삭제 된 파일에서 공간을 확보하도록 fs에 지금 알리십시오.


73

커널에게 빈 디스크 공간을 다시 제공하도록하는 방법이 있습니까? / proc /의 무언가에 쓰는 것처럼? ext4와 함께 Ubuntu 11.10 사용.

이것은 아마도 오래 되고 반복되는 주제 일 것입니다. 편집자가 내가 열어 놓은 소스 코드 파일을 저장할 수 없을 때만 0 공간을 두른 후 폴더 목록에서 0 바이트 크기의 공포로 인해 삭제 행위를 계속했습니다.

사용자와 루트 모두에서 100MB의 대용량 파일을 삭제했으며 하드 링크도 수행했습니다.

apt-get clean/ var / cache / apt / archives에 900MB가 넘기 전에 108KB 만 있습니다.

# du
108 /var/cache/apt/archives

한 시간 후에도 여전히 여유 공간이없고 편집기에서 열린 소중한 파일을 저장할 수 없지만 아래의 불일치에 주목하십시오.

# sync; df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda4             13915072  13304004         0 100% /

어떤 제안? 일부 서비스 / 프로세스를 종료했지만 누가 디스크 공간을 적극적으로 사용하고 있는지 확인하는 방법을 모릅니다.

더 많은 정보

# dumpe2fs  /dev/sda4
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              884736
Block count:              3534300
Reserved block count:     176715
Free blocks:              422679
Free inodes:              520239
First block:              0
Block size:               4096
Fragment size:            4096

4
파일 시스템은 즉시 공간을 비 웁니다. 그러나 ext [234]의 루트 예약 블록 기능과 커널이 열린 파일을 예약 된 상태로 유지하는 방법에 따라 공간이 손실 될 수 있습니다.
hahaamu

여러 파일 시스템 (파티션)이있는 경우 한 공간을 확보하면 다른 공간에서는 아무 효과가 없습니다.
vonbrand

"예약 된"5Go 블록이 스스로 회수되기 전에 왜 파티션을 채울 수 있었습니까?
Psddp

답변:


116

lsof열려있는 파일이 있는지 확인하십시오 . 공간이 닫힐 때까지 여유 공간이 확보되지 않습니다.

sudo /usr/sbin/lsof | grep deleted

어떤 삭제 된 파일이 여전히 열려 있는지 알려줍니다.


좋은. mysqld/ tmp에 약간의 잠금이 있지만 apport-gt/ var / lib / apt / lists / partial /에서 멸종 된 파일을 많이 사용하는 것으로 나타났습니다. 그래서 나는 killall apport-gt먼저 그것을 조사 할 것입니다.
Marcos

1
파일 핸들 / 프로세스를 닫은 직후에 공간을 실제로 "백백"하지는 않았지만 가장 가까운 대답으로 표시합니다. 다른 커널 / 프로세스 / fs 기반 접근 방식을 찾고 있습니다.
Marcos

18
lsof +L1링크를 해제 한 열린 파일을 선택할 수도 있습니다 .
Martin Fido

이 답변의 정보는 정확하지만 OP에 발생한 문제는이 문제가 아니라 루트 예약 공간 (다른 답변이 해결)에 의해 발생했을 수 있습니다.
marcelm

37

lsof삭제되었지만 열려있는 파일에서 여전히 공간을 사용하는 파일을 찾는 데 사용하십시오 .

lsof | grep deleted | grep etilqs_1IlrBRwsveCCxId
chrome     3446       user  128u      REG              253,2              16400       2364626 /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)  

/proc/<pid>/fd/해당 파일 핸들 에 해당 항목을 찾으십시오 .

ls -l /proc/3446/fd/etilqs_1IlrBRwsveCCxId
lrwx------. 1 user unix 64 Feb 11 15:31 128 -> /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)

이제 cat /dev/nullfd로 들어 가자.

cat /dev/null > /proc/3446/fd/128

inode가 여전히 열려 있지만 이제 길이는 0입니다.

chrome     3446       user  128u      REG              253,2         0    2364626 /var/tmp/etilqs_1IlrBRwsveCCxId (deleted)

5
cat자르기 위해 불필요한 사용 . Bourne 쉘에서는 그렇게 > /proc/3446/fd/128할 것입니다.
200_success

2
나중에 프로그램이 페이지 캐시에서 사용 가능하거나 사용 불가능할 수있는 파일의 일부를 실제로 다시 읽을 것으로 예상되는 경우이 작업을 수행하지 마십시오.
Michael R. Hines

13

df로 예약 된 공간을 표시하지 않습니다 root(로 실행되는 경우에도 root).

# df -h
Filesystem            Size  Used Avail Use% Mounted on
...
/dev/optvol           625G  607G     0 100% /opt
...

"예약 된 블록 비율"을 변경하는 방법

  1. 예약 된 공간을 4 %로 줄입니다.

    # tune2fs -m4 /dev/sda4

df -h 이제 45M 무료로 표시되었습니다.

  1. 내 파일을 빠르게 저장했습니다
  2. 다시 5 %로

    # tune2fs -m5 /dev/sda4


2
현재 루트 예약 공간은 거의 항상 너무 큽니다. 몇 퍼센트로 줄일 수 있습니다. df일반 사용자가 사용할 수있는 공간을 표시합니다. apt가 루트로 실행되므로 예약 된 공간은 루트가 아닌 사용자 (= 일반 사용자 및 자체 사용자가있는 서비스)로 인한 채우기를 방지하는 데만 유용합니다.
jofel

동의한다; mkfs요즘은 예를 예약해야한다. 5 % 또는 300MB 중 작은 쪽입니다 . 내 서버 중 일부를 2 %로 다시 조정하고 GB를 다시 확보했습니다!
Marcos

3
@ 조펠, 아니, 그렇지 않습니다. 사용률이 90 %를 넘을 때마다 많은 조각화가 시작됩니다. 사용률이 100 %에 근접하지 않고 더 많은 공간을 확보해야합니다.
psusi

@psusi 귀하의 의견에 감사드립니다. 그러나 일반 사용자로서 (임시) 거의 모든 사용 가능한 공간을 사용할 수있는 기회는 실제로 실용적이며 ext4에서는 더 이상 나쁘지 않습니다. unix.stackexchange.com/a/7965/15241
jofel

7

우분투에서 휴지통을 사용하여 파일을 삭제하면 파일이 완전히 제거되지 않았을 가능성이 큽니다.

휴지통을 비운 후에도 파일은 ~/.local/share/Trash/expunged재부팅 후까지 더 길어질 수 있습니다.

나는 이것에 대한 좋은 이유를 찾지 못했지만, 공간이 부족하면 항상 수동으로 rm삭제 된 휴지통 파일을 찾습니다.


1
좋은 지적. 비록 나는 명령 행으로 살고 죽는 사람들 중 하나이지만 그래픽 파일 관리자를 거의 사용하지 않습니다. 그러나 휴지통 비우기 클릭은 항상 숨겨져 있음을 알지 못합니다. 휴지통 비우기 클릭은 항상 최종적이며 필요할 때 디스크 공간을 반환했습니다.
Marcos

6
sudo lsof | grep "(deleted)$" | sed -re 's/^\S+\s+(\S+)\s+\S+\s+([0-9]+).*/\1\/fd\/\2/' | while read file; do sudo bash -c ": > /proc/$file"; done

설명 : 삭제 된 파일 만 추출하도록 출력을
정리 lsof하십시오. Sed는 각 행에서 프로세스 ID 및 파일 디스크립터 ID를 추출하고 형식으로 문자열을 작성하십시오 {pid}/fd/{fid}. 반복하면서 각 파일에 아무것도 출력하지 않고 비워 둡니다.


3
예기치 않은 토큰`( ' "근처에 오류"구문 오류가 발생했습니다
Majid Golshadi

5

sync여기서 도움이 되는지 궁금합니다. 그러나 대부분의 ( "다수"?) 시스템에서 IIRC가 파일 시스템을 30 초마다 동기화하지 않아야합니다.

커널 로그 (그래서 dmesg)를 검사하여 불쾌한 일이 일어나고 lsof있는지 확인하고 큰 삭제 된 파일이 여전히 열려 있는지 확인합니다 (실제로 삭제 된 파일은 lsof출력 에서 그렇게 표시됩니다 ).

삭제 된 파일이 공간을 해제하지 못하게하는 두 가지 이유 (링크 된 질문 중 하나)

  • 파일이 실제로 삭제되지 않았 음 : 당신은 다른 곳 hardlinked 된 파일을 삭제 (더 정확하게, 당신은 unlink()하나 개 이상의 링크 파일을 에드)
  • 여전히 열려있는 파일 : 열린 파일은 디렉토리 항목이 아닌 파일, 아이 노드 자체를 사용하여 북 케팅됩니다. 항목을 삭제해도 아이 노드는 여전히 열려있는 한 계속 유지됩니다.

그러나 왜 그렇게 많은 파일에서 발생할 수 있는지에 대한 구체적인 이유를 모르겠습니다 ...


sync도움이되지 않았습니다. 로그는 우분투 시스템이므로 버그가 많기 때문에 일반적으로 시끄 럽습니다. apport/ var / crash의 파일 크기는 77MB에 불과하지만 매일 밤마다 apt-get 업데이트가 충돌하기 때문에 자주 배포되었습니다. 또한 눈치 atd처럼 줄을 반복하여 / var에 / 로그 / 시스템 로그를 범람했다 atd[8892]: File a0015c0152ab76 is in wrong format - aborting아마도들은 / var / spool / cron / atspool에서 몇 개의 파일부터 있던 모든 공 크기 물론 문제의 원형 만들기
마르코스

1

CentOS 6.3은 또한 실제로 비어 있지 않은 쓰레기통을 비울 수 있습니다. 방금 달릴 때까지 공간을 되 찾을 방법을 찾지 못했습니다 rm -rf ~/.local/share/Trash/expunged/. 많은 머리를 긁적.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.