У меня есть 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 ГБ нераспределенного пространства.
Я прочитал вопрос и ответ Клонирование нескольких разделов в 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-карту изображение .
Здесь я нашел решение, которое решает мою проблему. Это весьма схоже с другим, но это лучше объясняет, как вычислить и какое значение имеют числа и разделы.
Ключевой информацией было использование команды truncate
. После полного решения, чтобы не сделать, теряют ответ.
Предварительный шаг состоит в клонировании SD-карты в Вашем ПК: Помните (preliminar шаги)
umont
раздел Вы хотите скопировать на своем ПК. Например: $ umont /dev/sdc1
$ umont /dev/sdc2
использовать lsblk
видеть, которым устройства доступны и управлять если они mounted/unmonted
создайте копию целой SD-карты со всем разделом unmonted:
$ dd if=/dev/sdc of=/path/to/file/myimage.img
Уменьшение изображений на Linux (решение, предложенное FrozenCow здесь)
Проблема контекста:
Наличие a myimage.img
больше затем поддержка оборудования (если это меньше, не должно быть никакой проблемы; однако, с помощью той же стратегии, можно лучше приспособить изображение в поддержке оборудования).
Секрет состоит в том, чтобы использовать стандартные инструменты Linux и инструменты: GParted, fdisk
и truncate
.
Требования:
.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 открывается, это должно появиться окно, подобное следующему:
Теперь заметьте несколько вещей:
Мы хотим изменить размер этого раздела так, чтобы были соответствия это содержание, но не больше, чем это.
Выберите раздел и нажмите Resize/Move. Окно, подобное следующему, раскроется:
Перетащите правильную панель налево как можно больше.
Обратите внимание, что иногда GParted будут нужны некоторые МБ, дополнительный для размещения некоторых связанных с файловой системой данных. Можно нажать стрелку вниз в Новом окне размера несколько раз, чтобы сделать так. Например, я нажал его 10 раз (=10MiB), чтобы FAT32 работал. Для NTFS Вы, возможно, не должны были бы вообще.
Наконец нажмите Resize/Move. Вы возвратитесь к окну GParted. На этот раз это будет выглядеть подобным следующему:
Заметьте, что существует часть освобожденного диска. Эта часть диска не будет использоваться разделом, таким образом, мы сможем сбрить эту часть изображения позже. 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
Отметьте две вещи в выводе:
End
)1 * 512
)Мы будем использовать эти числа в остальной части примера. Размер блока (512) часто является тем же, но конечный блок (9181183) будет отличаться для Вас. Числа означают, что parition заканчивает на байте 9181183*512 из файла. После того, как тот байт прибывает освобожденная часть. Только первые 9181183*512 байтов будут полезны для нашего изображения.
Затем мы уменьшаем файл изображения к размеру, который может просто содержать раздел. Для этого мы будем использовать truncate
команда (благодарит uggla!). С усеченной командой должен предоставить размер файла в байтах. Последний блок был 9181183, и номера блока запускаются в 0. Это означает, что нам нужно (9181183+1) *512 байтов. Это важно, еще раздел не будет соответствовать изображению. Таким образом, теперь мы используем усеченный с вычислениями:
$ truncate --size=$[(9181183+1)*512] myimage.img
Можно использовать опции 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
resize2fs
также можно использовать для изменения размера.
sudo resize2fs -fp SD.img 4G
Он также изменяет размер самого файла!