inode以及软硬链接

本文深入讲解了UNIX/Linux系统中inode的概念及其作用,包括inode如何存储文件元信息、inode的大小及inode表的作用。同时,文章详细阐述了硬链接与软链接的区别与应用场景,帮助读者更好地理解和运用文件系统。

iNode

1、inode是什么?

  理解inode,要从文件储存说起。 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector),每个扇区储存

512字节(相当于0.5KB),操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续

读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大

小,最常见的是4KB,即连续八个 sector组成一个 block。 文件数据都储存在"块"中,那么很显然,我们还必须找

到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域

就叫做inode,中文译名为"索引节点"。

     iNode是 UNIX 操作系统中的一种数据结构,其本质是 结构体,它包含了与文件系统中各个文件相关的一些重要

信息。在 UNIX 中创建文件系统时,同时将会创建大量的 inode 。通常,文件系统磁盘空间中大约百分之一空间分

配给了 inode 表。inode 表包含一份清单,其中列出了对应文件系统的所有 inode 编号。当用户搜索或者访问一个

文件时,UNIX 系统通过 inode 表查找正确的 inode 编号。在找到 inode 编号之后,相关的命令才可以访问该 

inode ,并对其进行适当的更改。使用 inode 可以节约大量的时间,并提高工作效率。

    例如,使用 vim 来编辑一个文件。当您键入 vim <filename> 时,在 inode 表中找到 inode 编号之后,才允许您

打开该 inode 。在 vim 的编辑会话期间,更改了该 inode 中的某些属性,当您完成操作并键入 :wq 时,将关闭并释

放该 inode 。通过这种方式,如果两个用户试图对同一个文件进行编辑, inode 已经在第一个编辑会话期间分配给

了另一个用户 ID (UID),因此第二个编辑任务就必须等待,直到该 inode 释放为止。

2、inode的内容

 inode包含文件的元信息,具体来说有以下内容:  

* 文件的字节数   

* 文件拥有者的User ID  

* 文件的Group ID  

* 文件的读、写、执行权限  

* 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件

上一次打开的时间。   

* 链接数,即有多少文件名指向这个inode   

* 文件数据block的位置

可以用stat命令,查看某个文件的inode信息

3、inode的大小 

     inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件

数据;另一个是inode区(inode table),存放inode所包含的信息。 每个inode节点的大小,一般是128字节或

256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘

中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块

硬盘的12.8%。  

  查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令。 df -i

查看每个inode节点的大小,可以用如下命令:

sudo dumpe2fs -h /dev/hda | grep "Inode size"

每个inode都有一个号码,操作系统用inode号码来识别不同的文件。   

 这里值得重复一遍,Unix/Linux系统内部不 使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是

inode号码便于识别的别称或者绰号。表面 上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:

首先,系统找到这个文件名对应的inode号 码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找

到文件数据所在的block,读出数据。   

使用ls -i命令,可以看到文件名对应的inode号码:  ls -i example.txt

ls -i命令列出整个目录文件,即文件名和inode号码:ls -i /etc

如果要查看文件的详细信息,就必须根据inode号码,访问inode节点,读取信息。ls -l命令列出文件的详细信息。



    在Linux系统中,内核为每一个新创建的文件分配一个iNode(索引节点),每个文件都有一个唯一的iNode号。

文件属性保存在索引节点里,在访问文件时,索引节点被复制到内存里。从而实现文件的快速访问。

链接是一种共享文件和访问它的用户的若干目录项之间建立联系的一种方法。Linux中包括两种链接:硬链接(Hard 

Link)和软链接(SOft Link),软连接又称符号链接(Symbolic Link)。符号链接相当于Windows下的快捷方式。

1、硬链接

      硬链接(hard link)可以被理解为一个“指向原始文件inode的指针”,系统不为它分配独立的inode与文件,所以

实际上来讲硬链接文件与原始文件其实是同一个文件,只是名字不同。于是每添加一个硬链接,该文件的inode连接

数就会增加1,直到该文件的inode连接数归0才是彻底删除。也就是说因为硬链接实际就是指向原文件inode的指

针,即便原始文件被删除依然可以通过链接文件访问,但是由于技术的局限性而不能跨文件系统也不能链接目录文

件。简单的说就是一个 inode 号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多

个别名硬连接就是安全备份的意思,他不占用磁盘空间,只是一个替身。

ln命令可以创建硬链接

  ln 源文件 目标文件 运行上面这条命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。inode信

息中有一项叫做"链接数",记录指向该inode的文件名总数,这时就会增加1。反过来,删除一个文件名,就会使得

inode节点中的"链接数"减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及

其所对应block区域。 

  这里顺便说一下目录文件的"链接数"。创建目录时,默认会生成两个目录项:"."和".."。前者的inode号码就是当前

目录的inode号码,等同于当前目录的"硬链接";后者的inode号码就是当前目录的父目录的inode号码,等同于父目

录的"硬链接"。所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录),这里的2是父目

录对其的“硬链接”和当前目录下的".硬链接“。

-f 建立时,将同档案名删除;

-i  删除前进行询问;

ln abc cde  建立abc的硬链接。

     删除一个硬链接文件并不影响其他有相同 inode 号的文件,即删除test.c时,不会删除硬盘上数据,因为引用计数>0 ;

硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功

能。也就是说,文件真正删除的条件是与之相关的所有硬链接文件均被删除。

 尽管硬链接节省空间,也是Linux系统整合文件系统的传统方式,但是存在一下不足之处:

(1)不可以在不同文件系统的文件间建立链接

(2)只有超级用户才可以创建硬链接

(3)不能给目录创建硬链接。

2、软连接

     软链接也称为符号链接(symbolic link)即“仅仅包含它所要链接文件的路径名”因此能做目录链接也可以跨越

文件系统,但原始文件被删除后链接文件也将失效,性质上和Windows™系统中的“快捷方式”是一样的。软链接克

服了硬链接的不足,没有任何文件系统的限制,任何用户可以创建符号链接并且可以为目录创建符号链接。

ln -s命令可以创建软链接。 ln -s 源文文件或目录 目标文件或目录

ln -s abc cde  建立一个软连接

   但需注意:软链接创建时原文件的路径指向使用绝对路径较好。使用相对路径创建的软链接被移动后该软链接文件

将成为一个死链接(如下所示的软链接 a 使用了相对路径,因此不宜被移动),因为链接数据块中记录的亦是相对路

径指向。

不足:

  因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找

不到了,而硬链接就没有这个缺陷,你想怎么移就怎么移;还有它要系统分配额外的空间用于建立新的索引节点和保

存原文件的路径。


      删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling 

link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。


总结(软硬链接对比) 

(1)软链接可以跨文件系统 ,硬链接不可以。

(2)关于 inode的问题 。硬链接不管有多少个,都指向的是同一个inode,会把inode链接数增加 ,只要inode的链

接数不是 0,文件就一直存在,不管你删除的是源文件还是链接的文件。只要有一个存在,文件就存在(其实也不分

什么 源文件链接文件的,因为他们指向都是同一个 inode)。 当你修改源文件或者链接文件任何一个的时候 ,其他

的文件都会做同步的修改。软链接不直接使用inode号作为文件指针,而是使用文件路径名作为指针(软链接跟源文件

的inode不一样)。所以删除链接文件对源文件无影响,但是删除源文件,链接文件就会找不到要指向的文件 。软链

接有自己的inode,并在磁盘上有一小片空间存放路径名.。

(3)软链接可以对一个不存在的文件名进行链接 。 

(4)软链接可以对目录进行链接。    


 关于硬连接不能跨越文件系统的原因

 不同的文件系统可能具有相同的inode号,假设可以在A系统中创建B系统的硬连接,例如B系统的文件Bb的硬连接

Ab,则它们理论上应该具有相同的inode号(如111111),但是此时A系统本来就可能存在inode号为111111的文

件,那此时想访问inode号为111111的文件的时候,内核就不能判断是访问A系统还是B系统的文件  


关于硬连接不能链接到目录的原因

     系统在遍历文件夹的时候,假设可以创建目录的硬链接,则因为系统不能识别出该硬连接是链接还是文件本身,

因此会无穷递归下去。而软链接可以被系统识别出,因为不会产生无穷递归。

      总之,建立链接就是建立了一个新文件。当访问链接文件时,系统就会发现它是个链接文件,它读取链接文件找

到真正要访问的文件。

<think> 首先,用户的问题是关于Linux系统中软硬链接的知识,包括原理、区别和使用方法。我需要基于用户提供的引用内容来回答。 用户引用了多个来源: - 引用[1]:解释了软链接和硬链接的区别,包括创建命令(ln -s 软链接,ln 硬链接)、限制(如目录不能创建硬链接)、inode等。 - 引用[2]:补充了软硬链接的本质,硬链接和源文件是同一份文件,软连接是独立的文件。 - 引用[3]:强调了软链接有自己独立的inode,硬链接共享inode。 - 引用[4]:软链接存储目标文件的绝对路径,硬链接是映射关系。 - 引用[5]:涉及动态库、静态库等,但主要焦点在文件系统和软硬链接上。 系统级指令要求: - 所有行内数学表达式用$...$。由于主题是Linux软硬链接,可能不需要数学表达式,但如果有的话,必须正确格式。 - 独立公式用$$...$$。同样,可能不需要。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,如[^1]。 用户可见层要求: - 回答结构清晰,逐步解决问题。 - 保证真实可靠。 我的回答结构: 1. **原理**:解释软硬链接的工作原理。 2. **区别**:对比软硬链接的特性。 3. **使用方法**:如何创建软硬链接的命令和注意事项。 4. **相关问题**:最后生成相关问题。 关键点基于引用: - **原理**: - 硬链接:硬链接和源文件共享相同的inode,意味着它们指向磁盘上的同一数据块。删除源文件,硬链接仍然有效。[^1][^2][^3] - 软链接:软链接是一个独立的文件,有自己的inode,存储目标文件的路径。删除源文件,软链接失效。[^1][^2][^3][^4] - **区别**: - 文件独立性:硬链接共享inode;软链接有自己的inode。[^3] - 限制:硬链接不能用于目录,不能跨文件系统;软链接可以用于目录、跨文件系统。[^1][^2] - 删除影响:删除源文件,硬链接无影响;软链接失效。[^1][^2] - **使用方法**: - 创建硬链接:`ln source_file hard_link` - 创建软链接:`ln -s source_file soft_link` [^1] 在回答中,自然地添加引用标识: - 例如,当提到区别时,结尾加[^1]。 生成相关问题: - 根据主题,生成2-3个相关问题,如: 1. 软硬链接在文件系统中的作用是什么? 2. 如何管理软硬链接以防止失效? 3. 软硬链接在系统备份中的应用? 确保回答真实可靠:基于提供的引用内容,不要添加未引用或无根据的信息。 </think> ### Linux软硬链接的原理、区别和使用方法 在Linux文件系统中,软链接和硬链接是管理文件和目录引用的重要机制。下面我将基于您的引用内容,逐步解释其原理、区别和使用方法。回答结合了多个可靠来源的信息[^1][^2][^3][^4][^5]。 #### 1. **原理** - **硬链接**: 硬链接本质上是文件系统中对同一文件的多个引用名。它与源文件共享相同的inode(索引节点),指向磁盘上的同一数据块。创建硬链接时,系统不复制文件数据,而是增加一个指向源文件inode的文件名。因此,所有硬链接和源文件都代表同一个物理文件。当文件被访问时,系统通过inode编号追踪数据位置[^1][^3][^5]。 例如:创建硬链接后,源文件和硬链接的文件大小、修改时间相同,因为它们共享inode。 - **软链接**: 软链接是一个独立的特殊文件(类似于Windows快捷方式),拥有自己独立的inode和元数据。它不存储文件数据本身,而是存储目标文件的绝对路径(符号路径)。当访问软链接时,系统解析该路径,重定向到目标文件。如果目标文件被移动或删除,软链接会失效(称为“断链”)[^1][^2][^4][^5]。 例如:软链接文件大小很小,因为它只包含路径字符串。 #### 2. **区别** 软链接和硬链接在多个方面存在关键差异,以下是主要区别点: | 特性 | **硬链接** | **软链接** | 引用来源 | |------------------|-----------------------------------------------|-----------------------------------------------|----------| | **文件独立性** | 共享源文件的inode,不是独立文件 | 拥有独立inode,是独立文件 | [^1][^3] | | **创建限制** | 不能用于目录;不能跨分区/文件系统创建 | 可用于目录;支持跨分区/文件系统创建 | [^1][^2] | | **目标存在性** | 必须指向已存在的文件 | 可指向不存在的文件(但访问时会报错) | [^2][^4] | | **删除影响** | 删除源文件后,硬链接仍可访问数据 | 删除源文件后,软链接失效(显示“断链”错误) | [^1][^2] | | **文件大小** | 与源文件大小相同 | 大小等于路径字符串长度(通常很小) | [^3][^5] | | **跨系统兼容性** | 仅在同一文件系统内有效 | 可跨不同文件系统(如ext4到NTFS) | [^4][^5] | 关键总结:硬链接更节省空间且稳定,但限制多;软链接灵活但依赖目标路径[^1][^2][^4]。 #### 3. **使用方法** 在Linux中,使用`ln`命令创建链接: - **创建硬链接**: 命令:`ln <源文件> <硬链接文件名>` 示例:创建源文件`file.txt`的硬链接`hardlink.txt`: ```bash touch file.txt # 创建源文件 ln file.txt hardlink.txt # 创建硬链接 ``` 验证:使用`ls -i`查看inode,源文件和硬链接的inode编号相同。 注意事项:不能用于目录(如`ln dir hardlink_dir`会报错)[^1][^5]。 - **创建软链接**: 命令:`ln -s <源文件或目录> <软链接文件名>` 示例:创建目录`my_dir`的软链接`softlink_dir`: ```bash mkdir my_dir # 创建目录 ln -s my_dir softlink_dir # 创建软链接 ``` 验证:使用`ls -l`查看,软链接显示为`softlink_dir -> my_dir`。 注意事项: - 如果源文件被移动,软链接需更新;可使用相对路径或绝对路径(推荐绝对路径以防失效)。 - 跨分区创建有效,如`ln -s /mnt/disk/file.txt ~/link.txt`[^1][^4][^5]。 **最佳实践**: - 硬链接适合备份重要文件(数据不易丢失)。 - 软链接适合管理跨系统资源或动态路径(如库文件链接)。 - 删除链接:直接删除链接文件(如`rm hardlink.txt`),不影响源文件;但如果删除源文件,软链接失效需手动清理[^1][^2]。 #### 相关问题 1. 软硬链接在Linux文件系统优化中的作用是什么?比如如何提升性能或减少存储占用? 2. 如何检测和处理失效的软链接(断链)? 3. 软硬链接在Linux系统备份和恢复中的应用场景有哪些?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值