AWS EC2 루트 EBS 볼륨 용량 줄이기

EBS(Elastic Block store)의 용량 크기를 늘리는 것은 EC2 콘솔에서 마우스 클릭 2번만에 해결할 수 있다.

하지만 용량 크기를 줄이는 것은 안된다.

인터넷에서 이를 검색해보면 글을 하나 찾을 수 있다.

https://serverfault.com/questions/673048/how-to-reduce-aws-ebs-root-volume-size

댓글을 보면 답변 작성자는 Amazon Linux에서 테스트 했다고 했고, Ubuntu에서는 안된다는 댓글이 있다.

줄이려고 하는 EC2의 OS는 우분투이기 때문에, 안될 것 같았지만, 혹시 몰라서 일단 따라해봤다.

역시나 안된다.

시스템 로그를 보니 부트 장치를 못 찾는 것 같았다. 댓글에 적힌 순서에 일부를 추가해 성공적으로 루트 EBS 볼륨의 크기를 줄일 수 있었다.

  • A = 루트 볼륨의 크기를 줄일 인스턴스
  • VA = A의 볼륨
  • VA의 크기를 360GB에서 190GB로 줄이는 것이 목표

1. 새로운 EC2 인스턴스 B를 켠다.

  • B의 OS는 A의 OS와 같아야 한다.
  • B의 인스턴스 유형은 중요하지 않다.
  • B의 스토리지의 크기는 줄이려고 하는 용량(이 글에서는 190GB)와 같아야 하고, 볼륨 유형은 A의 볼륨 유형과 같아야 한다.
  • VB = B의 볼륨

2. B가 실행 중인 것을 확인했으면, B의 실행을 중지(stop)한다. B가 중지되면 VB를 B에서 분리(detach)시킨다.

3. A의 실행을 중지한다.

4. 혹시 모를 사고를 방지하기 위해 VA의 스냅샷을 생성한다. VA의 스냅샷을 이용해 새로운 볼륨을 만든다. 이 볼륨은 VASNAP이라고 하자.

볼륨의 Availability Zone(가용 영역)은 A와 같아야 한다.

5. 새로운 인스턴스 C를 만든다.

  • C의 OS는 A, B와 같아야 한다.
  • C의 용도는 VASNAP의 내용을 B에 복사하기 위해서이다.
  • C의 스토리지는 기본값을 선택해도 된다.

6. C가 시작되면 VB와 VASNAP을 C에 연결(attach)한다.

  • VB의 디바이스(device): /dev/xvdf
  • VASNAP의 디바이스(device) /dev/xvdg

7. C에 VB와 VASNAP이 연결된 것을 확인했으면 C를 재부팅한다.

8. C에 SSH를 이용해서 접속한다.

9. 다음 두 디렉토리를 새로 만든다. 여기서부터는 root 권한으로 실행해야 한다.

mkdir /source /target

10. VB를 ext4로 포맷한다.

mkfs.ext4 /dev/xvdf1

여기서 에러가 발생한 경우 위의 링크를 참고한다.

이때 등장하는 파일 시스템의 UUID를 어딘가에 메모해놓는다.

Filesystem UUID: [B의 UUID] 

11. B를 /target에 마운트한다.

mount -t ext4 /dev/xvdf1 /target

12. e2label /dev/xvda1로 인스턴스의 레이블(label)을 확인한다. 여기서 나온 레이블을 이용해 /dev/xvdf1의 레이블을 설정한다. e2label /dev/xvda1의 결과가 cloudimg-rootfs 였기 때문에, 다음과 같이 실행했다.

e2label /dev/xvdf1 cloudimg-rootfs

13. VASNAP을 /source에 마운트한다.

mount -t ext4 /dev/xvdg1 /source

14. VASNAP의 내용을 VB에 모두 복사한다.

rsync -vaxSHAX /source/ /target

/target의 뒤에 “/“가 들어가면 절대로 안된다.

VASNAP에서 옮겨야할 양이 많으면 여기까지 하고 자는 것을 추천한다.

15. VASNAP의 UUID를 확인한다.

blkid -s UUID -o value /dev/xvdg1

16. VB의 grub.cfg를 VB의 UUID로 올바르게 바꿔준다.

예를 들어, VASNAP의 UUID(15의 결과)가 e3440600-4bbf-409a-a0c1-0c2ac3cea267, VB의 UUID(10에서 메모한 값)이 1a4b6b57-97e5-4dee-90f5-ddaa57d708a5 라면, 다음과 같이 실행하면 된다.

sed -i -e 's/e3440600-4bbf-409a-a0c1-0c2ac3cea267/1a4b6b57-97e5-4dee-90f5-ddaa57d708a5/g' /target/boot/grub/grub.cfg

17. VB에 부트 로더를 설치한다.

grub-install --root-directory=/target /dev/xvdf

18. VB를 언마운트 한다.

umount /target

19. VB를 C에서 분리하고, VA를 A에서 분리한다.

20. VB를 A에 연결한다. 이때 디바이스 A의 루트 디바이스와 같아야 하기 때문에, 아래 그림과 같이 확인하고 연결해야 한다.

21. A를 시작시킨다.

22. A에 정상 접속이 되고, 용량이 줄어든 것을 확인할 수 있다.

23. 인스턴스 B, C를 종료(terminate)하고, VASNAP, VA는 삭제(delete)한다.