i-node和符号链接

这篇博客从unix中的符号链接和硬链接的区别开始,接着深入介绍了背后的inode和文件在磁
盘上的存储结构

符号链接(Symbolic link)和硬链接(hard link)

Unix中可以通过ln命令创建一个链接,这个连接类似Windows中的快捷方式,新建的连接文件
指向一个已有的目标文件,磁盘上仍然只保存一份目标文件内容。
Unix中的链接分为符号连接和硬连接,从外部来看,他们的主要区别是:

  1. 目标文件删除后,符号连接文件也会失效,但硬连接文件仍然可以访问文件
  2. 硬连接要求链接文件和目标文件在同一个文件分区(文件系统)里

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中的内容根据不同文件类型而
不同:

  1. inode为普通文件类型时,它指向的数据区存储的是文件内容
  2. inode为软连接类型的文件时,它指向的数据区存储的是指向文件的文件名
    例如某个inode代表文件/tmp/t.txt,而/tmp/t.txt是指向/root/t.txt的软连接文件,
    那么这个inode指向的数据区存储的内容就是字符串:/root/t.txt
  3. inode为文件夹时,它指向的数据区内存储的有:
    3.1 目录下的文件名和文件对应的inode序号
    3.2 目录下的子目录和子目录对应的inode序号
    3.3 存储当前目录和父目录的inode序号
  4. 那么硬连接呢?硬连接和普通文件一样,当我们建立硬连接时,其实是让硬连接文件指
    向了和目标文件相同的i-node,这也就解释了为什么目标文件删除时,硬连接文件仍然
    有效:因为删除目标文件,只是解除了目标文件和i-node的关联,硬链接文件和i-node
    的关联仍在,可以通过硬链接访问到文件内容

例子

举一个例子,帮助理解上面讲述的内容。
假设有一个文件/tmp/a.txt,有一个硬连接文件/tmp/hard.txt指向它,还有一个符号链
/tmp/symbolic.txt也指向它,那么底层的i-nodedata-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的位置,省略了其他信息
如上图所示:

  1. i-node3是表示目录/tmp,他的数据在data block 79
  2. data block79内的内容是/tmp目录下的三个文件a.txthard.txtsymbolic.txt
    和他们对应的i-node位置,当然data block79还包含了两个特殊的目录:.(当前目录)
    ..(父目录)对应的i-node位置
  3. a.txthard.txt指向同一个i-node1i-node1的数据区存储了真正的文件内容:
    nice to meet you!
  4. 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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容