Skip to content

Обновление FreeBSD на Raspberry Pi 2

В сети есть много руководств по созданию образа MicroSD с FreeBSD для Raspberry Pi 2. Это очень полезный опыт в плане разворачивания этой ОС из исходников, со своим ядром (Да! Там и для ARM есть что менять!). Но, для меня уже ясны пара моментов: во-первых, обновление ОС через чистый образ диска - не самая лучшая затея в плане сохранения предыдущих наработок на RPI2. Если у Вас не релизная ветка, то этот вопрос вас волнует. Во-вторых, не очевидно, но техника, используемая для создания образа диска, с небольшой коррекцией прекрасно подходит и для обновления ОС, как мы это обычно делаем на "взрослых" платформах.
Давайте определимся с некоторыми необходимыми пунктами:
  • Подразумеваем, что у Вас уже есть установленная FreeBSD на Raspberry PI 2, например, с помощью готового образа с оффициального сайта FreeBSD.org
  • Сборка мира и ядра производится кросс-компиляцией на той самой "взрослой" платформе (Она же "хост");
  • Для сборки мы будем использовать дерево исходников /usr/src на хосте. Оно же у Вас есть, правда?
  • Обновление производится на хосте на смонтированный диск RPI2 (MicroSD). Я для себя отвел папку /mnt/rpi2;
  • Для процесса инсталляции на MicroSD требуется установить порт sysutils/u-boot-rpi2;
  • Исходя из вышеупомянутых учебников по сборке образа, у нас на MicroSD два раздела: / (/dev/da0s2a) ufs2 и /boot/msdos (/dev/da0s1) msdosfs. При условии, что флешка единственная, предполагаем, что она монтируется как /dev/da0.
Приступим.

Для удобной работы с кросс-компиляцией создадим папку для проекта. У меня она лежит тут: /home/<username>/src/rpi2. Сможете придумать лучшее место? Я не смог. Здесь будут лежать скрипты для /bin/sh, которые избавят нас от необходимости постоянно вводить набор дополнительных флагов, необходимых при кросс-компиляции.
Вот эти скрипты:
  • 1_build_all.sh. Второй строчкой я делаю ссылку на /usr/src в текущую директорию и впоследствии пользуюсь ей. Также, хочу заострить внимание на переменную KERNCONF, которая содержит имя файла с ядром "по умолчанию" для платформы. В нашем случае это RPI2, и лежит он в папке /usr/src/sys/arm/conf. Очень вероятно, что впоследствии Вы сделаете свой файл на основе этого и будете его модифицировать для своих нужд, тогда и значение переменной надо будет подправить.
    CODE:
    #!/bin/sh _BUILD_ENV="TARGET_ARCH=armv6 MALLOC_PRODUCTION=YES" ln -sf /usr/src cd src make ${_BUILD_ENV} UBLDR_LOADADDR=0x2000000 -s buildworld make ${_BUILD_ENV} KERNCONF=RPI2 -s buildkernel cd ..
  • 2_mount_da.sh. Здесь мы задаем устройство и путь для монтирования MicroSD. Опции для монтирования были выбраны такими, чтобы во время последующей установки на флешку делалось как можно меньше операций записи. Не полезны они для флешек.
    CODE:
    #!/bin/sh DEV=/dev/da0 ROOT_RPI2=/mnt/rpi2 _MOUNT_FLAGS="-o noatime,async" /sbin/mount ${_MOUNT_FLAGS} ${DEV}s2a $ROOT_RPI2 /sbin/mount ${_MOUNT_FLAGS} -t msdosfs ${DEV}s1 $ROOT_RPI2/boot/msdos
  • 3_install_all.sh. В этом скрипте производится установка мира и ядра, собранных при запуске первого скрипта, и еще пара вызовов утилиты mergemaster. Расположены они в порядке необходимости запуска, а закоментированы исключительно по той причине, что требуют изрядных времени и внимания для выполнения. Я раскоментирую их, когда буду в действительности готов уделить их выполнению должное внимание.
    CODE:
    #!/bin/sh DST=/mnt/rpi2 _RPI2_ENV="TARGET_ARCH=armv6 MALLOC_PRODUCTION=YES DESTDIR=${DST}" cd src ### Before installation #mergemaster -p -A armv6 -D ${DST} ### The instalation make ${_RPI2_ENV} KERNCONF=RPI2_MOUSE installkernel make ${_RPI2_ENV} installworld ### After installation #mergemaster -A armv6 -D ${DST} cd ..
  • 4_detach_da.sh. Отмонтируем и отцепляем MicroSD, чтобы вернуть диск в Raspberry PI 2 и попытаться "со всем этим взлететь".
    CODE:
    #!/bin/sh ROOT_RPI2=/mnt/rpi2 sync umount ${ROOT_RPI2}/boot/msdos umount ${ROOT_RPI2}
Итак, по окончанию подготовительных работ мы имеем в папке четыре скрипта, которым необходимо дать права на выполнение, например, командой: chmod +x <имя_скрипта.sh>, и софт-ссылку ./src на /usr/src.
У меня этот набор работает как часы. С десяток успешных обновлений, после того, как отказался от идеи устанавливать каждый раз новый образ с офф. сайта, а потом восстанавливать пакеты и конфигурацию заново. Теперь же - новое вдохновение и новые ожидания от этой маленькой коробочки.

Удачи и Вам!

Обратные ссылки

Нет обратных ссылок

Комментарии

Показывать комментарии Как список | Древовидной структурой

Нет комментариев.

Добавить комментарий

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.
E-Mail addresses will not be displayed and will only be used for E-Mail notifications.
To leave a comment you must approve it via e-mail, which will be sent to your address after submission.
Опции формы

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