장치에 남은 공간이 없음 문제 해결방법
No space left on device
안녕하세요
오늘은 디스크 공간이 없는 문제죠 no space left on device 라고 하는 에러 메시지에 대해서 어떻게 접근하고 해결할 수 있을지에 대해 짧은 영상으로 말씀을 좀 드려 보려고 합니다
에러는 이런 식으로 확인이 되요 파이썬, 자바 프로그램이든 어떤 프로그램이든 상관없어요 사실은 다양하게 나타날 수 있는 상황이 있는데요
꼭 한쪽으로만 일어날 수 있는 건 아니구요
그리고 또 이 문제가 사실은 다른 문제로 나타나는 경우도 있어요
예를 들어서 "No such file or directory" 라는 에러 메세지로 나타날 수도 있습니다
무슨 말이냐면 파일이 그냥 없는 거잖아요 파일명을 잘못 입력했을 수도 있잖아요 라고 할 수도 있겠지만 특정 프로그램들은 실행 도중에 임시적으로 파일을 생성하는 경우들이 있습니다 그런데 파일 공간이 없어서 생성을 못한 거야 그리고 나서 그 파일을 접근하려고 했어
그러면 당연히 no search 파일 에러가 뜨죠 사실 근본원인(root cause)는 파일을 만들 수 있는 디스크 공간이 없는 게 근본 원인인 거죠
이런 식으로 우리가 원래 실제 근본원인이 이렇게 직접적으로 no space라는 표현을 통해서 실제 공간이 없다라고 그냥 표현을 하는 경우들도 있지만
다른 에러 메시지로 현상과 결과가 나타나서 우리가 오해할 수 있다는 것도 항상 생각을 해야 됩니다
항상 에러 메시지는 결과와 현상이에요 그래서 그런 것들을 이해하시는 게 필요하겠구요
특히 나 이 용량 문제에 대해서 이제 보실 때 확인하실 때 우리가 이런 문제가 발생하면 일단 맨 처음에 명령을 입력해야 되는 건 뭡니까?
요거죠 df -h를 통해서 현재 몇 퍼센트 쓰는지를 보는 거예요
그런데 이게 100 %면 말 그대로 디스크 공간이 없는 거고 사용 중인 게 디스크 100 %라는 걸 알 수 있는데요
여러분들이 여기서 또 많이 헷갈려 하시는 것 중에 하나가 이렇게 했는데 100 %가 아니야 그런데 이 에러가 자꾸 터져! 이런 경우들도 있거든요
이런 경우에는 사실 뭘 봐야 되냐면 df -i 를 봐야 됩니다
이것도 에러 메시지는 사실은 결과와 현상이고 실제 근본 원인은 다른 데 있을 수 있다는 사실을 계속 끊임없이 가져가야 되는 이유예요
그러니까 공간이 없는 거는 맞는데 그 공간이 실제 우리가 파일블록을 넣을 수 있는 공간이 없는 게 아니라 inode 블록을 채워 넣을 수 있는 공간이 없을 때에도 동일한 에러 메시지가 뜰 수가 있습니다
그러니까 inode라고 하는 것은 파일을 다루는 단위에요 파일을 다루는 단위고 자료구조입니다
그 inode를 생성하는게 지금 현재 사용하고 있는 루트 파일 시스템에 파일 시스템 타입에 따라서 몇 개까지 되는지 지금 저희 같은 경우는 ext4고요 exd4로 포맷했을 때 btrfs로 포맷했을 때 그 파일 시스템 포맷들마다 inode의 개수, 그러니까 가용 범위내로 범주가 있는 그 inode의 개수가 있어요 그런데 그 개수를 넘어서게 된다면 실제 파일 블록이 들어갈 수 있는 물리적인 공간은 있지만 inode의 개수가 꽉 차서 no space라는 오류가 동일하게 발생할 수가 있습니다
그래서 그런 것들도 함께 한번 말씀 좀 드려봤구요 어찌 됐든 이렇게 결과를 만났어요
그러면 내가 임의적으로 파일을 크게 만들어 가지고 이렇게 디스크 공간이 커졌다면 그걸 지우면 되요
그런데 우리가 현장에서 이런 오류를 만나면 문제가 되는게 뭐냐면 뭘 지워야 될지 모릅니다 어떤 걸 지워야 될지 굉장히 헤멜텐데요
하나씩 한번 알아보도록 하죠
일단은 첫번째로 명령어가 있습니다
du 라는 명령어를 통해서요
우리가 그 차지하고 있는 것을 찾을 수 있어요 그러니까 저도 굉장히 많이 쓰는 것 중에 하나인데요
du 라는 명령어를 통해서 human-readable하게 보고 권한이 없는 것들은 에러메시지를 출력을 안 할 거고요
sort를 하는데 -r, --reverse 그러니까 높은 것 부터 보는 거예요 기가(G, giga), 메가(M, mega), 킬로(K, kilo) 높은 것 부터 보는 거고 human-readable로 출력되고 있는 G, M, K 에 따라서 sort 를 하는게 -h, --human-numeric-sort 가 됩니다
human-readable 넘버 숫자 값을 기준으로 해서 sort을 하겠다는 뜻이구요 여기서 TOP 20 을 이제 볼 수 가 있습니다.
head로 해서 출력 결과에 20라인만 보이게 되는 거에요 이런 식으로 하게 되면은 계산하는 게 좀 오래 걸려요
그런데 계산하고 나면은 어떤 폴더에서 얼마만큼 많이 쓰는지를 보기 때문에 하나씩 추적해 나가기가 정말 좋습니다
한가지 말씀을 드려보면 우리가 var/lib 라든지 var/ cach라든지 이런 폴더들이 좀 많이 쓰이기는 해요
일반적으로 특히나 우리가 도커 같은 거 쓰시거나 이제 Kubernetes 같은거 쓰시게 되면 var/lib폴더 밑에 그러니까 ls /var/lib 폴더 밑에 이제 이미지 파일이라든지 이런 것들이 같이 쌓일 수가 있거든요
그래서 이 공간이 좀 넓어지는 경우에는 사용하지 않는 이미지들 로컬 이미지들(예: /var/lib/docker/ 안에 있는 이미지들)을 지우는게 도움이 될 수 있습니다.
이런 식으로 사실 말하자면 연관되어 있는 게 정말 많아요 디스크 공간의 용량을 확보하는 상황들의 경우의 수가 사실 굉장히 많은데 이거는 사실은 어쩔 수 없습니다 하나씩 하나씩 살펴보면서 연습하는게 필요할 수가 있겠고요 디스크 공간 관련되서 같이 연이어서 우리가 공부할 수 있는것이 패키지입니다 패키지가 임시적으로 저장하는 폴더가 있어요 그리고 임시적으로 저장하는 폴더를 비워주게 되면 공간을 조금 더 확보할 수가 있습니다
그래서 그런 부분들도 우리가 이제 패키지를 다루시게 되면은 패키지를 이해하시게 되면은 용량을 확보할 때 굉장히 용이할 수 있는 전략 중에 하나라고 말씀을 드릴 수가 있을 것 같구요
두 번째로 보여드릴 수 있는게 이겁니다.
이제 autoremove 부터 시작을 할 수가 있을 것 같아요
autoremove 는 패키지라고 하는게 특정 A라는 패키지가 있다면 다른 패키지들을 같이 사용해야 되는 경우들이 있어요 의존되는 패키지 처음에는 필요하겠지만 최초에 받았던 그 A라는 패키지를 지우고 나면 그 의존하는 패키지가 더 이상 필요 없는 경우가 생성될 수가 있습니다
이렇게 더 이상 의존하지 않고 이제 누군가와 연관되서 사용되지 않고 있는 패키지들은요 삭제가 될 필요성이 있죠
이때 autoremove 라는 걸 통해서 이런 것들을 지울 수 있고 공간 확보를 조금 더 할 수 있습니다
그리고 이제 또 한가지 더 팁을 드려보면은 /var/cache/apt 아까전에 /var/lib 폴더 안에서는 여러가지가 있는데 대표적으로 도커 이미지
컨테이너 이미지 같은 것들 존재한다고 말씀드렸는데요
/var/cache/apt 의 archives 라고 하는 것은 이제 우리가 패키지 받게 되면 임시적으로 파일들이 저장되서 공간들이 들어가 있어요
그런 것들은 apt clean이라던지 이런 걸로 비워주시게 되어도 상관이 없거든요
이거는 이제 패키지를 받을 수 있는 저장소에서 미리 읽어놓은 파일이기 때문에 삭제를 해도 상관은 없습니다
그렇게 하면 공간을 조금 더 확보할 수 있겠고, 또 패키지를 확인한 다음에 패키지를 지우는 것도 방법이 될 수가 있겠습니다 그래서 이런 식으로 용량을 비울 수가 있겠고요
또 세 번째의 팁을드려보면은 journalctl 라는 게 있어요
journalctl에 disk usage 명령어 한번 입력해 보도록 하겠습니다
journalctl --disk-usage 이렇게 보시게 되면 지금 같은 경우에는 저는 240메가 정도로 얼마 많이 안 쓰고 있는 걸 볼 수 있는데 여러분들은 요거 입력했을 때 몇 기가까지 되는 경우도 있거든요 이런 경우에는 여기 보이는 것처럼 journalctl에 time 명령어 옵션을 줘가지고 3일 기준으로 해서 저장되어 있는 그러니까 파일 시스템 변경 사항들을 추적로그 파일들이 사실상 이 저널 파일들인데 이 저널 파일들을 복구할 때 활용할 수 있습니다
이런 것들을 전체 파일들을 가지고 있으면 공간을 너무 많이 차지하기 때문에 일부러 3일 정도까지만 남겨두고 과거 데이터들은 지우게 되면 나머지는 다 이전 공간을 조금 더 낭비를 줄일 수가 있겠죠
그래서 파일 시스템 같은 경우에는 물론 문제가 생기는 경우도 있지만 대부분은 문제가 안 생길 수는 있기 때문에 이렇게 기간을 너무 풀기간으로 잡기 보다는 이렇게 3일이라든지 몇 주 정도로 줄여서 하시게 되면 공간 낭비를 조금 더 줄이실 수 있다는 거 말씀을 드릴 수 있겠습니다
그리고 우리가 지금 쓰고 있는 커널 버전이 uname -r 했을 때 현재 커널 버전이 나오게 되는데요 이 커널 버전 이외에도 지금 우리가 쓰고 있는 커널이 설치되어 있는 것들을 /boot를 통해서도 볼 수가 있어요 여러개가 보이게 되겠고요
그 다음에 lib의 modules라든지 폴더 이런 데를 보시거나 usr의 lib폴더라든지 그런 데 보시게 되면 설치되어 있는 kernel 버전에 따른 kernel 모듈들이 있거든요 이런 kernel 모듈들도 공간을 굉장히 많이 씁니다 그래서 내가 사용하지 않고 있는 kernel버전에 대해서는 이렇게 dpkg를 통해서 찾은 다음에 퍼즐을 통해서 지우시게 되면은 공간 낭비를 조금 더 줄이실 수 있어요
apt-get purge 같은 경우는 apt-get remove 하고 다르게 설정파일까지도 함께 지우게 됩니다.
remove로 하게 되면은 설정파일은 남겨두고 지우게 되는 거고요 purge는 설정파일까지 함께 지우는 거다 라고 말씀드릴 수 있겠어요
자, 이런 식으로 해서 공간에 대해서 확보할 수 있는 전략들에서 말씀을 드렸고요
이 밖에도 디스크 관련된 다양한 오류들이 발생할 수 있어요
이런 것들은 서버엔지니어 트러블 슈팅강의를 통해서도 이해하실 수 있겠고 공부하실 수가 있습니다
그리고 이 디스크 관련되서 디스크를 다루거나 파일을 다루는 부분들에 대해서 좀 개념적으로 이해하시는 게 필요하시다면 리얼리눅스 강의안에서
시스템 핵심 정리 수업을 또 참고해 보시면 또 공부가 많이 되실 거라고 생각이 듭니다 https://reallinux.co.kr/course/se_system
자 오늘 영상도 이걸로 마무리 짓도록 하겠습니다
감사합니다