您的位置:首页 > 运维架构 > Linux

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

2014-06-06 19:18 253 查看
首先从磁盘结构讲起。按结构从小到大区分:

扇区,固定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盘)

下面是开机流程:

运行BIOS
运行MBR的引导加载程序
引导加载程序读取内核
操作系统开始运行
各个应用程序启动

Linux采用索引式文件系统,每个分区包含一个文件系统。一个文件占用一个inode,inode中包含文件大部分属性,并指向了包含有实际数据的数据块。在Linux系统中,inode号才是文件的唯一标识,想要获取文件中的内容必须通过inode:



一个文件包含一个inode号和一个文件名,如上图所示,文件中就是通过这个inode号指向找到对应inode的。文件名只是方便用户使用,更换名字后,inode号不会改变:



-i选项能够显示出文件的inode号,可以看到,修改了文件名后inode号是不会改变的。

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

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

再用stat命令查看文件属性,实际上就是读取stat结构体中的各个字段:



上图创建了一个硬链接hard_link,可以看到两个文件的inode号和属性完全相同。实际上就是两个名字不相同的文件指向了相同的inode,而inode又包含文件大部分信息,所以导致ls出来的两个文件属性一模一样。同时Links字段显示为2,表示有两个硬链接指向该inode。

接下来是软链接(符号链接)。软链接是一个独立的文件,有自己的inode和数据块,只是数据块中的内容就是所链接之文件的路径名。通过ln -s命令创建软链接:



可以看到,两个文件的inode不相同了。soft_link的硬链接数为1,表示只有一个文件指向这个inode。使用readlink命令查看符号链接本身的内容,也就是inode号为14156667的inode对应的数据块的内容:



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

再来一张图加深理解:



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



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

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



当在dir目录中再创建一个test目录后:



它的链接数变成了3,原因是子目录test中的..项现在也指向了dir目录的inode,使得链接数加1.如果再在dir中添加目录,那么链接数会依次增加。

参考:
《鸟哥的Linux私房菜》
《unix环境高级编程》 P86-P89.
https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/#fig2
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: