LabHub
学习 学习路径 课程

存储与挂载

设备、文件系统、挂载三层

在 LabHub 中继续学习

一句话总结

块装置是字节的排列,文件系统是放在该排列上的数据结构,挂载是将该数据结构附加到目录树上的行为。这三者完全是独立的。

概念图: 块装置 · 文件系统 · 挂载 · inode先掉了

为什么需要这个?

一句“磁盘满了”中至少包含了四个不同的问题。

  1. 街区真的都堵住了(df -h加100%)
  2. inode先掉了 (df -i去100%,区块有余地)
  3. 谁在打开已删除的文件,空间无法恢复(dfdu不一致)
  4. 本来那个路径不是预想中的文件系统(无法挂载)

四个原因和应对方法完全不同。但是症状是一样的No space left on device都。要区分三层才能分开这四个人。

存储器的三层和各层产生的症状。最下面的块装置是字节阵列,这里产生的情况是块真的满了。中间的文件系统是超级块和inode表,inode数量在格式化时是固定的,所以即使有块也可能先丢失inode。在顶部的挂载中,可能会出现有人打开已删除的文件,或者最初的路径不是预期的文件系统

怎么行动

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-sizedu可以确认的值是不同的。

第2层 — 文件系统

mkfs创建的是超级块+inode表+块组dumpe2fs -h读超级区块的话会出现这样的值。

项目 意义 为什么重要
Block size 块的大小(通常4096) 文件太小的话内部会碎片化
Inode count 格式化时固定的inode数量 ext4以后不能增加
Reserved block count root专用预约块 基本5%,在大容量数据磁盘上浪费
Filesystem UUID 这个文件系统的唯一ID 在fstab中代替设备名使用

**inode在格式化时数量是固定的,以后不能增加。**所以如果会话文件或邮件队列创建数百万个小文件,即使留下块,inode也会先下降。容量警报是df -hdf -i两者都要走路的理由。

预约块也是实际操作要点。在根文件系统中,基本5%是合理的(留出root写日志的空间),但在8TB数据磁盘上相当于玩弄400GB。tune2fs -m 1降低到。

3楼 — 机架

挂载将文件系统粘贴到目录树的一个节点上。在这里需要区分两点。

粘上磁盘后必须做的事情

粘贴新磁盘并进行安装的步骤虽然很短,但如果遗漏的话,会在重新启动时显示。 有项目。

不是写名字,而是写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行。