FreeBSD на Raspberry Pi 3

Пришла от китайских друзей южная версия малинки. Южная в смысле с тремя радиаторами и вентилятором, так как хоть данное устройство и не имеет обыкновения греться, такое обыкновение имеет климат. И кстати на второй день замечено, что по ночам эта штука не то чтобы громко, но заметно шумит вентилятором, скорость которого по уму надо научиться регулировать.

Первым делом выяснилось, что в комплекте нет microsd карты, пришлось заказывать в местном магазине SanDisk Ultra MicroSDHC, 32GB, UHS-I, Class 10 почти за 1200 рублей, а пока для экспериментов пришлось взять карту 4го класса на 8Гб из телефона.

С http://www.raspbsd.org/ скачиваем дистрибутив, пишем на карту и загружаемся с почти готовой FreeBSD.

Убив почти неделю на эксперименты, понял что было ошибкой заморачиваться со боркой RaspBSD годичной давности, и в итоге записал образ с репозитария ftp://ftp.freebsd.org/pub/FreeBSD/snapshots/arm64/aarch64/ISO-IMAGES/12.0 самую свежую от 24 августа 2018го.

Пришлось к малинке цеплять клавиатуру и монитор, чтобы в /etc/ssh/sshd_config поставить разрешение логиниться рутом.

Размер диска — не актуально для образа официального

Первая проблемка — файловая система, которая по понятным причинам заняла на флэшке меньше 2Гб…

# gpart show mmcsd0
=> 63 15564737 mmcsd0 MBR (7.4G)
63 102375 1 !12 [active] (50M)
102438 986 — free — (493K)
103424 3704832 2 freebsd (1.8G)
3808256 11756544 — free — (5.6G)

Это было вылечено # gpart resize -i 2 -a 4k mmcsd0

growfs /dev/mmcsd0s2 упорно сообщал «operation not permitted» но после service growfs onestart сдался, что странно, он был etc.conf разрешен на запуск… В общем после ребута получил в распоряжение дополнительных 5Gb.

Работа с пакетами

https://wiki.freebsd.org/arm64/rpi3 пишет, что репозитарий для ARM нужен от 11ой версии, но после перевода вылезла ошибка

ld-elf.so.1: Shared object «libarchive.so.6» not found, required by «pkg»

Которая легко лечится симлинком ln -s /usr/lib/libarchive.so /usr/lib/libarchive.so.6 что не слишком правильно но вполне себе работоспособно.

 

 

WiFi для малинки

WiFi реализованный через SDIO FreeBSD пока не видит, хотя работа над этим ведется и в ближайшие пол года поддержка надо полагать появится. Как вариант, если очень хочется WiFi — можно за 10 евро прикупить DLink-овский USB WiFi адаптер, больше похожий на заглушку, чем на устройство, и спокойно работать через него. А можно оставить жить малинку возле роутера на ethernet и не париться.

Системное время

Как выяснилось, у малинки нет аппаратных часов, так что пришлось прикручивать NTP. TimeZone прикручивать не стал, так как куда проще работать в UTC, ограничившись записью в rc.conf:

ntpdate_enable="YES"
ntpdate_flags="-b 0.europe.pool.ntp.org 1.europe.pool.ntp.org 2.europe.pool.ntp.org -f /var/db/ntp/ntp.drift"

Кстати есть и региональные сервера типа 0.bg.pool.ntp.org для Болгарии, но как показала практика удаленность по прыжкам у них одинаковая, а пинг регионального сервера на 30-40% больше чем у общеевропейского, хотя в других странах возможно ситуация будет другая.

Теперь после перезагрузки малинка стала корректно показывать время, обновляя при перезапуске, хотя надо проверить что будет после падения питания в доме, так как боюсь что интернет поднимется после перезагрузки малинки, ну да посмотрим еще.

Nginx

Разумеется в качестве веб-сервера будет nginx, я вообще удивляюсь что еще кто-то до сих пор пользуется apache, при этом из nginx выкидывается всё лишнее типа geoip, так как в варианте мозжечка для дома он точно не нужен. Так же лесом идет gzip, потому как уж чего-чего, а по трафику в локальной сети ограничений нет, а потому лишний раз нагружать и без того не слишком мощный процессор и не самую шуструю память не нужно.

С Nginx случились грабли, на вычисление которых ушло больше часа. При перезагрузке nginx не запускался, первая мысль — не поднят интерфейс сетевой… пошел искать логи, а их нет… Оказывается сборка raspbsd /var/log создает как mfs (memory file system), соответственно после перезагрузки, созданная при установке /var/log/nginx/ директория исчезает и nginx ругается, что не может не найти, не создать файл /var/log/nginx/error.log.

После некоторых раздумий было решено, что нечего логам делать в памяти, которой там всего 1Гб и не такая она быстрая, оставив временные файлы в оперативке, хотя и это возможно лишнее, время покажет.

PHP

Тут всё проще, единственное что пришлось мучительно выбирать между 5.6 и 7.2, под старый пых больше есть разработок и наработок, но он в любой момент может прекратить развитие, а 7.2 обещает лучшую работу с памятью, медленно но верно уходя в сторону С, плюс гарантированно будет развиваться, ну и конечно же всё это дело запускается в режиме php-fpm в связке с nginx, настройки обоих надо будет потюнить слегка под конкретную задачу. Extensions поставлены по минималке, так как что нужно легко доставить в любой момент.

MySQL

Точнее не сам мискуль, выкупленный ораклом, а совместимая MariaDB. В варианте мозгов для дома роль базы данных скорее всего сведется к хранению статистики, так что как таковой нагрузки не будет. 103 машка не пошла, требуя обновления портов которые и так обновлены, но 102ая нормально встала.

Memcached

Кроме классического кэширования запросов к базе, есть идея через memcached передавать показания датчиков. Ардуино успешно может через сокеты записывать ту же температуру в memcached малинки, а забирать эти показания будет либо PHP при генерации запрошенной страницы, либо тот же perl по крону отправляя периодически данные в MySQL для статистики. Таким образом получаем схему при которой всегда доступны данные в реальном времени, при этом без какой либо нагрузки.

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

MQTT — Mosquitto

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

r462668

/usr/ports/ports-mgmt/portdowngrade/mosquitto/

https://wiki.freebsd.org/arm64/rpi3

https://raspberrypi.stackexchange.com/questions/68354/freebsd-shared-object-libarchive-so-6-not-found-required-by-pkg

# pkg check -Bda
Checking all packages: 100%
mosquitto is missing a required shared library: libuuid.so.1

portupgrade -arRf

** Listing the failed packages (-:ignored / *:skipped / !:failed)
! misc/e2fsprogs-libuuid (e2fsprogs-libuuid-1.44.4) (uninstall error)
! databases/db5 (db5-5.3.28_7) (uninstall error)
! lang/cython (py27-cython-0.28.2) (unknown build error)
* devel/apr1 (apr-1.6.3.1.6.1_1)
! lang/ruby24 (ruby-2.4.4_2,1) (unknown build error)
* databases/ruby-bdb (ruby24-bdb-0.6.6_5)
* ports-mgmt/portupgrade (portupgrade-2.4.16,2)
! devel/binutils (binutils-2.30_5,1) (unknown build error)
! devel/php72-tokenizer (php72-tokenizer-7.2.9) (uninstall error)
* www/serf (serf-1.3.9_3)
* devel/subversion (subversion-1.10.2_1)
* ports-mgmt/portdowngrade (portdowngrade-1.7)
* net/mosquitto (mosquitto-1.4.14_2)
* lang/php72-extensions (php72-extensions-1.0)

 

cd /usr/ports/misc/e2fsprogs-libuuid/