linux文件系统有两层结构,逻辑结构和物理结构。也就是inode和block。

每个文件都有一个inode, 记录文件属性:权限,时间还有最重要的block号码。

block是实际存放文件内容的地方。

但文件名不在这里。在哪?在目录的block里面。

目录也有一个唯一的inode,记录内容与文件inode大体相似。

block是记录该目录下文件名,子目录名与它们的inode信息的地方。

所以我们在找文件时,比如/etc/issue,先读/目录的inode,找到/的内容block,再从中找出etc/的inode,

然后读etc/的block,找出issue的inode,再读issue的block,得出内容。当然前提是所有权限支持。

这也是为什么新建文件,删文件时要目录权限配合的原因。

因为文件本身不记录文件名,文件名记录在其父目录的block中。

那/目录的inode记录在哪里?这是鸡生蛋,蛋生鸡的问题。解决循环要有外力介入。

先有鸡还是先有蛋?先有鸡,因为鸡是恐龙进化来的。恐龙下蛋,但那毕竟不是鸡蛋.....

所以还是先有鸡,后有鸡蛋。这也解决了没有鸡蛋,鸡是从哪里来的问题。

根目录的inode是挂载时候记录的,因此有了/的inode,找文件就是一路顺藤摸瓜。

 

 

再谈谈linux下的link。

它分硬链接和软链接两种。软链接应用较广。

硬链接只是在相应目录的block里面记录了目标文件的inode。也就是多写了一行。它,不是真正意义上的文件,没有自己的inode,所以不会占用inode和block,但目标文件的inode引用计数会+1。

删除目标文件,硬链接依旧可以打开,毕竟删除只是删block里的文件名映射而已,由于硬链接里有完整的文件名映射,所以依然可以打开。

 

软链接则不同。软链接记录的是目标文件的文件名。会占用新的inode和block,block里记录的是目标文件的文件名。打开软链接时,先找到目标文件的文件名,在去相应目录去找inode, 相当于中间多了一层。

删除目标文件后,软链接无法打开。因为目标文件的文件名已经被删除,中间层不存在,所以即使目标文件的inode和block还在,但逻辑上它已经不存在了。所以无法打开。

 

但,无论更改软链接或者硬链接,都相当于更改原文件!

另外新建目录时会自动建两个硬链接.和..,所以本目录初始化时,link为2。上层目录link数会+1.

 ln 默认建硬链接,-s 建软链接。