【Linux编程】文件系统的分区、硬链接、软链接

首先从磁盘结构讲起。按结构从小到大区分:
  • 扇区,固定512字节
  • 磁道
  • 柱面,分区时的最小单位,开始柱面到结束柱面为一个分区
第一个扇区很重要,它包括:
  • 主引导分区MBR(446字节),内含引导加载程序Boot loader。它有如下功能:
    • 提供菜单:可选择不同的系统进行加载,多操作系统的基础
    • 加载内核文件:直接加载可使用的操作系统内核程序
    • 转交其它Boot loader:跳转到其它分区,执行那个分区的Boot loader,用于启动不同操作系统
  • 分区表(64字节),保存每个分区的起始、结束柱面。假设硬盘只有400个柱面:
    • P1:  1~100(/dev/sda1或C盘)
    • P2:101~200(/dev/sda2或D盘)
    • P3:201~300(/dev/sda3或E盘)
    • P4:301~400(/dev/sda4或F盘)

下面是开机流程:
  1. 运行BIOS
  2. 运行MBR的引导加载程序
  3. 引导加载程序读取内核
  4. 操作系统开始运行
  5. 各个应用程序启动
Linux采用索引式文件系统,每个分区包含一个文件系统。一个文件占用一个inode,inode中包含文件大部分属性,并指向了包含有实际数据的数据块。在Linux系统中, inode号才是文件的唯一标识,想要获取文件中的内容必须通过inode
【Linux编程】文件系统的分区、硬链接、软链接_第1张图片
一个文件包含一个inode号和一个文件名,如上图所示,文件中就是通过这个inode号指向找到对应inode的。文件名只是方便用户使用,更换名字后,inode号不会改变:
【Linux编程】文件系统的分区、硬链接、软链接_第2张图片
-i选项能够显示出文件的inode号,可以看到,修改了文件名后inode号是不会改变的。

下面介绍Linux文件系统的硬链接和软链接。

若一个inode号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名。可用link或ln命令创建硬链接:

再用stat命令查看文件属性,实际上就是读取stat结构体中的各个字段:
【Linux编程】文件系统的分区、硬链接、软链接_第3张图片
上图创建了一个硬链接hard_link,可以看到两个文件的inode号和属性完全相同。实际上就是两个名字不相同的文件指向了相同的inode,而inode又包含文件大部分信息,所以导致ls出来的两个文件属性一模一样。同时Links字段显示为2,表示有两个硬链接指向该inode。

接下来是软链接(符号链接)。 软链接是一个独立的文件,有自己的inode和数据块,只是数据块中的内容就是所链接之文件的路径名。通过ln -s命令创建软链接:
【Linux编程】文件系统的分区、硬链接、软链接_第4张图片
可以看到,两个文件的inode不相同了。soft_link的硬链接数为1,表示只有一个文件指向这个inode。使用readlink命令查看符号链接本身的内容,也就是inode号为14156667的inode对应的数据块的内容:

内容就是所链接文件的路径名,与上面的描述完全吻合。

再来一张图加深理解:
【Linux编程】文件系统的分区、硬链接、软链接_第5张图片

下面说一下目录。 Linux系统并不区分目录和文件,目录是记录了其它文件名的文件 每个目录中的.和..文件实际上是一个硬链接

可以看到,两个文件指向同一个inode。一个文件名为.,inode号为14155777;另一个文件名为/work,inode号也为14155777.

每个叶目录(不包含其它目录的目录)都链接数总是为2,因为该目录的inode总是被上一层目录的一个目录项和本目录中的.项所指出,例如下面的dir目录是一个叶目录,它的链接数是2:


当在dir目录中再创建一个test目录后:
【Linux编程】文件系统的分区、硬链接、软链接_第6张图片
它的链接数变成了3,原因是子目录test中的..项现在也指向了dir目录的inode,使得链接数加1.如果再在dir中添加目录,那么链接数会依次增加。

参考:
《鸟哥的Linux私房菜》
《unix环境高级编程》 P86-P89.
https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/#fig2

你可能感兴趣的:(【Linux编程】文件系统的分区、硬链接、软链接)