Как уменьшить размер корневого тома AWS EBS?

16

Расширить экземпляр EC2 легко, как вдох (например, создать AMI, запустить экземпляр из него, а затем изменить размер хранилища).

Но уменьшить его становится все труднее. Я бы хотел уменьшить размер корневого тома EBS экземпляра Amazon Web Services (AWS) EC2. В сети есть пары старых процедур высокого уровня. Более подробная версия, которую я нашел, - это годичный ответ на вопрос StackOverflow: как я могу уменьшить объем моего ebs , шаги имеют довольно высокий уровень:

Создайте новый том EBS нужного размера (например, / dev / xvdg)

Запустите экземпляр и подключите к нему оба тома EBS.

Проверьте файловую систему (исходного корневого тома): (например) e2fsck -f / dev / xvda1

Максимальное сжатие исходного корневого тома: (например, ext2 / 3/4) resize2fs -M -p / dev / xvda1

Скопируйте данные с помощью dd:

  • Выберите размер куска (мне нравится 16 МБ)

  • Рассчитать количество фрагментов (используя количество блоков из вывода resize2fs): blocks * 4 / (chunk_size_in_mb * 1024) - округлить немного для безопасности

  • Скопируйте данные: (например) dd if = / dev / xvda1 ibs = 16M of = / dev / xvdg obs = 16M count = 80

Измените размер файловой системы на новом (меньшем) томе EBS: (например) resize2fs -p / dev / xvdg

Проверьте файловую систему (исходного корневого тома): (например) e2fsck -f / dev / xvdg

Отключите новый корневой том EBS и прикрепите его к исходному экземпляру.

Я не могу найти подробное пошаговое «как» решение.

Мой корневой том EBS подключен к экземпляру HVM Ubuntu.

Любая помощь могла бы быть полезна.

Эрве
источник
Это похоже на довольно хорошее пошаговое решение.
ceejayoz
dd - копировать диск на диск dd, если = / dev / xvdf из = / dev / xvdh bs = 4k count = 227613 e2fsck -f / dev / xvdh1 resize2fs -p / dev / xvdh1
sirkubax

Ответы:

6

В консоли AWS:

  1. Остановите экземпляр, размер которого вы хотите изменить

  2. Создайте снимок активного тома, а затем из этого снимка создайте том «SSD общего назначения».

  3. Создайте другой том «SSD общего назначения» в нужном вам размере.

  4. Присоедините эти 3 тома к экземпляру как:

    • / dev / sda1 для активного тома.
    • / dev / xvdf для тома, который является целевым размером.
    • / dev / xvdg для тома, сделанного из снимка активного тома.
  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

Примечание: нет "/" следующего "/ target". Кроме того, может быть несколько ошибок в символических ссылках и атрибутах, но изменение размера все еще было успешным

  1. Размонтируйте файловые системы:

umount /target
umount /source

  1. Вернитесь в консоль AWS. Остановите экземпляр и отсоедините все тома.

  2. Присоедините том нового размера к экземпляру как: "/ dev / sda1"

  3. Запустите экземпляр, и он должен загрузиться.

ШАГ 10 ВАЖНО : Пометьте новый том «e2label», как указано выше, иначе экземпляр будет загружаться в aws, но не пройдет проверку соединения.

счет
источник
9
Я выполнил эти шаги несколько раз (Ubuntu 14.04), и каждый раз, когда я присоединяю новый том, экземпляр просто останавливается. Кто-нибудь еще испытывает эту проблему? Это ломает мой мозг!
thiesdiggity
2
Ты не единственный. Я пробовал это и другие решения, и, как и ты, мой экземпляр просто закрывается.
Блэрмейстер
1
@blairmeister У меня была такая же проблема, но мне удалось заставить ее работать! Посмотрите на мой ответ ниже, если вы все еще застряли :)
Рубен
мой e2label - cloudimg-rootfs ... после всех этих шагов, которые я могу подтвердить на Ubuntu 14.04, не работает
NineCattoRules
1
Я не одобряю этот ответ, поскольку он не охватывает достаточно случаев использования тома (например, загрузочного тома), чтобы защитить пользователей от непреднамеренного повреждения.
Джесси Адельман
6

Ни одно из других решений не будет работать, если том используется в качестве корневого (загрузочного) устройства.

На вновь созданном диске отсутствует загрузочный раздел, поэтому необходимо установить GRUB и правильно установить некоторые флаги, прежде чем экземпляр сможет использовать его в качестве корневого тома.

Мое (на сегодня работающее ) решение для уменьшения корневого тома:

Фон: у нас есть экземпляр A, корневой объем которого мы хотим уменьшить. Давайте назовем этот том VA. Мы хотим уменьшить VA с 30 ГБ, скажем, до 10 ГБ

  1. Создайте новый экземпляр ec2, B, с той же операционной системой, что и экземпляр A. В качестве хранилища выберите том того же типа, что и VA, но размером 10 ГБ. (или какой бы ни был ваш целевой размер). Итак, теперь у нас есть экземпляр B, который использует этот новый том (назовем его VB) в качестве корневого тома.
  2. После запуска нового экземпляра (B). Остановите его и отсоедините его корневой том (VB).

ПРИМЕЧАНИЕ. Следующие шаги в основном взяты из решения @bill:

  1. Остановите экземпляр, размер которого вы хотите изменить (A).

  2. Создайте снимок тома VA, а затем из этого снимка создайте том «SSD общего назначения». Этот том мы назовем его VASNAP.

  3. Спин новый экземпляр с Amazon Amazon, мы будем называть этот экземпляр 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:

я) Если /dev/xvdf1не существует по какой-либо причине, вам нужно создать его. Сначала введите:

sudo fdisk /dev/xvdf,

ii) Протрите диск, введя: wipefs

iii) Создайте новый раздел, введя: n

iv) Войдите, pчтобы создать основной раздел

v) Продолжайте нажимать ввод, чтобы продолжить настройки по умолчанию.

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 в / source:

mount -t ext4 /dev/xvdg1 /source

  1. Скопируйте содержимое:

rsync -vaxSHAX /source/ /target

Примечание: нет "/" следующего "/ target". Кроме того, может быть несколько ошибок в символических ссылках и атрибутах, но изменение размера все еще было успешным

  1. Umount VB:

umount /target

  1. Назад в Консоль AWS: извлечение VB из экземпляра C, а также извлечение VA из A.

  2. Присоедините том нового размера (VB) к экземпляру как: "/ dev / xvda"

  3. Загрузочный экземпляр A, теперь его корневое устройство 10 ГБ :)

  4. Удалите оба экземпляра B и C, а также все тома, кроме VB, который теперь является корневым томом экземпляра A.

Рубен Зерат
источник
Какая у тебя ОС?
NineCattoRules
@NineCattoRules Amazon Linux
Ruben Serrate
Я попробовал на Ubuntu 14.04, и он не работает
NineCattoRules
@NineCattoRules Ой ... Я могу подтвердить, что это работает для Amazon Linux, пришлось сделать это недавно.
Рубен
1
/dev/sda1Разве мы не должны прикрепить том на шаге 17 вместо /dev/xvda@RubenSerrate?
Alper
2

Следующие шаги работали для меня

Шаг 1. Создание снимка корневого тома ebs и создание нового тома из снимка (назовем это томом-копией)

Шаг 2. Создайте новый экземпляр с корневым томом ebs нужного размера. (давайте назовем это томом с измененным размером) Этот том 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

DrewJaja
источник
1
Сочетание @ruben serrate ответа с обновлением grub UUID - вот что у меня сработало.
Джонатан
Небольшая заметка, поскольку я просто потратил немного времени: Запуск blkidбез sudoвозврата кэшированных результатов без их проверки. Так что, похоже, UUID не изменился.
Ахил Наир
0

Вот альтернативный подход;

Подключите и смонтируйте старый том EBS на работающем экземпляре EC2. Если вы хотите скопировать загрузочный том, лучше сделать это в другом экземпляре, со старым томом, смонтированным как данные, а не с томом, используемым в качестве действующей системы.

Создайте новый том EBS нужного размера.

Присоедините новый том к экземпляру и (осторожно) отформатируйте в нем новую файловую систему (например, используя mkfs). Смонтировать его.

Скопируйте содержимое старой файловой системы со старого тома на новый:

rsync -vaxSHAX /oldvol/ /newvol/

Размонтируйте новый том и отсоедините его от экземпляра.

Если вы копировали корневую файловую систему, то:

Создайте снимок EBS нового тома.

Зарегистрируйте снимок как новый AMI.

Эрик Хаммонд
источник