9

У меня есть 16 ГБ SD-карта, на которой есть несколько разделов (на самом деле это карта Raspberry Pi). У меня есть несколько других карт на 4 ГБ, к которым я хочу клонировать основную карту. 3 раздела на основной карте:

  • Загрузочный раздел Rasp, FAT, 60 МБ
  • Раздел Linux, ext2, 1 ГБ
  • Дополнительный раздел для хранения, FAT, 1 ГБ

Если я использую dd чтобы создать изображение карты через:

dd if=/dev/sdb of=~/sd-card.bin

тогда результирующий .bin имеет размер 16GB. Есть ли способ использовать dd чтобы скопировать только то, что на самом деле используется, то есть <4 ГБ, чтобы я мог затем dd это на новую карту 4 ГБ? Или есть лучшее решение, которое я должен использовать?

2 ответа2

8

Я полагаю, что для выполнения копирования вы используете ПК с Linux или Mac, а не сам Raspberry Pi. Вам, вероятно, нужно будет добавить размер блока.

Я видел один и четыре мегабайта, используемые для дисков Raspberry pi, указав bs = 1M или bs = 4M. Я думаю, что размер блока важнее при записи на диск, так как большие передачи выполняются быстрее, чем меньшие. Это не устанавливает размер блока для диска, оно просто влияет на размер передач, используемых dd. Одной из причин установки большого размера блока является необходимость стирания вспышки перед ее записью. Это делается автоматически, но быстрее для передач, которые превышают минимальный размер стирания.

Вы можете ограничить общий объем данных, скопированных dd, используя "count". "количество" в единицах блоков. Если конец последнего раздела на исходном диске меньше размера места назначения, вы можете делать то, что хотите.

Что-то вроде dd if=/dev/sdb of=~/sd-card.bin bs=1M count=4000 создаст образ размером 4000MBs.

См. Http://en.wikipedia.org/wiki/Dd_(Unix) и http://elinux.org/RPi_Easy_SD_Card_Setup для получения дополнительной информации. Не уверен, как найти конец последнего раздела или общий размер карт. Однако, если вы отформатировали диски, вы, вероятно, знаете, как это сделать.

2

Разобравшись с ответом Уильяма, можно вычислить конец последнего раздела, используя 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).

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

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

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

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

Этот метод работал для меня на дюжине или около того клонов. Если в этом методе есть какие-либо фатальные недостатки, они еще не всплыли.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .