«Измените размер» .img для меньшей SD-карты. Как сжать образ загрузочной SD-карты

Контекст

У меня есть SD-карта объемом 16 ГБ с ОС на базе Linux для Raspberry Pi. Большая часть пространства пуста.

Я хочу поделиться SD .img с другими людьми, но если я использую команду

dd if=/dev/sdXX of=/home/user123/SD.img

, это создаст образ размером 16 ГБ. Слишком большой.

Вопрос

Как я могу изменить размер изображения SD-карты 16 ГБ в меньший 4 ГБ?

Я пробовал с GParted: он создает раздел с 4 ГБ без проблем, однако Целое .img SD-карты по-прежнему составляет 16 ГБ с 12 ГБ нераспределенного пространства.

GParted table

Я прочитал вопрос и ответ Клонирование нескольких разделов в Ubuntu , но я все еще не могу изменить размер 16 ГБ SD карта в 4 ГБ.

Подробнее

~$ lsblk 
...

sdc      8:32   1  14,9G  0 disk 
├─sdc1   8:33   1   100M  0 part 
└─sdc2   8:34   1     4G  0 part 
~$ sudo fdisk -l /dev/sdc
Disk /dev/sdc: 14,9 GiB, 15931539456 bytes, 31116288 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: 0xf8a631ce

Device     Boot  Start     End Sectors  Size Id Type
/dev/sdc1  *      2048  206847  204800  100M  c W95 FAT32 (LBA)
/dev/sdc2       206848 8595455 8388608    4G 83 Linux

Любой совет приветствуется!

Обратите внимание: : как заметил Мелебиус в комментарии , правильное слово, которое нужно использовать, - сокращение :

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

6
задан 23 September 2019 в 19:15

3 ответа

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

Ключевой информацией было использование команды truncate. После полного решения, чтобы не сделать, теряют ответ.

Предварительный шаг состоит в клонировании SD-карты в Вашем ПК: Помните (preliminar шаги)

  1. umont раздел Вы хотите скопировать на своем ПК. Например:
    $ umont /dev/sdc1
    $ umont /dev/sdc2
  1. использовать lsblk видеть, которым устройства доступны и управлять если они mounted/unmonted

  2. создайте копию целой SD-карты со всем разделом unmonted:

    $ dd if=/dev/sdc of=/path/to/file/myimage.img

Уменьшение изображений на Linux (решение, предложенное FrozenCow здесь)

Проблема контекста:

Наличие a myimage.img больше затем поддержка оборудования (если это меньше, не должно быть никакой проблемы; однако, с помощью той же стратегии, можно лучше приспособить изображение в поддержке оборудования).

Секрет состоит в том, чтобы использовать стандартные инструменты Linux и инструменты: GParted, fdisk и truncate.

Требования:

  • ПК Linux
  • .img Вы хотите уменьшиться (myimage.img в этом примере)

Создание устройства закольцовывания:

GParted является приложением, обычно раньше управлял таблицами разделов и файловыми системами. Для уменьшения изображения GParted будет используемым вдоль первой части ответа.

GParted воздействует на устройства, не простые файлы как изображения. Поэтому мы сначала должны создать устройство для изображения. Мы делаем это использование петлевой функциональности Linux.

Давайте включим, включают обратную петлю:

$ sudo modprobe loop

Давайте запросим новое (свободное) устройство закольцовывания:

$ sudo losetup -f

Возврат команды является путем к свободному устройству закольцовывания:

/dev/loop0

Давайте создадим устройство изображения:

$ sudo losetup /dev/loop0 myimage.img

Устройство /dev/loop0 представляет myimage.img. Мы хотим получить доступ к разделам, которые находятся на изображении, таким образом, мы должны попросить, чтобы ядро загрузило их также:

$ sudo partprobe /dev/loop0

Это должно дать нам устройство /dev/loop0p1, который представляет первый раздел в myimage.img. Нам не нужно это устройство непосредственно, но GParted требует его.

Измените размер раздела с помощью GParted:

Давайте загрузим новое устройство с помощью GParted:

$ sudo gparted /dev/loop0

Когда приложение GParted открывается, это должно появиться окно, подобное следующему:

enter image description here

Теперь заметьте несколько вещей:

  • Существует один раздел.
  • Раздел выделяет весь диск/устройство/изображение.
  • Раздел заполнен частично.

Мы хотим изменить размер этого раздела так, чтобы были соответствия это содержание, но не больше, чем это.

Выберите раздел и нажмите Resize/Move. Окно, подобное следующему, раскроется:

enter image description here

Перетащите правильную панель налево как можно больше.

Обратите внимание, что иногда GParted будут нужны некоторые МБ, дополнительный для размещения некоторых связанных с файловой системой данных. Можно нажать стрелку вниз в Новом окне размера несколько раз, чтобы сделать так. Например, я нажал его 10 раз (=10MiB), чтобы FAT32 работал. Для NTFS Вы, возможно, не должны были бы вообще.

Наконец нажмите Resize/Move. Вы возвратитесь к окну GParted. На этот раз это будет выглядеть подобным следующему:

enter image description here

Заметьте, что существует часть освобожденного диска. Эта часть диска не будет использоваться разделом, таким образом, мы сможем сбрить эту часть изображения позже. GParted является инструментом для дисков, таким образом, он не уменьшает изображения, только разделы, мы должны сделать уменьшение изображения сами.

Нажмите Apply in GParted. Это теперь переместит файлы и наконец уменьшит раздел, таким образом, сможет потребоваться минута или два, большую часть времени это заканчивается быстро. Впоследствии близкий GParted.

Теперь мы больше не нуждаемся в устройстве закольцовывания, поэтому разгружаем его:

$ sudo losetup -d /dev/loop0

Бритье изображения:

Теперь, когда у нас есть все важные данные в начале изображения, время к бритью той освобожденной части. Мы должны будем сначала знать, где наш раздел заканчивается и где освобожденная часть начинается. Мы делаем это использование fdisk:

$ fdisk -l myimage.img

Здесь мы будем видеть вывод, подобный следующему:

Disk myimage.img: 6144 MB, 6144000000 bytes, 12000000 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
Disk identifier: 0x000ea37d

      Device Boot      Start         End      Blocks   Id  System
myimage.img1            2048     9181183     4589568    b  W95 FAT32

Отметьте две вещи в выводе:

  • Раздел заканчивается на блоке 9181183 (показанный под End)
  • Размер блока составляет 512 байтов (показавший секторами 1 * 512)

Мы будем использовать эти числа в остальной части примера. Размер блока (512) часто является тем же, но конечный блок (9181183) будет отличаться для Вас. Числа означают, что parition заканчивает на байте 9181183*512 из файла. После того, как тот байт прибывает освобожденная часть. Только первые 9181183*512 байтов будут полезны для нашего изображения.

Затем мы уменьшаем файл изображения к размеру, который может просто содержать раздел. Для этого мы будем использовать truncate команда (благодарит uggla!). С усеченной командой должен предоставить размер файла в байтах. Последний блок был 9181183, и номера блока запускаются в 0. Это означает, что нам нужно (9181183+1) *512 байтов. Это важно, еще раздел не будет соответствовать изображению. Таким образом, теперь мы используем усеченный с вычислениями:

$ truncate --size=$[(9181183+1)*512] myimage.img
3
ответ дан 23 November 2019 в 07:53

Можно использовать опции bs и count в dd- управляйте для ограничения размера выходного файла.

Пример:

dd if=sdx of=SD.img bs=1G count=4

привел бы к outputfile с размером 4 гибибайт.

Возьмите глубокое, изучают man dd.

Необходимо было бы знать, сколько байтов необходимо скопировать так, чтобы все разделы были полностью покрыты, поэтому смотрите с sudo fdisk -l /dev/sdx какой сектор является последним, Вам нужно.

Разделы должны быть в начале диска (как в изображении, которое Вы предоставили).

Диски с таблицей разделов MS-DOS могут быть клонированы легко этот путь, но если диск использует GPT и должен быть клонирован к диску с другим размером, защитный MBR должен быть адаптированными послесловиями и GPT-резервным-копированием, которое находится в самом конце диска, должен быть воссоздан, это может быть, покончили gdisk.


От Вашего fdisk- произведите Вас, видят, что последний сектор последнего раздела является сектором 8595455, это означает, что необходимо скопировать по крайней мере 8595455+1 сектор (первый сектор 0). С размером сектора 512 байтов это равно 4 400 873 472 байтам. bs умноженный с count должны быть больше или равными, чем это.

Возможно, это является все еще слишком большим для карты с интерфейсом USB на 4 ГБ, можно все еще уменьшить размер sdc2, существует много неиспользуемого места в нем.

Для текущего примера Вы, если,

 dd if=/dev/sdc of=SD.img bs=10M count=420

покроет таблицу разделов, sdc1 и sdc2. Вычислите:

10*1024*1024*420 = 4,404,019,200 > 4,400,873,472
2
ответ дан 23 November 2019 в 07:53

resize2fs также можно использовать для изменения размера.

sudo resize2fs -fp SD.img 4G

Он также изменяет размер самого файла!

3
ответ дан 2 February 2020 в 07:02

Другие вопросы по тегам:

Похожие вопросы: