
У меня есть потребность использовать больше инодов, чем обычно доступно в большинстве файловых систем. Поэтому я создаю и монтирую файловую систему 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
Это создаст файл размером 5000 МБ на диске (через ls /mnt
), но когда я проверяю использование, df
он показывает, что диск не занят (место на диске не увеличивается на 5000 МБ ). Я подозреваю, что это потому, что он обнулен на диске и выглядит как неиспользуемое пространство.
По мере заполнения диска у меня есть программа, которая пытается удалить файлы, которые использовались реже всего, пока не исчезнет давление на диске. Оказывается, несмотря на удаление файлов в /mnt
, он все еще регистрируется как занимающий место на моем диске, по крайней мере, согласно df
и другим системным вызовам освобождения диска.
Так есть ли какой-то особый способ, которым мне нужно rm
зарегистрировать свободное место на этом виртуальном диске? Или мне нужно узнать о свободном месте нестандартным способом?
Редактировать: Полная команда и вывод. Обратите внимание, что использование диска /dev/vda1
не увеличивается на 5000 МБ.
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
решение1
Вы можете использовать fstrim
:
$ rm /tmp/test.img
rm: cannot remove '/tmp/test.img': No such file or directory
$ truncate -s 1G /tmp/test.img
$ sudo losetup --show -f /tmp/test.img
/dev/loop0
$ sudo mkfs.ext4 -E root_owner=1000:1000 /dev/loop0
mke2fs 1.46.2 (28-Feb-2021)
Discarding device blocks: done
Creating filesystem with 262144 4k blocks and 65536 inodes
Filesystem UUID: 70f9b205-0ada-43b1-8636-36983ad79394
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
$ sudo mount /dev/loop0 /tmp/meh/
$ openssl enc -pbkdf2 -aes-256-ctr -in /dev/zero -pass file:/dev/urandom -nosalt 2>/dev/null | dd of=/tmp/meh/fill iflag=count_bytes count=768M
1572864+0 records in
1572864+0 records out
805306368 bytes (805 MB, 768 MiB) copied, 2.15669 s, 373 MB/s
$ sudo umount /tmp/meh/
$ sudo mount /dev/loop0 /tmp/meh/
$ rm /tmp/meh/fill
$ sudo umount /tmp/meh/
$ sudo mount /dev/loop0 /tmp/meh/
$ du -h /tmp/test.img
802M /tmp/test.img
$ sudo fstrim -v /tmp/meh/
/tmp/meh/: 973.4 MiB (1020678144 bytes) trimmed
$ du -h /tmp/test.img
33M /tmp/test.img
Неиспользуемое (с точки зрения файловой системы на образе) пространство будет преобразовано в «дыры» (вразреженный файлсмысл).
Как вы уже догадались, вы -o discard
также можете выполнить монтирование с помощью — просто учтите, что результат может быть немного задержан.