내용으로 건너뛰기

Amazon Linux 2023에서 EBS 루트 볼륨을 더 작은 크기로 축소하는 방법은 무엇인가요?

8분 분량
콘텐츠 수준: 중급
1

Amazon Linux 2023(AL2023) 인스턴스의 EBS 루트 볼륨 크기를 줄이고 싶습니다. 예를 들어 50GiB 루트 볼륨을 30GiB로 축소하려고 합니다.

Short Description

Amazon EBS는 볼륨 크기를 늘리는 것은 지원하지만, 직접 축소하는 기능은 제공하지 않습니다. 또한 AL2023이 사용하는 XFS 파일시 스템은 자체적으로 축소 기능을 지원하지 않습니다. 따라서 루트 볼륨을 축소하려면 원하는 크기의 새 EBS 볼륨을 생성한 뒤, 원본 볼륨의 파티션 구조와 데이터를 복사하는 방식으로 진행해야 합니다.

이 과정에서 GPT 파티션 테이블 재생성, XFS 파일시스템 생성, UUID 수정이 필요합니다. AL2023은 UEFI 부팅과 BLS(Boot Loader Specification)를 사용하므로 UUID를 수정해야 하는 위치가 총 4곳입니다:

파일수정 항목
/etc/fstab루트(/) UUID
/boot/grub2/grub.cfgkernelopts의 root=UUID=
/boot/loader/entries/*.confoptions의 root=UUID=
/boot/efi/EFI/amzn/grub.cfgsearch.fs_uuid

x86_64에는 BIOS Boot Partition(p127)이 존재하지만 ARM64에는 없으므로, 원본 파티션 구조를 반드시 확인한 후 작업해야 합니다.

Resolution

사전 조건

  • 원본 인스턴스의 루트 볼륨에서 실제 데이터 사용량이 축소 목표 크기보다 작은지 확인합니다. df -hT로 확인할 수 있습니다.
  • 임시 인스턴스는 원본 인스턴스와 동일한 가용 영역(AZ)에 생성해야 합니다.
  • 원본 인스턴스의 아키텍처(x86_64 또는 ARM64)를 확인합니다.
  • 작업 전 원본 루트 볼륨의 스냅샷 백업을 반드시 생성합니다.

중요: XFS 파일시스템은 축소를 지원하지 않으므로, 이 가이드에서는 새 볼륨에 데이터를 복사하는 방식을 사용합니다. 작업 중 원본 인스턴스는 중지 상태여야 합니다.

1단계: 원본 인스턴스 중지 및 스냅샷 백업

  1. Amazon EC2 콘솔에서 원본 인스턴스를 선택하고 인스턴스 상태 > 인스턴스 중지를 선택합니다.
  2. 인스턴스가 중지됨 상태가 될 때까지 기다립니다.
  3. 인스턴스의 스토리지 탭에서 루트 볼륨 ID를 확인합니다.
  4. Elastic Block Store > 볼륨으로 이동하여 해당 루트 볼륨을 선택합니다.
  5. 작업 > 스냅샷 생성을 선택하여 백업 스냅샷을 생성합니다.

**참고: 스냅샷 생성이 완료될 때까지 기다린 후 다음 단계를 진행하세요.

2단계: 원본 루트 볼륨 분리

  1. Elastic Block Store > 볼륨에서 원본 루트 볼륨을 선택합니다.
  2. 작업 > 볼륨 분리를 선택하여 원본 인스턴스에서 루트 볼륨을 분리합니다.

3단계: 임시 인스턴스 생성

  1. 인스턴스 > 인스턴스 시작을 선택합니다.
  2. AMI는 해당 리전의 최신 AL2023 AMI를 선택합니다. 아키텍처는 원본 인스턴스와 동일해야 합니다(x86_64 또는 ARM64).
  3. 인스턴스 유형은 작업용이므로 t3.micro(x86_64) 또는 t4g.micro(ARM64) 등 소형 인스턴스를 선택합니다.
  4. 네트워크 설정에서 원본 인스턴스와 동일한 가용 영역(AZ)의 서브넷을 선택합니다.
  5. 인스턴스를 시작합니다.

4단계: 새 볼륨 생성 및 연결

  1. Elastic Block Store > 볼륨 > 볼륨 생성을 선택합니다.
  2. 볼륨 유형은 gp3, 크기는 축소 목표 크기(예: 30GiB)로 설정하고, 가용 영역은 임시 인스턴스와 동일하게 선택합니다.
  3. 볼륨을 생성합니다.
  4. 원본 루트 볼륨을 선택하고 작업 > 볼륨 연결을 선택하여 임시 인스턴스에 /dev/sdf로 연결합니다.
  5. 새로 생성한 빈 볼륨을 선택하고 작업 > 볼륨 연결을 선택하여 임시 인스턴스에 /dev/sdg로 연결합니다.

5단계: 디바이스 확인

임시 인스턴스에 SSH 또는 SSM으로 접속한 후 디바이스를 확인합니다.

#sudo su -
#lsblk -f

Nitro 기반 인스턴스에서는 디바이스 이름이 NVMe 형식으로 매핑됩니다.

===예시===

nvme0n1       (임시 인스턴스 OS)
├─nvme0n1p1   xfs    /
├─nvme0n1p127
└─nvme0n1p128 vfat   /boot/efi
nvme1n1       (원본 볼륨 - 50GiB)
├─nvme1n1p1   xfs
├─nvme1n1p127        (BIOS Boot - x86_64만 존재)
└─nvme1n1p128 vfat
nvme2n1       (새 볼륨 - 30GiB)

**참고: /dev/sdf/dev/nvme1n1, /dev/sdg/dev/nvme2n1로 매핑됩니다. lsblk 출력에서 볼륨 크기를 기준으로 원본과 새 볼륨을 구분하세요.

6단계: 새 볼륨에 GPT 파티션 생성

원본의 파티션 구조를 확인한 후 새 볼륨에 동일한 구조를 생성합니다.

# 원본 파티션 구조 확인
sgdisk -p /dev/nvme1n1

===예시=== x86_64 파티션 구조:

Number  Start (sector)    End (sector)  Size       Code  Name
   1           24576       104857566   50.0 GiB    8300  Linux
 127           22528           24575   1024.0 KiB  EF02  BIOS Boot Partition
 128            2048           22527   10.0 MiB    EF00  EFI System Partition

ARM64 파티션 구조:

Number  Start (sector)    End (sector)  Size       Code  Name
   1           24576       104857566   50.0 GiB    8300  Linux
 128            2048           22527   10.0 MiB    EF00  EFI System Partition

새 볼륨에 파티션을 생성합니다.

# 기존 파티션 테이블 초기화
sgdisk -Z /dev/nvme2n1

# EFI System Partition (10MB) - 모든 아키텍처 공통
sgdisk -n 128:2048:22527 -t 128:EF00 -c 128:"EFI System Partition" /dev/nvme2n1

# BIOS Boot Partition (1MB) - x86_64만 해당, ARM64에서는 건너뜁니다
sgdisk -n 127:22528:24575 -t 127:EF02 -c 127:"BIOS Boot Partition" /dev/nvme2n1

# Linux 루트 파티션 (나머지 전체)
sgdisk -n 1:24576:0 -t 1:8300 -c 1:"Linux" /dev/nvme2n1

# 파티션 테이블 변경 적용
partprobe /dev/nvme2n1

# 결과 확인
sgdisk -p /dev/nvme2n1
lsblk /dev/nvme2n1

중요: ARM64(Graviton) 인스턴스에서는 p127(BIOS Boot Partition) 생성 단계를 반드시 건너뛰세요.

7단계: 파일시스템 생성 및 EFI/BIOS 파티션 복제

루트 파티션에 XFS 파일시스템을 생성하고, EFI 및 BIOS 파티션은 dd로 블록 단위 복제합니다.

# 루트 파티션에 XFS 생성
mkfs.xfs /dev/nvme2n1p1

# EFI 파티션 생성 후 dd로 원본 내용 복제
mkfs.vfat /dev/nvme2n1p128
dd if=/dev/nvme1n1p128 of=/dev/nvme2n1p128 bs=4M status=progress

# BIOS Boot 파티션 복제 (x86_64만 해당)
dd if=/dev/nvme1n1p127 of=/dev/nvme2n1p127 bs=4M status=progress

**참고: dd를 사용하면 EFI 부트로더 바이너리와 설정이 그대로 복제됩니다.

8단계: 데이터 복사

원본 루트 파티션의 데이터를 새 볼륨으로 복사합니다.

mkdir -p /new /old
mount /dev/nvme2n1p1 /new
mount -o nouuid /dev/nvme1n1p1 /old

rsync -aAXv \
  --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/old","/new"} \
  /old/ /new

**참고: -aAXv 옵션은 아카이브 모드, ACL, 확장 속성을 보존하며 진행 상황을 표시합니다. 시스템 가상 디렉토리는 제외합니다.

9단계: chroot 환경 준비

chroot 환경에서 GRUB 재설치 및 패키지 관리 명령이 정상 동작하도록 필요한 디렉토리를 바인드 마운트합니다.

mount -B /dev /new/dev
mount -B /proc /new/proc
mount -B /sys /new/sys
mount -B /dev/pts /new/dev/pts

# DNS 해석을 위한 resolv.conf 복사
rm -f /new/etc/resolv.conf
cp /run/systemd/resolve/resolv.conf /new/etc/resolv.conf

10단계: chroot 진입 및 GRUB 재설정

chroot로 새 볼륨의 루트 환경에 진입하여 GRUB 설정을 재생성합니다.

chroot /new/

chroot 내부에서 다음 명령을 실행합니다.

# 기존 grub 설정 삭제 후 재설치
rm -f /etc/grub.d/*
rm -f /etc/sysconfig/grub
dnf reinstall grub2-tools -y

# 새 볼륨의 UUID 확인
NEW_ROOT_UUID=$(xfs_admin -u /dev/nvme2n1p1 | awk '{print $NF}')
NEW_EFI_UUID=$(blkid -s UUID -o value /dev/nvme2n1p128)
echo "Root UUID: $NEW_ROOT_UUID"
echo "EFI UUID: $NEW_EFI_UUID"

# grub2.cfg에서 원본 UUID를 새 UUID로 교체
OLD_UUID=$(grep -oP 'root=UUID=\K[a-f0-9-]+' /etc/grub2.cfg | head -1)
sed -i "s/$OLD_UUID/$NEW_ROOT_UUID/g" /etc/grub2.cfg

# GRUB 설정 재생성
grub2-mkconfig -o /boot/grub2/grub.cfg

11단계: fstab UUID 수정

fstab에 기록된 원본 볼륨의 UUID를 새 볼륨의 UUID로 변경합니다.

# chroot 내부에서 계속
sed -i "s|^.*\s/\s.*xfs.*|UUID=$NEW_ROOT_UUID     /           xfs    defaults,noatime  1   1|" /etc/fstab
sed -i "s|^.*\s/boot/efi\s.*|UUID=$NEW_EFI_UUID        /boot/efi       vfat    defaults,noatime,uid=0,gid=0,umask=0077,shortname=winnt,x-systemd.automount 0 2|" /etc/fstab

# 변경 결과 확인
cat /etc/fstab

중요: 루트(/)와 /boot/efi 두 항목의 UUID를 모두 수정해야 합니다. 누락 시 부팅에 실패합니다. **참고 : vi편집기를 사용하여 변경하는 것도 가능합니다.

12단계: chroot 탈출 및 resolv.conf 복원

chroot에서 나온 후 resolv.conf를 원래의 심볼릭 링크로 복원합니다.

exit

# resolv.conf 심볼릭 링크 복원
rm -f /new/etc/resolv.conf
ln -s /run/systemd/resolve/resolv.conf /new/etc/resolv.conf

**중요: 이 단계를 건너뛰면 부팅 후 DNS 해석에 실패합니다.

13단계: EFI grub.cfg UUID 수정

/boot/efi/EFI/amzn/grub.cfg는 UEFI 펌웨어가 GRUB을 로드한 직후 가장 먼저 읽는 파일입니다. 8단계에서 dd로 EFI 파티션을 복제했기 때문에 원본 UUID가 그대로 남아있으므로 수정이 필요합니다.

mkdir -p /newboot
mount /dev/nvme2n1p128 /newboot

NEW_ROOT_UUID=$(xfs_admin -u /dev/nvme2n1p1 | awk '{print $NF}')

sed -i "s/search.fs_uuid .*/search.fs_uuid $NEW_ROOT_UUID root/" /newboot/EFI/amzn/grub.cfg

# 수정 결과 확인
cat /newboot/EFI/amzn/grub.cfg

수정 후 다음과 같이 표시되어야 합니다.

search.fs_uuid <NEW_ROOT_UUID> root
set no_modules=y
set prefix=($root)'/boot/grub2'
configfile $prefix/grub.cfg

14단계: 전체 언마운트

모든 마운트 포인트를 해제합니다.

umount /new/dev/pts
umount /new/dev
umount /new/proc
umount /new/sys
umount /newboot
umount /new
umount /old

**참고 : target is busy. 메시지가 반환되는 경우 "umount -l /new" 방식으로 -l 옵션을 사용하여 lazy umount를 실행합니다.

15단계: 스냅샷 생성 및 AMI 등록

  1. Amazon EC2 콘솔에서 임시 인스턴스를 선택합니다.
  2. 볼륨에서 새 볼륨(축소된 볼륨)을 선택하고 작업 > 볼륨 분리를 선택합니다.
  3. 새 볼륨을 선택한 상태에서 작업 > 스냅샷 생성을 선택합니다. 스냅샷 생성이 완료될 때까지 기다립니다.
  4. Elastic Block Store > 스냅샷에서 생성된 스냅샷을 선택하고 작업 > 스냅샷에서 이미지 생성을 선택합니다.
  5. AMI 등록 시 다음 설정을 확인합니다:
    • 아키텍처: 원본 인스턴스와 동일하게 선택 (x86_64 또는 arm64)
    • 루트 디바이스 이름: /dev/xvda
    • 가상화 유형: hvm
    • 부팅 모드: uefi
    • ENA 지원: 활성화

중요: ENA 지원을 반드시 활성화해야 Nitro 인스턴스(t3, t4g 등)에서 사용할 수 있습니다.

16단계: 부팅 테스트 및 검증

  1. 등록한 AMI로 새 인스턴스를 시작합니다. 인스턴스 유형은 원본과 동일하게 선택합니다.
  2. EC2 콘솔에서 상태 검사 탭을 확인하여 2/2 상태 검사가 통과되는지 확인합니다.
  3. SSH 또는 SSM으로 접속하여 다음 항목을 확인합니다.
  4. 정상적으로 부팅이 되지 않은 경우 임시 인스턴스에 볼륨을 붙여 확인합니다.
df -hT /                                          # 루트 파일시스템 크기 확인
lsblk -f                                          # 파티션 구조 및 UUID 확인
cat /etc/fstab                                    # fstab UUID 확인
grep 'root=UUID' /boot/grub2/grub.cfg             # grub2.cfg UUID 확인
grep 'root=UUID' /boot/loader/entries/*.conf      # BLS 엔트리 UUID 확인
cat /boot/efi/EFI/amzn/grub.cfg                  # EFI grub.cfg UUID 확인

주의사항

  • XFS 파일시스템은 축소를 지원하지 않으므로 반드시 새 볼륨에 데이터를 복사하는 방식으로 진행해야 합니다.
  • x86_64에는 p127(BIOS Boot Partition)이 있지만 ARM64에는 없습니다. sgdisk -p로 원본 구조를 반드시 확인하세요.
  • UUID는 fstab(루트 + EFI), grub2.cfg(커널 파라미터), EFI/amzn/grub.cfg(부트 진입점) 총 3곳을 모두 수정해야 합니다.
  • AMI 등록 시 ENA 지원을 활성화하지 않으면 Nitro 인스턴스에서 실행할 수 없습니다.
  • chroot 후 resolv.conf 심볼릭 링크를 복원하지 않으면 부팅 후 DNS 해석에 실패합니다.
  • 작업 전 반드시 원본 볼륨의 스냅샷 백업을 생성하세요.

Related Information

[1] 설명서 > Amazon EBS > Amazon EBS 볼륨 크기 조정 후 파일 시스템 확장 [2] 설명서 > Amazon EC2 > Amazon EBS 볼륨을 인스턴스에서 분리 [3] 설명서 > Amazon EC2 > AMI 생성 및 등록

AWS
지원 엔지니어
게시됨 2달 전59회 조회