Linux
刪除文件時掛載的 .img 文件不會清理磁碟空間
我需要使用比大多數文件系統上通常可用的更多的 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
:$ 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
- 只需注意結果可能會稍微延遲。