Amazon EBS 볼륨 크기 축소

나는 EBS 볼륨 증가에 대한이 답변을 보았지만 하나를 축소하고 싶습니다.

기본 우분투 서버 이미지는 15GB이지만 최대 2GB 만 필요합니다 (데이터에 다른 볼륨을 사용합니다). 볼륨 크기를 줄이는 방법이 있습니까?



답변

나는 당신과 같은 질문을 가지고 있었으므로 그것을하는 방법을 연구했습니다.

먼저 미국 동부 지역의 Ubuntu 32 비트 EBS 지원 ami에서이 작업을 수행했습니다. 다른 OS 또는 이미지는 다르게 작동 할 수 있습니다. 그러나 ext * 파일 시스템을 사용하는 한 괜찮을 것이라고 생각합니다. 다른 파일 시스템에서 작동 할 수도 있지만, 스스로 파일 크기를 조정하는 방법을 찾아야합니다.

단계는 기본적으로 다음과 같습니다.

  1. 두 개의 볼륨을 실행중인 인스턴스에 연결합니다. 첫 번째는 축소하려는 스냅 샷을 기반으로하고 두 번째는 축소하려는 새 크기의 빈 볼륨을 나타냅니다.

  2. 첫 번째 볼륨의 파일 시스템을 확인하고 오류를 수정하십시오.

  3. 첫 번째 볼륨에서 파일 시스템을 축소하여 데이터를 보유하는 데 필요한만큼만 크기를 줄이십시오.

  4. 첫 번째 볼륨에서 두 번째 볼륨으로 파일 시스템을 복사하십시오.

  5. 두 번째 볼륨의 파일 시스템을 최대 크기로 확장하십시오.

  6. 두 번째 볼륨에 오류가 있는지 확인하여 모든 것이 좋아 보이는지 확인하십시오.

  7. 두 번째 볼륨의 스냅 샷을 만듭니다.

  8. 방금 촬영 한 두 번째 볼륨의 스냅 샷을 기반으로 머신 이미지를 생성하십시오.

먼저 축소하려는 ami에서 일부 정보를 가져와야합니다. 특히 커널 ID와 램 디스크 ID가 필요합니다 (내가 축소 한 이미지에 램 디스크가없는 경우). 이 모든 정보는 AMI 창의 aws 관리 콘솔에서 사용할 수 있어야합니다.

커널 ID는 kia-xxxxxxxx와 같고 스냅 샷 ID는 snap-xxxxxxxx와 같고 램 디스크 ID는 RIA-xxxxxxxx와 같습니다.

다음으로 Linux 인스턴스를 시작하십시오. 우분투 인스턴스를 시작했습니다. 원하는 경우 t1.micro 인스턴스를 사용할 수 있습니다. 다음 단계를 수행하는 데 많은 힘이 필요하지 않습니다.

머신이 실행 된 후 첫 번째 단계에서 기록한 스냅 샷을 첨부하십시오. 내 경우에는 / dev / sdf에 첨부했습니다.

그런 다음 원하는 크기의 새 볼륨을 만드십시오. 필자의 경우 5GB 볼륨을 만들었습니다. 크기를 축소하고 싶었습니다. 스냅 샷에서이 새 볼륨을 생성하지 마십시오. 새로운 빈 볼륨이 필요합니다. 다음으로 실행중인 인스턴스에 연결하십시오. 제 경우에는 / dev / sdg로 연결했습니다.

다음으로 머신에 ssh하지만 연결된 볼륨을 마운트하지 마십시오.

이 시점에서 나는 편집증 측면에서 실수를했고 오류가 없는지 확인하기 위해 큰 볼륨에서 파일 시스템을 확인하기로 결정했습니다. 아무것도 없다고 확신하면이 단계를 건너 뛸 수 있습니다.

$ sudo e2fsck -f /dev/sdf

다음으로, 볼륨이 큰 파일 시스템의 크기를 디스크의 데이터 크기만큼 크게 조정했습니다.

$ sudo resize2fs -M -p /dev/sdf

-M은 축소하고 -p는 진행률을 인쇄합니다.

resize2fs는 shrunkin 파일 시스템의 크기를 알려줍니다. 필자의 경우 4K 블록 크기를 제공했습니다.

이제 shrunkin 파일 시스템을 새 디스크에 복사합니다. 16MB 청크로 데이터를 복사 할 것이므로 복사해야하는 16MB 청크의 수를 알아야합니다. 이렇게 줄어든 파일 시스템 크기가 문제가됩니다.

필자의 경우 축소 된 파일 시스템은 1GB 이상이었습니다. 스냅 샷을 만들기 전에 기본 우분투 시스템에 다른 많은 프로그램을 설치했기 때문입니다. 파일 시스템의 크기를 가장 가까운 16MB로 반올림하여 제거했을 수도 있지만 안전하게 재생하고 싶었습니다.

따라서 16 배 16MB 청크 = 2GB :

$ sudo dd if=/dev/sdf ibs=16M of=/dev/sdg obs=16M count=128

EBS를 사용하면 각 읽기 및 쓰기 비용을 지불하기 때문에 16MB의 블록으로 복사 했으므로 가능한 한 그 수를 최소화하고 싶었습니다. 이런 식으로 그렇게했는지 모르겠지만 아마 아프지 않았습니다.

그런 다음 방금 새 볼륨에 복사 한 파일 시스템의 크기를 조정하여 볼륨에서 사용 가능한 모든 공간을 사용하십시오.

$ sudo resize2fs -p /dev/sdg

마지막으로, 모든 것이 제대로되었는지 확인하십시오.

$ sudo e2fsck -f /dev/sdg

테스트로 새로운 볼륨을 마운트하는 데 상처를 줄 수는 없지만이 머신에서해야 할 전부입니다. 그러나이 단계는 e2fsck가 문제점을 발견 했으므로 거의 선택 사항입니다.

이제 새 볼륨을 스냅 샷하고이를 기반으로 AMI를 생성해야합니다. 우리는 기계로 끝났으므로 원한다면 종료 할 수 있습니다.

작은 볼륨을 마운트 한 경우 마운트 해제 한 후 스냅 샷을 작성하십시오. 다시 관리 콘솔에서이 작업을 수행 할 수 있습니다.

마지막 단계에는 명령 줄 ec2 도구가 필요합니다.

편집하다:

이 답변이 게시되었으므로 AWS 콘솔에서 스냅 샷을 마우스 오른쪽 버튼으로 클릭하고 스냅 샷에서 이미지 생성을 선택하면됩니다. 여전히 적절한 커널 ID를 선택해야합니다. 목록에 나타나지 않으면 적절한 아키텍처를 선택했는지 확인하십시오.

우리는 ec2-register 애플리케이션을 사용하여 방금 생성 한 스냅 샷을 기반으로 AMI를 등록하므로 방금 생성 한 스냅 샷에서 snap-xxxxxxxx 값을 기록하십시오.

그런 다음 다음과 같은 명령을 사용해야합니다.

ec2-register -C cert.pem -K sk.pem -n The_Name_of_Your_New_Image
-d Your_Description_of_This_New_AMI --kernel aki-xxxxxxxx
-b "/dev/sda1=snap-xxxxxxxx" --root-device-name /dev/sda1

물론 커널 ID를 처음에 적어 둔 것으로 바꾸고 스냅 샷 ID를 이전 단계에서 생성 한 것으로 바꿔야합니다. 또한 위의 비밀 키 (sk.pem)와 x509 인증서 (cert.pem)를 가리켜 야합니다. 물론 이름과 설명에 대해 원하는 것을 선택할 수 있습니다.

이것이 도움이되기를 바랍니다.


답변

그래, 나도 궁금했다. 다음 튜토리얼은 과잉이지만 필요한 툴이 포함되어 있다고 생각합니다.
http://www.linuxconfig.org/Howto_CREATE_BUNDLE_UPLOAD_and_ACCESS_custom_Debian_AMI_using_ubuntu

위와 같이 새 디스크 이미지에 설치하는 대신 큰 AMI를 시작하고 새 EBS를 생성하고 EBS를 실행중인 인스턴스에 연결하고 실행중인 AMI를 새 EBS에 복사 할 수 있어야합니다. 마지막으로 새 EBS를 AMI로 등록하십시오.

더 많은 배경, 특히 freremark의 의견은이 블로그 게시물을 참조 하십시오.
http://alestic.com/2010/01/public-ebs-boot-amis-for-ubuntu-on-amazon-ec2

마지막으로, euca2ools는 ec2-ami-tools의 훌륭한 대체물 인 것 같습니다. euca2ools는 실제 맨 페이지를 포함합니다! 그것들은 euca- 접두사를 가진 ec2- * 명령과 이름이 모두 같습니다.
http://open.eucalyptus.com/wiki/Euca2ools 사용 중


답변

일반 EC2 인스턴스에서 사용중인 볼륨의 크기를 줄이려고했습니다. 나는 다른 답변과 비슷한 단계를 밟았지만 문제가 발생했습니다. 루트 볼륨을 줄이기 위해해야 ​​할 일은 다음과 같습니다.

AWS 콘솔에서

 1. Stop the source EC2 instance
 2. Create a snapshot of the volume you want to shrink
 3. Use the snapshot to create a new 'source' volume
 4. Created a new volume with smaller size (made sure it was big enough for the data on source)
 5. Attached both volumes to any EC2 instance (mine were /dev/sdf = source & /dev/sdg = target)
 6. Start the EC2 instance

EC2 인스턴스에서

 7. sudo su -   (everything from here is run as root)
 8. mkdir /source /target
 9. mount -t ext4 /dev/sdf /source
 10. mkfs.ext4 /dev/sdg
 11. mount -t ext4 /dev/sdg /target
 12. rsync -aHAXxSP /source/ /target
     ** notice that there is no trailing '/' after target if
       you put one there your data will be copied to
       /target/source and you will have to move it up a directory
 13. cat /boot/grub/grub.conf  (indicated that grub is using root=LABEL=/)
 14. cat /source/etc/fstab (indicated that fstab was also using LABEL=/)
 15. e2label /dev/sdg /
 16. umount /source
 17. umount /target

AWS 콘솔로 돌아 가기

 18. Stop the instance
 19. Detach ALL volumes from the instance
 20. Attach the 'target' volume to the instance using /dev/sda1 as the device
 21. Start the instance

내가 찾을 수있는 한 언급되지 않은 문제가 발생했습니다.
인스턴스가 잘 시작되었습니다. 그러나 인스턴스에 ssh하려고 할 때 연결할 수 없었습니다. 위의 단계를 여러 번 변형 한 후 마침내 새로 튀어 나온 EC2 인스턴스에서 루트 볼륨을 사용하려고했습니다.

AWS 콘솔에서

 1. Create a new EC2 instance with the right sized root volume
 2. Stop the new instance
 3. Detach the /dev/sda1 volume from the new instance
    ** used the 'source' volume from before & the new volume we just detached
 4. Attached both volumes to the original EC2 instance (/dev/sdf & /dev/sdg)
 5. Start the instance with the attached volumes

EC2 인스턴스에서

 1. sudo su -
 2. mkdir /source /target (only need to do this if you don't already have these directories)
 3. mount -t ext4 /dev/sdf /source
 4. mount -t ext4 /dev/sdg /target (no need to create a file system because it is already there)
 5. rsync -aHAXxSP /source/ /target
 6. umount /source
 7. umount /target

AWS 콘솔로 돌아 가기

 1. Stop the instance
 2. Detach the 'source' and 'target' volumes from instance
 3. Attach the 'target' volume to the instance from step 1 using /dev/sda1 as the device
 4. Start the instance
 5. ** we use an elastic IP so we just reassigned the IP to the new instance

이것이 누군가를 돕기를 바랍니다.