Обновление 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}
У меня этот набор работает как часы. С десяток успешных обновлений, после того, как отказался от идеи устанавливать каждый раз новый образ с офф. сайта, а потом восстанавливать пакеты и конфигурацию заново. Теперь же - новое вдохновение и новые ожидания от этой маленькой коробочки.
Удачи и Вам!
Комментарии
Показывать комментарии Как список | Древовидной структурой