设备、文件系统、挂载三层
一句话总结
块装置是字节的排列,文件系统是放在该排列上的数据结构,挂载是将该数据结构附加到目录树上的行为。这三者完全是独立的。
为什么需要这个?
一句“磁盘满了”中至少包含了四个不同的问题。
- 街区真的都堵住了(
df -h加100%) - inode先掉了 (
df -i去100%,区块有余地) - 谁在打开已删除的文件,空间无法恢复(
df哇du不一致) - 本来那个路径不是预想中的文件系统(无法挂载)
四个原因和应对方法完全不同。但是症状是一样的No space left on device都。要区分三层才能分开这四个人。
怎么行动
1层—块装置
/dev/sda,/dev/nvme0n1p1,环路装置/dev/loop0这些都是相同的。对内核来说,这只是一个可以读写的字节数组。
这里有一个重要的事实。文件系统不是块装置,也可以在普通的文件上创建。mkfs.ext4不在乎对象是设备还是文件。只是把对象从一开始确定的结构写进去。多亏了这种特性,即使没有特权也能学习文件系统内部。
truncate -s 256M /root/disk/lab.img # 희소 파일 — 실제 점유는 0
mkfs.ext4 -F -L LABHUB /root/disk/lab.img
blkid /root/disk/lab.img
dumpe2fs -h /root/disk/lab.img
debugfs -R 'ls -l /' /root/disk/lab.img
truncate制作的文件是稀疏文件(sparse)。逻辑大小为256MB,但实际磁盘占用率几乎为0。du --apparent-size哇du可以确认的值是不同的。
第2层 — 文件系统
mkfs创建的是超级块+inode表+块组。dumpe2fs -h读超级区块的话会出现这样的值。
| 项目 | 意义 | 为什么重要 |
|---|---|---|
| Block size | 块的大小(通常4096) | 文件太小的话内部会碎片化 |
| Inode count | 格式化时固定的inode数量 | ext4以后不能增加 |
| Reserved block count | root专用预约块 | 基本5%,在大容量数据磁盘上浪费 |
| Filesystem UUID | 这个文件系统的唯一ID | 在fstab中代替设备名使用 |
**inode在格式化时数量是固定的,以后不能增加。**所以如果会话文件或邮件队列创建数百万个小文件,即使留下块,inode也会先下降。容量警报是df -h哇df -i两者都要走路的理由。
预约块也是实际操作要点。在根文件系统中,基本5%是合理的(留出root写日志的空间),但在8TB数据磁盘上相当于玩弄400GB。tune2fs -m 1降低到。
3楼 — 机架
挂载将文件系统粘贴到目录树的一个节点上。在这里需要区分两点。
- 设备名称(
/dev/sdb1)是不稳定的。如果添加磁盘或改变引导顺序,sdb会变成sdc。所以fstab中使用UUID或LABEL。 - **原先在挂载点目录中的文件只是被遮蔽了,不会消失。**解挂后会再次显示出来。“数据消失了”的报告实际上有时是“新文件系统覆盖了它”。
粘上磁盘后必须做的事情
粘贴新磁盘并进行安装的步骤虽然很短,但如果遗漏的话,会在重新启动时显示。 有项目。
不是写名字,而是写UUID。/dev/sdb根据设备的顺序而变化。
如果再贴一个磁盘或者顺序不同的话/etc/fstab的那个线把其他磁盘
会指着,最坏的情况是引导停止。
blkid /dev/sdb1
# UUID="..." TYPE="ext4"
**在fstab上nofail决定要放什么。**如果没有的话,当那个磁盘没有粘住时,启动会
掉到紧急壳里。如果是数据光盘的话nofail放入后,系统会浮起来。
最好用警报通知,如果没有那个磁盘的话,如果服务毫无意义的话
删除是正确的。
**在修理之前,先测试一下是否可以安装。**重新启动确认是最好的方法。 是昂贵的方法。
mount -a # fstab 대로 전부 붙여 본다. 오류가 나면 여기서 난다
findmnt --verify # 문법과 대상까지 검사한다
查看排序和预约块。 ext4默认将5%预约给root,1TB 在数据磁盘上相当于玩弄了50GB。如果是数据专用的话,也可以减少。
tune2fs -m 1 /dev/sdb1
扩展有两个步骤。即使在云端增加容量,文件系统也保持不变。
增加隔断(growpart), 然后增加文件系统(resize2fs或者
xfs_growfs). 可以装载后一直延长,但一般不能缩短 —
XFS根本不支持压缩。所以与其一开始就大范围地压缩,不如小范围地压缩。
抓住并增加的一边比较安全。
**现在决定是否使用LVM。**如果以后要变更,就需要移动数据。将磁盘 如果有其他计划或需要快照,请从头在LVM上创建。
在现场相遇的样子
由于安装失败导致根目录被挂死的事故。/var/lib/postgresql本来是为了安装单独的磁盘而设计的,但是fstab项不正确,无法安装。数据库开始在根文件系统上写入数据,没有任何抱怨。几天后,根占用了100%,整个系统停止运行。所以在安装点目录中.not-mounted也有团队把相同的标记文件放在应用程序中,让应用程序确认它。
下次实习要做的事情
在文件上创建真正的ext4,提取UUID,读取超级块,tune2fs更改预约比例,debugfs往里面看。最后用UUID写入挂载该图像的fstab行。