1 文件系统
- 定义:分区上文件的组织方法和数据结构
- 常见文件系统:
- Windows:NTFS、FAT32
- Linux:ext2/3/4、XFS
2 EXT文件系统
-
super block:超级区块,记录整个文件系统相关信息的地方,可以使用
dumpe2fs /dev/sda
查看,记录的主要信息有:- 数据区块和inode的总量
- 未使用与已使用的inode与数据区块数量
- 数据区块与inode的大小(block为1、2、4K,inode为128B或256B)
- 文件系统的挂载时间、最近一次写入数据的时间、最近一次检验磁盘(fsck)的时间等文件系统的相关信息
- 一个有效位数值:若此文件系统已被挂载,则有效位为0,否则为1
-
Group Descriptor Table:GDP,块组描述符表,描述每个区块组群的开始与结束区块,以及说明在这个块组中哪里开始是inode Table,哪里开始是data blocks等等
-
block bitmap:区块对照表,用来描述整个块组中哪些块已用哪些块空闲,本身占一个块,每一个bit代表本块组的一个block,1为已用,0表示空闲
-
inode bitmap:inode对照表,与区块对照表类似,记录已使用和未使用的inode号码
-
inode table:inode表,由一个块组中的所有inode组成,每个inode记录的数据(元数据)可以通过
stat FILENAME
查看:- 该文件的读写属性(read、write、excute)
- 该文件的拥有者和拥有组(owner、group)
- 该文件的类型:
- d:目录
- -:普通文件
- c:字符设备
- b:块设备
- s:套接字文件
- l:软连接
- p:pipe管道文件
- 该文件的大小
- 该文件的时间戳(atime、ctime、mtime)
- 定义文件特性的标志(flag),如SetUID等
- 该文件真正内容的指针(pointer)
inode的数量与大小也是在格式化时就固定了
- 每个inode大小固定为128B(ext4 与 xfs 可设置到256B)
- 每个文件都仅会占用一个inode
- 读取文件时需要先找到inode,并分析inode所记录的权限与用户是否符合,符合才能执行操作
- 文件系统能够建立的文件数量与inode的数量有关
-
data block:数据区块,真正用来存放文件数据的地方,支持的区块大小由1、2、4K三种,在格式化时区块大小就被固定了,且每个区块都有编号,以方便inode记录。以下是ext2文件系统的限制:
block大小 1KB 2KB 4KB 最大单一文件限制 16GB 256GB 2TB 最大文件系统总容量 2TB 8TB 16TB - 原则上区块大小与数量在格式化完成后就不能修改
- 每个区块内最多只能放置一个文件的数据
- 如果文件大于区块大小,则一个文件会占用多个区块
- 如果文件小于区块大小,则该区块剩余容量就不能够再被使用,磁盘空间会浪费
3 inode结构
以1K区块来说明,每条区块号码的记录会使用4B,因此1K的大小能够记录256条记录:
- 12个直接指向:12×1K=12K
- 1个间接指向:256×1K=256K
- 1个双间接指向:256×256×1K= 25 6 2 256^2 2562K
- 1个三间接指向:256×256×256×1K= 25 6 3 256^3 2563K
- 总额=12+256+256×256+256×256×256=16GB
4 链接
作用:文件复用的一种形式
4.1 硬链接
用法:ln FILE1 FILE2
- 硬链接文件与源文件共用同一个inode,可以通过
ls -i
查看 - 硬连接数跟inode被引用的次数相同,可以通过
ll
查看 - 硬链接不能对目录做:简单的说做目录的硬链接涉及到一个递归链接的问题,会很复杂
- 硬链接不能跨文件系统:不同系统可能会导致inode相同
[root@localhost ~]# cp /etc/services ./link
[root@localhost ~]# ln link link_hard
[root@localhost ~]# ll -i link*
155520 -rw-r--r--. 2 root root 670293 3月 17 04:46 link
155520 -rw-r--r--. 2 root root 670293 3月 17 04:46 link_hard
# 可以看出link和link_hard两个文件的inode是相同的,而硬连接数也变成了2
[root@localhost ~]# ll -di .
130306 dr-xr-x---. 18 root root 4096 3月 17 04:46 .
实际上文件内容是与inode相关的,文件名只是目录中的数据,硬链接的实际示意图如下:
目录的data block中记录了文件名和对应的inode,访问文件的过程为:通过目录的inode找到目录的data ==> 从data中得知该文件名指向的文件inode ==> 通过文件inode访问文件
4.2 符号连接
也叫软连接
用法:ln -s FILE1 FILE2
- 本质为快捷方式
- 使用新的inode和block
- 符号链接可以对文件或目录做
- 符号链接能跨文件系统
[root@localhost ~]# ll -ih link*
155520 -rw-r--r--. 2 root root 655K 3月 17 04:46 link
155520 -rw-r--r--. 2 root root 655K 3月 17 04:46 link_hard
155530 lrwxrwxrwx. 1 root root 4 3月 17 04:58 link_soft -> link
# 可以看到软连接的inode和大小都与源文件不同
5 相关问题
- block的大小越大越好还是越小越好
block大小太小,大型文件会占用数量更多的区块,而inode也要记录更多的区块号码,可能造成文件系统读写性能不佳
block太大,可能会产生较严重的磁盘浪费
假设你的Ext2文件系统使用 4K block ,而该文件系统中有 10000 个小文件,每个文件大小均为 50bytes,由于 Ext2 文件系统中一个 block 仅能容纳一个文件,因此每个 block 会浪费『 4096 - 50 = 4046 (byte)』, 系统中总共有一万个小文件,所有文件容量为:50 (bytes) x 10000 = 488.3Kbytes,但此时浪费的容量为:『 4046 (bytes) x 10000 = 38.6MBytes 』
- 磁盘空间不足,原因可能是什么
- block不够用
- inode不够用
- block被进程占用没被释放
- 文件管理命令对inode、block的操作是怎样的?
- 创建
- 向当前文件系统申请空闲inode
- 按需申请空闲block,存放实际数据
- 在上一级目录的block中添加目录项(entry)
- 复制
- 向目标目录所在文件系统申请空闲inode和block
- 把源文件的block中的数据复制到目标block中
- 元数据放在inode中,并在目录的block里添加目录项
- 移动
- 同文件系统:只是移动了目录项
- 不同文件系统:复制+删除
- 删除
- 硬连接数=1
- 把block和inode置空
- 移出目录项
- 硬连接数>1
- 移出目录项
- 硬连接数-1
- 硬连接数=1
- 创建