У меня был такой же вопрос, как и у вас, поэтому я решил, как это сделать.
Во-первых, я сделал это из 32-битного Ebi с поддержкой Ebu из Ubuntu из региона Восток США, другие ОС или образы могут работать по-другому. Тем не менее, я подозреваю, что вы должны быть в порядке, если вы используете файловую систему ext *. Это может работать на других файловых системах, но вам придется выяснить, как изменить их размер самостоятельно.
Шаги в основном:
Присоедините два тома к работающему экземпляру, первый на основе снимка, который вы хотите сжать, а второй - пустой том с новым размером, на который вы хотите сжать.
Проверьте файловую систему первого тома и устраните все ошибки.
Уменьшите файловую систему на первом томе, чтобы она была настолько большой, насколько это необходимо для хранения данных.
Скопируйте файловую систему с первого тома на второй.
Разверните файловую систему на втором томе до максимального размера.
Убедитесь, что все выглядит хорошо, проверив второй том на наличие ошибок.
Сделайте снимок второго тома.
Создайте образ машины на основе снимка второго тома, который вы только что сделали.
Сначала вам нужно получить информацию от ами, которые вы хотите уменьшить. В частности, вам нужен идентификатор ядра и идентификатор ramdisk, если таковые имеются (образ, который я сжал, не имел ramdisk). Вся эта информация должна быть доступна из консоли управления aws в окне AMI.
Идентификатор ядра выглядит как kia-xxxxxxxx, а идентификатор моментального снимка выглядит как snap-xxxxxxxx, а идентификаторы ramdisk выглядят как RIA-xxxxxxxx.
Затем запустите экземпляр Linux. Я запустил экземпляр Ubuntu. Вы можете использовать экземпляр t1.micro, если хотите. Это не займет много сил, чтобы сделать эти следующие шаги.
После запуска машины прикрепите снимок, который вы записали с первого шага. В моем случае я прикрепил его к / dev / sdf
Затем создайте новый том нужного размера. В моем случае я создал том объемом 5 ГБ, так как я хотел уменьшить его. Не создавайте этот новый том из снимка. Нам нужен новый чистый том. Затем присоедините его к работающему экземпляру, в моем случае я прикрепил его как / dev / sdg
Далее, ssh в машину, но не монтируйте подключенные тома.
В этот момент я допустил ошибку из-за паранойи и решил проверить файловую систему на большом томе, просто чтобы убедиться в отсутствии ошибок. Если вы уверены, что их нет, вы можете пропустить этот шаг:
$ sudo e2fsck -f /dev/sdf
Затем я изменил размер файловой системы на большом томе, чтобы она была такой же большой, как данные на диске:
$ sudo resize2fs -M -p /dev/sdf
-M сжимает его, а -p печатает прогресс.
Resize2fs должен сказать вам, насколько велика файловая система shrunkin. В моем случае это дало мне размер в 4K блоков.
Теперь мы копируем файловую систему shrunkin на новый диск. Мы собираемся скопировать данные порциями по 16 МБ, поэтому нам нужно выяснить, сколько порций по 16 МБ нам нужно скопировать. Вот где этот уменьшенный размер файловой системы приходит в хэнди.
В моем случае размер сжатой файловой системы составлял чуть более 1 ГБ, потому что я установил множество других программ в базовой системе Ubuntu, прежде чем сделать снимок. Возможно, я мог бы просто скопировать размер файловой системы, округленный до ближайших 16 МБ, но я хотел, чтобы это было безопасно.
Итак, 128 раз по 16 МБ порций = 2 ГБ:
$ sudo dd if=/dev/sdf ibs=16M of=/dev/sdg obs=16M count=128
Я копировал блоками по 16 МБ, потому что с EBS вы платите за каждое чтение и запись, поэтому я хотел максимально уменьшить их количество. Я не знаю, делал ли это таким образом, но это, вероятно, не повредило.
Затем нам нужно изменить размер файловой системы, которую мы только что скопировали, на новый том, чтобы она использовала все доступное пространство на томе.
$ sudo resize2fs -p /dev/sdg
Наконец, проверьте это, чтобы убедиться, что все хорошо:
$ sudo e2fsck -f /dev/sdg
Это все, что нам нужно сделать на этой машине, хотя это не помешает смонтировать новый том, просто как тест. Однако этот шаг почти наверняка необязателен, так как e2fsck должен был поймать любые проблемы.
Теперь нам нужно сделать снимок нового тома и создать AMI на его основе. Мы закончили с машиной, так что вы можете прекратить ее, если хотите.
Убедитесь, что небольшой том отключен, если вы подключили его, а затем сделайте снимок. Опять же, вы можете сделать это в консоли управления.
Последний шаг требует инструментов командной строки ec2.
РЕДАКТИРОВАТЬ:
Поскольку этот ответ был опубликован, консоль AWS позволяет просто щелкнуть правой кнопкой мыши по снимку и выбрать «Создать изображение из снимка». Вам все равно нужно будет выбрать соответствующий идентификатор ядра. Если он не отображается в списке, убедитесь, что вы выбрали соответствующую архитектуру.
Мы используем приложение ec2-register для регистрации AMI на основе только что сделанного снимка, поэтому запишите значение snap-xxxxxxxx из только что сделанного снимка.
Затем вы должны использовать команду вроде:
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
Вам, конечно, нужно заменить идентификатор ядра на тот, который вы записали в начале, а идентификатор снимка на тот, который вы создали на предыдущем шаге. Вам также нужно указать его на свой секретный ключ (называемый sk.pem) и свой сертификат x509 (называемый cert.pem). Конечно, вы можете выбрать все, что вы хотите для имени и описания.
Надеюсь это поможет.