더 이상 디스크 공간이 없습니다 : 공간을 차지하는 것을 어떻게 찾을 수 있습니까?


81

16.04를 실행하는 서버 중 하나에서 문제가 발생했습니다. 디스크 공간이 남아 있지 않습니다.

나는 무엇이 공간을 차지하고 있는지 전혀 모른다. 현재 디렉토리 크기를 나열하는 명령이 있습니까? 그래서 모든 공간을 차지하는 디렉토리를 탐색하고 끝낼 수 있습니까?


1
디스크 사용량 분석기 확인
Pranal Narayan

@PranalNarayan 내 서버에 GUI가 없으므로 두려워합니다 :(
Karl Morrison

1
Darn 당신, 지금 내가 갔고,이 bugs.launchpad.net/ubuntu/+source/baobab/+bug/942255를 발견 하고 그것이 사실 이었으면 좋겠다.
Sam

1
wrt "GUI 없음, 서버입니다": GUI 앱을 설치하고 (사용자가 만족하고 서버에 지원 라이브러리가 있다고 가정 할 경우) X11-tunnelled-through-SSH를 통해 로컬 화면에서 다음과 같은 것을 사용합니다. export DISPLAY=:0.0; ssh -Y <user>@<server> filelight( filelight원하는 도구로 교체 ). 물론 공간이 전혀 남아 있지 않습니다. 도구를 아직 설치하지 않은 경우 어쨌든 다른 것을 사용해야합니다!
David Spillett

4
@DavidSpillett 명시된 바와 같이, 서버에 공간이 남아 있지 않습니다 . 그래서 아무것도 설치할 수 없습니다.
Karl Morrison

답변:


93

Linux에서 항상 그렇듯이 작업을 수행하는 방법은 여러 가지가 있습니다. 그러나 CLI에서 수행 해야하는 경우 이것이 선호되는 방법입니다.

나는 이것을 루트 또는 sudo로 실행하여 시작합니다.

du -cha --max-depth=1 / | grep -E "M|G"

grep은 리턴 라인을 메가 바이트 또는 기가 바이트 범위의 값으로 리턴하는 라인으로 제한합니다. 디스크가 충분히 큰 경우 |T테라 바이트 크기를 포함하도록 추가 할 수도 있습니다 . 당신은 몇 가지 오류가 발생할 수 있습니다 /proc, /sys및 / 또는 /dev그들이 디스크에 실제 파일이 아닌 때문이다. 그러나 루트의 나머지 디렉토리에 대해서는 여전히 유효한 출력을 제공해야합니다. 가장 큰 것을 찾은 후에는 해당 디렉토리 내에서 명령을 실행하여 범인을 좁힐 수 있습니다. 예를 들어, /var가장 큰 경우 다음과 같이 할 수 있습니다.

du -cha --max-depth=1 /var | grep -E "M|G"

아이들에게 문제가 생길 수 있습니다!

추가 고려 사항

위의 명령은 확실히 트릭을 수행하지만 아래 주석에 포함 할 수있는 몇 가지 사항을 지적하는 건설적인 비판이있었습니다.

  1. grep디렉토리 또는 파일 이름에 대문자 G 또는 M이있는 경우 제공 한 I로 인해 가끔 "K"값이 반환 될 수 있습니다. K 값 디렉토리가 표시되지 않도록하려면 보다 창의적이고 복잡한 정규식 게임. 예 :grep -E "^[0-9\.]*[MG]"
  2. 어떤 드라이브가 문제인지 알고 그 위에 다른 마운트 된 드라이브가 있고 검색에 시간을 낭비하지 않으려는 경우 명령에 -x플래그를 추가 할 수 있습니다 du. 해당 플래그에 대한 매뉴얼 페이지 설명 :

      -x, --one-file-system
          skip directories on different file systems
    
  3. du가장 높은 값이 맨 아래에 오도록 명령 의 출력을 정렬 할 수 있습니다 . 명령 끝에 이것을 추가하십시오.| sort -h


이것이 바로 내가하는 일입니다.
궤도에서 가벼움 경주

5
grep은 이름이 M 또는 G 인 폴더도 반환합니다. 크리에이티브 정규 표현식은 선택적인 dot + M | G를 사용하여 숫자를 "^[0-9]*[.]*[0-9]*[MG]"
적어야합니다.

4
문제가되는 드라이브가 하나 인 경우 해당 -x옵션을 사용하여 du하나의 드라이브 (명령 줄에서 제공)를 유지할 수 있습니다 . sort -h메가 바이트 / 기가 바이트의 사람이 읽을 수있는 값을 올바르게 정렬하기 위해 파이프를 통과 할 수도 있습니다. 나는 일반적으로 --max-depth옵션을 벗어난 채 전체 드라이브를 이런 식으로 검색하여 가장 큰 것을 바닥에 갖도록 적절하게 정렬합니다.
Muzer

1
@alexis 내 경험에 따르면 때로는 관심이있는 마운트 포인트 아래에 다른 쓰레기가 쌓이는 경우가 있습니다 (특히 그 경우 /), 사용 -x하면 물건을 잘못 계산하지 않을 것이라는 보장이 있습니다. 당신 /이 가득 차 있고 당신이 별도로 장착 된 /home또는 무엇이든 가지고 있다면 , 사용하는 -x것은 관련이없는 물건을 제거하는 데 거의 필요합니다. 그래서 만약을 대비하여 항상 사용하기가 더 쉽다는 것을 알았습니다.
Muzer

1
당신이 종류를 가지고 있다면 grep이 필요하지 않습니다.
OrangeDog

77

ncdu이것을 위해 사용할 수 있습니다 . 잘 작동합니다.

sudo apt install ncdu

여기에 이미지 설명을 입력하십시오


34
나는 실제로이 프로그램을 실제로 사용함에 따라 나 자신을 쫓고있다. 그러나 남은 공간이 없기 때문에 그것을 설치할 수 없다
Karl Morrison

@KarlMorrison 몇 가지 가능한 솔루션을 보았습니다. 다른 컴퓨터의 sshfs 위에 마운트하고 ncdu를 실행하십시오 (ssh 서버가 이미 있다고 가정합니다.)-또는 ssh 서버가없는 경우 할 수 있습니다 반대로, 다른 서버에 ncdu를 설치하고 sshfs를 사용하여 마운트하고 마운트에서 ncdu를 실행하십시오 (서버에 sshfs가 이미 있다고 가정)-또는 ncdu가 단일 스크립트가 아닌 경우 ... ncdu가 단일 스크립트 인 경우 그냥 할 수 curl http://path/to/ncdu | sh있고 인 메모리 IO stdin 캐시에서 실행되지만 행운이 필요합니다. 램 디스크를 만드는 방법이있을 것입니다
hanshenrik

@KarlMorrison 또는 Linux의 라이브 이미지를 부팅하여 설치할 수 있습니다.

sudo ncdu /명령 줄에서 설치 한 유형 sudosudo를 넣지 않으면 루트가 소유 한 폴더의 크기를보고하지 않으며, /입력하지 않으면 현재 폴더에서 recusively보고 만하기 때문에
Max Carroll

19

이 명령을 사용합니다

sudo du -aBM -d 1 . | sort -nr | head -20

때로는 /이상한 위치에 무언가를 배치 했으므로 디렉토리 에서 디렉토리 를 실행해야합니다 .


작동에 대한 +1 제공! 그러나 TopHats 솔루션은 실제로 내 드라이브를 더 빨리 읽습니다!
칼 모리슨

나는 종종 -d 1스위치 없이 (그리고 일반적으로 less대신에 head -20) 이 작업을 수행하는 것이 더 유용하다는 것을 알았습니다. 따라서 모든 파일과 디렉토리의 전체 재귀 적으로 열거 된 목록을 그들이 소비하는 공간으로 정렬하여 얻습니다. 그런 식으로 디렉토리가 많은 공간을 차지하는 것을 볼 경우 아래로 스크롤하여 공간의 대부분이 실제로 특정 파일이나 하위 디렉토리에 의해 차지되는지 확인할 수 있습니다. 불필요한 공간을 확보하기 위해 삭제할 파일과 디렉토리를 찾는 좋은 방법입니다. 보관하고 삭제하고 반복하고 싶지 않은 것이 보일 때까지 아래로 스크롤하면됩니다.
Ilmari Karonen

@KarlMorrison 그것은 더 빨리 읽지 않습니다 sort. 출력을 시작하기 전에 출력이 완료되기를 기다리는 것입니다.
muru

@muru 아 좋아. 그러나 더 나은 용어라면 더 빨리 횡단을 시작할 수 있도록 정보를 더 빨리 얻습니다!
Karl Morrison

13

대부분의 공간을 차지하는 디렉토리를 찾는 방법에 대한 좋은 답변이 이미 많이 있습니다. 작은 파일이 아닌 큰 파일이 주된 문제라고 생각할만한 이유가 있다면 다음과 같은 것을 사용할 수 있습니다 find / -size +10M.


11

우분투를 모르고 답변을 확인할 수 없지만 오래 전에 유닉스 관리자로서의 경험을 바탕으로 답변을 게시 할 수 있습니다.

  1. 공간이 부족한 파일 시스템 찾기

    df -h
    

    모든 파일 시스템, 크기 및 여유 공간을 나열합니다. 충분한 공간이있는 파일 시스템을 조사하면 시간이 낭비됩니다. 전체 파일 시스템이 / myfilesystem이라고 가정하십시오. / myfilesystems의 하위 디렉토리에 마운트 된 파일 시스템이 있으면 df 출력을 확인하십시오. 그렇다면 다음 상황에서이 상황에 맞게 조정해야합니다.

  2. 이 파일 시스템의 파일이 얼마나 많은 공간을 사용하는지 확인하십시오

    du -sh /myfilesystem
    

    -x 옵션은이 파일 시스템의 구성원 인 파일 만 고려되도록 보장하는 데 사용될 수 있습니다. 일부 Unix 변형 (예 : Solaris)은 du의 -x 옵션을 모릅니다. 그런 다음 몇 가지 해결 방법을 사용하여 파일 시스템의 du를 찾으십시오.

  3. 이제 보이는 파일의 du가 대략 df로 표시되는 사용 된 공간의 크기인지 확인하십시오. 그렇다면 정리할 / myfilesystem 파일 시스템의 큰 파일 / 디렉토리를 찾기 시작할 수 있습니다.

  4. 디렉토리의 가장 큰 하위 디렉토리를 찾으려면 /.../dir 사용

    du -sk /.../dir/*|sort -n
    

    -k 옵션은 du가 단위없이 sie를 킬로바이트 단위로 출력하도록합니다. 일부 시스템에서는 이것이 기본값 일 수 있습니다. 그런 다음이 옵션을 생략 할 수 있습니다. 가장 큰 파일 / 하위 디렉토리가 출력의 맨 아래에 표시됩니다.

  5. 더 이상 필요없는 큰 파일 / 디렉토리를 찾으면 적절한 방법으로 제거 할 수 있습니다. 출력 상단의 작은 디렉토리를 신경 쓰지 마십시오. 삭제해도 문제가 해결되지 않습니다. 여전히 공간이 충분하지 않으면 목록 맨 아래에 표시되는 큰 하위 디렉토리에서 4 단계를 반복 할 수 있습니다.

그러나 du 출력이 대략 df로 표시되는 사용 가능한 공간이 아닌 경우 어떻게됩니까?

du 출력이 더 크면 다른 파일 시스템이 마운트 된 서브 디렉토리를 놓쳤습니다. du 출력이 훨씬 작 으면 som 파일은 검사하는 디렉토리에 표시되지 않습니다. 그의 현상에는 다른 이유가있을 수 있습니다.

  1. 일부 프로세스는 이미 삭제 된 파일을 사용하고 있습니다. 따라서이 파일은 디렉토리에서 제거되어 du를 볼 수 없습니다. 그러나 파일 시스템의 경우 프로세스가 파일을 닫을 때까지 블록이 계속 사용됩니다. 관련 프로세스 (예 : lsof)를 찾아서이 파일을 강제로 닫을 수 있습니다 (예 : 응용 프로그램 중지 또는 프로세스 종료). 또는 단순히 컴퓨터를 재부팅하십시오.

  2. 상위 디렉토리 중 하나에 다른 파일 시스템이 마운트되어 더 이상 표시되지 않는 파일이 디렉토리에 있습니다. 따라서 / myfilesysem / subdir / bigfile 파일이 있고 / myfilesystem / subdir에 다른 파일 시스템을 마운트하면 더 이상이 파일을 볼 수 없습니다.

    du -shx /myfilesystem 
    

    / myfilesystem / subdir / bigfile의 크기를 포함하지 않는 값을보고합니다. 이러한 파일이 존재하는지 확인하는 유일한 방법은 / myfilesystem / subir을 마운트 해제하고 다음을 확인하는 것입니다.

    ls -la /myfilesystem/subdir 
    

    파일이 포함되어있는 경우

  3. ls 명령이 볼 수없는 디스크 공간을 사용 / 예비하는 특수한 유형의 파일 시스템이있을 수 있습니다. 이것을 표시하려면 특별한 도구가 필요합니다.

du 명령을 사용하는이 체계적인 방법 외에도 사용할 수있는 다른 방법이 있습니다. 따라서 find 명령을 사용하여 제공 한 값보다 큰 파일을 찾거나 제공 한 값보다 크거나 새로 생성되었거나 특수한 이름을 가진 파일을 검색 할 수 있습니다 (예 : * .log, core, * .trc). 그러나 올바른 파일 시스템에서 작업하려면 항상 1에 설명 된대로 df를 수행해야합니다.


사용량이 많은 서버에서는 항상 마운트를 해제 할 수 없습니다. 그러나 상위 디렉토리를 임시 위치에 마운트 할 수 있으며 다른 마운트는 포함되지 않으며 숨겨진 파일에 대한 액세스를 허용합니다.
Zan Lynx

시스템화하기 전에 마운트 실패로 인해 / 마운트를 휴지통으로 채 웁니다. 예를 들어 USB 드라이브를 연결하지 않고 / mnt / backup에 백업을 작성합니다. 이제 해당 작업 단위에 마운트 요구 사항이 있는지 확인합니다.
Zan Lynx

@ZanLynx 내가 들어 본 적이 감사 바인드 마운트 하기 전에
miracle173

@ZanLynx : 바쁜 서버 만이 아닙니다. /tmp별도의 파일 시스템 (예 : tmpfs)과 파일 /tmp이 다른 파일 시스템의 마운트 지점이되기 전에 파일을 생성 했다고 가정 해보 십시오. 이제 이러한 파일은 루트 파일 시스템에 있으며 마운트 포인트로 음영 처리되어 복구 모드로 재부팅하지 않고 (처리되지 않음 /etc/fstab) 바인드 마운트와 같이 액세스 할 수 없습니다 .
David Foerster 2016 년

9

명령을 사용하지 않으려 는 경우 앱이 있습니다. Filelight

어떤 폴더에서 디스크 공간을 사용하고 있는지 빠르게 시각화 할 수 있습니다.

여기에 이미지 설명을 입력하십시오


GUI가 아닌 SSH로 연결된 서버입니다.
Karl Morrison

@KarlMorrison ssh를 통해 GUI 프로그램을 실행하는 방법이 있다고 생각하지만 나중에 패키지를 설치할 공간이 생겼을 때의 아이디어입니다.
Xen2050

@David 오 예, 나는 그것을 벗어나려고 노력하고 있습니다. 내가 사용한 다른 플랫폼에서 필요했습니다. 나는 그 의견을 고칠 것이다.

@Karl 네, X가 이미 클라이언트에 설치되어 있다면 쉽습니다 : ssh -X <your host>그리고 커맨드 라인에서 프로그램을 실행하십시오

@MarkYisri 요점은 프로그램과 그 종속성을 설치해야한다는 것입니다. Filelight의 경우 최소한 KDElib 및 Qt가 필요하지만 실제로는 작지 않습니다. 파일 라이트 Ubuntu 패키지에 대해서는이 페이지를 참조하십시오 .
Ruslan

5

시도 sudo apt-get autoremove당신이하지 않은 경우 사용하지 않는 파일을 제거


1
벌써 전에 그랬어요 :(하지만 다른 사람들에게는 좋은 생각입니다!)
Karl Morrison

3

나는 이것을 자주 사용한다

du -sh /*/

그런 다음 큰 폴더를 찾으면 해당 폴더로 전환하여 추가 조사를 수행합니다.

cd big_dir
du -sh */

필요한 경우 자동으로 정렬 할 수도 있습니다.

du -s /*/ | sort -n

2

실제로 대답은 아니지만 부록입니다.

공간이 부족하여 @erman의 답변에서 ncdu를 설치할 수 없습니다.

몇 가지 제안

  • sudo apt clean all이미 다운로드 한 패키지를 삭제합니다. 안전한
  • sudo rm -f /var/log/*gz1 ~ 2 주가 지난 로그 파일 제거-최신 / 현재 로그를 삭제하지 않습니다. 대부분 안전
  • sudo lsof | grep deleted열려있는 모든 파일을 나열하지만 디스크에서 삭제 된 파일로 필터링합니다. 공정한 안전
  • sudo rm /tmp/*일부 임시 파일을 삭제하십시오. 사용중인 파일이 있으면 프로세스를 혼란스럽게 할 수 있습니다. 안전하지 않다

`lsof는 다음과 같이 줄을 반환 할 수 있습니다.

server456 ~ $ lsof | grep deleted
init          1          root    9r      REG              253,0  10406312       3104 /var/lib/sss/mc/initgro                        ups (deleted)
salt-mini  4532          root    0r      REG              253,0        17     393614 /tmp/sh-thd-1492991421                         (deleted)

init 줄에 대해 많은 것을 할 수는 없지만 두 번째 줄은 salt-minion에 파일이 삭제되었음을 보여주고 서비스가 다시 시작될 때 모든 파일 핸들이 닫히면 디스크 블록이 반환됩니다.

다른 일반적인 용의자에는 syslog / rsyslog / syslog-ng, 오징어, 아파치 또는 "무거운"서버 실행 프로세스가 포함됩니다.


2

필자는 Filelight와 같은 도구의 출력을 특히 중요하게 생각하지만 귀하의 경우 서버에는 일반적으로 GUI가 설치되어 있지 않지만 du항상 명령을 사용할 수 있습니다.

내가 일반적으로하는 일은 :

  • du출력을 파일에 씁니다 ( du / > du_output.txt).
  • 내 컴퓨터에 파일을 복사하십시오.
  • 임시 디렉토리에 출력 DuFS을 "마운트"하는 데 사용 합니다 du. 출력 DuFS에 따라 FUSE를 사용하여 가상 파일 시스템을 만듭니다 (= 실제로 파일이 생성되지 않고 모두 가짜 임) du.
  • 이 임시 디렉토리에서 Filelight 또는 다른 GUI 도구를 실행하십시오.

면책 조항 : 필자는 dufs헤드리스 시스템의 디스크 공간을 자주 찾아야하기 때문에 정확히 썼습니다 .


-n du_output.txt를 정렬 할 수 있습니다
Zan Lynx

사용 된 공간의 그래픽 표시가 더 직관적이라는 것을 알았습니다.
Matteo Italia

-1

@TopHat와 유사하지만 이름에 M, G 또는 T가있는 경우 일부 파일을 필터링합니다. 첫 번째 열에서 크기가 빠질 것이라고는 생각하지 않지만 파일 이름을 창의적으로 지정하지 않으면 파일 이름과 일치하지 않습니다.

du -chad 1 . | grep -E '[0-9]M[[:blank:]]|[0-9]G[[:blank:]]|[0-9]T[[:blank:]]'

c 또는 a가 무엇을했는지 몰랐기 때문에 명령 줄 스위치가 여기에 설명되어 있습니다 .

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