使用fallocate和mkfs.ext4可能会超出可用磁盘空间

使用fallocate和mkfs.ext4可能会超出可用磁盘空间

背景:我们有一个计算机集群,在节点分配时,作业会获取自己所请求大小的 tmp 目录。但我注意到我可以将两个作业发送到同一台机器,其请求的总磁盘空间大于可用空间。我将该错误追踪到fallocatemkfs.ext4

在具有 1.1T 可用磁盘空间的测试节点/计算机上,我创建虚拟磁盘来挂载 tmp 目录。使用fallocatemkfs.ext4

# fallocate -l 900G /tmp/disk-test1
# /sbin/mkfs.ext4 -F /tmp/disk-test1
# fallocate -l 900G /tmp/disk-test2
# /sbin/mkfs.ext4 -F /tmp/disk-test2

创建两个文件(看起来)大小均为 900G

# ll --block-size=G /tmp/
...
-rw-r--r--. 1 root  root 900G Jul  4 14:03 disk-test1
-rw-r--r--. 1 root  root 900G Jul  4 14:03 disk-test2
...

并查看可用磁盘空间

# df -h
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/vg.01-lv_root  1.1T  8.6G  1.1T   1% /
...

/tmp 目录:

# df -h /tmp
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/vg.01-lv_root  1.1T  8.6G  1.1T   1% /

我不希望这种事发生。如果没有足够的剩余空间,则不得创建虚拟磁盘,并且一旦安装,对虚拟磁盘的写入应受到其大小的限制。

这里发生了什么?

答案1

是的,我可以重现:

# df -h .
Filesystem           Size  Used Avail Use% Mounted on
/dev/root             30G   14G   14G  51% /
# fallocate -l 8G test1.disk
# df -h .
Filesystem           Size  Used Avail Use% Mounted on
/dev/root             30G   22G  5.8G  80% /
# mkfs -text4 test1.disk
mke2fs 1.43.4 (31-Jan-2017)
Discarding device blocks: done                            
Creating filesystem with 2097152 4k blocks and 524288 inodes
...
# df -h .
Filesystem           Size  Used Avail Use% Mounted on
/dev/root             30G   14G   14G  51% /

当文件被 d 时,磁盘使用率上升fallocate,但在 d 后又下降mkfs。请注意“丢弃设备块:完成”在 的输出中mke2fs。 (弗罗斯特舒茨在评论中提到了这一点.)

手册页说的是-E discard:

尝试在 mkfs 时丢弃
块(最初丢弃块对于固态设备和稀疏/精简配置存储很有用)。 ...这是默认设置。

要做nodiscard相反的事情,所以让我们尝试一下:

# df -h .; fallocate -l 8G test2.disk; mkfs -text4 -Enodiscard test2.disk; df -h .
Filesystem           Size  Used Avail Use% Mounted on
/dev/root             30G   14G   14G  51% /
mke2fs 1.43.4 (31-Jan-2017)
Creating filesystem with 2097152 4k blocks and 524288 inodes
...
Filesystem           Size  Used Avail Use% Mounted on
/dev/root             30G   22G  5.9G  79% /

现在另一个fallocate -l 8G失败了。

相关内容