最近有同学跟我讲他也要开始学习Linux了,我寻思着我也要开始复习了,就从Linux文件系统开始吧!
一. 各种各样的文件系统
- fat16:Windows95之前采用的文件系统。
- fat32(vfat):Windows98之后采用的文件系统。
- NTFS:windows现在采用的文件系统。
- ext系列:Linux Extended Filesystem。
- xfs:这个是CentOS中使用的文件系统,没用过,不太清楚。
二. 文件系统基础知识
(1). 关于磁盘
- 在以前,柱面是最小的分区单位。但是现在,扇区不仅是最小的分区单位,也是最小的物理存储单位。
- 现在的磁盘都有EFI分区(ESP,包含boot loader等文件),需要进行格式化才能被UEFI所读取。
- 磁盘分区表有两种格式,一种是MBR分区表,一种是现代的GPT分区表。
(2). 关于分区和格式化
为什么需要分区?其实有时候是不得不分区,比如装双系统的时候,如果不给Windows下的磁盘分区,就装不了Linux;
为什么需要格式化?因为每种操作系统所设置的文件属性和权限并不相同,为了存放文件所需的数据,才需要进行格式化。
传统的磁盘与文件系统的应用中,一个分区就只能被格式化为一个文件系统。现代我们有LVM和RAID技术,可以把一个分区格式化为多个不同的文件系统(LVM),也可以把多个分区格式化为同一个文件系统(RAID)
(3). Windows和Linux下操作系统简介
Windows下FAT操作系统有点像数据结构中的链表——他在数据区块中存放着下一个数据区块的索引。
而Linux下的ext文件系统则是索引式文件系统,他引入了所谓inode的概念,把文件的一些属性和权限全部塞到inode中,更重要的是,一个inode对应一个完整的文件,换句话说,所有数据区块的索引都存在这个inode中。
两者相比的话,由于Linux采用的是索引式文件系统,只要磁头转一圈,就可以读取所有的数据;但是Windows就不一定了。
这就是为什么当Windows需要经常进行磁盘碎片的整理——因为磁盘碎片过多,文件的读写性能下降。Linux下就没这种需求。
三. ext2文件系统概论
·ext2文件系统长什么样
先看左边的表格,这里有两个比较精妙的设计:
- boot sector放到最前面,有利于多重引导。
- 分了很多的block group,有利于管理(就像军队里有班,排,连的区别一样)
block group里的内容也很丰富,这里对一些内容做一个大致的介绍:
- super block:介绍了整个文件系统的基本信息,比如一个inode和data block的数量和大小等。
- descirptors: 这个则是介绍了每个区块群组开始和结束的位置。
- bitmaps:在新建文件或删除文件的时候,需要查看有哪些inode或者data block还没有使用或已经占用,这个就是提供了这样一种对照表,有利于提高效率。
- table:存放着inode和data blocks的实际内容,后面会详讲。
(p.s 每个block group中可能都会有所谓的super block,有的也没有,这是因为文件系统中只要有一个super block即可,其他block group中的super block都是起备份作用)
四. ext2文件系统之inode table
关于inode table中只要了解三方面即可:
(1). inode中到底存放这哪些信息?
inode中存放的东西特别多,这里只举常用的:
- 文件读写属性和文件权限(之前已经提到过了)
- 文件的大小
- 文件的各种时间(atime, ctime, mtime)
- 该文件的真正指向
(2). inode的大小?
每个inode所占的磁盘空间固定为128B(新的ext4和xfs可设为256B)
根据标准,每个inode对应一个完整的文件,其中,记录数据区块的内容只有4B(一个int,32位)。
为了记录大容量的文件内容,inode的数据区块采用12直接,1间接,1双间接,1三间接的做法。
即占用一个data block来记录索引。如下图所示:
一个data block有1K, 2K, 4K三种不同的大小。这样以来,以1K大小为例,一个data block可以记录256个区块的号码。
(3). inode与目录树之间的关系
对于目录,文件系统会分配一个inode与至少一个区块给该目录,不够的话再分配一个block,因此目录的大小一般都是你block大小的整数倍,而不是你所有文件大小之和。
对于文件,情况就不一样了,这主要是因为,Linux下的文件系统虽然也是根据文件的大小分配block,但是显示的却是文件的实际大小。两者并不矛盾。
另外非常重要的一点就是,文件的inode并不记录你的文件名。文件名记录在你目录的block中。因此Linux下新增或者删除文件,都与目录的w权限相关。还有一点也很重要,就是目录的data block中记录了其中文件的inode。
也就是说,Linux下的文件读取流程有点类似下面一幅图(长得挺像二分图):
五. 日志式文件系统
如果要新增一个文件,ext2文件系统会怎么做呢?
- 先看看对应目录有无w和x的权限,有的话才可以继续。
- 根据inode bitmap找到没有使用过的inode,然后把文件的一些属性写入。
- 根据block bitmap找到没有使用过的data block, 然后把实际的数据写入。
- 更新inode bitmap和block bitmap,最后更新super block的内容。
其中,由于data bitmap,inode bitmap和super block的数据是经常变动的,每次新增,删除,编辑时都会影响到这三个部分的数据,因此叫做meta data。
但是这种做法有一种缺陷——如果在上述步骤中,突然断电,就会发生meta data和实际数据区域内容不一致的情况。
如果想靠元数据区和实际区进行逐一比对的话,是很费时的,这时,日志式文件系统就兴起了。
日志式文件系统跟原来的文件系统有这么两个差别:
首先,在最开始的时候,在日志记录区块中记录——我要开始记录了。
然后,在结束的时候,在日志式文件系统中再记录——我结束了!
这样,我们的系统只要检查我们的日志,就可以知道哪些地方出问题了。
六. 符号链接和硬链接
Linux下有两种链接方式——symbolic link和hard link。
硬链接只是在该文件的目录下添加一条到某inode的关联记录而已。
符号链接则是一种新的文件类别,指向目标文件的inode。
符号链接和硬链接的比较
种类 | 优点 | 缺点 | 在ll下的表现 |
符号链接 | 可以链接目录 | 需要占用inode和区块;原来文件删除后,符号链接也会失效 | 在文件名末尾出现->字样 |
硬链接 | 不用占用inode和区块 | 不能跨文件系统,不能链接目录,只能链接所有文件。 | 第二栏数目+1 |
这两种链接方式都十分直观,如下图所示:(上为符号链接,下为硬链接。)
创建相关链接的命令:
ln source target # 创建硬链接
ln -s source target # 创建硬链接
新建目录的时候,目录中还会默认存在两个目录:./和../
./是硬链接到新建的目录的,而../是硬链接到父目录的。所以说, 新建一个目录的时候
- 该目录的硬链接数为2;
- 其父目录的链接数+1;
七. 其他
·什么是挂载?
挂在就是将文件系统和目录树结合。
·Linux文件系统的运行
编辑文件的时候我们最终要把文件保存在磁盘上,然而磁盘写入的速度比内存慢很多,因此我们不得不花时间在等待磁盘的读写上。
为此Linux使用了一个叫做异步处理的方法。在内存的数据可以分为clean和dirty两大类。
- 所谓clean的数据就是在内存中,没有被更改过的数据。
- 所谓dirty的数据,就是在内存中被更改过的数据。
Linux会将dirty的数据,不定时地写入磁盘内,当然也可以通过sync命令强行写入硬盘。
如果不正常关机,系统可能花很长时间在磁盘校验上。甚至可能造成文件系统的损坏。(好在服务器一般不关机)
·什么是Linux VFS?
VFS(virtual filesystem switch),由于Linux支持很多文件系统,所以我们可以通过vfs来管理所有的文件系统,这个比较复杂,详细的可以移步其他博客(书上也没写,逃)。
·相关命令
dumpe2fs # 查看ext系列超级区块的信息
·相关文件
- /dev/shm:利用内存虚拟出来的磁盘空间,访问速度非常快(真是奇怪,不仅有所谓的虚拟内存,还有这种奇怪的东西)
- /proc: Linux系统需要加载的系统数据,而且是挂载到内存当中,所以不占任何的磁盘空间。