Ma conf NanoBSD

Je suis l’heureux possesseur d’une alix 2D3, un temps elle a tournée sous OpenBSD mais quand est venue la carte wifi non supportée j’ai du changer d’OS pour FreeBSD et les drivers madwifi. Un jour j’en ai eu marre de me battre avec mount -uw / et les devices md(4) et j’y ais mis une pfsense, au début l’interface web c’est convi, mais vite on se sent limité, et ne pas éditer mon pf.cont(5) avec vim me rendait malade.

Puis j’apprends qu’il existe un script dans les sources FreeBSD qui permet de faire une FreeBSD pour l’embarqué (ie, petite taille, lecture seule + ram disk). C’est marqué dans le titre, il s’agit de nanobsd(8).

C’est très bien foutu et on est assez émerveillé quand on connait pas les techniques de l’embarqué comme moi.

En gros vous faites un fichier de config en shell, /usr/src/tools/tools/nanobsd/nanobsd.sh se charge de vous compiler le world et le kernel et mettre tout ça dans une image disque.

Il y a beaucoup de paramètres customisables, une simple lecture du script vous les donnera tous. Nanobsd génère 2 images, une image disque complete (.disk.full) et une image avec seulement une partition (.disk.image). L’image complète comporte 3 partitions, les deux premières sont identiques en tailles et contiennent les mêmes données que _.disk.image, lors de la première installation vous utilisez _.disk.full, et pour mettre à jour vous utilisez _.disk.image à écrire sur la partition que vous n’utilisez pas actuellement (comme ça pas besoin de sortir la carte flash pour mettre à jour).

Nanobsd monte une des deux partitions sur / (en read-only), et deux ram disk pour /etc et /var (/tmp est linké avec /var/tmp, /usr/local/etc sur /etc/local). Pour rendre les changements sur /etc persistants, on utilise la troisième partition qui se monte sur /cfg, tout les fichiers de /cfg sont écrits sur /etc au boot.

Il y a un script simple pour comparer /etc et /cfg pour sauvegarder les changements.

% mount /cfg
% touch /cfg/rc.conf # si le fichier n'existe pas dans /cfg il n'est pas copié
% umount /cfg
% sh /root/save_cfg
/etc/rc.conf --> /cfg/rc.conf
%

Voyez le tgz avec ma config, vous y trouverez la config kernel, la config nanobsd, et les fichiers que j’ai mis dans /usr/src/tools/tools/nanobsd/Files/

Avec en particulier dnsmasq.conf qui bloque au niveau dns les publicités (avec une liste updatée tous les jours).

Mon alix sert donc de routeur, serveur dns/dhcp/impression. Sendmail relaye vers mon serveur interne, et syslog envoie tout à mon serveur.

% cd /usr/src/tools/tools/nanobsd/
% cp ~/solo/alix.cfg .
% cp -r ~/solo/Files/* Files/
% cp ~/solo/SOLO /usr/src/sys/i386/conf/
% sh nanobsd.sh -c alix.cfg
% wait
% qemu -hda /usr/obj/nanobsd.solo/_.disk.full -m 512 -no-acpi -nographic -cpu pentium
# Hmm quelque chose ne va pas, mais j'ai pas envie de rebuild world et/ou kernel
% sh nanobsd.sh -h

Mon script utilise des packages préconstruits, si vous voulez les compiler vous même il y a une fonction pour ça dans nanobsd.sh

Pour finir (ou commencer), voici la doc nanobsd

Voilà, ma config est certainement loin d’être parfaite niveau taille système mais ma carte flash fait 4G (donc 2G utilisable pour le système) et c’est largement suffisant pour faire tourner une FreeBSD “pas trop dépouillée”.

Pour mettre à jours (j’ai gzip mon image avant) en supposant que le système tourne sur la partition 1:

% ssh phil@aldo cat /usr/obj/nanobsd.solo/_.disk.image.gz | zcat | sh updatep2
% reboot

J’ai modifié updatep{1|2} en ajoutant gpart set -a active -i PARTITION_INDEX ad0 en raison d’un problème que vous aurez peut être (la nouvelle partition est pas marquée active…)

Si le sujet vous intéresse, il y a un projet linux embarqué sympa qui s’appelle buildroot où là on peut carrément construire sa chaîne de compilation croisée (arm, mips etc), et construire un système embarqué très personalisé. Dommage qu’il n’existe pas un tel projet basé sur le kernel BSD (un jour peut être…)