기존 반가상화 Linux AMI에서 AWS HVM Linux AMI 생성

기존 반가상화 Linux AMI에서 AWS HVM Linux AMI 생성

기존 PV(반가상화) AMI에서 하드웨어 가상 머신(HVM) AMI를 생성할 수 있습니까?

처음에는 새 PV 인스턴스를 시작하고 ec2-create-image명령을 사용하여 가상화 유형으로 HVM을 지정하면서 새 이미지를 생성하려고 생각했습니다. 그러나 ec2-create-image가상화 유형을 지정하는 명령줄 매개변수가 없습니다.

이 작업을 수행하는 다른 방법이 있나요?

답변1

업데이트

AWS는 EC2 API에서 이 기능을 활성화했습니다. --virtualization-type옵션 으로 제공됩니다 .aws ec2 register-image새로운 Boto 기반 awscli에서.

원래 답변

예! 불행하게도 이를 수행할 수 있는 직접적인 방법은 없습니다. 또한 일부 PV 인스턴스에는 커널 및 부트로더 수정이 필요할 수 있습니다.

  1. 기존 PV AMI에서 볼륨을 생성합니다. 자체 PV AMI인 경우 스냅샷에서 볼륨을 만들 수 있습니다. 타사 AMI인 경우 인스턴스를 시작하고 스냅샷을 생성해야 합니다.
  2. AMI를 사용하여 HVM 인스턴스를 시작합니다.
  3. 해당 HVM 인스턴스를 중지합니다.
  4. 해당 인스턴스에서 루트 볼륨을 분리합니다.
  5. PV 볼륨을 루트 볼륨(파티셔닝된 경우 /dev/sda1 또는 /dev/sda)으로 HVM 인스턴스에 연결합니다.
  6. ec2-create-imageHVM 인스턴스에서 실행합니다 .
  7. 새로운 HVM AMI로 다른 인스턴스를 시작하세요.

그래도 작동하지 않으면 5단계 전에 해당 볼륨을 실행 중인 인스턴스에 연결하고, chroot를 설정하고, 배포용 커널과 부트로더를 설치해야 합니다. 로그와 cloud-init 캐시를 지울 수도 있습니다.

답변2

aws ec2 register-image제 경우에는 제가 생성한 인스턴스가 부팅되지 않아서 수동으로 변환을 해야 했습니다 . 내 솔루션은 다음을 기반으로합니다.이 게시물AWS EC2 포럼.

준비

모든 볼륨이 동일한 가용성 영역에 있는지 확인하십시오.

  1. 마이그레이션하려는 PV 시스템에 SSH를 통해 연결하고 모든 업데이트를 적용한 다음 로그아웃하세요.

  2. AWS 콘솔로 이동하여 PV 시스템이 생성된 것과 동일한 기본 AMI(제 경우에는 Amazon 64비트 Linux AMI)를 선택하여 새 HVM 인스턴스를 시작합니다.

  3. 이 새 인스턴스에 SSH를 통해 연결하고 모든 업데이트를 적용한 후 로그아웃하세요.

  4. AWS 콘솔로 이동하여 PV 인스턴스를 중지합니다. 루트 디바이스의 스냅샷을 만들고 SOURCE VOLUME이 스냅샷에서 새 볼륨( )을 생성합니다.

  5. HVM 인스턴스를 중지합니다. 새 인스턴스에서 루트 디바이스의 스냅샷을 만들고 TARGET VOLUME이 스냅샷에서 새 볼륨( )을 생성합니다. HVM(새) 인스턴스를 다시 시작합니다.

  6. AWS 콘솔 사용:

  • SOURCE VOLUME새 인스턴스 에 /dev/xvdf.
  • TARGET VOLUME새 인스턴스 에 /dev/xvdg.

변환 프로세스

  1. 새 인스턴스에 SSH로 접속하고 루트 액세스 권한을 얻습니다.

     sudo su
    
  2. 소스 및 대상 드라이브를 마운트합니다.

     mkdir -p /mnt/source && mount /dev/xvdf /mnt/source
     mkdir -p /mnt/target && mount /dev/xvdg1 /mnt/target
    

    /dev/xvdf제 경우에는 (소스)와 /dev/xvdg1(타겟) 디바이스가 있었습니다 . 파티션 수와 파티션을 연결한 위치에 따라 구성이 변경될 수 있습니다(준비의 6단계 참조). ls -al /dev/xvd*드라이브를 보려면 사용하십시오 .

  3. 백업 /lib/modules/*(PV ami의 커널이 새로운 HVM 시스템과 다른 경우. 이 모듈은 AWS의 일부 서비스에서 사용됩니다.)

  4. /boot대상 볼륨을 제외한 모든 항목을 삭제합니다 .

     cd /mnt/target && ls | grep -v boot | xargs rm -Rf
    
  5. /boot소스 볼륨에서 삭제 :

     rm -Rf /mnt/source/boot
    
  6. 모든 속성을 유지하면서 소스 볼륨의 데이터를 대상 볼륨에 복사합니다.

     rsync -aAXHPv /mnt/source/ /mnt/target
    
  7. 단계 (8)의 최종 위치에 마운트될 때 를 참조하도록 파티션을 /mnt/target/etc/fstab편집 합니다 . 라벨을 사용하거나 다음과 같은 내용을 사용하세요./TARGET VOLUME

     /dev/xvda1 /     ext4    defaults,barrier=0 1 1
    

그런 다음 3단계에서 백업한 것을 복원합니다 /lib/modules/. (PV ami의 커널이 새 HVM 시스템과 다른 경우)

  1. AWS 콘솔을 사용하여 시스템을 중지하고 모든 볼륨을 분리합니다. TARGET VOLUME새 인스턴스에 를 으로 연결합니다 /dev/xvda.

    원래 루트 장치가 마운트된 위치를 기록해 두십시오. 대부분의 경우 이어야 합니다 /dev/xvda.

  2. HVM 인스턴스를 시작합니다. 이제 PV 시스템의 정확한 복제본이 되어야 합니다. 모든 것이 정상으로 보이면 이제 PV 인스턴스와 을 삭제할 수 있습니다 SOURCE VOLUME.

답변3

TLDR:

ec2-register -a x86_64 -d '3.15.7-200.fc20.x86_64' -n 'Fedora_20_HVM_AMI'  --sriov simple --virtualization-type hvm -s snap-b44feb18 --root-device-name /dev/sda1 

세부 단계:

다음을 기반으로 추가 답변Jeff Strunk의 답변단계를 단순화하고 ec2 레지스터 이미지에 대해 좀 더 자세한 정보를 제공하려면 다음을 수행하세요.

  1. PV 이미지를 사용하여 인스턴스를 생성합니다. 원하는 대로 변경/업데이트하세요.

  2. 위 인스턴스에서 이미지를 생성합니다.

  3. EC2 콘솔의 EC2 > Elastic Block Store > Snapshot에서 위 AMI가 사용하는 스냅샷 ID를 찾으세요.

    또는 ec2 API 도구 설정이 있는 경우:

    EC2-설명-이미지 ami-id_of_above_created_ami

    ami의 스냅샷 ID를 찾습니다.

    .. 추가 단계에 대한 가정: ec2 키와 API 도구가 설정되어 사용할 준비가 되었습니다.

  4. 위의 스냅샷을 사용하여 새 HVM AMI를 등록합니다. 예:

ec2-register -a x86_64 -d '3.15.7-200.fc20.x86_64' -n 'Fedora_20_HVM_AMI' --sriov simple --virtualization-type hvm -s snap-b44feb18 --root-device-name /dev/sda1

어디

  • -d는 AMI 설명입니다.
  • -n은 AMI 이름입니다.
  • -s는 3단계의 스냅샷 ID입니다.
  • -a는 건축이다
  • --virtualization-type은 hvm으로 만들기 위해 필요합니다.
  • --sriov는 향상된 네트워킹을 활성화하기 위한 것이지만 중복될 수도 있지만 확실하지 않습니다.

자세한 내용은:

답변4

여기에 있는 모든 제안을 시도했지만 그 중 어느 것도 나에게 도움이 되지 않았으며 다음에서 해당 주제에 대한 훌륭한 블로그 항목을 발견했습니다.https://www.opswat.com/blog/aws-2015-why-you-need-switch-pv-hvm.

절차의 요소(세부 사항)는 다음과 같습니다.

  1. grub마이그레이션할 PV 인스턴스(소스 인스턴스)에 설치합니다 .

  2. 소스 인스턴스(소스 볼륨, SV)에서 루트 볼륨의 예방적 스냅샷을 만듭니다.

  3. 볼륨을 마이그레이션할 임시 HVM 인스턴스를 만듭니다.

    1. Amazon Linux 인스턴스를 사용했습니다.
  4. 대상 볼륨(DV)을 생성하고 이 볼륨과 SV를 모두 임시 인스턴스에 연결합니다.

    1. DV는 최소한 SV만큼 커야 합니다.

    2. SV를 로 연결 /dev/{sd,xvd}f하고 DV를 으로 연결합니다 /dev/{sd,xvd}g.

    3. DV를 분할합니다.

    parted /dev/xvdg --script 'mklabel msdos mkpart primary 1M -1s print quit'

    partprobe /dev/xvdg

    udevadm settle

  5. SV의 FS 크기를 최소 크기로 조정하고 dd이미지를 DV에 사용합니다.

    1. 소스 볼륨의 FS를 정리합니다.e2fsck -f /dev/xvdf

    2. 같은 것을 최소화하십시오:resize2fs -M /dev/xvdf

    3. resize2fs의 출력(예 Resizing the file system on /dev/xvdf to 269020 (4k) blocks: )을 관찰하고 다음 단계를 위해 기록해 둡니다.

    4. SV를 DV로 복제:dd if=/dev/xvdf of=/dev/xvdg1 bs=<block size from previous step, here 4k> count=<use block count from last step, here 269020>

    5. 새 파티션에서 FS를 확장합니다.resize2fs /dev/xvdg1

  6. grubDV의 부트 블록에 설치

    1. DV에 장치 파일을 임시로 생성합니다.mount /dev/xvdg1 /mnt; cp -a /dev/xvdg /dev/xvdg1 /mnt/dev/

    2. grub 파일을 설치합니다:

    rm -f /mnt/boot/grub/*stage*

    cp /mnt/usr/*/grub/*/*stage* /mnt/boot/grub/

    rm -f /mnt/boot/grub/device.map

    1. chroot 환경에 grub을 설치합니다:

    cat << ARNIE | chroot /mnt grub --batch

    device (hd0) /dev/xvdg

    root (hd0,0)

    setup (hd0)

    ARNIE

  7. 대상 볼륨에 다른 사소한 변경 사항을 적용한 후 볼륨을 스냅하고 여기에서 AMI를 만듭니다.

    1. 임시 장치 파일을 정리합니다.rm -f /mnt/dev/xvdg /mnt/dev/xvdg1

    2. 에서 로 /mnt/boot/grub/grub.conf변경하고 커널 라인에 추가(또는 교체 ) 하고 필요한 경우 커널 라인에서 로 교체합니다.root (hd0)root (hd0,0)console=*console=ttyS0root=*root=LABEL=/

    3. 에서 /mnt/etc/fstab루트 FS의 행에 레이블이 지정된 참조가 포함되어 있는지 확인하십시오. 예:

    LABEL=/ / ext4 defaults,noatime 1 1

    1. 새 루트 FS에 다음과 같은 레이블을 붙입니다.e2label /dev/xvdg1 /

    2. 임시 인스턴스에서 DV를 마운트 해제하고 임시 인스턴스에서 SV와 DV를 모두 분리합니다.

    3. DV를 스냅하고 해당 스냅에서 AMI 이미지를 생성합니다.

  8. 해당 HMI에서 HVM 인스턴스를 시작합니다. 이것이 마이그레이션된 인스턴스입니다.

관련 정보