首先从磁盘结构讲起。按结构从小到大区分:
- 扇区,固定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.
Linux文件系统的分区、硬链接、软链接,布布扣,bubuko.com
Linux文件系统的分区、硬链接、软链接
原文:http://blog.csdn.net/nestler/article/details/28911009