마운트된 .img 파일은 파일이 삭제될 때 디스크 공간을 정리하지 않습니다.

마운트된 .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까지 올라가지 않습니다). 디스크가 0으로 처리되어 사용되지 않은 공간처럼 보이기 때문에 의심됩니다.

디스크가 가득 차면 디스크 공간 압박이 제거될 때까지 가장 최근에 사용되지 않은 파일을 삭제하려고 시도하는 프로그램이 있습니다. 에서 파일을 삭제했음에도 불구하고 적어도 다른 디스크 여유 시스템 호출 /mnt에 따르면 이 파일은 여전히 ​​내 디스크의 공간을 차지하는 것으로 등록됩니다 .df

rm그러면 공간이 비어 있음을 등록하기 위해 이 가상 디스크의 파일 에 필요한 특별한 방법이 있습니까 ? 아니면 비표준 방식으로 여유 공간을 문의해야 합니까?

편집: 전체 명령 및 출력에 따르면 디스크 사용량이 /dev/vda15000MB 증가하지 않습니다.

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. 결과가 약간 지연될 수 있다는 점만 참고하세요.

관련 정보