Допустим, у меня есть 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 перестроить зеркальную копию (вероятно, потребуется циклическое монтирование во второй раз).