어젯밤에 예상했던 것보다 더 많은 출력 데이터를 생성하는 일부 프로그램을 실행했는데 결국 루트 ext4 파티션이 채워졌습니다. 문제가 되는 프로세스를 종료하고 더 이상 필요하지 않은 외부 데이터를 삭제하기 시작했는데 다음과 같은 결과가 나타났습니다.
$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 3.4G 0 3.4G 0% /dev
tmpfs 690M 11M 680M 2% /run
/dev/sda4 810G 806G 0 100% /
tmpfs 3.4G 0 3.4G 0% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 3.4G 0 3.4G 0% /sys/fs/cgroup
/dev/sda1 476M 26M 450M 6% /boot/efi
tmpfs 690M 0 690M 0% /run/user/1000
보시다시피 "Used"가 "Size"보다 4GB 적음에도 불구하고 여유 공간이 없습니다. 이것이 일부 프로세스에 의해 열린 삭제된 파일이라고 가정하고 lsof를 사용하여 가장 큰 파일이 64MB /memfd:pulseaudio임을 확인했습니다.
혼란스러워서 시스템을 재부팅했는데 문제가 해결될 것이라고 거의 확신했습니다. 그러나 df의 출력은 변경되지 않습니다.
어떻게 이럴 수있어? 어떻게 해결할 수 있나요?
$ uname -a
Linux ... 4.16.0-1-amd64 #1 SMP Debian 4.16.5-1 (2018-04-29) x86_64 GNU/Linux
$ cat /etc/issue
Debian GNU/Linux buster/sid \n \l
답변1
ext4
루트로 실행되는 프로세스에 의해서만 채워질 수 있는 "예약된 블록"이라는 개념이 있습니다. 출력에서는 df
이를 고려할 수 있습니다.
예를 들어, 한 시스템에서는 다음과 같이 df
표시됩니다.
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 30626752 14557916 14490036 51% /
여기서 30626752 - 14557916 - 14490036은 1578800과 동일하며 이는 예약된 블록의 기본 개수인 전체의 약 5%에 해당합니다. 예약된 블록 비율을 0으로 변경2fs 조정( tune2fs -m 0 /dev/sda1
) 표시된 숫자가 변경되었습니다 df
.
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 30626752 14557924 16052444 48% /
(숫자는 여전히 정확히 일치하지 않습니다. 16384개의 1k 블록이 계산되지 않았지만 이는 어떤 이유로든 "사용된" 것으로 계산되지 않는 일부 내부 파일 시스템 구조 때문이라고 생각합니다.)