Pull to refresh

Как создать образ диска в Linux с несколькими разделами, не имея физического образца

Configuring Linux **nix *Development for Linux *
Sandbox
Tutorial

Здравствуй дорогой читатель данного руководства. Меня зовут Андрей, и нет, я не алкоголик, а разработчик встраиваемых систем на базе Linux.

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

Для чего это нужно? Все процессорные платы, разрабатываемые нашим предприятием, обладают слотом для sdcard и установленной на плате mmc. Загрузка системы производится либо с sd, либо c mmc. sd-карта является, как правило, временным решением, подкупает простотой установки. А mmc является постоянным решением, куда устанавливается уже финальное программное обеспечение. Переключение между способами загрузки осуществляется перемычками (джамперами на плате).

В случае, когда мы говорим о заказчике на этапе разработки, ему необходима самостоятельная возможность работать с устройством. Для этого ему предоставляется само устройство и ссылка для скачивания образа, с инструкцией, как установить образ на sdcard и загрузить с неё систему. Далее заказчик иницирует либо установку с sd-карты, либо запускает диагностическое программное обеспечение, но это уже конкретные детали работы с заказчиком.

В случае, когда мы говорим о производстве, и выпуске устройства, то мы знаем, что люди которые будут устанавливать на mmc конечный продукт, как правило, не умеют подключаться через терминал и работать с командной строкой u-boot или Linux, да и просто может не быть на это времени. В их задачи должны входить осуществление простого производственного цикла, например:

  1. получить устройство;

  2. подключить к стенду;

  3. установить джамперы и sd-карту;

  4. подать питание;

  5. дождаться сообщений об окончании установки ПО;

  6. выключить устройство;

  7. снять джамперы и извлечь sd-карту;

  8. подать питание;

  9. дождаться диагностических сообщений;

  10. выключить устройство и передать дальше...

Конечно, образ можно разместить, например на сервере, и накатывать через сеть, но такой вариант, все равно, требует, как минимум, наличие загрузчика на mmc.

Для того, чтобы не мучаться с каждой sd-картой для каждого варианта, можно заранее подготовить несколько образов. И тут возникает вопрос - каким образом? Подготовку можно даже автоматизировать, но это совсем другая история.

Что потребуется для понимания и осуществления происходящего:

  • ОС GNU/Linux Debian;

  • умение пользоваться командной строкой на уровне ввода команд;

  • понимать что такое переменная окружения и как ее значение использовать в командной строке.

Создаем образ:

  1. Создаём файл образа диска заданного размера:

    dd if=/dev/zero of=${FILENAME} bs=${BYTES} count=${NUMBER_OF_BYTES}
    # или
    truncate -s ${SIZE} ${FILENAME}
  2. Подключаем диск к системе, разбиваем и форматируем:

    fdisk ${FILENAME} # как делить диск и на какое количество разделов, личное дело каждого
    DEVLOOP=$(sudo losetup --show -fP ${FILENAME})
    # форматируем разделы, если образ диска включает два раздела, то:
    sudo mkfs.${FSTYPE} ${DEVLOOP}p1
    sudo mkfs.${FSTYPE} ${DEVLOOP}p2
  3. Монтируем разделы и записываем информацию:

    sudo mount ${DEVLOOP}p${N} ${MOUNTPOINT}${N}
    sudo cp -aR /rootfs/* ${MOUNTPOINT}${N}/ # что записываем и куда, каждый решает сам
    # если вам также как и мне требуется на диске u-boot, то не забываем установить:
    sudo dd if=u-boot.img of=${DEVLOOP} bs=1k seek=1
  4. Отключаем диски в обратном порядке:

    sudo umount ${MOUNTPOINT}${N}
    sudo losetup -d ${DEVLOOP}
  5. Записываем полученный образ на соотвествующее устройство, если есть необходимость, например, для проверки и тестирования:

    sudo dd if=${FILENAME} of=${BLKDEV} conv=fsync

    Передаём полученный ${FILENAME} заказчику или производству, с инструкцией, как пользоваться.

Заключение

Подготовить образ диска можно двумя способами:

  • сделав образ с реального физического носителя при помощи программы dd;

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

Почему первый способ не всегда подходит? Если вы разрабатываете одну систему, пользуетесь одной sd-картой, то этот способ кажется вполне приемлемым. Но, как только, вы попробуете установить образ с этой единственной sd-карты на другую, похожую, например другого размера, вас ждет разочарование в таком подходе. У меня в работе, как правило несколько встраиваемых систем, и держать по несколько разных sd-карт для каждой - просто незволительная роскошь. Виртуальный же образ всегда легко модифицируем и распространяем. Но есть недостаток - это его фиксированный размер, он в таком же виде попадет на sd-карту, ограничив размер используемого места, но для случая когда это необходимо для разворачивания системы это не имеет значения.

UPD: Руководство исправлено в соответствии с замечаниями комментаторов. Спасибо.

Tags:
Hubs:
Total votes 9: ↑7 and ↓2 +5
Views 10K
Comments 22
Comments Comments 22