Zmniejszenie wielkości wolumenu Amazon EBS


25

Widziałem tę odpowiedź na rosnące wolumeny EBS , ale chciałbym ją zmniejszyć.

Domyślne obrazy serwera Ubuntu to 15 GB, podczas gdy naprawdę potrzebuję tylko 2 GB maksimum (używam innego woluminu dla danych). Czy istnieje sposób, aby zmniejszyć rozmiar woluminu?

Odpowiedzi:


27

Miałem to samo pytanie co ty, więc wymyśliłem, jak to zrobić.

Po pierwsze, zrobiłem to z 32-bitowego ami wspieranego przez EBS Ubuntu z regionu USA-Wschód, inne systemy operacyjne lub obrazy mogą działać inaczej. Podejrzewam jednak, że powinieneś być w porządku, o ile używasz systemu plików ext *. Może działać na innych systemach plików, ale musisz dowiedzieć się, jak samodzielnie zmienić ich rozmiar.

Kroki są w zasadzie:

  1. Dołącz dwa woluminy do działającej instancji, pierwszy oparty na migawce, którą chcesz zmniejszyć, a drugi pusty wolumin o nowym rozmiarze, do którego chcesz się zmniejszyć.

  2. Sprawdź system plików pierwszego woluminu i napraw wszelkie błędy.

  3. Zmniejsz system plików na pierwszym woluminie, aby był tak duży, jak to konieczne, aby pomieścić dane.

  4. Skopiuj system plików z pierwszego woluminu do drugiego.

  5. Rozwiń system plików na drugim woluminie do jego maksymalnego rozmiaru.

  6. Upewnij się, że wszystko wygląda dobrze, sprawdzając drugi wolumin pod kątem błędów.

  7. Zrób migawkę drugiego tomu.

  8. Utwórz obraz maszyny na podstawie migawki drugiego właśnie pobranego woluminu.

Najpierw musisz uzyskać informacje z ami, które chcesz zmniejszyć. W szczególności potrzebujesz identyfikatora jądra i identyfikatora ramdysku, jeśli taki istnieje (obraz, który zmniejszyłem, nie miał ramdysku). Wszystkie te informacje powinny być dostępne z konsoli zarządzania aws, w oknie AMI.

Identyfikator jądra wygląda jak kia-xxxxxxxx, a identyfikator migawki wygląda jak snap-xxxxxxxx, a identyfikatory ramdysku wyglądają jak RIA-xxxxxxxx.

Następnie uruchom instancję Linuksa. Uruchomiłem instancję Ubuntu. Jeśli chcesz, możesz użyć instancji t1.micro. Wykonanie tych kolejnych kroków nie wymaga dużej mocy.

Po uruchomieniu komputera dołącz migawkę zapisaną w pierwszym kroku. W moim przypadku załączyłem go do / dev / sdf

Następnie utwórz nowy wolumin o żądanym rozmiarze. W moim przypadku utworzyłem wolumin 5 GB, ponieważ chciałem go zmniejszyć. Nie twórz tego nowego woluminu z migawki. Potrzebujemy nowego pustego woluminu. Następnie dołącz go do działającej instancji, w moim przypadku podłączyłem go jako / dev / sdg

Następnie ssh do komputera, ale nie montuj dołączonych woluminów.

W tym momencie popełniłem błąd po stronie paranoi i zdecydowałem się sprawdzić system plików na dużym woluminie, aby upewnić się, że nie ma błędów. Jeśli masz pewność, że ich nie ma, możesz pominąć ten krok:

$ sudo e2fsck -f /dev/sdf

Następnie zmieniłem rozmiar systemu plików na dużym woluminie, tak aby był on tak duży jak dane na dysku:

$ sudo resize2fs -M -p /dev/sdf

-M zmniejsza go, a -p drukuje postęp.

Resize2fs powinien powiedzieć ci, jak duży jest skurczony system plików. W moim przypadku dał mi rozmiar w blokach 4K.

Teraz kopiujemy skurczony system plików na nowy dysk. Skopiujemy dane w kawałkach 16 MB, więc musimy dowiedzieć się, ile kawałków 16 MB musimy skopiować. W tym miejscu przydatny jest ten zmniejszony rozmiar systemu plików.

W moim przypadku zmniejszony system plików miał nieco ponad 1 GB, ponieważ przed zrobieniem migawki zainstalowałem wiele innych programów w podstawowym systemie Ubuntu. Prawdopodobnie mogłem uniknąć kopiowania rozmiaru systemu plików w zaokrągleniu do najbliższych 16 MB, ale chciałem grać bezpiecznie.

Zatem 128 razy 16 MB fragmentów = 2 GB:

$ sudo dd if=/dev/sdf ibs=16M of=/dev/sdg obs=16M count=128

Skopiowałem w blokach 16 MB, ponieważ w EBS płacisz za każdy odczyt i zapis, więc chciałem zminimalizować ich liczbę tak bardzo, jak to możliwe. Nie wiem, czy zrobił to w ten sposób, ale prawdopodobnie nie zaszkodziło.

Następnie musimy zmienić rozmiar systemu plików, który właśnie skopiowaliśmy na nowy wolumin, aby wykorzystał całą dostępną przestrzeń na woluminie.

$ sudo resize2fs -p /dev/sdg

Na koniec sprawdź, czy wszystko jest w porządku:

$ sudo e2fsck -f /dev/sdg

To wszystko, co musimy zrobić na tym komputerze, choć zamontowanie nowego woluminu nie zaszkodziło, tak jak w teście. Jednak ten krok jest prawie na pewno opcjonalny, ponieważ e2fsck powinien był wykryć jakiekolwiek problemy.

Musimy teraz wykonać migawkę nowego woluminu i utworzyć na jego podstawie AMI. Skończyliśmy z maszyną, więc możesz ją zakończyć, jeśli chcesz.

Upewnij się, że mały wolumin nie jest zamontowany, jeśli go zamontowałeś, a następnie wykonaj jego migawkę. Ponownie możesz to zrobić w konsoli zarządzania.

Ostatni krok wymaga narzędzi ec2 z linii poleceń.

EDYTOWAĆ:

Ponieważ ta odpowiedź została opublikowana, konsola AWS pozwala po prostu kliknąć migawkę prawym przyciskiem myszy i wybrać opcję Utwórz obraz z migawki. Nadal będziesz musiał wybrać odpowiedni identyfikator jądra. Jeśli nie ma go na liście, upewnij się, że wybrałeś odpowiednią architekturę.

Używamy aplikacji ec2-register do zarejestrowania AMI na podstawie właśnie wykonanej migawki, więc zapisz wartość snap-xxxxxxxx z właśnie wykonanej migawki.

Następnie powinieneś użyć polecenia takiego jak:

ec2-register -C cert.pem -K sk.pem -n The_Name_of_Your_New_Image
-d Your_Description_of_This_New_AMI --kernel aki-xxxxxxxx
-b "/dev/sda1=snap-xxxxxxxx" --root-device-name /dev/sda1

Oczywiście musisz zastąpić identyfikator jądra tym, który zapisałeś na początku, a ID migawki tym, który utworzyłeś w poprzednim kroku. Musisz także skierować go na swój tajny klucz (zwany sk.pem) powyżej i swój certyfikat x509 (zwany cert.pem). Możesz oczywiście wybrać cokolwiek chcesz dla nazwy i opisu.

Mam nadzieję że to pomoże.


Dzięki, to pomogło! W przypadku dużych woluminów (takich jak 1 TB) procedura ta zajmuje dużo czasu w przypadku mikro instancji. Widziałem kopiowanie woluminów oparte na rsync bez użycia fsck (np. Tutaj ubuntuforums.org/showpost.php?p=9866025&postcount=27 ), ale podejście oparte na dd wydaje się znacznie bardziej niezawodne, nawet w przypadku woluminów innych niż root.
chronos

Pierwsze polecenie sudo e2fsck -f /dev/sdfmoże być wymaganym krokiem przed dokonaniem zmiany rozmiaru (było w moim konkretnym przypadku, Amazon Linux AMI).
notacouch

1
Powinno być oczywiste, ale nie zapomnij, aby system plików na woluminie (/ Facepalm) zgodnie docs AWS sudo mkfs -t ext4 /dev/sdg.
notacouch

1

Tak, też się nad tym zastanawiałem. Poniższy samouczek to przesada, ale myślę, że zawiera niezbędne narzędzia: http://www.linuxconfig.org/Howto_CREATE_BUNDLE_UPLOAD_and_ACCESS_custom_Debian_AMI_using_ubuntu

Zamiast instalować na nowym obrazie dysku, jak wyżej, powinna istnieć możliwość uruchomienia dużego AMI, utworzenia nowego EBS, dołączenia EBS do działającej instancji i skopiowania działającego AMI do nowego EBS. Na koniec zarejestruj nowy system EBS jako AMI.

Spójrz na ten post na blogu, aby uzyskać więcej informacji, w szczególności komentarz freremark: http://alestic.com/2010/01/public-ebs-boot-amis-for-ubuntu-on-amazon-ec2

Podsumowując, euca2ools wydaje się doskonałym zamiennikiem ec2-ami-tools - euca2ools zawiera rzeczywiste strony! Wszystkie mają takie same nazwy jak polecenia ec2- *, tylko z prefiksem euca-. http://open.eucalyptus.com/wiki/Euca2oolsUsing


0

Chciałem zmniejszyć rozmiar woluminu używanego przez ogólną instancję EC2. Postępowałem podobnie do innych odpowiedzi tutaj, ale natrafiłem na problem. Oto, co musiałem zrobić, aby zmniejszyć objętość katalogu głównego ...

W konsoli AWS

 1. Stop the source EC2 instance
 2. Create a snapshot of the volume you want to shrink
 3. Use the snapshot to create a new 'source' volume
 4. Created a new volume with smaller size (made sure it was big enough for the data on source)
 5. Attached both volumes to any EC2 instance (mine were /dev/sdf = source & /dev/sdg = target)
 6. Start the EC2 instance

W instancji EC2

 7. sudo su -   (everything from here is run as root)
 8. mkdir /source /target
 9. mount -t ext4 /dev/sdf /source
 10. mkfs.ext4 /dev/sdg
 11. mount -t ext4 /dev/sdg /target
 12. rsync -aHAXxSP /source/ /target 
     ** notice that there is no trailing '/' after target if 
       you put one there your data will be copied to 
       /target/source and you will have to move it up a directory
 13. cat /boot/grub/grub.conf  (indicated that grub is using root=LABEL=/)
 14. cat /source/etc/fstab (indicated that fstab was also using LABEL=/)
 15. e2label /dev/sdg /
 16. umount /source
 17. umount /target

Powrót do konsoli AWS

 18. Stop the instance
 19. Detach ALL volumes from the instance
 20. Attach the 'target' volume to the instance using /dev/sda1 as the device
 21. Start the instance

Tutaj natrafiliśmy na problem, o którym nie wspomniano, o ile mogę go znaleźć. Instancja zaczęła się dobrze, świetnie! Ale kiedy próbowałem ssh do instancji, nie mogłem się połączyć. Po wielu wielu odmianach powyższych kroków w końcu zdecydowałem się użyć woluminu głównego z świeżo rozwiniętej instancji EC2.

W konsoli AWS

 1. Create a new EC2 instance with the right sized root volume
 2. Stop the new instance
 3. Detach the /dev/sda1 volume from the new instance
    ** used the 'source' volume from before & the new volume we just detached
 4. Attached both volumes to the original EC2 instance (/dev/sdf & /dev/sdg)
 5. Start the instance with the attached volumes

W instancji EC2

 1. sudo su - 
 2. mkdir /source /target (only need to do this if you don't already have these directories)
 3. mount -t ext4 /dev/sdf /source
 4. mount -t ext4 /dev/sdg /target (no need to create a file system because it is already there)
 5. rsync -aHAXxSP /source/ /target 
 6. umount /source
 7. umount /target

Powrót do konsoli AWS

 1. Stop the instance
 2. Detach the 'source' and 'target' volumes from instance
 3. Attach the 'target' volume to the instance from step 1 using /dev/sda1 as the device
 4. Start the instance
 5. ** we use an elastic IP so we just reassigned the IP to the new instance

Mam nadzieję, że to komuś pomoże


Rozmiar woluminu można tylko zwiększyć, a nie zmniejszyć. z migawki.
Ankit Kumar Rajpoot
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.