У мене є зображення DD із SD-картки 4 Гб, яка має два розділи, ці два розділи використовують лише близько 800 Мб, і як такий я хочу зменшити розмір файлу img.
Хтось знає про спосіб видалення "вільного місця" з файлу img?
У мене є зображення DD із SD-картки 4 Гб, яка має два розділи, ці два розділи використовують лише близько 800 Мб, і як такий я хочу зменшити розмір файлу img.
Хтось знає про спосіб видалення "вільного місця" з файлу img?
Відповіді:
Спочатку переконайтеся, що вільний простір справді порожній і не містить залишків видалених файлів. Найпростіший спосіб досягти цього - створити на диску величезний файл, що містить лише нульові байти, а потім видалити його.
# losetup --find --partscan foo.img
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 4096M 0 loop
├─loop0p1 259:0 0 2048M 0 loop
└─loop0p2 259:1 0 2048M 0 loop
# for part in /dev/loop0p*; do
mount $part /mnt
dd if=/dev/zero of=/mnt/filler conv=fsync bs=1M
rm /mnt/filler
umount /mnt
done
dd: error writing ‘/mnt/filler’: No space left on device
dd: error writing ‘/mnt/filler’: No space left on device
# losetup --detach /dev/loop0
Потім стисніть його за допомогою інструменту типу gzip
або xz
. Навіть при найнижчих рівнях стиснення довга серія нулів добре стисне:
# ls -s
4096M foo.img
# gzip foo.img
# ls -s
11M foo.img.gz
Зверніть увагу, що ви повинні розпакувати зображення під час запису на диск. Це призведе до розтиску "живого":
# cat foo.img.gz | gunzip | dd of=/dev/sda
Зверніть увагу, що пристрій виводу (sda) повинен мати достатній розмір для розміщення оригінального зображення, інакше дані будуть втрачені або зіпсовані.
Альтернативний метод, якщо ви хочете продовжувати використовувати зображення - наприклад, з віртуальною машиною - це перетворити необроблене зображення в один із форматів зображень, використовуваний програмним забезпеченням для віртуалізації; наприклад, qcow2 для Qemu, VDI для VirtualBox або VMDK для VMware.
Зауважте, що для цього все ж потрібно підготувати зображення, очищаючи вільний простір за допомогою вищевказаного методу.
# qemu-img convert -f raw -O qcow2 foo.img foo.qcow
# qemu-img convert -f raw -O vmdk foo.img foo.vmdk
Але якщо він знову буде записаний на реальний диск, вам доведеться перетворити його назад у необроблене зображення.
resize2fs
або ntfsresize
(у Linux немає інструменту для FAT), перед тим, як записати його на менший пристрій, або створивши свіжу файлову систему та скопіювавши лише файли.
Використовувати resize2fs
набагато набагато простіше
resize2fs -M xxx.img
вас попросять спочатку e2fsck - так:
e2fsck -f -y xxx.img
(зображення НЕ повинно монтуватися!)
Примітка. Це буде працювати лише в тому випадку, якщо зображення є одним розділом, якщо це блок-пристрій із неміцними розділами, див. Вище відповідь ...
losetup --find --partscan xxx.img
для установки файлу зображення як циклічного пристрою. потім запустіть, lsblk
щоб знайти розділи пристрою циклу.
resize2fs
вони стосуються лише extN
типів розділів. Інші типи перегородок потребують інших інструментів.
Я також спробував це з qemu-img , і він спрацював як шарм:
qemu-img resize test.img 2G
Ми змінюємо розмір, test.img
щоб зробити його 2G (2 Гб).
Працювали бездоганно для мене.
df -h
показує оригінальний розмір. Як це можливо?
Я використав gparted підхід зі своїм комп'ютером Ubuntu 16.10:
1) Зіставте файл img на наступний доступний розділ циклу losetup
, як описано в попередніх публікаціях, як зазначено вище
2) Перевірте, за допомогою lsblk
якого циклу диск вашого файлу зображень відображений, наприклад/dev/loop0
3) Виконати sudo gparted /dev/loop0
4) Зменшіть розділ (и) циклу, як вважаєте відповідним; будь-ласка, переконайтесь, що ці розділи відключені.
5) Виконайте fdisk /dev/loop0
, потім введіть p
, це покаже вам розмір блоку та кінцевий номер блоку різних розділів.
6) Виконати dd if=/dev/loop0 of=shrunk_image_file.img
, застосувати до цієї команди параметрів bs=[BlockSize]
і , count=[EndBlockNumberOfLastLoopPartition+1]
і ви будете мати стиснувся і rightsized файл зображення.