Обрезать пустое пространство из необработанного изображения 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, приведет к тому, что записи таблицы петиций станут неверными, и файл нельзя будет использовать для монтирования в качестве петлевого устройства. Я следую этому методу
- Сначала смонтируйте образ диска как петлевое устройство.
sudo -i
udisksctl loop-setup -f disk.img
#notedown where its mounted
gparted /dev/loopxx
- В пользовательском интерфейсе gparted добавьте в конце новый раздел размером 1 МБ, примените изменения.
- Размонтировать файл
udisksctl loop-delete -b /dev/loopxx
- сбросить таблицу разделов в файл
sfdisk -d disk.img > partitions.txt
- Найти последний использованный сектор
parted disk.img 'unit s print'
- Найдите смещение байта = (последний использованный сектор + 1) * 512
- обрезать файл
truncate -s offset disk.img
- Обновите файл 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
- Восстановить таблицу разделов
sfdisk disk.img < partitions.txt