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


38

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

처음에는 새로운 PV 인스턴스를 시작하고 ec2-create-image명령을 사용하여 가상화 유형으로 HVM을 지정하는 것이 었습니다. 그러나 ec2-create-image가상화 유형을 지정하기위한 명령 행 매개 변수가 없습니다.

이 작업을 수행하는 다른 방법이 있습니까?

답변:


22

최신 정보

AWS는 EC2 API에서이 기능을 활성화했습니다. 새로운 Boto 기반 AWS에서 --virtualization-type옵션으로 사용할 수 있습니다 aws ec2 register-image.

원래 답변

예! 불행히도 그렇게하는 직접적인 방법은 없습니다. 또한 일부 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를 설정 한 다음 배포 용 커널 및 부트 로더를 설치해야합니다. 로그 및 모든 클라우드 초기화 캐시를 지우고 싶을 수도 있습니다.


2
1-5 단계를 시도했지만 인스턴스가 몇 초 후에 중지되므로 작동하지 않습니다. 누군가가 chroot를 설정하고 커널과 부트 로더를 설치하는 방법에 대해 자세히 설명 할 수 있습니까? 이전 인스턴스와 새 인스턴스는 모두 AMI Linux입니다. 감사.
tolgamorf

작동하는 PV 인스턴스가있는 경우 aws ec2 register-imagePV 이미지의 스냅 샷에서 --virtualization-type 플래그를 사용하여 인스턴스를 HVM으로 변환 할 수 있습니다 . 자세한 내용 aws ec2 register-image help을 참조하십시오.
Jeff Strunk

2
를 사용하여 PV 인스턴스에서 HVM 이미지를 생성했습니다 aws ec2 register-image. 그런 다음 해당 이미지에서 새 HVM 인스턴스를 시작했습니다. 그러나 시스템은 부팅되지 않습니다.
tolgamorf

aws ec2 포럼을 살펴본 후 파일을 수동으로 교체하여 변환하는 솔루션을 찾았습니다. 곧 답변을 드리겠습니다.
tolgamorf

@ tolgamorf 당신이 한 일을 전혀 기억하십니까? 같은 문제가 있습니다.
Dmitry Minkovsky

13

필자의 경우 사용하여 만든 인스턴스가 aws ec2 register-image부팅되지 않았으므로 수동으로 변환을 수행해야했습니다 . 내 솔루션은 AWS EC2 포럼 의이 게시물 을 기반으로 합니다 .

예비

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

  1. 마이그레이션 할 모든 PV 시스템에 SSH를 연결하고 모든 업데이트를 적용한 다음 로그 아웃하십시오.

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

  3. 이 새 인스턴스에 SSH를 설치하고 모든 업데이트를 적용한 다음 로그 아웃하십시오.

  4. AWS Console로 이동하여 PV 인스턴스를 중지하십시오. 루트 장치의 스냅 샷을 생성 SOURCE VOLUME하고이 스냅 샷에서 새 볼륨 ( )을 생성하십시오.

  5. HVM 인스턴스를 중지하십시오. 새 인스턴스에서 루트 디바이스의 스냅 샷을 작성 TARGET VOLUME하고이 스냅 샷에서 새 볼륨 ( )을 작성하십시오.

  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. 편집 /mnt/target/etc/fstab에 대한 /가를 참조 그래서 파티션, TARGET VOLUME단계 (8)에서 최종 위치에 장착 할 때. 레이블을 사용하거나 단순히 다음과 같은 것을 사용하십시오.

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

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

  1. AWS 콘솔을 사용하여 시스템을 중지하고 모든 볼륨을 분리하십시오. TARGET VOLUME새 인스턴스를로 첨부하십시오 /dev/xvda.

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

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


1
이유는 간단하지 않습니다 rm -f /bootcp -a /mnt/source/boot /mnt/target?
michelem

@Michelem 내가 올바르게 기억한다면, 나는 그것을 처음부터 시도했습니다. 머신이 부팅되지 않았습니다.
tolgamorf

1
@tolgamorf 이것을 반영하기 위해 답변을 업데이트 할 수 있습니까?
Dan Tenenbaum 2019

2
이 지침은 정말 도움이되었고 (나를 위해 일했습니다!)하지만 마지막 제안이 있습니다. 원래 질문은 HVM AMI를 만드는 것에 대한 것이 었으므로 해당 단계를 암시하지 말고 인스턴스를 중지하고 인스턴스에서 AMI를 만드는 마지막 단계를 추가 한 다음 인스턴스를 종료하십시오. 또한 @DanGravell과 똑같은 문제가 있었으며 자기 저장 장치를 사용하지 않으므로 대답에서 해결할 수있는 일반적인 함정 일 수 있습니다.
Dan Tenenbaum 2019

1
많은 감사합니다! 이로 인해 많은 시간이 절약되었고 fstab 부분을 정리하여 혼란스럽게 만들었습니다. 단계 (4) 동안 나는 대상이 아닌 임시 볼륨의 루트를 삭제하여 해당 볼륨을 손상시키고 프로세스를 다시 시작해야했습니다.
Zar

10

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 

세부 단계 :

단계를 단순화하고 ec2 레지스터 이미지에 대한 자세한 내용을 제공하기 위해 Jeff Strunk의 응답 에 따라 추가로 응답 합니다.

  1. PV 이미지를 사용하여 인스턴스를 만듭니다. 원하는 사항을 변경하십시오.

  2. 위 인스턴스에서 이미지를 만듭니다.

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

    또는 ec2 api 도구가 설정된 경우 :

    ec2-describe-images 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는 강화 된 네트워킹을 활성화하기위한 것이지만 중복 될 수는 있지만 확실하지는 않습니다.

자세한 내용은:


2
내가 잘못하고 있지 않으면 인스턴스 유형을 제한하는 마켓 플레이스 AMI에서는 작동하지 않습니다. 공식 MongoDB 반가상 AMI를 HVM으로 변환하려고 시도했지만 HVM AMI를 만들 수는 있지만 HVM 인스턴스를 시작하지는 않습니다.
Matt Beckman

@MattBeckman AMI 제한보다는 기본 커널 / 부트 로더 지원에 대해 생각합니다. 위의 페도라에서는 작동하지만 아마존 리눅스에서는 작동하지 않습니다. 거기서 당신은 Jeff Strunk originaly가 제안한대로 가야합니다.
Anshu Prateek

1
@AnshuPrateek
Atmesh Mishra에서

2

AWS 웹 인터페이스 내부에서이를 수행 할 수 있습니다. 스냅 샷으로 이동 한 후 hvm으로 변환 할 원하는 스냅 샷을 클릭하고 작업을 클릭 한 다음 이미지만듭니다 . 이미지 작성 마법사의 드롭 다운에서 HVM을 선택하십시오 .


9
방금 시도했지만 인스턴스가 제대로 부팅되지 않는 것처럼 보입니다. 시작한 후 몇 분 후에 자체적으로 중지 된 상태가됩니다.
ovi

1

여기에있는 모든 제안을 시도했지만 아무도 효과가 없었지만 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=ttyS0커널 라인에, 필요하면 교체 root=*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 인스턴스를 시작하십시오. 이것이 마이그레이션 된 인스턴스입니다.

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