7.1认识Linux文件系统
重点:inode、block(数据区块)、superblock(超级区块)
7.7.1 磁盘组成与分区的复习
磁盘结构
GPT与MBR
区别
- MBR早,GPT晚
- MBR最多支持2T ,GPT支持大于2T的总容量及大于2T的分区,并且几乎没有上限,最大支持到128个分区,分区大小支持到256TB。
- MBR第一扇区(512 byte)有主引导记录(MBR 446 byte)和分区表(64byte)。分区表记录如何分区,分为主要分区扩展分区(最多一个)与逻辑分区,如果超过4个需要用逻辑分区,分区信息记录在每个分区最前面。
GPT兼容MBR并且支持UEFI,每个分区都有自己的启动扇区。
磁盘以文件表示
linux中设备都以文件形式在/dev中表示,如磁盘为/dev/sd[a-p物理][1-128分区]
7.1.2 文件系统特性
- Linux与Windows文件系统不一样,默认情况下不通用
- 一个可挂载的数据是一个文件系统(并非一个分区)
- 超级区块: inode与数据区块总量 使用量 剩余量 数据区块与inode大小 文件系统有关信息,一个文件系统中只有一个
- BlockGroup: 区块的集合,文件系统的部分
- inode(index node):文件属性 用户组 时间 数据区块号码 本质上是在某些区块中存索引 固定大小 一个文件(包括目录)一个inode
- 数据区块:文件内容
- 存索引的inode类文件系统一般不需要碎片整理 fat会因为存的文件离散需要碎片整理
7.1.3 Linux的ex2文件系统(inode)
文件系统:boot+group+group...
group: inode信息 数据
限制:
- 区块数量大小格式化后不能再修改
- 每个区块最多一个文件(浪费容量)
缺点:
区块大:小文件多浪费空间
区块小:inode多读写性能差
记录一个区块指针需要4B,一个inode包含12个直接、1个间接、1个双间接、1个三间接,所以1K区块下一个文件最大12+256+256256+256256*256个数据区块共16G
如何查看这些信息
sudo blkid 查询目前被系统格式化的数据
dumpe2fs [-bh] 设备文件名 (在ext系统下)
xfs_info 挂载点或设备文件名 (在xfs文件系统下)
输出:超级区块信息+区块群组信息
7.1.4与目录树的关系
- 4KB区块存100K,需要26个Block,因为还有一个存多的inode
- inode本身不记录文件名,所以需要逐层进入目录,并读取下一层的inode(内含权限)
- 文件系统用久了可以复制出所有文件格式化再复制回去,使得数据连续,提高读写性能
7.1.5 ext2/ext3/ext4 文件的存取与日志式文件系统的功能
存
- 读所在目录inode中记载的是否有w权限,如有
- 根据inode对照表找未使用的inode,将新文件的权限属性写入
- 根据区块对照表找未使用的区块,将数据写入,更新inode指向数据
- 同步更新inode与数据到各自对照表
取
- 根据inode查看是否有x权限
- 查看下一层inode,继续检查权限
- 如有权限,打开文件或进入下一层目录
数据不一致
- 原因:断电等
- ext2: 数据检查
- ext3、ext4:Journal日志(预备、实际写入、结束三个阶段),检查日志出问题的文件而不用检查全盘
7.1.6 Linux文件系统的运行
异步处理
修改时将文件读入内存标记为clean,修改后标记为dirty但并不立即写入硬盘,需要调用sync。
不正常关机时会导致磁盘校验。
7.1.7 挂载点的意义(mount point)
文件系统与目录树
挂载:文件系统与目录树结合,比如将/
挂载到/dev/sda1
这个设备
相同文件系统类型的不同文件系统目录树根的inode相同,不同文件系统内文件inode值可能重复,同一个文件系统inode与文件一一对应。
7.1.8 其他Linux支持的文件系统与VFS
Linux支持多种文件系统,包括传统、日志、网络的,以下命令可以查询。
ls -l /lib/modules/$(uname -r)/kernel/fs # 系统支持的
cat /proc/filesystems # 加载到内存中的
VFS(Virtual Filesystem Switch)是位于内核层的系统调用,帮助处理读取不同文件系统
7.1.9 XFS文件系统简介
ext4不好:预先分配所有inode,格式化慢,不适合大容量磁盘
XFS好:适合大容量磁盘和巨型文件
lsattr
和chattr
可以更改隐藏属性,但是xfs不支持部分隐藏属性
xfs分为数据区(data section)、文件系统活动登录区(log section)、实时运行区(realtime section)
数据区
同ext,分为超级区块、剩余空间的管理、inode分配与追踪。但是inode动态分配,格式化快。且数据块(4K以上内核不给挂载)与inode大小(256B-2M)可以自定义。
文件系统活动登录区
类似日志区,所有文件变化在此记录,当完全被写入记录才被删除,用于校验。可指定外部磁盘作为该区。
实时运行区
先在该区段中寻找数个extent区块,将文件放到这些区块中,等分配完了再写入数据区中的inode与区块中。
xfs文件系统查看信息
df -T 路径 #查询路径文件系统,具体见7.2
xfs_info 挂载点|设备文件名 #查看超级区块记录
注意点:如果对/boot
使用,可以看到/dev/sda2
指向某个物理设备,但是对/
使用,可以看到指向/dev/mapper/centos-root
。这是因为在安装系统时候,设备分区使用了LVM而非标准分区,linux为你自动创建的空间池,用多少取多少。
ypeng@study:~ $ ll /dev/mapper/centos-root
lrwxrwxrwx. 1 root root 7 3月 28 11:59 /dev/mapper/centos-root -> ../dm-0
含有inode大小、个数、总数、区块大小、数量、与阵列stripe
有关的信息
7.2 文件系统的简单操作
df
df [-ahikHTm]
-a : 列出**所有**文件系统
-h : 容量自动单位换算
-i : 显示inode数量不显示磁盘容量
-T : 显示所在硬盘分区的文件系统
/proc
中1kblock,used,free都是0,因为这个目录挂载在内存中
/dev/shm/
是用内存虚拟出的磁盘空间
不知道某个目录/文件所在挂载点,还想知道这个分区还能存多少东西?
df [目录名|挂载点名]
du
du [-ahskm]
-s : 列出仅当前目录
不加参数:列出当前目录和所有**目录**
-a : 列出目录和文件
-S : 不统计子目录中的文件
7.2.2 硬链接与符号链接
硬链接
- 在访问目录中文件时,查到目录的inode之后找目录的数据,目录的数据存的文件名->inode。硬链接只是加了一条文件名->inode,并没有产生新的文件。
- 硬链接权限属性完全一样。
- 既不增加inode数,也不减少inode数
- 可以通过任何一个文件名写入,删除一个文件名inode和区块还在
- 不能跨文件系统(inode重复)
- 不能链接目录(需迭代进行,复杂度高,不支持,但是
.
和..
目录例外,每新建一个目录其链接数为2,包括其自身和.
,其父目录链接数+1,由于..
)
ln 建立硬链接
符号链接
ln -s
- 等同于Windows快捷方式
- 可以链接目录
-
源文件删除后符号链接打不开
磁盘的分区、格式化、检验与挂载
流程: 分区->格式化->检验(可选)->挂载(Linux特色)
7.3.1 观察磁盘分区状态
lsblk [-dfimpt] [设备名] #列出磁盘分区 [设备名]只可以输入disk,不能输入分区
查看UUID(全局唯一标识符):lsblk-f
或blkid
parted 设备文件 print #列出磁盘分区信息
磁盘分区:gdisk(GPT)/fdisk(MBR)
分区流程:lsblk
或blkid
查看分区->gdisk
或fdisk
根据提示操作
区块与扇区:区块针对文件系统而言,扇区针对物理硬盘而言
不要处理正在活动的分区(已挂载的分区),linux将不能更新分区表
添加分区默认按序号给分区编号,且默认开始扇区从第一个未被占用的扇区开始。
7.3.3 磁盘格式化(创建文件系统)
功能:使用文件系统格式化软件格式化磁盘分区。
命令:mkfs.xfs
mkfs.ext4
mkfs
mkfs.xfs -b 区块容量 -d 有关datasection的数值 -f 分区内已经有文件系统强制执行
-i inode数值Log内置或者放到其他设备等,-r 与实时区有关
mkfs.ext4 [-b 区块大小] [-L 设备名称]