3

У меня есть несколько десятков Малиновых Пис, которые я использую как часть домашнего лабораторного эксперимента. Я создал инсталляцию Rasbian (специфичная для Pi версия Debian) на одном Pi, и я хочу распространить ее на остальную часть Pis.

В Pis используются карты MicroSD (из которых все те, что я купил, имеют одинаковую емкость 8 ГБ и один и тот же номер модели). Раньше я использовал dd для создания образа карты MicroSD "золотой мастер", но это занимает много времени, так как он создает побайтное изображение карты SD 8 ГБ и должен записать все это ( даже если общее использованное пространство на карте составляет, возможно, 300 мегабайт или меньше).

Есть 3 раздела; загрузочный раздел (с ядром), корневой раздел файловой системы (с основной частью ОС) и третий специальный раздел.

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

Это возможно? Или мне лучше использовать parted и попробовать написать скрипт для репликации таблиц разделов?

Спасибо!

5 ответов5

5

Даже несмотря на то, что вы явно спросили о « ... скопировать и написать таблицу разделов ... », я думаю, что вы действительно хотите:

  • для клонирования своего золотого образа на другие новые идентичные SD-карты:
  • чтобы избежать "dd-ing" всей исходной SD-карты объемом 8 ГБ, поскольку она содержит только 300 МБ данных.

В таком случае есть альтернатива "dd", которая может делать именно то, что вам нужно: клонирование диска, но с учетом свойств / структуры / границ файловой системы.

Одной из таких альтернатив является пристрастие [1]: « ...Это сохраняет разделы, имеющие поддерживаемую файловую систему на секторной основе, в файл изображения [...] Partimage будет копировать данные только из использованных частей раздела... »

Обратите внимание, что partimage также можно использовать в сетевой среде клиент-сервер и что он включен в несколько live-linux-CD, например SystemRescueCD [2] (чтобы упростить процесс клонирования системных дисков).

Еще один инструмент, который вы можете проверить - это FSArchiver.


[1] http://www.partimage.org/Main_Page

[2] http://www.sysresccd.org/SystemRescueCd_Homepage


PS: извините за то, что не публикую другие релевантные URL, но ... это мой первый ответ, и я не могу включить более 2 URL

3

Конечно, вы можете сделать это с помощью dd . Таблица разделов MSROS или MBR находится в первых 512 байтах:

head -c 512 /dev/sdb > mbr.bin
cp mbr.bin /dev/sdc
partprobe

dd if=/dev/sde bs=512 count=1 of=mbr.bin
dd if=mbr.bin of=/dev/sdf
partprobe

Однако это не будет копировать фактическую структуру файловой системы ; вам все равно придется запустить mkfs на пустых разделах.

Вы можете предпочесть скриптовый sfdisk или parted инструменты для создания разделов конкретных размеров вместо этого.

3

Вы можете ускорить dd , увеличив размер блока с помощью флага bs . Я обычно использую следующее: dd if=/dev/source of=/dev/destination bs=8M . Честно говоря, dd или parted - ваши лучшие варианты, dd - лучший выбор по качеству (на мой взгляд). 

1

(Дубликат https://unix.stackexchange.com/questions/12986/how-to-copy-the-partition-layout-of-a-whole-disk-using-standard-tools)

Лично я предпочитаю не использовать dd, чтобы избежать дублирования UUID.

Используйте sfdisk:

   -d, --dump
          Dump the partitions of a device in a format that is usable as input to sfdisk.  For example,
              % sfdisk -d /dev/hda > hda.out
              % sfdisk /dev/hda < hda.out
          will correct the bad last extended partition that the OS/2 fdisk creates.

Обратите внимание, что это не работает с GPT - но ... вместо этого вы можете использовать sgdisk:

sgdisk -R=/dev/sdb /dev/sda  # copy the table
sgdisk -G /dev/sdb           # randomize the GUIDs
0

(Я бы прокомментировал ответ @ ray выше, если бы у меня было достаточно повторений)

Если вы счастливы, что данные находятся в начале SD-карты, просто используйте опцию count dd .

Чтобы добавить в пример @ ray:

dd if=/dev/source of=/dev/destination bs=8M count=38

38 блоков по 8 МБ каждый по 304 МБ. Если вы используете промежуточный файл, то он будет иметь размер 304 МБ, а при обратной записи вы можете опустить count .

dd if=/dev/source of=~/intermediate_file bs=8M count=38
dd if=~/intermediate_file of=/dev/destination bs=8M

Промежуточный файл будет иметь дополнительное преимущество, заключающееся в том, что он будет быстрее (при условии сохранения промежуточного файла на жестком диске или SSD), поскольку при каждом клонировании не будет медленного чтения с SD-карты.

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