สร้าง AWS HVM Linux AMI จาก Paravirtual Linux AMI ที่มีอยู่


38

เป็นไปได้หรือไม่ที่จะสร้างฮาร์ดแวร์เครื่องเสมือน (HVM) AMI จาก paravirtual (PV) AMI ที่มีอยู่

ความคิดเริ่มแรกของฉันคือการเริ่มต้นอินสแตนซ์ PV ใหม่และใช้ec2-create-imageคำสั่งเพื่อสร้างอิมเมจใหม่ในขณะที่ระบุ HVM เป็นชนิด virutalization อย่างไรก็ตามec2-create-imageไม่มีพารามิเตอร์บรรทัดคำสั่งเพื่อระบุประเภทการจำลองเสมือน

มีวิธีอื่นอีกไหมในการทำสิ่งนี้?

คำตอบ:


22

ปรับปรุง

AWS เปิดใช้งานคุณสมบัตินี้ใน EC2 API มันมีให้เป็น--virtualization-typeตัวเลือกaws ec2 register-imageใน awscli ที่ใช้ Boto ใหม่

คำตอบเดิม

ใช่ น่าเสียดายที่ไม่มีวิธีโดยตรงในการทำเช่นนั้น นอกจากนี้อินสแตนซ์ PV บางตัวอาจต้องการการปรับเปลี่ยนเคอร์เนลและ bootloader

  1. สร้างไดรฟ์ข้อมูลจาก PV AMI ที่คุณมีอยู่ ถ้าเป็น PV AMI ของคุณเองคุณสามารถสร้างวอลลุ่มจากสแนปชอตได้ หากเป็น AMI ของบุคคลที่สามคุณจะต้องเปิดใช้งานอินสแตนซ์และถ่ายรูปหน้าจอ
  2. เรียกใช้งานอินสแตนซ์ HVM ด้วย AMI ใด ๆ
  3. หยุดอินสแตนซ์ของ HVM นั้น
  4. แยกโวลุ่มออกจากอินสแตนซ์นั้น
  5. แนบปริมาตร PV เป็นปริมาณรูท (/ dev / sda1 หรือ / dev / sda หากมีการแบ่งพาร์ติชัน) กับอินสแตนซ์ HVM
  6. ทำงานec2-create-imageกับอินสแตนซ์ของ HVM
  7. เรียกใช้งานอินสแตนซ์อื่นด้วย HVM AMI ใหม่ของคุณ

หากวิธีนี้ใช้ไม่ได้ผลก่อนขั้นตอนที่ 5 คุณจะต้องแนบโวลุ่มนั้นกับอินสแตนซ์ที่กำลังทำงานตั้งค่า chroot และติดตั้งเคอร์เนลและ bootloader สำหรับการแจกจ่ายของคุณ คุณอาจต้องการล้างบันทึกและแคชคลาวด์เริ่มต้น


2
ฉันลองขั้นตอนที่ 1-5 และไม่ได้ผลสำหรับฉันเนื่องจากอินสแตนซ์หยุดหลังจากสองสามวินาที มีคนอธิบายรายละเอียดเกี่ยวกับวิธีตั้งค่า chroot และติดตั้งเคอร์เนลและ bootloader หรือไม่ ทั้งอินสแตนซ์เก่าและใหม่เป็น AMI Linux ขอบคุณ
tolgamorf

หากคุณมีอินสแตนซ์ PV ที่ใช้งานได้คุณสามารถแปลงเป็น HVM ได้ด้วยการรันaws ec2 register-imageด้วยแฟล็ก --virtualization-type บนสแน็ปช็อตของอิมเมจ PV ดูaws ec2 register-image helpรายละเอียดที่
Jeff Strunk

2
ฉันสร้างภาพจากอินสแตนซ์ HVM PV aws ec2 register-imageของฉันโดยใช้ จากนั้นฉันก็เปิดอินสแตนซ์ HVM ใหม่จากภาพนั้น อย่างไรก็ตามระบบจะไม่บูต
tolgamorf

หลังจากขุดผ่านฟอรั่ม aws ec2 ฉันพบวิธีแก้ปัญหาที่การแปลงเสร็จสิ้นโดยแทนที่ไฟล์ด้วยตนเอง ฉันจะเขียนคำตอบในไม่ช้า
tolgamorf

@tolgamorf คุณจำทุกสิ่งที่คุณทำหรือไม่? ฉันมีปัญหาเดียวกัน
Dmitry Minkovsky

13

ในกรณีของฉันฉันต้องทำการแปลงด้วยตนเองเนื่องจากอินสแตนซ์ที่ฉันสร้างโดยใช้aws ec2 register-imageไม่ได้บูต ทางออกของฉันจะขึ้นอยู่กับโพสต์นี้บนAWS EC2 ฟอรั่ม

การจัดเตรียม

ตรวจสอบให้แน่ใจว่าไดรฟ์ข้อมูลทั้งหมดอยู่ในโซนความพร้อมใช้งานเดียวกัน

  1. SSH ไปยังเครื่อง PV ที่คุณต้องการย้ายข้อมูลและใช้การอัปเดตทั้งหมดจากนั้นออกจากระบบ

  2. ไปที่คอนโซล AWS และเปิดใช้งานอินสแตนซ์ HVM ใหม่โดยเลือก AMI ฐานเดียวกันกับที่ระบบ PV ถูกสร้างขึ้น (ในกรณีของฉันคือ Amazon 64 บิต Linux AMI ของ Amazon)

  3. SSH กับอินสแตนซ์ใหม่นี้และใช้การอัปเดตทั้งหมดจากนั้นออกจากระบบ

  4. ไปที่คอนโซล AWS และหยุดอินสแตนซ์ 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 /bootและcp -a /mnt/source/boot /mnt/target?
michelem

@Michelem ถ้าฉันจำได้ถูกต้องฉันลองทำมันตั้งแต่แรก เครื่องไม่บู๊ต
tolgamorf

1
@tolgamorf มีโอกาสใดที่จะอัพเดตคำตอบเพื่อสะท้อนสิ่งนี้?
Dan Tenenbaum

2
คำแนะนำเหล่านี้มีประโยชน์จริง ๆ (และใช้งานได้สำหรับฉัน !!) แต่ฉันมีคำแนะนำสุดท้าย เนื่องจากคำถามเดิมเกี่ยวกับการสร้าง HVM AMI อย่าออกจากขั้นตอนนั้นโดยปริยายเพิ่มขั้นตอนสุดท้ายในการหยุดอินสแตนซ์และทำ AMI จากมัน (จากนั้นให้ยกเลิกอินสแตนซ์) นอกจากนี้ฉันยังมีปัญหาเดียวกันกับ @DanGravell และฉันไม่ได้ใช้ที่เก็บแม่เหล็กดังนั้นสิ่งเหล่านี้อาจเป็นข้อผิดพลาดทั่วไปที่สามารถแก้ไขได้ในคำตอบ
Dan Tenenbaum

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 

ขั้นตอนโดยละเอียด:

ตอบเพิ่มเติมตามการตอบสนองของ Jeff Strunkเพื่อทำให้ขั้นตอนง่ายขึ้นและให้รายละเอียดเพิ่มเติมเล็กน้อยเกี่ยวกับอิมเมจการลงทะเบียน ec2:

  1. สร้างอินสแตนซ์โดยใช้อิมเมจ PV ทำการเปลี่ยนแปลงการเปลี่ยนแปลงที่คุณต้องการ

  2. สร้างภาพจากอินสแตนซ์ด้านบน

  3. ค้นหารหัสสแนปชอตที่ใช้โดย AMI ข้างต้นภายใต้ EC2> ร้านยืดหยุ่นของบล็อก> สแนปชอตในคอนโซล EC2

    หรือหากคุณมีการตั้งค่าเครื่องมือ ec2 api:

    ec2-description-images ami-id_of_above_created_ami

    และค้นหารหัสสแน็ปช็อตสำหรับ ami

    .. ข้อสมมติฐานสำหรับขั้นตอนต่อไป: ตั้งค่าคีย์ ec2 และเครื่องมือ api ของคุณแล้วและพร้อมใช้งาน:

  4. ลงทะเบียน HVM AMI ใหม่โดยใช้ภาพรวมด้านบน: ตัวอย่าง:

ec2-register -a x86_64 -d '3.15.7-200.fc20.x86_64' -n 'Fedora_20_HVM_AMI' - เรียบง่าย - ระบบเสมือนประเภท hvm -s snap-b44feb18 - รูตอุปกรณ์ชื่อ / dev / sda1

ที่ไหน

  • -d คือคำอธิบาย AMI
  • -n เป็นชื่อ AMI
  • -s เป็นสแน็ปช็อต id จากขั้นตอนที่ 3
  • - เป็นสถาปัตยกรรม
  • - virtualization-type จำเป็นสำหรับการทำให้ hvm
  • - sriov สำหรับการเปิดใช้งานเครือข่ายที่เพิ่มขึ้นแม้ว่ามันอาจจะซ้ำซ้อนไม่แน่ใจ

สำหรับข้อมูลเพิ่มเติม:


2
ถ้าฉันทำอะไรผิดนี่จะไม่ทำงานกับ AMI ของตลาดที่ จำกัด ประเภทอินสแตนซ์ พยายามแปลง MongoDB paravirtual AMI อย่างเป็นทางการเป็น HVM และในขณะที่ฉันสามารถสร้าง HVM AMI ได้ก็จะไม่เปิดใช้งานอินสแตนซ์ HVM
Matt Beckman

@ MattBeckman ฉันคิดว่ามันเกี่ยวกับการสนับสนุน kernel / bootloader พื้นฐานมากกว่าข้อ จำกัด ของ AMI ข้างต้นใช้สำหรับ fedora แต่ไม่ใช่สำหรับ amazon linux คุณต้องไปตามที่แนะนำโดย 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. ทำสแน็ปช็อตข้อควรระวังของวอลุ่ม root บนอินสแตนซ์แหล่งที่มา (source volume, 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. ปรับขนาดให้เล็กที่สุดของ FS ของ SV และใช้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. ติดตั้งgrubลงในบล็อกการบูตของ DV

    1. สร้างไฟล์อุปกรณ์ชั่วคราวบน DV: mount /dev/xvdg1 /mnt; cp -a /dev/xvdg /dev/xvdg1 /mnt/dev/

    2. ติดตั้งไฟล์ด้วง:

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

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

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

    1. ติดตั้งด้วงในสภาพแวดล้อม chroot:

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

    device (hd0) /dev/xvdg

    root (hd0,0)

    setup (hd0)

    ARNIE

  7. ต้องทำการเปลี่ยนแปลงเล็กน้อยอื่น ๆ ในปริมาณปลายทาง snap ไดรฟ์และทำ 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. เรียกใช้อินสแตนซ์ HVM จาก HMI นั้น นั่นคืออินสแตนซ์ที่ย้ายของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.