我需要使用比大多数文件系统上通常可用的更多的 inode。因此,我创建并挂载了一个带有自定义 inode 设置的 ext4 文件系统:
dd if=/dev/zero of=loop0.img bs=1MB count=5000
losetup --find --show `pwd`/loop0.img
mkfs -t ext4 -i 1024 /dev/loop0
mount /dev/loop0 /mnt
这将在磁盘上创建一个 5000MB 的文件(通过ls /mnt
),但是当我检查使用df
它时显示磁盘未被占用(磁盘空间没有增加 5000MB)。我怀疑是因为它在磁盘上归零并且看起来像未使用的空间。
随着磁盘已满,我有一个程序会尝试删除最近最少使用的文件,直到磁盘空间压力消除。事实证明,尽管删除了 中的文件/mnt
,但它仍然注册为占用我的磁盘空间,至少根据df
和其他磁盘空闲系统调用。
那么有没有一种特殊的方法需要rm
这个虚拟磁盘上的文件来注册空间是可用的?还是我需要以非标准方式查询可用空间?
编辑:完整的命令和输出,注意磁盘使用量/dev/vda1
不会增加 5000MB。
root@localhost:~# df
Filesystem 1K-blocks Used Available Use% Mounted on
udev 490064 0 490064 0% /dev
tmpfs 101092 3188 97904 4% /run
/dev/vda1 19343152 2699088 15660656 15% /
tmpfs 505448 0 505448 0% /dev/shm
tmpfs 5120 0 5120 0% /run/lock
tmpfs 505448 0 505448 0% /sys/fs/cgroup
tmpfs 101088 0 101088 0% /run/user/0
root@localhost:~# dd if=/dev/zero of=loop0.img bs=1MB count=5000
5000+0 records in
5000+0 records out
5000000000 bytes (5.0 GB, 4.7 GiB) copied, 6.20117 s, 806 MB/s
root@localhost:~# losetup --find --show `pwd`/loop0.img
/dev/loop0
root@localhost:~# mkfs -t ext4 -i 1024 /dev/loop0
mke2fs 1.44.5 (15-Dec-2018)
Discarding device blocks: done
Creating filesystem with 1220703 4k blocks and 4884000 inodes
Filesystem UUID: 4f308a54-6ddd-4ef6-b685-c193dfec8b84
Superblock backups stored on blocks:
8176, 24528, 40880, 57232, 73584, 204400, 220752, 400624, 662256,
1022000
Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
root@localhost:~# mount /dev/loop0 /mnt
root@localhost:~# df
Filesystem 1K-blocks Used Available Use% Mounted on
udev 490064 0 490064 0% /dev
tmpfs 101092 3216 97876 4% /run
/dev/vda1 19343152 2769404 15590340 16% /
tmpfs 505448 0 505448 0% /dev/shm
tmpfs 5120 0 5120 0% /run/lock
tmpfs 505448 0 505448 0% /sys/fs/cgroup
tmpfs 101088 0 101088 0% /run/user/0
/dev/loop0 3594900 45080 3289556 2% /mnt
您可以使用
fstrim
:未使用的(就图像上的文件系统而言)空间将被转换为“孔”(在稀疏文件意义上)。
正如您可能已经猜到的那样,您也可以安装
-o discard
- 只需注意结果可能会稍微延迟。