(五)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和数据块放在一起不好管理,所以一般都是区分为多个区块群组

ext2

文件系统最前面有一个boot sector,可以用来装引导程序(多重引导)

每个群组有六个主要内容

数据区块

在ext2文件系统中支持的区块大小有1k、2k和4k,大小在格式化时确定,每个区块大小所支持的单一文件大小和文件系统的最大支持磁盘容量都不相同

Block大小 1KB 2KB 4KB
单一文件限制 16GB 256GB 2TB
最大文件系统总容量 2TB 8TB 16TB

就算文件系统支持2TB,软件也要支持才行

ext2文件系统的区块限制

  1. 原则上,区块的大小与数量在格式化完就不能再修改(重新格式化)
  2. 每个区块内最多只能放一个文件的数据
  3. 如果文件大于一个区块,则一个文件会占用多个区块
  4. 若文件小于一个区块,则剩余容量被浪费

比如文件系统使用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个三间接

inode

图源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

  1. 通过挂载点找到/inode,判断权限rx才能进入
  2. 承上找到/区块,在区块里找到etc/的inode号码,同样判断rx权限
  3. 承上找到etc/区块,找到passwd文件的inode号码,判断r
  4. 读取passwd的区块内的内容

文件大小和读取性能

文件通常是无法写在一起的,一般是填充在空的区块中,就会发生文件数据离散

  • 当文件太过离散时,就会发生读取效率降低
  • 可以把文件系统的数据复制出来,格式化文件系统在复制回去解决
  • 但是文件系统太大时,文件太容易分散,磁盘的物理结构查找比较费时,要合理规划文件系统大小

ext文件的存取和日志式文件系统的功能

创建文件时文件系统的操作是

  • 判断用户在此目录是否具有wx权限
  • 在inode对照表找到空的inode号码,写入权限属性
  • 根据区块对照表找到空的区块号码,写入数据,并更新inode所指向的区块数据
  • 更新inode对照表与区块对照表,然后更新超级区块

一般将inode对照表、数据区块叫数据存放区,超级区块、区块对照表、inode对照表较元数据(metadata),因为数据变动时都可能会影响这些数据

数据的不一致(inconsistent)

正确的文件写入步骤如上,但总会碰到一些特殊情况,比如断电、死机、系统错误等,可能会导致元数据没有更新,然后元数据和实际数据就会不一致

在ext2为了解决这个问题,借由超级区块当中记录的有效位(是否挂载)和文件系统的状态(是否正确卸载)来判断是否强制检查数据的一致性,或者手动使用e2fsck程序检查,但是这种检查都会检查整个文件系统,相当费时,于是有了后来的日志式文件系统

日志式文件系统(journaling filesystem)

所谓日志就是使用一个区块专门记录文件的写入和修改文件的操作

  • 当系统写入文件时,会在日志记录区记录写入的信息
  • 然后开始正常写入,更新metadata
  • 结束后才会完成此次记录

出问题时就会专门检查这个记录区块,这样就达到了快速修复文件系统,是日志文件系统最基础的功能

Linux文件系统的运行

若编辑一个大型文件,从磁盘读取到内存,再给CPU,编辑中如果再写入磁盘,由于磁盘速度比CPU慢很多,编辑中会频繁的等待,没有效率,于是Linux采用了异步处理asynchronously)的方式,大致过程如下

  1. 内存加载文件,若没被修改,则被系统设置为干净clean
  2. 修改过则是dirty
  3. 系统会不定时的将dirty写进磁盘,或者手动使用sync

也就是将文件放在内存中以提高系统性能,所以Linux文件系统与内存关系很大

  • 系统会将常用的文件加载到内存缓存区
  • 所以Linux的物理内存都会用光,可以提高系统性能
  • 可以手动使用sync将数据写入磁盘
  • 正常关机也会调用sync指令
  • 若不正常关机,因为数据没写进磁盘,重新启动会花更多时间进行磁盘校验,甚至会导致文件系统损坏

挂载点的意义(mount point)

每个文件系统都有inode、区块,要与目录树链接才能使用,这就是挂载

1
2
3
4
[manu@study ~]$ ls -lid / /boot /home
64 dr-xr-xr-x. 17 root root 245 1月 2 22:29 /
64 dr-xr-xr-x. 5 root root 4096 12月 28 07:44 /boot
64 drwxr-xr-x. 3 root root 20 12月 28 07:43 /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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[manu@study ~]$ ls -l /lib/modules/$(uname -r)/kernel/fs
总用量 20
-rw-r--r--. 1 root root 5980 8月 8 02:21 binfmt_misc.ko.xz
drwxr-xr-x. 2 root root 25 12月 28 07:32 btrfs
drwxr-xr-x. 2 root root 30 12月 28 07:32 cachefiles
drwxr-xr-x. 2 root root 24 12月 28 07:32 ceph
drwxr-xr-x. 2 root root 24 12月 28 07:32 cifs
drwxr-xr-x. 2 root root 26 12月 28 07:32 cramfs
drwxr-xr-x. 2 root root 23 12月 28 07:32 dlm
drwxr-xr-x. 2 root root 26 12月 28 07:32 exofs
drwxr-xr-x. 2 root root 24 12月 28 07:32 ext4
drwxr-xr-x. 2 root root 60 12月 28 07:32 fat
drwxr-xr-x. 2 root root 27 12月 28 07:32 fscache
drwxr-xr-x. 2 root root 42 12月 28 07:32 fuse
drwxr-xr-x. 2 root root 24 12月 28 07:32 gfs2
drwxr-xr-x. 2 root root 25 12月 28 07:32 isofs
drwxr-xr-x. 2 root root 24 12月 28 07:32 jbd2
drwxr-xr-x. 2 root root 25 12月 28 07:32 lockd
-rw-r--r--. 1 root root 5216 8月 8 02:21 mbcache.ko.xz
drwxr-xr-x. 6 root root 137 12月 28 07:32 nfs
drwxr-xr-x. 2 root root 46 12月 28 07:32 nfs_common
drwxr-xr-x. 2 root root 24 12月 28 07:32 nfsd
drwxr-xr-x. 2 root root 4096 12月 28 07:32 nls
drwxr-xr-x. 2 root root 27 12月 28 07:32 overlayfs
drwxr-xr-x. 2 root root 27 12月 28 07:32 pstore
drwxr-xr-x. 2 root root 28 12月 28 07:32 squashfs
drwxr-xr-x. 2 root root 23 12月 28 07:32 udf
drwxr-xr-x. 2 root root 23 12月 28 07:32 xfs

VFS(Virtual Filesystem Switch)

Linux通过VFS识别不同的文件系统,Linux识别的文件系统都是VFS管理

更多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
2
3
4
5
6
7
8
9
10
11
12
13
[manu@study ~]$ df -T /boot
文件系统 类型 1K-块 已用 可用 已用% 挂载点
/dev/sda2 xfs 1038336 174128 864208 17% /boot
[manu@study ~]$ xfs_info /dev/sda2
meta-data=/dev/sda2 isize=512 agcount=4, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=262144, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
  • 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自动显示,方便阅读
  • -HM=1024K
  • -T显示硬盘分区的文件系统
  • -i使用inode的形式显示
  • 没选项时默认将系统的所有文件系统全列出来
1
2
3
4
5
6
7
8
9
10
11
12
[manu@study ~]$ df
文件系统 1K-块 已用 可用 已用% 挂载点
devtmpfs 480848 0 480848 0% /dev
tmpfs 497872 0 497872 0% /dev/shm
tmpfs 497872 8768 489104 2% /run
tmpfs 497872 0 497872 0% /sys/fs/cgroup
/dev/mapper/centos-root 10475520 4250208 6225312 41% /
/dev/sda2 1038336 174128 864208 17% /boot
/dev/mapper/centos-home 5232640 122516 5110124 3% /home
tmpfs 99576 4 99572 1% /run/user/42
tmpfs 99576 40 99536 1% /run/user/1000
/dev/sr0 10767514 10767514 0 100% /run/media/manu/CentOS 7 x86_64

这里说一下sr0,sr0是CD-ROM,无法写入,所以使用100%

du

  • 会去文件系统内找当前目录或选定目录的文件数据
  • du [-] dirname/filename
  • -a列出所有的文件和目录容量,默认是目录容量
  • -h以易读的形式显示
  • -s仅列出该目录的总量
  • -S 仅列出子目录
  • -k默认值
  • -m

我们知道,创建文件时会有一个inode,而目录是通过记录文件的inode来链接到该文件的

所谓硬式链接就是:在某目录下创建一个文件,而这个文件的inode是我所需要的文件的inode

实例

1
2
3
4
5
6
[root@study /]# ll -i yangyong.text 
3705 -rw-r--r--. 1 root root 0 1月 2 22:29 yangyong.text
[root@study /]# ln yangyong.text test
[root@study /]# ll -i yangyong.text test
3705 -rw-r--r--. 2 root root 0 1月 2 22:29 test
3705 -rw-r--r--. 2 root root 0 1月 2 22:29 yangyong.text
  • 2表示有两个文件链接到了这个inode

  • 比较安全(相当于备份)

  • 硬链接一般不会占磁盘空间大小

限制

  • 只能在同一个文件系统
  • 不能链接目录

建立一个文件,这个文件记录的是我所需要的文件的文件名

实例

1
2
3
[root@study /]# ln -s yangyong.text test2
[root@study /]# ll test2
lrwxrwxrwx. 1 root root 13 1月 7 22:49 test2 -> yangyong.text
  • test2的文件大小13B,源文件的文件名也是13个字符

  • 源文件没了,链接文件会找不到文件

  • 符号链接就相当于Windows的快捷方式

ln

  • ln [-] sourcefile linkname
  • -s符号链接,默认硬链接
  • -f若有这个linkname则将文件删除再创建

创建一个目录时,这个目录下默认至少有两个文件,.and..,所有新目录会有两个链接数,父目录也会增加一个目录数


参考《鸟哥的Linux私房菜 基础学习篇》

作者

manu

发布于

2020-01-10

更新于

2023-01-06

许可协议


:D 一言句子获取中...