这篇博客从unix中的符号链接和硬链接的区别开始,接着深入介绍了背后的inode和文件在磁
盘上的存储结构
符号链接(Symbolic link)和硬链接(hard link)
Unix中可以通过ln命令创建一个链接,这个连接类似Windows中的快捷方式,新建的连接文件
指向一个已有的目标文件,磁盘上仍然只保存一份目标文件内容。
Unix中的链接分为符号连接和硬连接,从外部来看,他们的主要区别是:
- 目标文件删除后,符号连接文件也会失效,但硬连接文件仍然可以访问文件
- 硬连接要求链接文件和目标文件在同一个文件分区(文件系统)里
inode
虽然硬连接和符号连接的区别,跟两者实现原理有关,要理解这一点还需要从Unix文件系统
和磁盘物理结构讲起
一个磁盘会被分成很多区,一个分区又是由多个柱面(cylinder group)组成的。柱面里包含
真正的数据和文件元信息,文件元信息指文件名、大小、权限等等
disk drive +-----------+-------------------------+-----------------+
| partition | partition | partition |
| | | |
+-----------+-------------------------+-----------------+
/ \
/ \
/ \
/ \
+------+------+-------------+-------------+....+-------------+
file |boot |super | cylinder | cylinder | | cylinder |
system |block |block | group0 | group1 | | groupN |
+------+------+-------------+-------------+....+-------------+
/ \
/ \
/ \
/ \
+------+----+-------+-------+-------------+--------------+
|super |cg |i-node |block | | |
|block |info|map |bitmap | i-nodes | data block |
|copy | | | | | |
+------+----+-------+-------+-------------+--------------+
/ \
/ \
/ \
+-------+-------+---------+-------+
|i-node |i-node |... |i-node |
+-------+-------+---------+-------+
上图中,i-node是一个定长条目,包含了文件的元信息:文件类型、文件的权限、
文件的大小和文件数据在data block中的位置等
data block则是文件数据的真正存储位置,data block中的内容根据不同文件类型而
不同:
- inode为普通文件类型时,它指向的数据区存储的是文件内容
- inode为软连接类型的文件时,它指向的数据区存储的是指向文件的文件名
例如某个inode代表文件/tmp/t.txt,而/tmp/t.txt是指向/root/t.txt的软连接文件,
那么这个inode指向的数据区存储的内容就是字符串:/root/t.txt - inode为文件夹时,它指向的数据区内存储的有:
3.1 目录下的文件名和文件对应的inode序号
3.2 目录下的子目录和子目录对应的inode序号
3.3 存储当前目录和父目录的inode序号 - 那么硬连接呢?硬连接和普通文件一样,当我们建立硬连接时,其实是让硬连接文件指
向了和目标文件相同的i-node,这也就解释了为什么目标文件删除时,硬连接文件仍然
有效:因为删除目标文件,只是解除了目标文件和i-node的关联,硬链接文件和i-node
的关联仍在,可以通过硬链接访问到文件内容
例子
举一个例子,帮助理解上面讲述的内容。
假设有一个文件/tmp/a.txt,有一个硬连接文件/tmp/hard.txt指向它,还有一个符号链
接/tmp/symbolic.txt也指向它,那么底层的i-node和data-block示意图如下:
i-node1 i-node2 i-node3 i-node4
+-------+-------------+-------+---------------------------+-------------+----
| |File | |Dictory | File | ...
| |data block 3 | |data block 79 |data block 8 |
| |.... | |.... |.... |
+-------+-------------+-------+---------------------------+-------------+----
| | |
| | |
V V V
+-------+-------------+.......+--------------------------+-------------+-----
| | nice to meet| |i-node1 /tmp/a.txt |/tmp/a.txt |
| | you! | |i-node1 /tmp/hard.txt | |
| | | |i-node4 /tmp/symbolic.txt | |
| | | |i-node3 . | |
| | | |i-nodeX .. | |
+-------+-------------+.......+--------------------------+-------------+-----
data block3 data block 79 data block80
上图的i-node节点表明了各自的文件类型和对应的data-block的位置,省略了其他信息
如上图所示:
-
i-node3是表示目录/tmp,他的数据在data block 79 -
data block79内的内容是/tmp目录下的三个文件a.txt、hard.txt和symbolic.txt
和他们对应的i-node位置,当然data block79还包含了两个特殊的目录:.(当前目录)
和..(父目录)对应的i-node位置 -
a.txt和hard.txt指向同一个i-node1,i-node1的数据区存储了真正的文件内容:
nice to meet you! -
symbolic.txt是符号链接,它的数据区存储了指向的目标文件路径:/tmp/a.txt
参考资料
- Advanced Programming in the Unix Environment(3rd) P113 File System
- Advanced Programming in the Unix Environment(3rd) P120 Symbolic Links