Bagaimana cara mengurangi ukuran volume root AWS EBS?

16

Memperbesar instance EC2 mudah seperti nafas (misalnya, membuat AMI, meluncurkan instance darinya dan kemudian mengubah ukuran penyimpanan).

Tetapi menguranginya menjadi lebih sulit. Saya ingin mengurangi ukuran volume root, Elastic Block Store (EBS), contohnya Amazon Web Services (AWS) EC2. Ada beberapa prosedur lama tingkat tinggi di internet. Versi yang lebih terperinci yang saya temukan adalah jawaban satu tahun pada pertanyaan StackOverflow: bagaimana cara saya mengurangi kapasitas volume ebs saya , langkah-langkahnya memiliki tingkat yang cukup tinggi:

Buat volume EBS baru dengan ukuran yang diinginkan (mis. / Dev / xvdg)

Luncurkan sebuah instance, dan lampirkan kedua volume EBS untuk itu

Periksa sistem file (dari volume root asli): (misalnya) e2fsck -f / dev / xvda1

Maksimalkan volume root asli: (mis. Ext2 / 3/4) resize2fs -M -p / dev / xvda1

Salin data dengan dd:

  • Pilih ukuran chunk (Saya suka 16MB)

  • Hitung jumlah potongan (menggunakan jumlah blok dari output resize2fs): blok * 4 / (chunk_size_in_mb * 1024) - kumpulkan sedikit untuk keselamatan

  • Salin data: (mis. Dd jika = / dev / xvda1 ibs = 16M dari = / dev / xvdg obs = 16M hitung = 80

Ubah ukuran sistem file pada volume EBS baru (lebih kecil): (mis.) Resize2fs -p / dev / xvdg

Periksa sistem file (dari volume root asli): (misalnya) e2fsck -f / dev / xvdg

Lepaskan volume root EBS baru Anda, dan lampirkan ke instance asli Anda

Saya tidak dapat menemukan solusi "bagaimana caranya" langkah demi langkah yang terperinci.

Volume root EBS saya dilampirkan ke instance Ubuntu HVM.

Bantuan apa pun akan sangat dihargai.

dia
sumber
Itu terlihat seperti solusi langkah-demi-langkah yang cukup bagus.
ceejayoz
dd - salin disk-ke-disk dd jika = / dev / xvdf dari = / dev / xvdh bs = jumlah 4k = 227613 e2fsck -f / dev / xvdh1 resize2fs -p / dev / xvdh1
sirkubax

Jawaban:

6

Di AWS Console:

  1. Hentikan instance yang ingin Anda ubah ukurannya

  2. Buat snapshot volume aktif dan kemudian buat volume "General Purpose SSD" dari snapshot itu.

  3. Buat volume "General Purpose SSD" lainnya dengan ukuran yang Anda inginkan.

  4. Lampirkan 3 volume ini ke instance sebagai:

    • / dev / sda1 untuk volume aktif.
    • / dev / xvdf untuk volume yang merupakan ukuran target.
    • / dev / xvdg untuk volume yang dibuat dari snapshot volume aktif.
  5. Mulai contoh.

  6. Masuk ke instance baru melalui SSH.

  7. buat direktori baru ini:

mkdir /source /target

  1. buat sistem file ext4 pada volume baru:

mkfs.ext4 /dev/xvdf

  1. pasang ke direktori ini:

mount -t ext4 /dev/xvdf /target

  1. Ini sangat penting, sistem file memerlukan e2label agar linux dapat mengenalinya dan mem-boot-nya, gunakan "e2label / dev / xvda1" pada instance aktif untuk melihat seperti apa seharusnya, dalam hal ini labelnya adalah: "/"

e2label /dev/xvdf /

  1. pasang volume yang dibuat dari snapshot:

mount -t ext4 /dev/xvdg /source

  1. Salin konten:

rsync -ax /source/ /target

Catatan: tidak ada "/" mengikuti "/ target". Juga, mungkin ada beberapa kesalahan tentang symlinks dan attrs, tetapi ukurannya masih berhasil

  1. Umount sistem file:

umount /target
umount /source

  1. Kembali di Konsol AWS: Hentikan instance, dan lepaskan semua volume.

  2. Lampirkan volume berukuran baru ke instance sebagai: "/ dev / sda1"

  3. Mulai instance, dan itu harus boot.

LANGKAH 10 PENTING : Beri label pada volume baru dengan "e2label" seperti yang disebutkan di atas, atau instance akan terlihat mem-boot di aws tetapi tidak lulus pemeriksaan koneksi.

tagihan
sumber
9
Saya telah menjalankan langkah-langkah ini beberapa kali (Ubuntu 14.04) dan setiap kali saya memasang volume baru, instance hanya berhenti. Adakah orang lain yang mengalami masalah ini? Ini memeras otakku!
thiesdiggity
2
Kamu bukan satu-satunya. Saya telah mencoba ini dan solusi lain dan seperti diri Anda yang baik, contoh saya juga ditutup.
blairmeister
1
@blairmeister Saya punya masalah yang sama, tetapi berhasil membuatnya bekerja! Lihatlah jawaban saya di bawah ini jika Anda masih terhenti :)
Ruben Serrate
e2label saya adalah cloudimg-rootfs ... mengikuti semua langkah ini yang dapat saya konfirmasikan pada Ubuntu 14.04 tidak berfungsi
NineCattoRules
1
Saya downvot jawaban ini karena tidak mencakup kasus penggunaan yang cukup untuk volume (seperti sebagai volume boot) untuk melindungi pengguna dari kerusakan yang tidak disengaja.
Jesse Adelman
6

Tidak ada solusi lain yang akan berfungsi jika volume digunakan sebagai perangkat root (dapat di-boot).

Disk yang baru dibuat tidak memiliki partisi boot, sehingga GRUB harus diinstal dan beberapa flag diatur dengan benar sebelum instance dapat menggunakannya sebagai volume root.

Solusi saya (mulai hari ini, bekerja ) untuk menyusutkan volume root adalah:

Latar Belakang: Kami memiliki instance A, yang volume akarnya ingin kami susutkan. Sebutlah volume ini VA. Kami ingin mengecilkan VA dari 30GB menjadi katakanlah 10GB

  1. Buat instance ec2 baru, B, dengan OS yang sama dengan instance A. Sebagai penyimpanan, pilih volume yang jenisnya sama dengan VA, tetapi dengan ukuran 10GB. (atau apa pun ukuran target Anda). Jadi sekarang kita memiliki instance B yang menggunakan volume baru ini (sebut saja VB) sebagai volume root.
  2. Setelah instance baru (B) berjalan. Hentikan dan lepaskan volume root (VB).

CATATAN: Langkah-langkah berikut sebagian besar diambil dari solusi @bill:

  1. Hentikan instance yang ingin Anda ubah ukurannya (A).

  2. Buat snapshot volume VA dan kemudian buat volume "General Purpose SSD" dari snapshot itu. Volume ini kita akan menyebutnya VASNAP.

  3. Putar instance baru dengan amazon Linux, kami akan memanggil instance ini C. Kami hanya akan menggunakan instance ini untuk menyalin konten VASNAP ke VB. Kita mungkin juga bisa menggunakan instance A untuk melakukan langkah-langkah ini, tetapi saya lebih suka melakukannya di mesin independen.

  4. Lampirkan volume berikut ke instance C. / dev / xvdf untuk VB. / dev / xvdg untuk VASNAP.

  5. Mulai ulang instance C.

  6. Masuk ke instance C melalui SSH.

  7. Buat direktori baru ini:

mkdir /source /target

  1. Memformat partisi utama VB dengan sistem file ext4:

mkfs.ext4 /dev/xvdf1

Jika Anda tidak mendapatkan kesalahan, lanjutkan ke Langkah 11. Jika tidak, jika Anda tidak punya /dev/xvdf1, Anda perlu membuat partisi dengan melakukan i-vii berikut:

i) Jika /dev/xvdf1tidak ada karena alasan apa pun, Anda harus membuatnya. Masukkan pertama:

sudo fdisk /dev/xvdf.

ii) Hapus disk dengan memasukkan: wipefs

iii) Buat partisi baru dengan memasukkan: n

iv) Masuk puntuk membuat partisi primer

v) Terus tekan enter untuk melanjutkan dengan pengaturan default.

vi) Ketika meminta perintah lagi, masukkan wuntuk menulis perubahan dan berhenti.

vii) Pastikan Anda memiliki /dev/xvdf1partisi dengan melakukan: lsblk

Anda harus melihat sesuatu seperti:

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

Sekarang lanjutkan ke Langkah 11.

  1. Pasang ke direktori ini:

mount -t ext4 /dev/xvdf1 /target

  1. Ini sangat penting, sistem file membutuhkan e2label untuk Linux untuk mengenalinya dan mem-boot-nya, gunakan "e2label / dev / xvda1" pada contoh aktif untuk melihat apa yang seharusnya, dalam hal ini labelnya adalah: "/"

e2label /dev/xvdf1 /

  1. Mount VASNAP di / sumber:

mount -t ext4 /dev/xvdg1 /source

  1. Salin konten:

rsync -vaxSHAX /source/ /target

Catatan: tidak ada "/" mengikuti "/ target". Juga, mungkin ada beberapa kesalahan tentang symlinks dan attrs, tetapi ukurannya masih berhasil

  1. Umount VB:

umount /target

  1. Kembali di AWS Console: Dettach VB dari instance C, dan juga dettach VA dari A.

  2. Lampirkan volume ukuran baru (VB) ke instance sebagai: "/ dev / xvda"

  3. Contoh boot A, perangkat rootnya sekarang 10GB :)

  4. Hapus kedua instance B dan C, dan juga semua volume selain VB, yang sekarang menjadi volume root instance A.

Ruben Serrate
sumber
Apa OS kamu?
NineCattoRules
@NineCattoRules Amazon Linux
Ruben Serrate
Saya mencoba di Ubuntu 14.04 dan tidak berhasil
NineCattoRules
@NineCattoRules Aduh ... Saya dapat mengkonfirmasi itu berfungsi untuk Amazon Linux, harus melakukannya baru-baru ini.
Ruben Serrate
1
Seharusnya tidak kami lampirkan volume pada langkah 17 ke /dev/sda1intstead dari /dev/xvda@RubenSerrate?
alper
2

Langkah-langkah berikut ini berhasil untuk saya

Langkah 1. Buat snapshot volume ebs root dan buat volume baru dari snapshot (sebut saja salinan-volume ini)

Langkah 2. Buat instance baru dengan volume root ebs dengan ukuran yang diinginkan. (sebut saja volume ini diubah ukurannya) Volume ebs ini akan memiliki partisi yang tepat untuk booting. (Membuat volume ebs baru dari awal tidak berhasil untuk saya)

Langkah 3. Pasang volume-ubah dan volume-salin ke instance.

Langkah 4. Format ukuran volume.

sudo fdisk -l
    sudo mkfs -t ext4 /dev/xvdf1

Catatan: pastikan volume partisi /dev/xvdf1tidak dimasukkan/dev/xvdf

Langkah 5. Pasang volume-ubah ukuran dan salin volume mkdir / mnt / salin mkdir / mnt / ubah ukuran

sudo mount /dev/xvdh1 /mnt/copy
sudo mount /dev/xvdf1 /mnt/resize

Langkah 6. Salin file

rsync -ax /mnt/copy/ /mnt/resize

Langkah 7. Pastikan e2label sama dengan volume root

sudo E2label /dev/xvdh1 > cloudimg-rootfs
sudo E2label /dev/xvdf1 cloudimg-rootfs

Langkah 8. Perbarui grub.conf pada volume-copy untuk mencocokkan udid volume baru

Cari dan ganti uudid di /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"

Langkah 9. Lepas volume

Langkah 10. Pasang volume ebs baru yang telah diubah ukurannya ke instance / dev / sda1

DrewJaja
sumber
1
Menggabungkan jawaban serr @ruben dengan pembaruan UUID grub adalah yang berhasil bagi saya.
Jonathan Maim
Catatan kecil karena saya hanya membuang-buang waktu: Berjalan blkidtanpa sudomengembalikan hasil yang di-cache tanpa memvalidasinya. Jadi sepertinya UUID tidak berubah.
Akhil Nair
0

Inilah pendekatan alternatif;

Pasang dan pasang volume EBS lama pada instance EC2 yang berjalan. Jika Anda ingin menyalin volume boot, lebih baik melakukannya pada instance yang berbeda, dengan volume lama dipasang sebagai data, bukan dengan volume yang digunakan sebagai sistem live.

Buat volume EBS baru dengan ukuran yang diinginkan.

Lampirkan volume baru ke instance dan (hati-hati) memformat sistem file baru di atasnya (misalnya, menggunakan mkfs). Pasang itu.

Salin konten sistem file lama dari volume lama ke volume baru:

rsync -vaxSHAX /oldvol/ /newvol/

Lepaskan volume baru dan lepaskan dari instance.

Jika Anda menyalin sistem file root, maka:

Buat cuplikan EBS volume baru.

Daftarkan foto itu sebagai AMI baru.

Eric Hammond
sumber