Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。
安装好系统后,root用户的家目录有一个文件anaconda-ks.cfg
,以这个文件以例,看一下该文件的inode信息。
$ stat anaconda-ks.cfg 文件:anaconda-ks.cfg 大小:1152 块:8 IO 块:4096 普通文件 设备:fd00h/64768d Inode:33757248 硬链接:1 权限:(0600/-rw-------) Uid:( 0/ root) Gid:( 0/ root) 环境:system_u:object_r:admin_home_t:s0 最近访问:2022-04-23 04:54:15.200283588 -0400 最近更改:2022-04-23 03:14:15.129695148 -0400 最近改动:2022-04-23 03:14:15.129695148 -0400 创建时间:2022-04-13 10:10:41.924217883 -0400
一般情况下,文件名和inode号码是"一一对应"关系,每个inode号码对应一个文件名。但是,Unix/Linux系统允许,多个文件名指向同一个inode号码。
这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hard link)。
ln 源文件 目标文件
增加一个硬链接,指向root用户家目录的anaconda-ks.cfg
文件,命名为anaconda.cfg
ln anaconda-ks.cfg anaconda.cfg
然后通过ll
命令,可以看到anaconda-ks.cfg
这个文件的链接数由原来的1,变成2了。因为硬链接,就是直接指向inode
的文件数呀。
$ ll anaconda-ks.cfg -rw-------. 2 root root 1152 4月 23 03:14 anaconda-ks.cfg
删除一个文件名,就会使得inode节点中的"链接数"减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。
有了上面对硬链接的了解,知道输入ll
命令会展示出相关文件或者目录的硬链接数。那么接下来就了解一下,为什么新建一个空目录的时候,空目录的硬链接数为2。
每一个目录,都会自带了两个隐藏的目录,分别是代表当前目录的.
以及代表父目录的..
。基于上面对硬链接的了解,接下来查看一下这两个目录的inode
以及它们之间的关系。
先来看一下目录结构。当前正在root用户的家目录下。
$ pwd /root
命令ll
后面的参数 a
代表显示所有的目录,包括隐藏目录.
以及..
,参数i
代表的是显示文件对应的inode
。
$ ll -ai 33575041 dr-xr-x---. 5 root root 4096 4月 23 08:27 . 128 dr-xr-xr-x. 17 root root 224 4月 12 07:43 ..
接下来再看看home/admin
这个目录所对应的inode
信息。参数-d
代表的是查看目录文件的信息,而不是查看目录下面的文件信息。
$ ll -id /root 33575041 dr-xr-x---. 5 root root 4096 4月 23 08:27 /root
可以看到,/root
这个目录的 inode,跟/root
这个目录下面的隐藏目录.
的 inode 是一样的。就是说,有两个文件,指向了同一个inode 。这就是为什么,每一个新建的目录,它的硬链接数都是 2 的原因。因为还有一个硬链接,指向了父目录的 inode。从此也可以推出结论,每一个目录的硬链接数,总是等于2加上它的子目录总数(含隐藏目录)。
软件链接跟windows操作系统下的快捷方式差不多一个意思。就好像QQ软件安装在D盘了,但是通过双击桌面上QQ软件的快捷方式,可以正常运行QQ软件。但是把QQ软件删除了,这个时候双击桌面上QQ软件的快捷方式,就会出现“快捷方式指向了一个未知位置”等信息。
硬链接有自己的文件名,但没有自己的 inode。软链接有自己的 inode,但是这个 inode 指向的目标文件的inode。这个时候,如果把目标文件删除了,软链接的inode 所指向的 inode 也没有了。再使用软链接访问目标文件的时候,就会出现 “No such file or directory”的错误。
ln -s 源文文件或目录 目标文件或目录
为root用户下的anaconda-ks.cfg
文件增加一个软链接,名为anaconda
ln -s anaconda-ks.cfg anaconda
这个也可以通过ll
命令,看到软链接有直观的指向说明
$ ll lrwxrwxrwx. 1 root root 15 4月 23 08:27 anaconda -> anaconda-ks.cfg -rw-------. 2 root root 1152 4月 23 03:14 anaconda.cfg -rw-------. 2 root root 1152 4月 23 03:14 anaconda-ks.cfg