(五)Linux文件系统管理
深入理解3
文件系统特性
- 每个操作系统设置的文件属性、权限都不同,将分区格式化才能成为系统能够利用的文件格式(filesystem)
- 传统一个分区只能格式化成一个文件系统,新技术能将一个分区格式化成多个文件系统(LVM)
- 格式化不再针对硬盘分区
- 一个被挂载的数据为一个文件系统而不是一个分区
- Linux有文件权限、属性,文件系统会将两部分数据存放在不同的区块,权限属性放在inode,实际数据放在数据块中,还有一个超级区块(superblock)记录文件系统的整体信息,比如数据快总量、剩余、使用
- 每个inode和区块都有编号,它们的作用如下
- 超级区块:记录文件系统的整体信息,包括inode和超级区块的总量、使用、剩余,以及文件系统的格式和信息等
- inode:记录文件属性,一个属性占用一个inode,同时记录文件数据所在的区块号码
- 数据区块:实际记录文件的内容,文件过大占用多个区块
硬盘的读取顺序是inode记录的号码,比如记录的是1、3、5、6号码,则硬盘会一次性读取这四个块的内容,这叫索引式文件系统
u盘的FAT格式则是
1->3->5->6
这样的读取顺序
- 碎片整理:当存取的文件过于离散(读取性能差)时使用碎片整理可以将文件的区块集中起来
Linux的ext2文件系统
ext2(Linux second extended filesystem,ext2fs)
ext2采用了inode,文件系统一开始就将inode和数据块规划好了了,除非重新格式化或者使用resize2fs命令修改大小,但将inode和数据块放在一起不好管理,所以一般都是区分为多个区块群组
文件系统最前面有一个boot sector,可以用来装引导程序(多重引导)
每个群组有六个主要内容
数据区块
在ext2文件系统中支持的区块大小有1k、2k和4k,大小在格式化时确定,每个区块大小所支持的单一文件大小和文件系统的最大支持磁盘容量都不相同
Block大小 | 1KB | 2KB | 4KB |
---|---|---|---|
单一文件限制 | 16GB | 256GB | 2TB |
最大文件系统总容量 | 2TB | 8TB | 16TB |
就算文件系统支持2TB,软件也要支持才行
ext2文件系统的区块限制
- 原则上,区块的大小与数量在格式化完就不能再修改(重新格式化)
- 每个区块内最多只能放一个文件的数据
- 如果文件大于一个区块,则一个文件会占用多个区块
- 若文件小于一个区块,则剩余容量被浪费
比如文件系统使用4k大小,而每个文件只有1k,则存储一个文件会浪费3k
当文件过大时,使用区块容量最大的则文件系统的区块号码就少,方便读写
inode table
- 记录了读写属性
- 拥有者和群组
- 大小
- 文件的atimr、ctime、mtime
- 特性标识flag,如SetUID
- 该文件的真正内容指向(pointer)
- 每个inode的大小为128B(ext4、xfs可以到256B)
- 每个文件仅占用一个inode
- 所以系统能建立的文件数量与inode数量有关
- 系统读取文件时会先找到inode,分析inode记录的权限与用户的权限是否符合,然后才能读取
为了记录更多的信息,inode记录的区块号码的区域定义是12个直接、1个间接、1个双间接、1个三间接
图源https://zhuanlan.zhihu.com/p/40604943
文件太大是,才会用到间接,间接就是再拿一个区块来记录区块号码的记录区
以1k区块为例
- 12个直接:12X1K=12K
每个区块1K,记录一个区块使用4B,一个区块能记录256个区块
- 间接:256X1K=256K
- 双间接:256X256X1K=256^2K
- 三间接:256^3K
以上加起来16GB
由于大于2K的区块会受到ext2文件系统的限制,上面的计算不适用2K、4K
Superblock
- 记录数据区块与inode的总量
- 未使用的、已使用的inode与数据块数量
- 数据块的大小(1、2、4k),inode的大小(128、256B)
- 文件系统的挂载信息,最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等文件系统相关信息
- 一个有效位数值,若此文件已被挂载,则有效位为0,否则为1
虽然每个群组都可能含有超级区块,但实际上文件系统应仅有一个超级区块,除了第一个区块有超级区块外,后面不一定有超级区块,有的话主要也是作为备份
Filesystem Description
可以描述每个区块群组的开始和结束区块,以及说明每个区段(suoerblock、对照表、inode对照表、数据区块)分别位于哪一个区块之间,可以使用dumpe2fs观察
区块对照表(block bitmap)
说明哪些区块是是空的,哪些使用过的
inode对照表
负责记录使用与未使用的inode号码
dumpe2fs
可以用查询ext系列超级区块的信息
结合目录树
目录
目录主要记录文件名,文件才是真正记录文件的地方
创建目录时,文件系统会分配一个inode和至少一个区块给目录
- inode记录权限和属性
- 区块记录文件名和文件名的inode信息
目录的文件名过多时,会使用多个区块
文件
- 建立文件时,会分配一个inode和相对于文件大小的区块数量,注意直接不够用时用间接会使用额外的区块
读取目录树
目录树从根目录开始,系统通过挂载点的信息找到挂载点的inode,层层递进找到正确的目录
例如/etc/passwd
- 通过挂载点找到
/
的inode,判断权限rx才能进入 - 承上找到
/
的区块,在区块里找到etc/的inode号码,同样判断rx权限 - 承上找到
etc/
的区块,找到passwd文件的inode号码,判断r - 读取passwd的区块内的内容
文件大小和读取性能
文件通常是无法写在一起的,一般是填充在空的区块中,就会发生文件数据离散
- 当文件太过离散时,就会发生读取效率降低
- 可以把文件系统的数据复制出来,格式化文件系统在复制回去解决
- 但是文件系统太大时,文件太容易分散,磁盘的物理结构查找比较费时,要合理规划文件系统大小
ext文件的存取和日志式文件系统的功能
创建文件时文件系统的操作是
- 判断用户在此目录是否具有wx权限
- 在inode对照表找到空的inode号码,写入权限属性
- 根据区块对照表找到空的区块号码,写入数据,并更新inode所指向的区块数据
- 更新inode对照表与区块对照表,然后更新超级区块
一般将inode对照表、数据区块叫数据存放区,超级区块、区块对照表、inode对照表较元数据(metadata),因为数据变动时都可能会影响这些数据
数据的不一致(inconsistent)
正确的文件写入步骤如上,但总会碰到一些特殊情况,比如断电、死机、系统错误等,可能会导致元数据没有更新,然后元数据和实际数据就会不一致
在ext2为了解决这个问题,借由超级区块当中记录的有效位(是否挂载)和文件系统的状态(是否正确卸载)来判断是否强制检查数据的一致性,或者手动使用e2fsck程序检查,但是这种检查都会检查整个文件系统,相当费时,于是有了后来的日志式文件系统
日志式文件系统(journaling filesystem)
所谓日志就是使用一个区块专门记录文件的写入和修改文件的操作
- 当系统写入文件时,会在日志记录区记录写入的信息
- 然后开始正常写入,更新
metadata
- 结束后才会完成此次记录
出问题时就会专门检查这个记录区块,这样就达到了快速修复文件系统,是日志文件系统最基础的功能
Linux文件系统的运行
若编辑一个大型文件,从磁盘读取到内存,再给CPU,编辑中如果再写入磁盘,由于磁盘速度比CPU慢很多,编辑中会频繁的等待,没有效率,于是Linux采用了异步处理(asynchronously
)的方式,大致过程如下
- 内存加载文件,若没被修改,则被系统设置为干净(
clean
) - 修改过则是
dirty
- 系统会不定时的将dirty写进磁盘,或者手动使用
sync
也就是将文件放在内存中以提高系统性能,所以Linux文件系统与内存关系很大
- 系统会将常用的文件加载到内存缓存区
- 所以Linux的物理内存都会用光,可以提高系统性能
- 可以手动使用sync将数据写入磁盘
- 正常关机也会调用sync指令
- 若不正常关机,因为数据没写进磁盘,重新启动会花更多时间进行磁盘校验,甚至会导致文件系统损坏
挂载点的意义(mount point)
每个文件系统都有inode、区块,要与目录树链接才能使用,这就是挂载
1 | [manu@study ~]$ ls -lid / /boot /home |
- 装Linux时我安装了
/ 、/boot 、/home
三个目录,于是有3个挂载点 - 每个的inode相同,代表三个不同的文件系统
Linux支持的文件系统
- 传统文件系统:ext2、minix、FAT、iso9660等
- 日志式文件系统:ext3、ext4、ReiserFS、Windows’NTFS、IBM’s JFS、SGI’s XFS、ZFS
- 网络文件系统:NFS、SMBFS
查看某Linux支持的文件系统
1 | [manu@study ~]$ ls -l /lib/modules/$(uname -r)/kernel/fs |
VFS(Virtual Filesystem Switch)
Linux通过VFS识别不同的文件系统,Linux识别的文件系统都是VFS管理
XFS
简介
随着磁盘的容量越来越大,现在的单位已经是PB、EB,ext采用的是先规划出inode、区块、元数据,在大容量的磁盘面前需要很多时间,特别是一些巨型文件,在ext的效率也不是很好,然后有了xfs文件系统,是一个日志式文件系统,具备了几乎所有ext4文件系统的功能
XFS文件系统的配置
1.数据区(data section)
类似于ext的block groups
,分为多个存储区群组allocation groups
,每个群组包括了
- 整个文件系统的超级区块
- inode的分配与追踪,inode与数据区块都是动态产生(所有格式化很快),不同意ext的事先规划
- 剩余空间的管理机制
此外,xfs的区块容量可以设置为512B64K(Linux最大4K),inode可设置256B2MB,
2.文件系统活动登陆区(log section)
记录文件系统的变化,就像日志区
因为所有操作都要在这个区作记录,所有这个区的读写很频繁
xfs在设计上允许使用外部磁盘作为登陆区(比如使用SSD加快速度)
实时运行区(realtime section)
建立文件时,xfs会在这个区里找数个extent区块放置文件,然后写入data section的inode和区块中,extent的大小在格式化时指定,范围4K~1G
xfs的详细信息可以参考xfs官网和https://blog.csdn.net/scaleqiao/article/details/520985
xfs描述数据观察
1 | [manu@study ~]$ df -T /boot |
- isize指的是inode的容量256B,agcount代表allocation group的数量4个,agsize代表每个allocation group有多少区块,区块大小在第4行
bsize=4k
,所以整个文件系统大小=4X65536X4K
- sectsz代表逻辑扇区的容量设置为
512B
- log=internal代表log section在文件系统内部,大小=
4096BX2560
简单操作
df
- 列出文件系统的整体磁盘使用量
df [-] dir/file
-a
列出所有文件系统-k
以KB显示文件系统-m
以MB显示文件系统-h
以GB、MB、KB自动显示,方便阅读-H
M=1024K-T
显示硬盘分区的文件系统-i
使用inode的形式显示- 没选项时默认将系统的所有文件系统全列出来
1 | [manu@study ~]$ df |
这里说一下sr0,sr0是CD-ROM,无法写入,所以使用100%
du
- 会去文件系统内找当前目录或选定目录的文件数据
du [-] dirname/filename
-a
列出所有的文件和目录容量,默认是目录容量-h
以易读的形式显示-s
仅列出该目录的总量-S
仅列出子目录-k
默认值-m
硬链接Hard link
我们知道,创建文件时会有一个inode,而目录是通过记录文件的inode来链接到该文件的
所谓硬式链接就是:在某目录下创建一个文件,而这个文件的inode是我所需要的文件的inode
实例
1 | [root@study /]# ll -i yangyong.text |
2
表示有两个文件链接到了这个inode比较安全(相当于备份)
硬链接一般不会占磁盘空间大小
限制
- 只能在同一个文件系统
- 不能链接目录
符号链接Symbolic Link
建立一个文件,这个文件记录的是我所需要的文件的文件名
实例
1 | [root@study /]# ln -s yangyong.text test2 |
test2的文件大小13B,源文件的文件名也是13个字符
源文件没了,链接文件会找不到文件
符号链接就相当于Windows的快捷方式
ln
ln [-] sourcefile linkname
-s
符号链接,默认硬链接-f
若有这个linkname则将文件删除再创建
创建一个目录时,这个目录下默认至少有两个文件,
.
and..
,所有新目录会有两个链接数,父目录也会增加一个目录数
参考《鸟哥的Linux私房菜 基础学习篇》
(五)Linux文件系统管理