Как уменьшить раздел файла img, созданного из dd?

я скопировал 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>

и теперь, когда я пытаюсь смонтировать образ, я получаю " Маунт: тип неправильно ПС, плохой вариант, плохо суперблок..." сообщение об ошибке.

затем я попытался с помощью gparted как описано в этом сайте в должности. Графический интерфейс показал полный раздел, если я не побежал parted в первую очередь. Даже тогда графический интерфейс не позволял мне изменять размер раздела.

за попытку уменьшить размер раздела и начать с новой копии 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.

когда я установил перегородка, она все еще показала как одинаковый размер.

8
задан MrMas
02.04.2023 1:11 Количество просмотров материала 2598
Распечатать страницу

1 ответ

на контур картинки

прежде всего, забудьте 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. Эта воля переместите данные, которые могут находиться в области, которую вы собираетесь отрезать, и сохраните новые границы как часть метаданных файловой системы. (Я полагаю, что это то, что вы имели в виду под "дефрагментацией".)

только после того, как файловая система была стянута вы также можете сжать раздел, содержащий его. Это можно сделать с помощью parted или fdisk, просто изменив конечный адрес раздела.

Примечание: You должны возможность использовать GParted для изменения размера файловая система и раздел в один шаг-если он поддерживает работу с петлевыми устройствами, то есть. Это может зависеть от версии GParted. (Впрочем, из командной строки расстались не сжимает файловые системы, а просто обрезает раздел.)

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

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

3
отвечен grawity 2023-04-03 08:59

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх