Как уменьшить размер образа диска виртуальной машины (kvm)?

Как уменьшить размер образа диска виртуальной машины (kvm)?

Допустим, у меня есть linux-vm-image.rawраздел размером 10 ГБ. Внутри есть один основной раздел (используется классическая таблица разделов типа MS-DOS, а не GPT) etx4(LVM не используется), который распространяется на весь том. И реальные данные, выделенные на этом разделе, составляют, например, 3 ГБ.

Этот образ подготовлен для использования в некоторой среде виртуализации (в моем случае kvm+OpenStack), и любая виртуальная машина, созданная из этого образа, будет изменять свой размер в соответствии с целевым размером виртуального диска в зависимости от выбора пользователя. Поэтому нет причин оставлять свободное дисковое пространство внутри этого образа диска.

Как мне уменьшить размер этого образа необработанного диска до минимума (с 10 ГБ до ~3 ГБ)?

Естьнекоторый инструкциидля qcow2образов дисков, но мне приходится использовать rawтолько образы - не qcow, не OVFи не другие.

Я предполагаю, что-то вроде

  • смонтировать этот образ где-нибудь как блочное устройство
  • выполните некоторые действия, чтобы переместить все файлы внутри раздела ext4 в его «начало», другими словами - выполните дефрагментацию свободного пространства
  • размонтировать образ
  • уменьшить размер файловой системы в образе (чтобы соответствовать размеру данных внутри него)
  • уменьшить размер образа (чтобы он соответствовал размеру файловой системы внутри него)
  • обновить таблицу разделов в образе, чтобы она соответствовала новому размеру раздела

Но разве я не пытаюсь изобрести велосипед? Есть ли какая-то однострочная команда или специальное программное обеспечение, чтобы сделать то, что я хочу?

решение1

Raw-изображения не очень удобны для изменения размера. Однако вы можете попробовать zerofree(непримонтированную) файловую систему, а затем сжать полученный файл изображения.

Также проверьте, поддерживает ли ваша целевая среда формат контейнера OVF, который позволяет использовать сжатые образы дисков (zerofree по-прежнему применим).

решение2

Вы на правильном пути. Если вы можете смонтировать его как блочное устройство (петлевое монтирование), вы, вероятно, сможете заставить gparted работать с ним.

gparted выполнит большую часть того, что вам нужно:
1. переместит данные файловой системы в начало раздела (уменьшит файловую систему);
2. уменьшит раздел и скорректирует таблицу разделов;
3. возможно, он даже сможет выдать вам оставшийся размер «диска», когда вы распечатаете обновленную таблицу разделов (например, последний сектор последнего раздела и т. д.).

Это сложная часть. После этого размонтируйте его. Возможно, вам придется вручную вычислить точный размер вашего "диска", но после этого простое усечение файла должно это сделать.

ОБНОВЛЕНИЕ: Если ваша таблица разделов типа MBR, то все в порядке. С GPT у нее есть зеркальная копия в конце диска. Так что будьте осторожны с этим, так как gparted может быть недостаточно умен для этого (если только вы не можете передать ему необработанный образ напрямую). Если у вас возникли проблемы, рассмотрите gdisk как шаг после усечения. Усеките с несколькими дополнительными блоками и заставьте gdisk/equiv перестроить зеркальную копию (вероятно, потребуется циклическое монтирование во второй раз).

Связанный контент