Як зменшити розділ файлу img, зроблений з dd?


0

Я скопіював диск USB на .img використання файлу dd:

dd if=/dev/sdc of=myimage.img

Я хочу зменшити розмір розділу на зображенні. Я спробував кілька методів і завжди закінчував зображенням, яке монтувалося на петлю, розділ якого все ще є повним розміром USB.

  • Як змінити myimage.img мати менший розділ після того, як буде змонтовано петлю?

  • Чи потрібно копіювати нулі в порожню частину розділу перед тим, як це зробити?

  • Чи потрібно дефрагментувати, щоб при зменшенні розміру зображення видаляти порожні байти? (З того, що я прочитав, Linux поширюється на весь розділ, тому я не чекаю, що всі дані в кінці зображення будуть нульовими байтами.

ПРИМІТКА. Я не намагаюся заощадити дисковий простір, тому архівування не допоможе мені.

Передумови

У мене встановлений Linux на USB-диску ext4. Я маю намір дублювати встановлення для декількох пристроїв. Я зробив це успішно, але хотів би створити на одному диску USB розділ лише для читання з системою і невеликий розділ, який дозволяє постійне зберігання. Замість того, щоб зламати USB, я намагаюся змінити копію USB. Я сподіваюся, що ми не будемо відволікатися на цей фон.

Коротше кажучи, я зробив наступне:

# Create mount point in current directory
sudo mkdir mnt
# Loopback mount the image
fdisk -l myimage.img
sudo mount -o offset=<partion_block_start * block_size> myimage.img mnt
# Copy all zeros to remaining space of the image
cd mnt
sudo dd if=/dev/zero of=filler conv=fsync bs=1M
rm filler
cd ..

Спочатку я спробував використати parted як описано в відповідь суперкористувача і qemu-img як описано в цей інший відповідь суперкористувача .

sudo umount mnt
parted myimage.img
# At parted command prompt
(parted) resizepart 1
# Entered my end <target size>. Note that parted uses zero-based 
# indexing. This could be your final image size. In my case, the way the
# Linux installer worked, the partition started at 1M.
(parted) print
# I see that the partition is now sized as I expect
(parted) exit
# Just another sanity check
sudo parted -m esp3_007.img unit B print
# I see that the partition is now sized as I expect

Коли я намагаюся змонтувати зображення знову, він працює нормально, але df як і раніше відображається розділ у тому ж розмірі. Тоді я спробував

qemu-img resize myimage.img <target_size>

А тепер, коли я намагаюся встановити зображення, я отримую повідомлення про помилку "mount: wrong fs type, bad option, bad superblock ...".

Потім я спробував використати gparted як описано в цей пост за межами ділянки . Графічний інтерфейс показав повний розділ, якщо я не побіг parted на першому місці. Навіть тоді, GUI не дозволив мені змінити розмір розділу.

Щоб спробувати змусити розмір розділу бути меншим, починаючи з нової копії myimage.img я намагався fdisk описано в це відповідь AskUbuntu

sudo fdisk myimage.img
Command (m for help): d
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4, default 1): 1
# defaults on the rest seemed to be correct in my case.

Коли я встановив розділ, він все одно показав такий самий розмір.


ПРИМІТКА. Я не намагаюся заощадити місце на диску - тоді навіщо? Просто копіювати файли працює A-OK для linux, а потім додати завантажувач
Xen2050

Як я вже заявив, мені потрібно змінити розмір розділу, щоб додати інший розділ без перевстановлення Linux.
MrMas

Вам не потрібно перевстановлювати файли, просто скопіюйте файли + grub / etc
Xen2050

Відповіді:


4

На циклі зображення

Перш за все, забудьте offset=, використання losetup --partscan і просто встановіть розділ за допомогою /dev/loop0p1.

# losetup --partscan /dev/loop0 myimage.img
# lsblk
# mount /dev/loop0p1 /mnt

Щоб ефективно очистити порожній простір у межах розділу, запустіть fstrim на файловій системі, що монтується циклом, так само, як на SSD. (Фактично це робить файл зображення рідким.)

# fstrim -v /mnt

На зміну розмірів розділів

Але поки що вам не потрібно очищати порожній простір або робити щось подібне. Незалежно від того, чи заповнена область, що має бути урізаною, нулями або шматками старих даних.

Замість цього, ви повинні робити точно так само, як ви робите з ext4 на реальному диску - вам потрібно скоротити кожен шар зсередини. Ви не можете пропустити кроки тільки тому, що це зображення.

Щоб зменшити розділ, який містить файлову систему, спочатку потрібно повідомити файлова система стиснути. Для ext2 / 3/4 це робиться за допомогою resize2fs. Це дозволить перемістити дані, які можуть жити в області, яку ви збираєтеся відсікати, і зберігатимуть нові межі як частину метаданих файлової системи. (Я вважаю, що це ви мали на увазі під "дефрагментацією".)

Лише після зменшення файлової системи можна також зменшити вміст розділу, що його містить. Це можна зробити за допомогою розділеного чи fdisk, просто змінюючи кінцеву адресу розділу.

Примітка: Ви слід мати змогу використовувати GParted для зміни розміру файлової системи і розділу в один крок - якщо він підтримує роботу з пристроями циклу, тобто. Це може залежати від версії GParted. (Проте CLI розлучилися не може зменшити файлову систему, вона просто обрізає розділ.)

Нарешті, після зміни розміру файлової системи та розділу можна скоротити весь вміст, що їх містить. Для цього спочатку від'єднайте пристрій від циклу і використовуйте його truncate --size=... у файлі зображення.

(Щоб зробити це безпечно, без необхідності ретельно обчислювати, я б зменшив файлову систему трохи більше, ніж потрібно, щоб створити простір "буфера", наприклад, якщо я хочу 4 ГБ зображення, я б скоротив файлову систему до 3 ГБ до 3,5 Гб, а потім обрізати зображення до 4 Гб, потім рости все в протилежному порядку, щоб заповнити простір 'буфера'.)


BTW, gparted не працював з подібних причин, коли інші команди не працювали: gparted не працює безпосередньо на файлах зображень. Циклічне відтворення, використання losetup як описано в цій відповіді, а потім запущено gparted на /dev/loopx дозволяє змінювати розмір.
MrMas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.