인생은 속도가 아니라 방향이다

[AWS] 문제 해결 : 디스크용량이 부족할때 EBS 볼륨 늘리기 본문

백엔드(Back-end)/AWS

[AWS] 문제 해결 : 디스크용량이 부족할때 EBS 볼륨 늘리기

기록하는 동구 2020. 12. 16. 18:23
반응형

문제 발생!

 

cp: writing `syslogbackup`: No space left on device
cs

 

갑자기 서버가 마비되서 ec2를 접속해보니 이런 터미널 오류가뜨면서 공간이없다고 나온다.

해결하러 가보자!


 

디스크 용량 확인

$ df -hT
cs

마운트 돼있는 모든 파티션의 크기, 사용중인 공간, 사용가능한 공간정보를 보기위해 df 도구를 사용한다. -hT 옵션을 추가하면 1K블록 단위 대신 읽기 쉬운 형태로 데이터를 보여주고 어떤 파일시스템 기반인지도 Type값으로 보여준다.

 

확인해보니 로그파일이 쌓이다 쌓이다 하드디스크가 98% 까지 차버리는 상황에 도달했다.  지우는데는 한계가 있어서 디스크볼륨을 늘리는것으로 선택했다.

 

 

아래 명령어로, /dev/nvme0n1p1 이 어떻게 사용되었는지 원인을 파악해보자 

$ sudo du --/ | sort -| tail -40 | sort --r
cs

 

 


AWS EC2디스크 용량을 늘려보자!

 

AWS서버의 하드디스크 용량을 늘리는 절차는 간단하게 총 두가지로 이루어진다.

 

① AWS console로 로그인해서 EBS(Elastic Block Store)의 볼륨 크기를 확장한다.

  1. AWS Console 로그인
  2. 볼륨(Elastic Block Store) 클릭
  3. 볼륨수정

 

EBS 볼륨수정

 

② 볼륨 크기 조정후 EC2로 접속해 Linux 파일시스템을 확장시킨다.

1. 인스턴스에 연결합니다.

2. 각 볼륨의 사용중인 파일 시스템을 확인합니다

$ df -hT
cs

3-1. 볼륨에 확장해야하는 파티션이 있는지 확인 하려면 lsblk 명령을 사용해서 연결된 블록 디바이스에 대한 정보를 표시합니다.

$ lsblk
cs

3-2. 다음 명령을 통해서 파일시스템 유형을 확인할수있습니다. 

$ lsblk -f
cs
 w

4-1. 블록 디바이스에 남은 공간 없음 오류를 방지하려면 임시 파일 시스템 tmpfs를 /tmp 탑재 지점에 탑재합니다. 그러면 /tmp에 탑재된 10M tmpfs가 생성됩니다. 

$ sudo mount -o size=10M,rw,nodev,nosuid -t tmpfs tmpfs /tmp
cs

 

4-2. 각 볼륨에서 파티션을 확장하려면 growpart 명령을 사용합니다. 디바이스 이름과 파티션 번호사이에 공백이 있다는 점을 꼭 확인하세요!

 

$ sudo growpart /dev/nvme0n1p1 1
cs

다시 lsblk명령으로 확인해보면, 

 

5. xfs_growfs 명령을 사용하여 각 볼륨에서 파일 시스템을 확장합니다. (/는 df-hT의 출력에 나와있는 볼륨 탑재 지점입니다.)

$ sudo xfs_growfs -/
cs

만약, XFS 도구가 아직 설치되지 않은경우 다음과 같이 설치할 수 있습니다.

$ sudo apt-get install xfsprogs
cs

 


6. ex4볼륨은 resize2fs 명령을 사용하여 각 볼륨에서 파일 시스템을 확장합니다.

$ sudo resize2fs /dev/nvme0n1p1
cs

다시 확인해보면,


예약 블록(Reserved Block)

그런데 의문이 든다. 파일시스템이 가득 찬 상태인데 어떻게 시스템에 로그인 할수 있을까?

디스크에 여유공간이 없다면 어떻게 압축할수 있을까?

 

알아보니 리눅스는 긴급 상황(단편화를 방지하기 위해)을 위해 예약블록(reserved block)이라고 하는 파일 시스템의 여러 블록을 따로 떼어 놓는다는것이다. 루트 사용자만이 그런 예비블록을 쓸수있고 이렇게 파일시스템이 가득 찼더라도 루트사용자는 여전히 로그인하고 일부 파일을 옮길수있는 여유공간을 확보해놓는것이다. ext기반의 파일 시스템이 탑재된 대부분의 서버는 총 블록의 5%가 예약되있다고 한다.

예약블록은 tune2fs 도구를 통해 확인할수 있다.

 

예를들어, 가득차있던 /dev/nvme0n1p1 파티션의 예약 블록수를 확인해보자.

$ sudo tune2fs -/dev/nvme0n1p1 | grep -"block count"
cs

 

예약블록수가 하나도 없다?! 당황하지않고 예약공간을 5% 할당해주자.

$ sudo tune2fs -5 /dev/nvme0n1p1
cs

할당된걸 확인 해보자.

$ sudo tune2fs -/dev/nvme0n1p1 | grep -"block count"
cs


용량 큰 디렉터리 추적하기

df명령어는 각 파일 시스템에서 사용중인 공간이 얼마나 되는지 알려 준다. 그러나 해당 공간을 알고 난 이후에도 여전히 무엇이 디스크 공간을 차지하고있는지 알수없다. 

 

이럴때 du 명령에서 sort명령어를 파이프하면 어떤 디렉토리가 가장 많은 디스크 공간을 차지하고있는지 알수있다. 이러한 기능을 수행하는 명령을 친근하게 "duck 명령어"라 한다.

$ cd /
$ sudo du -ckx | sort -> /tmp/duck-root
cs

 

이 명령어는 가장 많은 공간을 소비하는 디렉터리의 정렬된 목록을 만들어 /tmp/duck-root에 저장한다. 이 목록에 tail을 사용하면 공간을 가장많이 차지하는 상위 10개의 디렉터리를 확인할수있다.

$ tail /tmp/duck-root
cs

 

 

참고(Reference) : 

wikibook.co.kr/article/when-the-disk-is-full/

stackoverflow.com/questions/20120973/yum-fails-with-there-are-no-enabled-repos

100100e.tistory.com/33

noosphere.tistory.com/81

serverfault.com/questions/864979/xfs-growfs-is-not-a-mounted-xfs-filesystem/864985

docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/recognize-expanded-volume-linux.htmlhttps://aws.amazon.com/ko/premiumsupport/knowledge-center/ebs-volume-size-increase/

 

볼륨 크기 조정 후 Linux 파일 시스템 확장 - Amazon Elastic Compute Cloud

볼륨 크기 조정 후 Linux 파일 시스템 확장 EBS 볼륨 크기를 늘리고 난 후에는 파일 시스템 관련 명령을 사용하여 파일 시스템의 크기를 늘려야 합니다. 볼륨이 optimizing 상태가 되자마자 파일 시스

docs.aws.amazon.com

 

 

반응형
Comments