Jak zmniejszyć rozmiar woluminu głównego AWS EBS?

16

Powiększanie instancji EC2 jest łatwe jak oddech (na przykład stwórz AMI, uruchom z niej instancję, a następnie zmień rozmiar pamięci).

Ale zmniejszenie go staje się trudniejsze. Chciałbym zmniejszyć wielkość woluminu katalogu głównego usługi Amazon Web Services (AWS) EC2 Elastic Block Store (EBS). W sieci jest kilka starych procedur wysokiego poziomu. Bardziej szczegółowa wersja, którą znalazłem, to roczna odpowiedź na pytanie StackOverflow: jak mogę zmniejszyć pojemność ebs , kroki mają dość wysoki poziom:

Utwórz nowy wolumin EBS o pożądanym rozmiarze (np. / Dev / xvdg)

Uruchom instancję i dołącz do niej oba woluminy EBS

Sprawdź system plików (oryginalnego woluminu głównego): (np.) E2fsck -f / dev / xvda1

Maksymalnie zmniejsz oryginalny wolumin główny: (np. Ext2 / 3/4) resize2fs -M -p / dev / xvda1

Skopiuj dane za pomocą dd:

  • Wybierz rozmiar porcji (lubię 16 MB)

  • Oblicz liczbę porcji (używając liczby bloków z wyjścia resize2fs): bloki * 4 / (chunk_size_in_mb * 1024) - zaokrąglij nieco w górę dla bezpieczeństwa

  • Skopiuj dane: (np.) Dd if = / dev / xvda1 ibs = 16M z = / dev / xvdg obs = 16M liczba = 80

Zmień rozmiar systemu plików na nowym (mniejszym) woluminie EBS: (np.) Resize2fs -p / dev / xvdg

Sprawdź system plików (oryginalnego woluminu głównego): (np. E2fsck -f / dev / xvdg

Odłącz nowy wolumin główny EBS i dołącz go do oryginalnej instancji

Nie jestem w stanie znaleźć szczegółowego rozwiązania „jak to zrobić”.

Mój główny wolumin EBS jest dołączony do instancji HVM Ubuntu.

Każda pomoc byłaby bardzo mile widziana.

herve
źródło
To wygląda na całkiem dobre rozwiązanie „krok po kroku”.
ceejayoz
dd - skopiuj dysk na dysk dd if = / dev / xvdf of = / dev / xvdh bs = 4k count = 227613 e2fsck -f / dev / xvdh1 resize2fs -p / dev / xvdh1
sirkubax

Odpowiedzi:

6

W konsoli AWS:

  1. Zatrzymaj instancję, której rozmiar chcesz zmienić

  2. Utwórz migawkę aktywnego woluminu, a następnie utwórz wolumin „SSD ogólnego zastosowania” z tej migawki.

  3. Utwórz kolejny wolumin „SSD ogólnego zastosowania” o żądanym rozmiarze.

  4. Dołącz te 3 woluminy do instancji jako:

    • / dev / sda1 dla aktywnego woluminu.
    • / dev / xvdf dla woluminu o docelowym rozmiarze.
    • / dev / xvdg dla woluminu utworzonego z migawki aktywnego woluminu.
  5. Uruchom instancję.

  6. Zaloguj się do nowej instancji za pośrednictwem SSH.

  7. utwórz te nowe katalogi:

mkdir /source /target

  1. utwórz system plików ext4 na nowym woluminie:

mkfs.ext4 /dev/xvdf

  1. zamontuj go w tym katalogu:

mount -t ext4 /dev/xvdf /target

  1. Jest to bardzo ważne, system plików potrzebuje e2label, aby Linux mógł go rozpoznać i uruchomić, użyj „e2label / dev / xvda1” na aktywnej instancji, aby zobaczyć, co powinno być, w tym przypadku etykieta to: „/”

e2label /dev/xvdf /

  1. zamontuj wolumin utworzony z migawki:

mount -t ext4 /dev/xvdg /source

  1. Skopiuj zawartość:

rsync -ax /source/ /target

Uwaga: nie ma „/” po „/ cel”. Ponadto może występować kilka błędów dotyczących dowiązań symbolicznych i attrów, ale zmiana rozmiaru nadal była udana

  1. Zamontuj systemy plików:

umount /target
umount /source

  1. Powrót do konsoli AWS: Zatrzymaj instancję i odłącz wszystkie woluminy.

  2. Dołącz wolumin o nowym rozmiarze do instancji jako: „/ dev / sda1”

  3. Uruchom instancję i powinna się uruchomić.

KROK 10 JEST WAŻNY : Oznacz nowy wolumin nazwą „e2label”, jak wspomniano powyżej, w przeciwnym razie wystąpi problem z uruchomieniem aws, ale nie przejdzie sprawdzania połączenia.

rachunek
źródło
9
Kilka razy wykonałem te kroki (Ubuntu 14.04) i za każdym razem, gdy dołączam nowy wolumin, instancja po prostu się zatrzymuje. Czy ktoś jeszcze ma ten problem? To dręczy mój mózg!
thiesdiggity,
2
Nie jesteś jedyny. Próbowałem tego i innych rozwiązań i jak twoje dobre ja, moja instancja również się wyłącza.
blairmeister,
1
@blairmeister Miałem ten sam problem, ale udało mi się go uruchomić! Spójrz na moją odpowiedź poniżej, jeśli nadal utkniesz :)
Ruben Serrate
mój e2label to cloudimg-rootfs ... wykonując wszystkie te kroki mogę potwierdzić, że Ubuntu 14.04 nie działa
NineCattoRules
1
Głosuję za odrzuceniem tej odpowiedzi, ponieważ nie obejmuje ona wystarczającej liczby przypadków użycia woluminu (np. Woluminu rozruchowego), aby chronić użytkowników przed przypadkowym uszkodzeniem.
Jesse Adelman
6

Żadne z pozostałych rozwiązań nie będzie działać, jeśli wolumin będzie używany jako urządzenie root (bootowalne).

Na nowo utworzonym dysku brakuje partycji rozruchowej, więc aby instancja mogła używać go jako woluminu głównego, musiałby mieć zainstalowany GRUB i niektóre flagi poprawnie ustawione.

Moje (na dzień dzisiejszy działające ) rozwiązanie zmniejszania woluminu głównego to:

Tło: Mamy instancję A, której wolumin główny chcemy zmniejszyć. Nazwijmy ten tom VA. Chcemy zmniejszyć VA z 30 GB, powiedzmy 10 GB

  1. Utwórz nową instancję ec2, B, z tym samym systemem operacyjnym co instancja A. Jako pamięć wybierz wolumin tego samego typu co VA, ale o wielkości 10 GB. (lub inny docelowy rozmiar). Mamy teraz instancję B, która używa tego nowego woluminu (nazwijmy go VB) jako woluminu głównego.
  2. Po uruchomieniu nowej instancji (B). Zatrzymaj go i odłącz wolumin główny (VB).

UWAGA: Poniższe kroki pochodzą głównie z rozwiązania @bill:

  1. Zatrzymaj instancję, której rozmiar chcesz zmienić (A).

  2. Utwórz migawkę woluminu VA, a następnie utwórz wolumin „SSD ogólnego zastosowania” z tej migawki. Ten tom nazwiemy VASNAP.

  3. Zakręć nową instancją w amazon Linux, nazwiemy ją instancją C. Po prostu wykorzystamy tę instancję do skopiowania zawartości VASNAP do VB. Prawdopodobnie moglibyśmy również użyć instancji A do wykonania tych kroków, ale wolę to zrobić na niezależnej maszynie.

  4. Dołącz następujące woluminy do instancji C. / dev / xvdf dla VB. / dev / xvdg dla VASNAP.

  5. Uruchom ponownie instancję C.

  6. Zaloguj się do instancji C przez SSH.

  7. Utwórz nowe katalogi:

mkdir /source /target

  1. Sformatuj główną partycję VB za pomocą systemu plików ext4:

mkfs.ext4 /dev/xvdf1

Jeśli nie otrzymasz żadnych błędów, przejdź do kroku 11. W przeciwnym razie, jeśli nie masz /dev/xvdf1, musisz utworzyć partycję, wykonując następujące czynności i-vii:

i) Jeśli /dev/xvdf1z jakiegoś powodu nie istnieje, musisz go utworzyć. Najpierw wpisz:

sudo fdisk /dev/xvdf.

ii) Wyczyść dysk, wprowadzając: wipefs

iii) Utwórz nową partycję, wprowadzając: n

iv) Enter, paby utworzyć partycję podstawową

v) Naciskaj Enter, aby przejść do ustawień domyślnych.

vi) Kiedy ponownie poprosi o polecenie, wprowadź, waby zapisać zmiany i wyjść.

vii) Sprawdź, czy masz /dev/xvdf1partycję, wykonując: lsblk

Powinieneś zobaczyć coś takiego:

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

Teraz przejdź do kroku 11.

  1. Podłącz go do tego katalogu:

mount -t ext4 /dev/xvdf1 /target

  1. Jest to bardzo ważne, system plików potrzebuje e2label dla Linuksa, aby go rozpoznać i uruchomić, użyj „e2label / dev / xvda1” na aktywnej instancji, aby zobaczyć, co to powinno być, w tym przypadku etykieta to: „/”

e2label /dev/xvdf1 /

  1. Zamontuj VASNAP na / source:

mount -t ext4 /dev/xvdg1 /source

  1. Skopiuj zawartość:

rsync -vaxSHAX /source/ /target

Uwaga: nie ma „/” po „/ cel”. Ponadto może występować kilka błędów dotyczących dowiązań symbolicznych i attrów, ale zmiana rozmiaru nadal była udana

  1. Umount VB:

umount /target

  1. Powrót do konsoli AWS: Odłącz VB od instancji C, a także odepnij VA od A.

  2. Dołącz wolumin o nowym rozmiarze (VB) do instancji jako: „/ dev / xvda”

  3. Wystąpienie rozruchowe A, teraz urządzenie root ma 10 GB :)

  4. Usuń zarówno instancje B i C, a także wszystkie woluminy oprócz VB, który jest teraz woluminem głównym instancji A.

Serrate Rubena
źródło
Jaki masz system operacyjny?
NineCattoRules
@NineCattoRules Amazon Linux
Ruben Serrate
Próbowałem na Ubuntu 14.04 i to nie działa
NineCattoRules
@NineCattoRules Ojej ... Mogę potwierdzić, że działa na Amazon Linux, musiałem to ostatnio zrobić.
Ruben Serrate
1
Czy nie powinniśmy dołączyć woluminu z kroku 17 /dev/sda1zamiast /dev/xvda@RubenSerrate?
alper
2

Poniższe kroki działały dla mnie

Krok 1. Utwórz migawkę głównego wolumenu Ebs i utwórz nowy wolumin z migawki (nazwijmy to woluminem-kopiuj)

Krok 2. Utwórz nową instancję z woluminem głównym ebs o pożądanym rozmiarze. (nazwijmy to woluminem o zmienionym rozmiarze) Ten wolumin ebs będzie miał odpowiednią partycję do rozruchu. (Utworzenie nowego wolumenu EBS od podstaw nie działało dla mnie)

Krok 3. Dołącz zmianę wielkości woluminu i kopię woluminu do instancji.

Krok 4. Sformatuj zmianę rozmiaru woluminu.

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

Uwaga: upewnij się, że wolumin partycji /dev/xvdf1nie został wprowadzony/dev/xvdf

Krok 5. Zamontuj zmianę rozmiaru woluminu i kopiowanie woluminu mkdir / mnt / copy mkdir / mnt / resize

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

Krok 6. Skopiuj pliki

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

Krok 7. Upewnij się, że e2label jest taki sam jak wolumin główny

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

Krok 8. Zaktualizuj grub.conf na kopii woluminu, aby pasował do nowego woluminu udid

Wyszukaj i zamień uudid w /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"

Krok 9. Odmontuj woluminy

Krok 10. Dołącz nową zmienioną objętość ebs do instancji / dev / sda1

DrewJaja
źródło
1
Dla mnie zadziałało połączenie odpowiedzi @ruben ząbkowanej z aktualizacją grub UUID.
Jonathan Maim
Mała uwaga, ponieważ właśnie zmarnowałem trochę czasu: Uruchomienie blkidbez sudozwracania wyników z pamięci podręcznej bez ich sprawdzania. Będzie więc wyglądać, jakby UUID się nie zmienił.
Akhil Nair
0

Oto alternatywne podejście;

Podłącz i podłącz stary wolumin EBS do działającej instancji EC2. Jeśli chcesz skopiować wolumin rozruchowy, najlepiej zrobić to w innej instancji, ze starym woluminem zamontowanym jako dane, a nie z woluminem używanym jako system na żywo.

Utwórz nowy wolumin EBS o pożądanym rozmiarze.

Dołącz nowy wolumin do instancji i (ostrożnie) sformatuj w nim nowy system plików (np. Używając mkfs). Zamontuj to.

Skopiuj zawartość starego systemu plików ze starego woluminu do nowego woluminu:

rsync -vaxSHAX /oldvol/ /newvol/

Odmontuj nowy wolumin i odłącz go od instancji.

Jeśli kopiujesz główny system plików, to:

Utwórz migawkę EBS nowego woluminu.

Zarejestruj migawkę jako nowy AMI.

Eric Hammond
źródło