Подтвердить что ты не робот

Как создать образ .IMG диска (SD-карту) без использования свободного места?

В Linux мы можем сделать

dd if=/dev/sdb of=bckup.img

но если диск имеет 32 ГБ и используется только 4 ГБ, файл образа 32 ГБ - пустая трата времени. Есть ли способ или инструмент для создания изображений только с достоверными данными?

4b9b3361

Ответ 1

Лучшее, что можно сделать, это

  1. Скопируйте все файлы со всех разделов, сохраняя метаданные

    mkdir -p myimage/partition1

    mkdir myimage/partition2

    sudo cp -Rrf --preserve=all /media/mount_point_partition1/* myimage/partition1/

    sudo cp -Rrf --preserve=all /media/mount_point_partition2/* myimage/partition2/

  2. Извлеките MBR

    sudo dd if=/dev/sdX of=myimage/mbr.img bs=446 count=1

    замените /dev/sdX на соответствующее устройство.

  3. Разбейте целевой диск на разделы с размерами, превышающими скопированные данные, и должны иметь тот же формат и те же флаги, используя gparted. Google, как разбить диск.

  4. Смонтируйте только что отформатированный и размеченный диск. На большинстве компьютеров вам просто нужно подключить диск, и вы можете найти смонтированные разделы в папке /media.

  5. Скопируйте ранее скопированные данные в разделы назначения, используя следующие команды

    sudo cp -Rrf --preserve=all myimage/partition1/* /media/mount_point_partition1/ sudo cp -Rrf --preserve=all myimage/partition2/* /media/mount_point_partition2/

  6. Скопируйте обратно MBR

    sudo dd if=myimage/mbr.img of=/dev/sdX bs=446 count=1

Теперь наслаждайтесь новым диском!

Ответ 2

Довольно хороший и простой способ справиться с этим - просто передать его через gzip, что-то вроде этого:

# dd if=/dev/sdb | gzip > backup.img.gz

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

Вы бы использовали это для восстановления такого изображения:

# cat backup.img.gz | gunzip | dd of=/dev/sdb

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

# cd /media/flashdrive
# dd if=/dev/zero of=bigfile bs=1M     # let it run and quit by disk full error
# rm bigfile

Ответ 3

Используя параметры bs и count dd, вы можете ограничить размер изображения, как показано на шаге 2 answer 1665017.

Возможно, вы уже знаете, какой размер изображения вы хотите создать. Если нет, вы можете получить хорошую идею от df:

df -H --total /

Замените / на список разделенных пробелами всех точек монтирования, относящихся к разделам диска.

Более точный способ - использовать fdisk или ваш предпочтительный редактор разделов и заняться калькулятором.

$ fdisk -l /dev/mmcblk0

Disk /dev/mmcblk0: 7.4 GiB, 7948206080 bytes, 15523840 sectors
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: 0x00057540

Device         Boot  Start     End Sectors  Size Id Type
/dev/mmcblk0p1        2048  186367  184320   90M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      186368 3667967 3481600  1.7G  5 Extended
/dev/mmcblk0p5      188416 3667967 3479552  1.7G 83 Linux

Общее используемое пространство в байтах = конечный сектор последнего раздела сектора сектора X (здесь 3667967 x 512).

Общее используемое пространство в GB = общее используемое пространство в байтах /1024 3 (здесь 1,749023 ГБ).

Если вы решите, например, что ваше изображение должно быть ровно 2 ГБ, следующая команда сделает это:

dd if=/dev/mmcblk0 of=/path/to/pi_updated.img bs=1M count=2048

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

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

Для моих целей мне не нужно изображение, которое отлично подрезано до последнего бит данных, поэтому, когда реальный размер составляет 1,75 ГБ, для меня достаточно 2 ГБ изображения. Это вырезает другие 6 ГБ (или 30 ГБ или что-то еще, что у него есть) неиспользуемого пространства, которое в противном случае было бы на изображении.

Я видел советы во многих местах, что dd должен не выполняться на смонтированном разделе, и я следовал этому, потому что он кажется интуитивно правильным; это похоже на попытку набросать эскиз в зеркало с эскизом, который вы делаете, также видимым в эскизе. Это немного отрывочно.

Ответ 4

Если у вас большая SD-карта 16 ГБ, 32 ГБ и т.д., Но вы хотите сэкономить место с помощью резервной копии, вы можете использовать:

sudo apt-get install gnome-disk-utility

Откройте утилиту диска, чтобы проверить, действительно ли ваш usb-накопитель содержит:

gnome-disks

В моем случае SD-карта объемом 32 ГБ с изображением Распбиана, распознаваемая как: /dev/sde

Поэтому я бегу с /dev/sde:

sudo dd bs=4M status=progress if=/dev/sde | gzip > \
/you-selected-full-path-here/raspberry-images/'date +%Y%m%d'_rpi_image_backup.gz
status=progress gives you progress bar indication
| gzip > compresses the 32 GB total size and not writing the empty space from the 32 GB
'date +%Y%m%d' writes today date in the filename

Вывод: 20190529_rpi_image_backup.gz

И размер составляет всего 3,5 ГБ. Если вы хотите записать это изображение на новую SD-карту, используйте:

https://www.balena.io/etcher/

Также вы можете записать этот образ, сделанный из 32 ГБ, на диск 16 ГБ или 8 ГБ, это не будет жалобой на то, что изображение больше не будет слишком большим.

Ответ 5

Попробовав несколько разных методов, я нашел следующую статью:

https://medium.com/platformer-blog/creating-a-custom-raspbian-os-image-for-production-3fcb43ff3630

Он создан для сжатия и изменения размера (при первой загрузке) образа raspberry-pi, но его можно легко настроить для любого другого дистрибутива Linux. Я успешно установил работу с Debian 9 на чипе, основанном на собственном оружии.

rc.local, созданный сценарием pishrink, сначала использует raspi-config для изменения размера rootfs, а затем возвращается к методу, использующему parted (который мне пришлось заранее установить на моей машине). Я закомментировал раздел кода, где raspi-config.

Образ моей SD-карты сократился с 15 до 1,1 ГБ. Я высветил уменьшенное изображение SD-карты с помощью etcher. Потребовалось менее 5 минут, а не более получаса для полного образа объемом 15 ГБ.