จะลดขนาดปริมาณรูต AWS EBS ได้อย่างไร?


16

การขยายอินสแตนซ์ EC2 นั้นง่ายเหมือนลมหายใจ (ตัวอย่างเช่นสร้าง AMI เรียกใช้อินสแตนซ์จากนั้นจากนั้นเปลี่ยนขนาดหน่วยเก็บข้อมูล)

แต่การลดมันจะกลายเป็นเรื่องยากมากขึ้น ฉันต้องการลดขนาดของไดรฟ์ข้อมูลรากแบบยืดหยุ่นของ Amazon Web Services (AWS) EC2 มีคู่ของขั้นตอนระดับสูงเก่าในสุทธิ รุ่นที่มีรายละเอียดมากขึ้นที่ฉันพบคือคำตอบอายุหนึ่งปีสำหรับคำถาม StackOverflow: ฉันจะลดความจุปริมาณ ebs ของฉันได้อย่างไรขั้นตอนมีระดับสูงมาก:

สร้างปริมาณ EBS ใหม่ที่มีขนาดที่ต้องการ (เช่น / dev / xvdg)

เปิดตัวอินสแตนซ์และแนบ EBS ทั้งสองเล่มเข้ากับมัน

ตรวจสอบระบบไฟล์ (ของปริมาณรูตดั้งเดิม): (เช่น) e2fsck -f / dev / xvda1

ย่อขนาดปริมาตรรูทดั้งเดิมสูงสุด: (เช่น ext2 / 3/4) resize2fs -M -p / dev / xvda1

คัดลอกข้อมูลไปด้วย dd:

  • เลือกขนาดก้อน (ฉันชอบ 16MB)

  • คำนวณจำนวนชิ้น (ใช้จำนวนบล็อกจากเอาต์พุต resize2fs): บล็อก * 4 / (chunk_size_in_mb * 1024) - ปัดเศษขึ้นเพื่อความปลอดภัย

  • คัดลอกข้อมูล: (เช่น) dd if = / dev / xvda1 ibs = 16M ของ = / 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 ของ = / dev / xvdh BS = 4k นับ = 227613 e2fsck -f / dev / xvdh1 resize2fs -p / dev / xvdh1
sirkubax

คำตอบ:


6

ใน AWS Console:

  1. หยุดอินสแตนซ์ที่คุณต้องการปรับขนาด

  2. สร้างสแน็ปช็อตของไดรฟ์ข้อมูลที่ใช้งานอยู่จากนั้นสร้างไดรฟ์ "วัตถุประสงค์ทั่วไป SSD" จากสแน็ปช็อตนั้น

  3. สร้างโวลุ่ม "General Purpose SSD" อีกขนาดตามที่คุณต้องการ

  4. แนบ 3 วอลุ่มเหล่านี้กับอินสแตนซ์ดังต่อไปนี้:

    • / dev / sda1 สำหรับไดรฟ์ข้อมูลที่ใช้งานอยู่
    • / dev / xvdf สำหรับไดรฟ์ข้อมูลที่เป็นขนาดเป้าหมาย
    • / dev / xvdg สำหรับไดรฟ์ข้อมูลที่ทำจาก snapshot ของไดรฟ์ข้อมูลที่ใช้งานอยู่
  5. เริ่มอินสแตนซ์

  6. เข้าสู่อินสแตนซ์ใหม่ผ่าน SSH

  7. สร้างไดเรกทอรีใหม่เหล่านี้:

mkdir /source /target

  1. สร้างระบบไฟล์ ext4 ในปริมาณใหม่:

mkfs.ext4 /dev/xvdf

  1. ติดตั้งกับไดเร็กทอรีนี้:

mount -t ext4 /dev/xvdf /target

  1. สิ่งนี้สำคัญมากระบบไฟล์ต้องการ e2label สำหรับ linux เพื่อให้จดจำและบู๊ตใช้ "e2label / dev / xvda1" บนอินสแตนซ์ที่ใช้งานอยู่เพื่อดูว่ามันควรจะเป็นอะไรในกรณีนี้ฉลากคือ: "/"

e2label /dev/xvdf /

  1. เมานต์ระดับเสียงที่สร้างขึ้นจากภาพรวม:

mount -t ext4 /dev/xvdg /source

  1. คัดลอกเนื้อหา:

rsync -ax /source/ /target

หมายเหตุ: ไม่มี "/" ติดตาม "/ เป้าหมาย" นอกจากนี้อาจมีข้อผิดพลาดเล็กน้อยเกี่ยวกับ symlink และ attrs แต่การปรับขนาดก็ยังประสบความสำเร็จ

  1. ติดตั้งระบบไฟล์:

umount /target
umount /source

  1. ย้อนกลับไปใน AWS Console: หยุดอินสแตนซ์และถอดโวลุ่มทั้งหมด

  2. แนบไดรฟ์ข้อมูลขนาดใหม่ไปยังอินสแตนซ์เป็น: "/ dev / sda1"

  3. เริ่มต้นอินสแตนซ์และควรเริ่มระบบ

ขั้นตอนที่ 10 สำคัญ : ติดป้ายกำกับวอลุ่มใหม่ด้วย "e2label" ตามที่กล่าวไว้ข้างต้นมิฉะนั้นอินสแตนซ์จะปรากฏขึ้นเพื่อบูตใน aws แต่จะไม่ผ่านการตรวจสอบการเชื่อมต่อ


9
ฉันได้ทำตามขั้นตอนเหล่านี้หลายครั้ง (Ubuntu 14.04) และทุกครั้งที่ฉันแนบโวลุ่มใหม่อินสแตนซ์ก็หยุด มีบุคคลอื่นที่ประสบปัญหานี้หรือไม่ นี่คือสมองของฉัน!
thiesdiggity

2
คุณไม่ใช่คนเดียว ฉันได้ลองวิธีนี้และวิธีแก้ปัญหาอื่น ๆ แล้วและเช่นเดียวกับตัวตนที่ดีของคุณอินสแตนซ์ของฉันก็ปิดตัวลงเช่นกัน
blairmeister

1
@ blairmeister ฉันมีปัญหาเดียวกัน แต่สามารถจัดการให้ทำงานได้! มีลักษณะที่คำตอบของฉันด้านล่างหากคุณยังคง stucked :)
Ruben ฟันปลา

e2label ของฉันคือ cloudimg-rootfs ... ทำตามขั้นตอนเหล่านี้ทั้งหมดฉันสามารถยืนยันบน Ubuntu 14.04 ไม่ทำงาน
NineCattoRules

1
ฉันกำลัง downvoting คำตอบนี้เนื่องจากมันไม่ครอบคลุมกรณีการใช้งานที่เพียงพอสำหรับไดรฟ์ข้อมูล (เช่นปริมาณการบูต) เพื่อปกป้องผู้ใช้จากความเสียหายโดยไม่ตั้งใจ
Jesse Adelman

6

ไม่มีวิธีแก้ไขอื่นใดที่ใช้งานได้หากใช้โวลุ่มเป็นอุปกรณ์รูท (บูตได้)

ดิสก์ที่สร้างขึ้นใหม่ไม่มีพาร์ติชันสำหรับเริ่มระบบดังนั้นจึงจำเป็นต้องติดตั้ง GRUB และตั้งค่าสถานะบางอย่างอย่างถูกต้องก่อนที่อินสแตนซ์สามารถใช้เป็นโวลุ่มรูทได้

โซลูชัน(ณ วันนี้ที่ทำงาน ) ของฉันสำหรับการลดขนาดรูตคือ:

พื้นหลัง:เรามีอินสแตนซ์ A ซึ่งมีปริมาณรูตที่เราต้องการย่อ ลองเรียกเสียงนี้ว่า VA เราต้องการลดขนาด VA จาก 30GB เป็น 10GB

  1. สร้างอินสแตนซ์ ec2 ใหม่ B พร้อมระบบปฏิบัติการเดียวกับอินสแตนซ์ A ในฐานะหน่วยเก็บข้อมูลเลือกไดรฟ์ที่เป็นประเภทเดียวกันกับ VA แต่มีขนาด 10GB (หรือขนาดเป้าหมายของคุณคืออะไร) ตอนนี้เรามีอินสแตนซ์ B ซึ่งใช้โวลุ่มใหม่นี้ (ลองเรียกมันว่า VB) เป็นโวลุ่มรูต
  2. เมื่ออินสแตนซ์ใหม่ (B) กำลังทำงาน หยุดมันและถอดโวลุ่มนั้นออก (VB)

หมายเหตุ: ขั้นตอนต่อไปนี้ส่วนใหญ่นำมาจากโซลูชันของ @bill:

  1. หยุดอินสแตนซ์ที่คุณต้องการปรับขนาด (A)

  2. สร้างสแน็ปช็อตของไดรฟ์ข้อมูล VA จากนั้นสร้างไดรฟ์ "วัตถุประสงค์ทั่วไป SSD" จากสแน็ปช็อตนั้น เล่มนี้เราจะเรียกมันว่า VASNAP

  3. หมุนอินสแตนซ์ใหม่ด้วย amazon Linux เราจะเรียกอินสแตนซ์นี้ C. เราจะใช้อินสแตนซ์นี้เพื่อคัดลอกเนื้อหาของ VASNAP เป็น VB เราอาจใช้อินสแตนซ์ A เพื่อทำตามขั้นตอนเหล่านี้ได้ แต่ฉันชอบที่จะทำในเครื่องอิสระ

  4. แนบวอลุ่มต่อไปนี้กับอินสแตนซ์ C / dev / xvdf สำหรับ VB / dev / xvdg สำหรับ VASNAP

  5. รีบูตอินสแตนซ์ C

  6. เข้าสู่อินสแตนซ์ C ผ่าน SSH

  7. สร้างไดเรกทอรีใหม่เหล่านี้:

mkdir /source /target

  1. ฟอร์แมตพาร์ติชั่นหลักของ VB ด้วยระบบไฟล์ ext4:

mkfs.ext4 /dev/xvdf1

หากคุณไม่มีข้อผิดพลาดให้ไปที่ขั้นตอนที่ 11 มิฉะนั้นถ้าคุณไม่มี/dev/xvdf1คุณต้องสร้างพาร์ติชันโดยทำ i-vii ต่อไปนี้:

i) หาก/dev/xvdf1ไม่มีเหตุผลอะไรก็ตามคุณต้องสร้างมันขึ้นมา ป้อนครั้งแรก:

sudo fdisk /dev/xvdf.

ii) ล้างดิสก์โดยป้อน: wipefs

iii) สร้างพาร์ติชันใหม่โดยการป้อน: n

iv) Enter pเพื่อสร้างพาร์ติชันหลัก

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. สิ่งนี้สำคัญมากระบบไฟล์ต้องใช้ e2label สำหรับ Linux เพื่อให้รู้จักและบู๊ตใช้ "e2label / dev / xvda1" บนอินสแตนซ์ที่ใช้งานอยู่เพื่อดูว่ามันควรจะเป็นอะไรในกรณีนี้ฉลากคือ: "/"

e2label /dev/xvdf1 /

  1. เมานต์ VASNAP บน / ที่มา:

mount -t ext4 /dev/xvdg1 /source

  1. คัดลอกเนื้อหา:

rsync -vaxSHAX /source/ /target

หมายเหตุ: ไม่มี "/" ติดตาม "/ เป้าหมาย" นอกจากนี้อาจมีข้อผิดพลาดเล็กน้อยเกี่ยวกับ symlink และ attrs แต่การปรับขนาดก็ยังประสบความสำเร็จ

  1. จำนวน VB:

umount /target

  1. ย้อนกลับไปใน AWS Console: Dettach VB จากอินสแตนซ์ C และ dettach VA จาก A

  2. แนบไดรฟ์ข้อมูลขนาดใหม่ (VB) กับอินสแตนซ์เป็น: "/ dev / xvda"

  3. Boot instance A ตอนนี้เป็นอุปกรณ์รูท 10GB :)

  4. ลบทั้งอินสแตนซ์ B และ C และรวมถึงโวลุ่มทั้งหมดยกเว้น VB ซึ่งตอนนี้เป็นโวลุ่มของอินสแตนซ์ A


ระบบปฏิบัติการของคุณคืออะไร?
NineCattoRules

@NineCattoRules Amazon Linux
Ruben Serrate

ฉันลองบน Ubuntu 14.04 และใช้งานไม่ได้
NineCattoRules

@NineCattoRules อุ๊ย ... ฉันยืนยันได้เลยว่ามันใช้งานได้กับ Amazon Linux ต้องทำเร็ว ๆ นี้
Ruben Serrate

1
เราไม่ควรแนบโวลุ่มในขั้นตอนที่ 17 เข้ากับการ/dev/sda1แทนที่ของ/dev/xvda@RubenSerrate?
Alper

2

ขั้นตอนต่อไปนี้ใช้ได้สำหรับฉัน

ขั้นตอนที่ 1 สร้างสแน็ปช็อตของปริมาณรูต ebs และสร้างโวลุ่มใหม่จากสแน็ปช็อต (เรียกชื่อเล่มนี้ว่าสำเนา)

ขั้นตอนที่ 2 สร้างอินสแตนซ์ใหม่ด้วย ebs root volume ที่มีขนาดที่ต้องการ (ขอเรียกขนาดนี้ปรับขนาด) 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 อัปเดต grub.conf บนโวลุ่มการคัดลอกเพื่อให้ตรงกับไดรฟ์ข้อมูลใหม่ udid

ค้นหาและแทนที่ uudid ใน /boot/grub/grub.cfg

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
การรวมคำตอบ @ serub serrate เข้ากับการอัพเดท UUID ของด้วงนั้นเป็นสิ่งที่ใช้ได้ผลสำหรับฉัน
Jonathan Maim

โน้ตเล็ก ๆ ที่ฉันเพิ่งเสียเวลา: ทำงานblkidโดยไม่sudoส่งคืนผลลัพธ์แคชโดยไม่ตรวจสอบความถูกต้อง ดังนั้นดูเหมือนว่า UUID จะไม่เปลี่ยนแปลง
Akhil Nair

0

นี่คือวิธีอื่น

แนบและประกอบวอลุ่ม EBS เก่าบนอินสแตนซ์ EC2 ที่กำลังรัน หากคุณต้องการคัดลอกโวลุ่มสำหรับบูตขอแนะนำให้ทำกับอินสแตนซ์อื่นโดยใช้วอลลุ่มเก่าเป็นข้อมูลไม่ใช่กับโวลุ่มที่ใช้เป็นระบบจริง

สร้างปริมาณ EBS ใหม่ตามขนาดที่ต้องการ

แนบโวลุ่มใหม่เข้ากับอินสแตนซ์และ (อย่างระมัดระวัง) จัดรูปแบบระบบไฟล์ใหม่บนมัน (เช่นการใช้ mkfs) ติดมัน

คัดลอกเนื้อหาระบบไฟล์เก่าจากโวลุ่มเก่าไปยังโวลุ่มใหม่:

rsync -vaxSHAX /oldvol/ /newvol/

ถอนติดตั้งโวลุ่มใหม่และแยกออกจากอินสแตนซ์

หากคุณกำลังคัดลอกระบบไฟล์รูทดังนั้น:

สร้างสแนปชอต EBS ของไดรฟ์ข้อมูลใหม่

ลงทะเบียนภาพรวมเป็น AMI ใหม่


0

บทความด้านล่างนี้เป็นแบบฝึกหัดที่ดีและตรงไปตรงมาเกี่ยวกับวิธีลดขนาดของปริมาณ EBS มีคำแนะนำและภาพหน้าจอแบบทีละขั้นตอนง่าย ๆ

ลดขนาดของปริมาณ EBS ในอินสแตนซ์ EC2 ของคุณ

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