공간이 부족한 Linux 서버


31

나는 두 번의 연속 인터뷰 에서이 질문을 받았지만 여러 시스템 관리자와 조사하고 점검 한 결과 좋은 대답을 얻지 못했습니다. 누군가가 나를 도울 수 있는지 궁금합니다.

서버의 디스크 공간이 부족합니다. 로그 파일이 매우 커서 제거해도 안전한지 확인하십시오. 파일을 삭제했지만 디스크가 여전히 가득 찼음을 표시합니다. 이 문제의 원인은 무엇이며 어떻게 해결 하시겠습니까? 이 로그 파일을 작성하는 프로세스를 어떻게 알 수 있습니까?


3
더 나은 시스템 관리자와 상담해야합니다. 이것은 사소한 것입니다.
울다

2
사소한 것이지만 상황과 질문은 종종 충분히 나옵니다.
ewwhite

OP가이를 수락 할 수 있습니까?
ewwhite

5
사소한 지 아닌지 유창하게 말하지 않는 사람 (예 : 주로 Windows 관리자)은 배우는 것이 좋습니다.
John Gardeniers

답변:


56

이것은 일반적인 인터뷰 질문이며 다양한 프로덕션 환경에서 발생하는 상황입니다.

파일의 디렉토리 항목이 삭제되었지만 로깅 프로세스가 여전히 실행 중입니다. 모든 파일 핸들이 닫히고 (예 : 프로세스가 종료 됨) 모든 디렉토리 항목이 제거 될 때까지 운영 체제가 공간을 회수하지 않습니다. 파일에 쓰는 프로세스를 찾으려면 lsof명령 을 사용해야합니다 .

질문의 다른 부분은 때때로 "프로세스를 종료하지 않고 쓰여지는 파일을 어떻게 지우나요?"일 수 있습니다. 이상적으로 는 파일을 삭제하는 대신 로그 파일"제로"또는 "잘라 내기"하는 것이 가장 : > /var/log/logfile좋습니다.


1
... 또는 fuser.
Steven 월요일

1
비트 확장 : 디스크의 파일에 대한 모든 참조가 사라질 때까지 다른 공간에서 해당 공간을 사용할 수 없습니다. 여기에는 파일 핸들이 포함됩니다. 그것은 또한이 속임수가 작동하도록합니다 : serverfault.com/questions/45237/link-to-a-specific-inode
Jeff Ferland

1
no-clobber설정 한 경우 :>| /var/log/logfile
Belmin Fernandez

2
모든 인터뷰에서이 질문의 변형을 묻습니다. "디스크가 가득 찼습니다. df공간이 부족 du하다고 말하고 거의 사용하지 않는다고 말합니다. 원인은 무엇이며 왜 두 도구가 동의하지 않습니까?"
voretaq7

> /var/log/file디스크 공간이 여전히 100 %에 도달 하면 어떻게해야합니까 ? 로그 파일이 비어있는 것 같지만이 로그 파일에 기록하는 프로그램을 다시 시작한 후에 만 ​​공간이 복구됩니다. 프로그램을 다시 시작하지 않고 디스크 공간을 복구하는 방법이 있습니까?
alemani

14

파일에 대한 또 다른 링크가 있습니다 (하드 링크 또는 열린 파일 핸들). 파일을 삭제하면 디렉토리 항목 만 삭제됩니다. 마지막 참조가 제거 될 때까지 파일 데이터와 inode가 정지됩니다.

서비스가 임시 파일을 작성하고 파일을 열어 둔 상태에서 즉시 삭제하는 것이 일반적입니다. 이렇게하면 디스크에 파일이 생성되지만 프로세스가 비정상적으로 종료되는 경우 파일이 삭제되고 다른 프로세스가 파일에서 실수로 스톰 핑되는 것을 방지 할 수 있습니다. 예를 들어 MySQL은 모든 온 디스크 임시 테이블에 대해이 작업을 수행합니다. 맬웨어는 종종 유사한 전술을 사용하여 파일을 숨 깁니다.

Linux에서는 다음과 같이 삭제 된 파일에 편리하게 액세스 할 수 있습니다 /proc/<pid>/fd/<filenumber>.


8

나는 sysadmin은 아니지만 Unix.SE에서 수집 한 것에서 Linux 시스템은 파일을 가리키는 모든 파일 설명자가 파일을 링크 할 때까지 링크가 해제 된 후에 실제로 파일을 삭제하지 않습니다 (공백 / 재사용 가능으로 표시) 폐쇄되었습니다. 따라서 첫 번째 부분에 대답하기 위해 프로세스가 여전히 그것을 읽고 있기 때문에 공간이 아직 비어 있지 않습니다. 두 번째에 답하기 위해와 함께 파일을 사용하는 프로세스를 확인할 수 있습니다 lsof.


2

명백한 하드 링크 / 열린 파일 응답 외에 한 가지 대안은이 파일은 /var/log/lastlogRHEL 과 같이 (아주 많은 공간을 차지하지 않는 ) 매우 스파 스 파일 입니다. 삭제하면 영향이 거의 없으므로 다음으로 큰 파일을 확인해야합니다.


1

파일을 쓰는 프로세스가 루트 인 경우 수퍼 유저 예약 파일 공간에 씁니다. 파일 시스템에는 사용자 작업이 디스크를 채우는 경우 시스템 작동을 유지하기위한이 공간이 있습니다. 이 공간 (기본값은 5 % 임)은 많은 도구에서 보이지 않습니다.

lsof는 어떤 프로세스가 파일을 잠 갔는지, ergo가 파일에 쓰고 있음을 보여줄 수 있습니다.


1
tune2fs를 사용하여이 예약 비율을 조정할 수도 있습니다. 디스크 공간을 확보하는 동안 서버가 계속 실행되도록하는 빠른 방법입니다.
sjbotha

1

프로세스가 파일을 여는 것 외에도 두 번째 경우는 btrfs또는 같은 스냅 샷을 지원하는 파일 시스템이있는 경우입니다 ZFS.

예를 들어, 거대한 로그 파일이 존재하는 스냅 샷을 만듭니다. 지금 파일을 삭제하면 델타 만 삭제됩니다. 델타는 파일을 사용하지 않을 때만 삭제됩니다.

참조 :

세 번째 경우는 블록 수준 중복 제거를 지원하는 파일 시스템이 있고 대부분의 파일이 다른 파일과 동일한 경우입니다. 로그 내용이 동일하도록 동일한 FS를 공유하는 syslog 컨테이너 또는 VM에 로그를 보내는 컨테이너 또는 VM이 ​​없으면 로그에 대해 이것이 발생할 것으로 예상되지 않습니다.

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