Обрезать пустое пространство из необработанного изображения dd

У меня есть сырой образ диска, который я сделал, используя dd экземпляра Ubuntu. Общий размер диска составляет 300 ГБ, но используется только 5,5 ГБ.

Есть ли способ изменить размер необработанного образа dd до 20 ГБ, сохранив все 5,5 ГБ данных и просто обрезав пустые блоки?

3 ответа

Проверьте размеры сектора:

sudo fdisk -l '/home/user/images/test.img'

Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00070424

Device                      Boot Start     End Sectors  Size Id Type
/home/user/images/test.img1 *     2048   26623   24576   12M  e W95 FAT16
/home/user/images/test.img2      26624 7200767 7174144  3,4G 83 Linux

Используйте конечный номер (7200767) в качестве ссылки, добавьте 1 и * 512, как показано ниже:

sudo truncate --size=$[(7200767+1)*512] '/home/user/images/test.img'

Ваш файл должен быть усечен

Поскольку это необработанное изображение, оно всегда будет точно такого же размера, что и экземпляр, из которого вы его сделали. Тем не менее, есть несколько приемов, которые вы можете использовать для достижения того же.

обнуление

Запись нулей в области с неиспользуемым пространством подготавливает его к сжатию, что эффективно уменьшает размер до размера меньше используемого:

sudo mount -o loop instance.img /testmount
sudo dd if=/dev/zero of=/testmount/zero
sudo rm -f /testmount/zero
sudo umount /testmount

компрессия

Простое сжатие изображения сделает его меньше, независимо от того, обнулили ли вы его сначала:

gzip instance.img

или, для более современного подхода:

zstd -T0 instance.img

Визуализация с поддержкой файловой системы

Если изображение не обязательно должно быть необработанным (т. Е. Представление блочного устройства, а не содержимого), у вас также есть возможность использовать инструменты для работы с файловой системой для создания изображения. Обнуление в этом случае не требуется. Например, ZFS поставляется со встроенной поддержкой для этого, например с компрессией:

sudo zfs snapshot myvms/myinstance@myimage
sudo zfs send myvms/myinstance@myimage | zstd -T0 > instance.zfs.zst

Если диск разбит на разделы GPT,truncateОпция, заданная @Wessel, приведет к тому, что записи таблицы петиций станут неверными, и файл нельзя будет использовать для монтирования в качестве петлевого устройства. Я следую этому методу

  1. Сначала смонтируйте образ диска как петлевое устройство.
      sudo -i
udisksctl loop-setup -f disk.img
#notedown where its mounted
gparted /dev/loopxx
  1. В пользовательском интерфейсе gparted добавьте в конце новый раздел размером 1 МБ, примените изменения.
  2. Размонтировать файлudisksctl loop-delete -b /dev/loopxx
  3. сбросить таблицу разделов в файлsfdisk -d disk.img > partitions.txt
  4. Найти последний использованный секторparted disk.img 'unit s print'
  5. Найдите смещение байта = (последний использованный сектор + 1) * 512
  6. обрезать файлtruncate -s offset disk.img
  7. Обновите файл parts.txt, чтобы отразить новое состояние.
      Remove the last-lba line from the since it no longer valid
Remove last 1MB partition since we don't need it anymore
  1. Восстановить таблицу разделовsfdisk disk.img < partitions.txt
Другие вопросы по тегам