AWS EBS 루트 볼륨 크기를 줄이는 방법은 무엇입니까?


16

EC2 인스턴스 확대는 호흡처럼 쉽습니다 (예 : AMI 생성, 인스턴스 시작 및 스토리지 크기 변경).

그러나 그것을 줄이는 것이 더 어려워집니다. AWS (Amazon Web Services) EC2 인스턴스 EBS (Elastic Block Store) 루트 볼륨 크기를 줄이려고합니다. 인터넷에는 몇 가지 오래된 고급 절차가 있습니다. 내가 찾은보다 자세한 버전은 StackOverflow 질문에 대한 1 년 된 답변입니다 .ebs 볼륨 용량을 줄이는 방법 , 단계는 상당히 높은 수준입니다.

원하는 크기의 새 EBS 볼륨을 만듭니다 (예 : / dev / xvdg).

인스턴스를 시작하고 두 EBS 볼륨을 모두 연결

원래 루트 볼륨의 파일 시스템을 확인하십시오. (예 : e2fsck -f / dev / xvda1

원래 루트 볼륨을 최대한 줄입니다 (예 : ext2 / 3 / 4) resize2fs -M -p / dev / xvda1

dd를 사용하여 데이터를 복사하십시오.

  • 청크 크기를 선택하십시오 (16MB가 좋습니다)

  • resize2fs 출력의 블록 수를 사용하여 청크 수 계산 : blocks * 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 인스턴스에 연결되어 있습니다.

어떤 도움이라도 정말로 감사하겠습니다.


그것은 꽤 좋은 단계별 "방법"솔루션처럼 보입니다.
ceejayoz

dd-디스크에 디스크 복사 dd if = / dev / xvdf of = / dev / xvdh bs = 4k count = 227613 e2fsck -f / dev / xvdh1 resize2fs -p / dev / xvdh1
sirkubax

답변:


6

AWS 콘솔에서 :

  1. 크기를 조정하려는 인스턴스를 중지하십시오.

  2. 활성 볼륨의 스냅 샷을 생성 한 다음 해당 스냅 샷에서 "범용 SSD"볼륨을 생성하십시오.

  3. 원하는 크기로 다른 "범용 SSD"볼륨을 작성하십시오.

  4. 이 3 개의 볼륨을 다음과 같이 인스턴스에 연결하십시오.

    • 활성 볼륨의 경우 / dev / sda1
    • 대상 크기 인 볼륨의 경우 / dev / xvdf
    • 활성 볼륨의 스냅 샷에서 작성된 볼륨의 경우 / dev / xvdg
  5. 인스턴스를 시작하십시오.

  6. SSH를 통해 새 인스턴스에 로그온하십시오.

  7. 이 새 디렉토리를 작성하십시오.

mkdir /source /target

  1. 새 볼륨에 ext4 파일 시스템을 만듭니다.

mkfs.ext4 /dev/xvdf

  1. 이 디렉토리에 마운트하십시오.

mount -t ext4 /dev/xvdf /target

  1. 이것은 매우 중요합니다. 파일 시스템은 리눅스가 그것을 인식하고 부팅하기 위해 e2label이 필요합니다. 활성 인스턴스에서 "e2label / dev / xvda1"을 사용하여 무엇이 필요한지 확인하십시오.이 경우 레이블은 "/"입니다.

e2label /dev/xvdf /

  1. 스냅 샷에서 생성 된 볼륨을 마운트하십시오.

mount -t ext4 /dev/xvdg /source

  1. 내용을 복사하십시오.

rsync -ax /source/ /target

참고 : "/ target"뒤에 "/"가 없습니다. 또한 symlinks 및 attrs에 대해 몇 가지 오류가있을 수 있지만 크기 조정은 여전히 ​​성공했습니다.

  1. 파일 시스템을 마운트 해제하십시오.

umount /target
umount /source

  1. AWS 콘솔로 돌아 가기 : 인스턴스를 중지하고 모든 볼륨을 분리하십시오.

  2. "/ dev / sda1"과 같이 새 크기의 볼륨을 인스턴스에 연결하십시오.

  3. 인스턴스를 시작하면 부팅됩니다.

10 단계 중요 : 위에서 언급 한대로 "e2label"로 새 볼륨에 레이블을 지정하십시오. 그렇지 않으면 인스턴스가 aws로 부팅되는 것처럼 보이지만 연결 확인은 통과하지 못합니다.


9
이 단계를 여러 번 수행했으며 (Ubuntu 14.04) 새 볼륨을 연결할 때마다 인스턴스가 중지됩니다. 이 문제가 다른 사람이 있습니까? 이것은 내 두뇌를 건 드리는 것입니다!
thiesdiggity

2
당신은 유일한 사람이 아닙니다. 나는이 솔루션과 다른 솔루션을 시도했으며 당신의 좋은 자아처럼 내 인스턴스도 종료되었습니다.
blairmeister

1
@blairmeister 나는 같은 문제가 있었지만 작동하게했습니다! 여전히 붙어 있다면 아래의 답변을 살펴보십시오. :)
Ruben Serrate

내 e2label하지 작업 cloudimg-rootfs ... 내가 우분투 14.04에서 확인할 수 있습니다 모든 단계 다음을 수행입니다
NineCattoRules

1
이 답변은 부주의 한 손상으로부터 사용자를 보호하기 위해 볼륨 (부팅 볼륨과 같은)에 대한 충분한 사용 사례를 다루지 않기 때문에 다운 투표하고 있습니다.
Jesse Adelman

6

볼륨이 루트 (부팅 가능) 장치로 사용되는 경우 다른 솔루션은 작동하지 않습니다.

새로 생성 된 디스크에 부트 파티션이 없기 때문에 GRUB을 설치하고 인스턴스가 루트 볼륨으로 사용하기 전에 일부 플래그를 올바르게 설정해야합니다.

내 (오늘의 같은 작업 루트 볼륨을 축소하기위한) 솔루션입니다 :

배경 : 루트 볼륨을 줄이려는 인스턴스 A가 있습니다. 이 볼륨을 VA라고하겠습니다. 10GB라고 말하면 VA를 30GB에서 줄이려고합니다.

  1. 인스턴스 A와 동일한 OS를 사용하여 새로운 ec2 인스턴스 B를 생성합니다. 스토리지로는 VA와 동일한 유형이지만 크기는 10GB 인 볼륨을 선택합니다. (또는 대상 크기가 무엇이든). 이제이 새로운 볼륨을 VB라고하는 인스턴스 B가 루트 볼륨으로 사용됩니다.
  2. 새 인스턴스 (B)가 실행되면 중지하고 루트 볼륨 (VB)을 분리하십시오.

참고 : 다음 단계는 대부분 @bill 솔루션에서 가져옵니다.

  1. 크기를 조정하려는 인스턴스를 중지하십시오 (A).

  2. 볼륨 VA의 스냅 샷을 생성 한 다음 해당 스냅 샷에서 "범용 SSD"볼륨을 생성하십시오. 이 책을 VASNAP이라고합니다.

  3. Amazon Linux를 사용하여 새 인스턴스를 스핀하고이 인스턴스를 C라고합니다.이 인스턴스를 사용하여 VASNAP의 내용을 VB로 복사합니다. 인스턴스 A를 사용하여 이러한 단계를 수행 할 수도 있지만 독립 시스템에서 수행하는 것을 선호합니다.

  4. VB의 경우 인스턴스 C에 다음 볼륨을 연결하십시오. / dev / xvdf VASNAP의 경우 / dev / xvdg

  5. 인스턴스 C를 재부팅하십시오.

  6. SSH를 통해 인스턴스 C에 로그온하십시오.

  7. 다음 새 디렉토리를 작성하십시오.

mkdir /source /target

  1. ext4 파일 시스템으로 VB의 기본 파티션을 포맷하십시오 :

mkfs.ext4 /dev/xvdf1

오류가 없으면 11 단계로 진행하십시오. 그렇지 않은 경우 다음이없는 경우 /dev/xvdf1다음 i-vii를 수행하여 파티션을 작성해야합니다.

i) /dev/xvdf1어떤 이유로 든 존재하지 않는 경우 이를 작성해야합니다. 먼저 입력하십시오 :

sudo fdisk /dev/xvdf.

ii) 다음을 입력하여 디스크를 정리하십시오. wipefs

iii) 다음을 입력하여 새 파티션을 만듭니다. n

iv) p1 차 파티션을 작성하려면 입력하십시오

v) 기본 설정을 계속하려면 enter를 계속 누르십시오.

vi) 명령을 다시 요청하면 w변경 사항을 작성하고 종료하도록 입력하십시오 .

vii) 다음 /dev/xvdf1을 수행 하여 파티션 이 있는지 확인하십시오 . 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 단계로 진행하십시오.

  1. 이 디렉토리에 마운트하십시오.

mount -t ext4 /dev/xvdf1 /target

  1. 이것은 매우 중요합니다. 파일 시스템에서 Linux를 인식하고 부팅하려면 e2label이 필요합니다. 활성 인스턴스에서 "e2label / dev / xvda1"을 사용하여 필요한지 확인하십시오.이 경우 레이블은 "/"입니다.

e2label /dev/xvdf1 /

  1. / source에 VASNAP 마운트 :

mount -t ext4 /dev/xvdg1 /source

  1. 내용을 복사하십시오.

rsync -vaxSHAX /source/ /target

참고 : "/ target"뒤에 "/"가 없습니다. 또한 symlinks 및 attrs에 대해 몇 가지 오류가있을 수 있지만 크기 조정은 여전히 ​​성공했습니다.

  1. Umount VB :

umount /target

  1. AWS 콘솔로 돌아 가기 : 인스턴스 C에서 VB를 분리하고 A에서 VA를 분리하십시오.

  2. 새 크기의 볼륨 (VB)을 인스턴스에 "/ dev / xvda"로 연결하십시오.

  3. 부팅 인스턴스 A, 이제 루트 장치는 10GB입니다. :)

  4. 인스턴스 B와 C, VB를 제외한 모든 볼륨 (이제 인스턴스 A의 루트 볼륨)을 모두 삭제하십시오.


당신의 OS는 무엇입니까?
NineCattoRules

@NineCattoRules Amazon Linux
Ruben Serrate

우분투 14.04에서 시도했지만 작동하지 않습니다
NineCattoRules

@NineCattoRules Ouch ... Amazon Linux에서 작동하는지 확인할 수 있으며 최근에 수행해야했습니다.
Ruben Serrate

1
/dev/sda1@RubenSerrate 대신 17 단계의 볼륨을 연결 /dev/xvda해서는 안됩니까?
alper

2

다음 단계는 나를 위해 일했습니다.

1 단계. 루트 ebs 볼륨의 스냅 샷 생성 및 스냅 샷에서 새 볼륨 생성 (이 볼륨 복사라고하겠습니다)

단계 2. 원하는 크기의 ebs 루트 볼륨으로 새 인스턴스를 작성하십시오. (이 볼륨 크기를 호출하겠습니다)이 ebs 볼륨에는 부팅을위한 올바른 파티션이 있습니다. (처음부터 새로운 ebs 볼륨을 생성해도 효과가 없었습니다)

단계 3. 볼륨 크기 조정 및 볼륨 사본을 인스턴스에 연결하십시오.

단계 4. 볼륨 크기를 조정하십시오.

sudo fdisk -l
    sudo mkfs -t ext4 /dev/xvdf1

참고 : 파티션 볼륨이 입력 /dev/xvdf1되지 않았 는지 확인하십시오/dev/xvdf

5 단계. 볼륨 크기 조정 및 볼륨 복사 mkdir / mnt / copy mkdir / mnt / resize

sudo mount /dev/xvdh1 /mnt/copy
sudo mount /dev/xvdf1 /mnt/resize

6 단계. 파일 복사

rsync -ax /mnt/copy/ /mnt/resize

7 단계. e2label이 루트 볼륨과 동일한 지 확인하십시오.

sudo E2label /dev/xvdh1 > cloudimg-rootfs
sudo E2label /dev/xvdf1 cloudimg-rootfs

8 단계. 새 볼륨 udid와 일치하도록 볼륨 복사에서 grub.conf 업데이트

/boot/grub/grub.cfg에서 uudid를 검색하고 교체하십시오.

ubuntu@server:~/mnt$ sudo blkid
/dev/xvdh1: LABEL="cloudimg-rootfs" UUID="1d61c588-f8fc-47c9-bdf5-07ae1a00e9a3" TYPE="ext4"
/dev/xvdf1: LABEL="cloudimg-rootfs" UUID="78786e15-f45d-46f9-8524-ae04402d1116" TYPE="ext4"

9 단계. 볼륨 마운트 해제

10 단계. 새로운 크기 조정 된 ebs 볼륨을 인스턴스 / dev / sda1에 연결


1
@ruben serrate answer와 grub UUID 업데이트를 결합하면 나에게 도움이됩니다.
Jonathan Maim

방금 낭비한 작은 메모 : 실행 blkid하지 않고 실행 하면 sudo캐시 된 결과가 유효성을 검사 하지 않고 반환됩니다. UUID가 변경되지 않은 것처럼 보입니다.
Akhil Nair

0

다른 접근법이 있습니다;

실행중인 EC2 인스턴스에 이전 EBS 볼륨을 연결하고 마운트하십시오. 부팅 볼륨을 복사하려는 경우 볼륨이 라이브 시스템으로 사용되는 것이 아니라 이전 볼륨이 데이터로 마운트 된 다른 인스턴스에서 수행하는 것이 가장 좋습니다.

원하는 크기의 새 EBS 볼륨을 만듭니다.

새 볼륨을 인스턴스에 연결하고 새 파일 시스템을 조심스럽게 포맷하십시오 (예 : mkfs 사용). 마운트하십시오.

이전 파일 시스템 내용을 이전 볼륨에서 새 볼륨으로 복사하십시오.

rsync -vaxSHAX /oldvol/ /newvol/

새 볼륨을 마운트 해제하고 인스턴스에서 분리하십시오.

루트 파일 시스템을 복사하는 경우 :

새 볼륨의 EBS 스냅 샷을 만듭니다.

스냅 샷을 새 AMI로 등록하십시오.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.