%20%EC%9E%A5%EC%B9%98%EB%A1%9C%20%EC%82%AC%EC%9A%A9%EB%90%98%EB%8A%94%20%EA%B2%BD%EC%9A%B0%20%EB%8B%A4%EB%A5%B8%20%EC%86%94%EB%A3%A8%EC%85%98%EC%9D%80%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
EC2 인스턴스를 확장하는 것은 숨처럼 쉽습니다(예: AMI를 생성하고 여기에서 인스턴스를 시작한 다음 스토리지 크기 변경).
그러나 이를 줄이는 것은 점점 더 어려워진다. Amazon Web Services(AWS) EC2 인스턴스 Elastic Block Store(EBS) 루트 볼륨 크기를 줄이고 싶습니다. 인터넷에는 몇 가지 오래된 고급 절차가 있습니다. 내가 찾은 더 자세한 버전은 StackOverflow 질문에 대한 1년 전의 답변입니다.EBS 볼륨 용량을 어떻게 줄일 수 있나요?, 단계의 수준은 매우 높습니다.
원하는 크기(예: /dev/xvdg)의 새 EBS 볼륨을 생성합니다.
인스턴스를 시작하고 두 EBS 볼륨을 모두 연결합니다.
원래 루트 볼륨의 파일 시스템을 확인합니다. (예: e2fsck -f /dev/xvda1
원래 루트 볼륨을 최대로 축소합니다: (예: ext2/3/4) resize2fs -M -p /dev/xvda1
dd를 사용하여 데이터를 복사합니다.
청크 크기를 선택하세요. (16MB가 좋아요)
청크 수를 계산합니다(resize2fs 출력의 블록 수를 사용하여): block*4/(chunk_size_in_mb*1024) - 안전을 위해 비트를 반올림합니다.
데이터를 복사합니다: (예) dd if=/dev/xvda1 ibs=16M of=/dev/xvdg obs=16M count=80
새로운(더 작은) EBS 볼륨에서 파일 시스템 크기를 조정합니다. (예: resize2fs -p /dev/xvdg)
원래 루트 볼륨의 파일 시스템을 확인합니다. (예: e2fsck -f /dev/xvdg
새 EBS 루트 볼륨을 분리하고 원본 인스턴스에 연결합니다.
자세한 단계별 "방법" 솔루션을 찾을 수 없습니다.
내 EBS 루트 볼륨이 HVM Ubuntu 인스턴스에 연결되어 있습니다.
어떤 도움이라도 정말 감사하겠습니다.
답변1
볼륨이 루트(부팅 가능) 장치로 사용되는 경우 다른 솔루션은 작동하지 않습니다.
새로 생성된 디스크에는 부팅 파티션이 없으므로 인스턴스가 이를 루트 볼륨으로 사용하려면 GRUB를 설치하고 일부 플래그를 올바르게 설정해야 합니다.
내 (오늘부터일하고 있는) 루트 볼륨을 줄이는 솔루션은 다음과 같습니다.
배경:루트 볼륨을 축소하려는 인스턴스 A가 있습니다. 이 볼륨을 VA라고 부르겠습니다. VA를 30GB에서 10GB로 줄이고 싶습니다.
- 인스턴스 A와 동일한 OS를 사용하여 새 ec2 인스턴스 B를 생성합니다. 또한 커널이 일치해야 필요에 따라 업그레이드하거나 다운그레이드할 수 있습니다. 스토리지로 VA와 동일한 유형이지만 크기가 10GB인 볼륨을 선택합니다. (또는 목표 크기가 무엇이든). 이제 이 새 볼륨(VB라고 함)을 루트 볼륨으로 사용하는 인스턴스 B가 생겼습니다.
- 새 인스턴스(B)가 실행되면. 이를 중지하고 루트 볼륨(VB)을 분리합니다.
참고: 다음 단계는 대부분 @bill의 솔루션에서 수행됩니다.
크기를 조정하려는 인스턴스를 중지합니다(A).
볼륨 VA의 스냅샷을 생성한 다음 해당 스냅샷에서 "범용 SSD" 볼륨을 생성합니다. 이 책을 VASNAP이라고 부르겠습니다.
Amazon Linux로 새 인스턴스를 실행합니다. 이 인스턴스를 C라고 하겠습니다. 이 인스턴스를 사용하여 VASNAP의 콘텐츠를 VB에 복사합니다. 이러한 단계를 수행하기 위해 인스턴스 A를 사용할 수도 있지만 저는 독립된 시스템에서 수행하는 것을 선호합니다.
다음 볼륨을 인스턴스 C에 연결합니다. VB의 경우 /dev/xvdf. VASNAP의 경우 /dev/xvdg.
인스턴스 C를 재부팅합니다.
SSH를 통해 인스턴스 C에 로그인합니다.
다음과 같은 새 디렉터리를 만듭니다.
mkdir /source /target
- ext4 파일 시스템으로 VB의 기본 파티션을 포맷합니다:
mkfs.ext4 /dev/xvdf1
오류가 발생하지 않으면 11단계로 진행하십시오. 그렇지 않고 오류가 없으면 /dev/xvdf1
다음 i-vii를 수행하여 파티션을 생성해야 합니다.
i) /dev/xvdf1
어떤 이유로든 존재하지 않는 경우 새로 만들어야 합니다. 먼저 입력하세요:
sudo fdisk /dev/xvdf
.
ii) 다음을 입력하여 디스크를 닦습니다.
wipefs
iii) 다음을 입력하여 새 파티션을 만듭니다.
n
iv) p
기본 파티션을 생성하려면 Enter를 누르십시오.
v) 기본 설정을 계속하려면 Enter 키를 계속 누르세요.
vi) 다시 명령을 요청하면 Enter를 눌러 w
변경 내용을 쓰고 종료합니다.
/dev/xvdf1
vii) 다음을 수행하여 파티션이 있는지 확인합니다 .lsblk
다음과 같은 내용이 표시됩니다.
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 250G 0 disk
└─xvda1 202:1 0 250G 0 part
xvdf 202:80 0 80G 0 disk
└─xvdf1 202:81 0 80G 0 part
xvdg 202:96 0 250G 0 disk
└─xvdg1 202:97 0 250G 0 part
이제 11단계로 진행하세요.
- 다음 디렉터리에 마운트합니다.
mount -t ext4 /dev/xvdf1 /target
- 이것은 매우 중요합니다. 파일 시스템은 Linux를 인식하고 부팅하려면 e2label이 필요합니다. 활성 인스턴스에서 "e2label /dev/xvda1"을 사용하여 그것이 무엇인지 확인하십시오. 이 경우 레이블은 "/"입니다.
e2label /dev/xvdf1 /
- /source에 VASNAP 마운트:
mount -t ext4 /dev/xvdg1 /source
- 내용을 복사하세요:
rsync -vaxSHAX /source/ /target
참고: "/target" 뒤에는 "/"가 없습니다. 또한 심볼릭 링크 및 속성에 대한 몇 가지 오류가 있을 수 있지만 크기 조정은 여전히 성공적이었습니다.
- VB 마운트 해제:
umount /target
AWS 콘솔로 돌아가서: 인스턴스 C에서 VB를 분리하고 A에서도 VA를 분리합니다.
새로운 크기의 볼륨(VB)을 "/dev/xvda"로 인스턴스에 연결합니다.
인스턴스 A를 부팅하면 이제 루트 장치는 10GB입니다. :)
인스턴스 B와 C를 모두 삭제하고 현재 인스턴스 A의 루트 볼륨인 VB를 제외한 모든 볼륨도 삭제합니다.
답변2
AWS 콘솔에서:
크기를 조정하려는 인스턴스를 중지하세요.
활성 볼륨의 스냅샷을 생성한 다음 해당 스냅샷에서 "범용 SSD" 볼륨을 생성합니다.
원하는 크기로 다른 "범용 SSD" 볼륨을 만듭니다.
다음과 같이 3개의 볼륨을 인스턴스에 연결합니다.
- 활성 볼륨의 경우 /dev/sda1입니다.
- 대상 크기인 볼륨의 경우 /dev/xvdf입니다.
- 활성 볼륨의 스냅샷에서 생성된 볼륨의 경우 /dev/xvdg입니다.
인스턴스를 시작합니다.
SSH를 통해 새 인스턴스에 로그인합니다.
다음과 같은 새 디렉터리를 만듭니다.
mkdir /source /target
- 새 볼륨에 ext4 파일 시스템을 만듭니다.
mkfs.ext4 /dev/xvdf
- 이 디렉토리에 마운트하십시오:
mount -t ext4 /dev/xvdf /target
- 이것은 매우 중요합니다. Linux가 이를 인식하고 부팅하려면 파일 시스템에 e2label이 필요합니다. 활성 인스턴스에서 "e2label /dev/xvda1"을 사용하여 그것이 무엇인지 확인하십시오. 이 경우 레이블은 "/"입니다.
e2label /dev/xvdf /
- 스냅샷에서 생성된 볼륨을 마운트합니다.
mount -t ext4 /dev/xvdg /source
- 내용을 복사하세요:
rsync -ax /source/ /target
참고: "/target" 뒤에는 "/"가 없습니다. 또한 심볼릭 링크 및 속성에 대한 몇 가지 오류가 있을 수 있지만 크기 조정은 여전히 성공적이었습니다.
- 파일 시스템을 마운트 해제합니다.
umount /target
umount /source
AWS 콘솔로 돌아가서: 인스턴스를 중지하고 모든 볼륨을 분리합니다.
새로운 크기의 볼륨을 "/dev/sda1"로 인스턴스에 연결합니다.
인스턴스를 시작하면 부팅됩니다.
10단계가 중요합니다: 위에서 언급한 대로 "e2label"로 새 볼륨에 레이블을 지정합니다. 그렇지 않으면 인스턴스가 aws에서 부팅되는 것처럼 보이지만 연결 확인을 통과하지 못합니다.
답변3
1. 새 ebs 볼륨을 생성하고 인스턴스에 연결합니다.
새 EBS 볼륨을 생성합니다. 예를 들어 원래 20G가 있었고 이를 8G로 축소하려는 경우 새 8G EBS 볼륨을 생성하고 동일한 가용 영역에 있어야 합니다. 루트 파티션을 축소해야 하는 인스턴스에 연결합니다.
2. 새로 생성된 ebs 볼륨의 파일을 분할하고 포맷하고 동기화합니다.
(1. 파티션 상황을 확인하세요.먼저 명령을 사용하여 sudo parted -l
원본 볼륨의 파티션 정보를 확인합니다.
[root@ip-172-31-16-92 conf.d]# sudo parted -l
Model: NVMe Device (nvme)
Disk /dev/nvme0n1: 20G
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 2097kB 1049kB bbp bios_grub
2 2097kB 20480MB 24G xfs root
이 20G 루트 장치 볼륨은 두 개의 파티션으로 분할되어 있음을 알 수 있습니다. 하나는 bbp이고 다른 하나는 루트입니다. bbp 파티션에는 파일 시스템이 없지만 bios_grub이라는 플래그가 있는데, 이는 이 시스템이 grub으로 부팅되었음을 나타냅니다. 또한 루트 볼륨이 gpt를 사용하여 파티셔닝되었음을 나타냅니다. bios_grub은 실제로 BIOS 부팅 파티션입니다. 참조는 다음과 같습니다.
https://en.wikipedia.org/wiki/BIOS_boot_partition https://www.cnblogs.com/f-ck-need-u/p/7084627.html
이는 약 1MB이며, 우리가 집중해야 할 루트라는 파티션이 있습니다. 이 파티션은 원래 시스템의 모든 파일을 저장합니다. 따라서 백업의 개념은 이 파티션의 파일을 새 ebs 볼륨의 다른 작은 파티션으로 전송하는 것입니다.
(2 사용parted
새 ebs 볼륨을 파티션하고 포맷하는 데 사용됩니다.
lsblk
블록을 나열하는 데 사용합니다 .
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 20G 0 disk
├─nvme0n1p1 259:1 0 1M 0 part
└─nvme0n1p2 259:2 0 20G 0 part /
nvme1n1 270:0 0 8G 0 disk
새 ebs 볼륨은 nvme1n1 디바이스이므로 이를 분할해야 합니다.
~# parted /dev/nvme1n1
GNU Parted 3.2
Using /dev/xvdg
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt #Using the gpt layout would take up the first 1024 sectors
(parted) mkpart bbp 1MB 2MB # Since the first 1024 sectors are used, the start address here is 1024kb or 1MB, and bbp is the partition name, that is, BIOS boot partition, which needs to take up 1MB, so the end address is 2MB
(parted) set 1 bios_grub on #Set partition 1 as BIOS boot partition
(parted) mkpart root xfs 2MB 100% #allocate the remaining space (2MB to 100%) to the root partition.
파티셔닝 후 lsblk
다시 사용하면 볼 수 있습니다.
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 20G 0 disk
├─nvme0n1p1 259:1 0 1M 0 part
└─nvme0n1p2 259:2 0 20G 0 part /
nvme1n1 270:0 0 8G 0 disk
├─nvme1n1p1 270:1 0 1M 0 part
└─nvme1n1p2 270:2 0 8G 0 part /
nvme1n1p1과 nvme1n1p2라는 두 개의 파티션이 더 있는 것을 볼 수 있습니다. 여기서 nvme1n1p2는 새로운 루트 파티션입니다. 파티션을 포맷하려면 다음 명령을 사용하십시오.
mkfs.xfs /dev/nvme1n1p2
포맷한 후에는 파티션을 마운트해야 합니다. 예를 들어 /mnt/myroot에 마운트합니다.
mkdir -p /mnt/myroot
mount /dev/nvme1n1p2 /mnt/myroot
(3 rsync를 사용하여 모든 콘텐츠를 새 볼륨의 해당 루트 파티션으로 전송합니다.
sudo rsync -axv / /mnt/myroot/
위의 -x
매개변수는 현재 인스턴스의 루트 디렉터리를 백업하기 때문에 매우 중요합니다. 따라서 이 매개변수를 추가하지 않으면 /mnt/myroot 자체를 /mnt/myroot에 백업하고 다음 경로에 빠지게 됩니다. 무한 루프.(–exclude 매개변수도 괜찮습니다.) rsync 명령은 cp 명령과 다릅니다. cp 명령은 덮어쓰는 반면 rsync는 동기식 증분 백업입니다. 시간이 많이 절약될 거예요. 커피를 마시고 동기화가 완료될 때까지 기다리세요.
3. 해당 파일의 uuid를 교체하세요.
볼륨이 변경되었기 때문에 볼륨의 uuid도 변경되었습니다. 부팅 파일에서 uuid를 교체해야 합니다. 다음 두 파일을 수정해야 합니다.
/boot/grub2/grub.cfg #or /boot/grub/grub.cfg
/etc/fstab
그렇다면 무엇을 바꿔야 할까요? 먼저 blkid를 통해 관련 볼륨의 uuid를 나열해야 합니다.
[root@ip-172-31-16-92 boot]# sudo blkid
/dev/nvme0n1p2: LABEL="/" UUID="add39d87-732e-4e76-9ad7-40a00dbb04e5" TYPE="xfs" PARTLABEL="Linux" PARTUUID="47de1259-f7c2-470b-b49b-5e054f378a95"
/dev/nvme1n1p2: UUID="566a022f-4cda-4a8a-8319-29344c538da9" TYPE="xfs" PARTLABEL="root" PARTUUID="581a7135-b164-4e9a-8ac4-a8a17db65bef"
/dev/nvme0n1: PTUUID="33e98a7e-ccdf-4af7-8a35-da18e704cdd4" PTTYPE="gpt"
/dev/nvme0n1p1: PARTLABEL="BIOS Boot Partition" PARTUUID="430fb5f4-e6d9-4c53-b89f-117c8989b982"
/dev/nvme1n1: PTUUID="0dc70bf8-b8a8-405c-93e1-71c3b8a887c7" PTTYPE="gpt"
/dev/nvme1n1p1: PARTLABEL="bbp" PARTUUID="82075e65-ae7c-4a90-90a1-ea1a82a52f93"
기존 대형 EBS 볼륨의 루트 파티션 uuid는 이고 add39d87-732e-4e76-9ad7-40a00dbb04e5
, 새로운 소형 EBS 볼륨의 uuid는 임을 알 수 있습니다 566a022f-4cda-4a8a-8319-29344c538da9
. sed 명령을 사용하여 교체하세요.:
sed 's/add39d87-732e-4e76-9ad7-40a00dbb04e5/566a022f-4cda-4a8a-8319-29344c538da9/g' /boot/grub2/grub.cfg
sed 's/add39d87-732e-4e76-9ad7-40a00dbb04e5/566a022f-4cda-4a8a-8319-29344c538da9/g' /etc/fstab
grub-install
물론 편의를 위해 여기에 있는 (일부 시스템에서는 ) 을 사용하여 grub 파일을 수동으로 생성할 수도 있습니다 grub2-install
.
4. 두 개의 볼륨을 분리한 다음 새 작은 볼륨을 다시 연결합니다.
umount
그런 다음 새 ebs 볼륨을 마운트 해제하는 데 사용합니다 .
umount /mnt/myroot/
해당 대상이 사용 중이라는 메시지가 표시되는 경우. fuser -mv /mnt/myroot
어떤 프로세스가 작동 중인지 확인하는 데 사용할 수 있습니다 . 내가 찾은 것은 bash입니다. 이는 bash에서 이 디렉토리를 종료해야 함을 의미합니다. cd
홈디렉토리로 돌아가서 다시 위의 명령어를 입력하여 마운트를 해제할 때 사용합니다 .
그런 다음 볼륨이 있는 두 개를 모두 분리하고(물론 먼저 인스턴스를 중지합니다) 여기에 장치 이름을 입력하여 새 볼륨을 루트 장치로 다시 연결합니다. /dev/xvda
아래 그림과 같이
그런 다음 인스턴스를 시작합니다. SSH가 실패한 경우 다음 방법을 사용하여 디버깅할 수 있습니다.
1. 시스템 로그 가져오기
참조:
1.https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/TroubleshootingInstances.html#InitialSteps
2.https://www.daniloaz.com/en/partitioning-and-resizing-the-ebs-root-volume-of-an-aws-ec2-instance/
3.https://medium.com/@m.yunan.helmy/derease-the-size-of-ebs-volume-in-your-ec2-instance-ea326e951bce
답변4
아래 기사는 EBS 볼륨 크기를 줄이는 방법에 대한 훌륭하고 간단한 튜토리얼입니다. 단계별 가이드와 스크린샷을 쉽게 따라할 수 있습니다.