⭐️ Amazon Web Service/Amazon EC2

[Linux] EC2 EBS 부팅 볼륨 축소 (ext 4 / Amazon Linux 1)

mini_world 2021. 3. 23. 14:14
목차 접기

안녕하세요! 🙋‍♀️ 🙋‍♂️

 

Amazon EBS는 확장하기 매우매우매우 쉽습니다. 하지만 축소는 완전히 다른 이야기죠.. 정말 어렵습니다.
실수로 EBS 볼륨을 확장해버린 경우, 돌이키기가 매우 어렵습니다. 
사용하지도 않는 불필요한 비용이 발생할 뿐만 아니라, 되돌리기 위한 공수도 많이 들죠..😂(넘싫...)

이번 포스팅은 EC2의 블록 스토리지(Disk)인 EBS의 볼륨 축소 실습을 진행해 보려고 합니다.
특히, 파일시스템이 ext4인 Amazon Linux1을 가지고 진행할 예정입니다.

작업을 진행하기 전 반드시 아래 주의사항 세가지를 확인해주세요!

주의 1※
스냅샷 축소를 진행하는동안 원본 인스턴스는 잠시 중지시켜주세요.
데이터 정합성 문제가 발생할 수 있습니다.😅

주의 2
모든 작업은 하나의 가용영역에서 진행합니다.
EBS는 가용영역에 종속적입니다. 즉, EBS가 작업할 인스턴스와 다른 가용영역에 있는 경우 연결할수 없어요!!

※주의 3※
작업을 진행하기 전, 반드시 리눅스 파일시스템을 먼저 확인하세요.
ext2,3,4인 경우 볼륨 축소가 가능하지만 xfs인 경우 축소가 불가능합니다.
파일시스템이 xfs인 경우에는 rsync로 보내주는 수 밖에 없어요 ㅠㅠ!!!!!
df 명령어로 확인할 수 있습니다. 아래 처럼 타입에 ext4가 확인되면, 이 포스팅을 따라하시면 되겠습니다 😙

[root@myhost /]$ df -TH
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  2.1G   70k  2.1G   1% /dev
tmpfs          tmpfs     2.1G     0  2.1G   0% /dev/shm
/dev/nvme0n1p1 ext4      106G  1.2G  105G   2% /

 

 


작업 순서


Step #1    EC2 인스턴스 스냅샷 생성 & 스냅샷으로 EBS 볼륨 생성
Step #2    원본 EC2 인스턴스와 같은 OS로 EC2 신규 생성 & EBS 볼륨 떼기
Step #3    Temp 인스턴스 생성 & EBS 모두 연결
Step #4    Temp 인스턴스에 SSH 연결하고 디스크 복사
Step #5    축소된 볼륨으로 인스턴스 시작


 

 

 


Step #1    EC2 인스턴스 스냅샷 생성 & 스냅샷으로 EBS 볼륨 복제

이번 단계에서는 EC2 인스턴스의 스냅샷을 생성하고, 스냅샷으로 EBS 볼륨을 생성하겠습니다.
지금 생성하는 EC2 인스턴스 스냅샷은 "백업" 목적으로도 사용할 수 있습니다.

원본 EBS 인스턴스인 "Original" 인스턴스는 100GiB 의 OS볼륨을 가지고 있습니다.
OS 볼륨 크기를 100GiB -> 30 GiB로 줄이도록 하겠습니다.

인스턴스를 클릭하면, 아래 하위 탭이 활성화 됩니다.
하위 활성화 탭 중 "스토리지"를 클릭하고, 볼륨ID를 클릭합니다.

볼륨 ID를 클릭하면, EBS 볼륨 페이지로 이동합니다.
이 상태에서 상단 "작업" > "스냅샷 생성"을 클릭하고, 스냅샷을 생성해줍니다.

스냅샷이 잘 생성됐는지 확인하기 위해, 왼쪽 네비게이션바 "스냅샷"을 클릭합니다.
아직 pending 상태네요. 조금 기다리시면 Completed 상태로 변경됩니다.

Completed 된 상태롤 확인하신 후 상단 "작업" > "볼륨생성"을 클릭하여 볼륨을 만들어줍니다.
*볼륨 생성 시 가용영역을 주의하세요! 항상 똑같은 가용영역에 위치해야 합니다.

볼륨 생성이 정상적으로 되었는지 확인해봅니다.
왼쪽 네비게이션 바 "볼륨"을 찾아 클릭하시고, 아래 캡쳐사진처럼 avaliable 상태인 볼륨이 보이면 됩니다 :)
볼륨 생성이 완료되었습니다!!! 🎉🎉 다음단계로 갑시다!!

 


Step #2    원본 EC2 인스턴스와 같은 OS로 EC2 신규 생성 & EBS 볼륨 떼기

원본 EC2의 OS는 "Amazon Linux 1" 입니다.
먼저, 원본 EC2의 OS를 한번 더 확인해줍시다. 

[root@ip-172-31-11-197 /]# cat /etc/issue
Amazon Linux AMI release 2018.03

Amazon Linux 1 이 맞네요 :)
Amazon Linux1 AMI을 이용하여 EC2를 생성합니다. EC2를 생성하는 방법은 별도로 안내하지 않습니다!

다만, Amazon Linux1의 경우 이미 EOS되어 커뮤니티 AMI를 사용해야 합니다.

EC2 생성 과정 중 AMI 선택

두번째 주의할점은, 스토리지 부분에서 줄이고싶은 크기의 스토리지를 생성해줘야 합니다.

이런 설정으로 인스턴스를 생성하신 후, 인스턴스를 "중지"합니다.
중지됨 상태로 변경된것을 확인한 후에 인스턴스를 선택하고, "스토리지"하위탭을 클릭하여 볼륨ID를 클릭합니다.

이동 된 페이지에서 바로 상단의 "작업" > "볼륨 분리"를 클릭합니다.

검색창의 필터를 제거해보면, 이제 원본볼륨, 원본을 복제한 볼륨, 축소될 볼륨 이렇게 3개가 보입니다.

위에서 생성한 EC2(OS볼륨 분리한것)는 종료해줍니다. 이 인스턴스는 더이상 사용하지 않습니다 :)
EC2 콘솔 > 왼쪽 네비게이션 바 "인스턴스" > 이름없는 인스턴스 클릭 > 인스턴스 종료

여기까지 완료 되었으면 다음 단계로 넘어갑니다!

 


Step #3    Temp 인스턴스 생성 & EBS 모두 연결

이번 단계에서는 디스크 복제 작업을 진행할 임시 인스턴스를 생성하고, EBS를 모두 연결할 예정입니다.

먼저, EC2 하나를 생성합니다. 
Step2에서 생성했던 인스턴스는 Amazon Linux1 인스턴스를 생성했지만, 이번 작업용 임시 인스턴스는 최신OS인 Amazon Linux2를 사용했습니다.

이제 EBS를 Temp Instance에 연결하겠습니다.
EC2 콘솔 왼쪽 네비게이션 바 "볼륨"을 클릭합니다.
아래 사진과 같이 avaliable 상태인 2개의 EBS 볼륨이 보입니다. 이 볼륨을 모두 Temp Instance에 연결합니다.

상단 "작업" > "볼륨연결" 클릭 후 팝업창에서 Temp Instance 선택하여 연결합니다.

작업을 완료하면 이렇게 총 3개의 EBS볼륨이 Temp Instance에 연결됩니다.

여기까지 완료 되었다면 다음 단계로 넘어갑니다.👍🏻

 


Step #4    Temp 인스턴스에 SSH 연결하고 디스크 복사

먼저, temp instance에 SSH로 접속합니다.

localComputer ~ % ssh -i Desktop/awskey/myVirginia.cer ec2-user@<Elastic IP>
Last login: Wed Jul 28 07:14:29 2021 from 14.52.234.101

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@temp-instance ~]$
[ec2-user@temp-instance ~]$ sudo su
[root@temp-instance ec2-user]#

이 인스턴스에 연결 된 블록디스크를 확인합니다.

[root@temp-instance ec2-user]# lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
nvme0n1       259:0    0    8G  0 disk
├─nvme0n1p1   259:1    0    8G  0 part /
└─nvme0n1p128 259:2    0    1M  0 part
nvme1n1       259:3    0  100G  0 disk
├─nvme1n1p1   259:4    0  100G  0 part
└─nvme1n1p128 259:5    0    1M  0 part
nvme2n1       259:6    0   30G  0 disk
├─nvme2n1p1   259:7    0   30G  0 part
└─nvme2n1p128 259:8    0    1M  0 part

하나의 블록 디스크에 각 2개의 파티션이 있고, 그중 하나는 1M로 되어있는ㄴ데 이부분은 부팅을위한 파티션(부트파티션)입니다. 건들이지 마세요 ㅠ.ㅠ (제가 이거 만져서 오래 고생했습니다..부팅 안돼요 ㅠㅠ)

 

먼저 원본디스크를 정리해주는 작업을 합니다. 아래의 명령어(e2fsck, resize2fs)를 순서대로 실행합니다.

[root@temp-instance ec2-user]# e2fsck -f /dev/nvme1n1p1

e2fsck 1.42.9 (28-Dec-2013)
/: recovering journal
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Free blocks count wrong (25485459, counted=25484998).
Fix<y>? yes
Free inodes count wrong (6513165, counted=6513015).
Fix<y>? yes

/: ***** FILE SYSTEM WAS MODIFIED *****
/: 40585/6553600 files (0.2% non-contiguous), 728885/26213883 blocks
[root@temp-instance ec2-user]# resize2fs -M -p /dev/nvme1n1p1
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/nvme1n1p1 to 375620 (4k) blocks.
Begin pass 2 (max = 125318)
Relocating blocks             XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Begin pass 3 (max = 800)
Scanning inode table          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Begin pass 4 (max = 4682)
Updating inode references     XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
The filesystem on /dev/nvme1n1p1 is now 375620 blocks long.

resize2fs 명령의 결과 마지막에 나오는 blocks는 이 파일시스템의 4k 블럭 숫자를 의미합니다.
필요한 16MB 블록 개수를 계산합니다. 아래 계산식으로 봤을때 저는 "91.7041015625"가 나오네요 :)
반올림해서 "92"를 사용하겠습니다.

* 계산 식 : block count * 4 / (16 * 1024)

이제 DD 명령어를 사용해서 디스크를 복사합니다. 
이번 작업은 실제 블록디스크를 복사하는 작업이므로 시간이 생각보다 많이 걸릴 수 있습니다.
터미널이 끊어지지 않도록 사전에 Screen 명령어를 쓰겠습니다. 여러분도... 반드시 사용하세요!!!

[root@temp-instance ec2-user]# screen
[root@temp-instance ec2-user]# sudo dd if=/dev/nvme1n1p1 ibs=16M of=/dev/nvme2n1p1 obs=16M count=92 status=progress
520093696 bytes (520 MB) copied, 41.092843 s, 12.7 MB/s
1526726656 bytes (1.5 GB) copied, 100.127467 s, 15.2 MB/s
92+0 records in
92+0 records out
1543503872 bytes (1.5 GB) copied, 113 s, 13.7 MB/s

테스트 디스크라 용량이 크지않아 금방 끝났네요 :)
파티션 검토를 위해 아래 두개 명령어를 실행합니다.

[root@temp-instance ec2-user]# resize2fs -p /dev/nvme2n1p1
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/nvme2n1p1 to 7863803 (4k) blocks.
Begin pass 1 (max = 228)
Extending the inode table     XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
The filesystem on /dev/nvme2n1p1 is now 7863803 blocks long.
[root@temp-instance ec2-user]# e2fsck -f /dev/nvme2n1p1
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/: 40585/1966080 files (0.2% non-contiguous), 439001/7863803 blocks

이렇게 이번 스텝도 완료 되었습니다! 👍🏻👍🏻👍🏻
다음 단계로 넘어가서 부팅해봅시다!

 


Step #5    축소된 볼륨으로 인스턴스 시작

왼쪽 네비게이션 바 "볼륨"으로 이동합니다.
먼저, Original 인스턴스에 OS 볼륨으로 연결되어있는 EBS를 연결 해제 합니다.

그리고 30GiB 볼륨도 "볼륨 분리"합니다!!!

2개의 볼륨을 다 분리하고 나면 아래 캡쳐처럼 2개가 avaliable 상태 입니다.

이제 30 GIB 볼륨을 original 인스턴스에 마운트 합니다.

볼륨 연결 시 부팅볼륨 (루트디바이스)로 마운트 되어야 하기 때문에, 
디바이스 부분에 반드시 /dev/xvda 로 작성해주세요!!!

자, 이렇게 30 GiB 볼륨이 Original 인스턴스에 마운트 되었다면!!
부팅해보러 갑시다!

인스턴스를 시작합니다!
Original 인스턴스를 선택하고, 인스턴스 상태 > 인스턴스 시작을 클릭합니다.
인스턴스를 클릭하면 활성화 되는 하위탭 "스토리지"에서 볼륨이 30GiB로 줄어든것을 알 수 있습니다.

EC2에 직접 접속하지 않고 부팅이 되었는지 확인해봅시다.
인스턴스 선택 > "작업" > "모니터링 및 문제 해결" > "인스턴스 스크린샷 가져오기"를 클릭합니다.

인스턴스 스크린샷을 확인하니 부팅이 잘 된것같네요!!


 

모든 과정이 완료되었습니다! 고생하셨습니다! 🎉🎉🎉🎉👍🏻👍🏻👍🏻