FreeBSD Raspberry Pi, csomagok

Egyrészt bejelentés, másrészt némi leírás.

Vettem kb. két hete egy Raspberry Pi-t, kb. egy féléves "mérlegelés" után.

A fő cél, hogy az RPI legyen egy szkenner szerver, sőt, ha már lúd, akkor legyen nyomtató-szerver is, így a régi TPLink-nyomtatószerver tartalék lehetne, és nem zabálna ő is 2-3-4 wattot (csökkentsük a rezsit :) ).

Több, mint egy éve FreeBSD-t használok (Linux után), így adódott az az akarat, hogy az RPI-n is legyen FreeBSD, ha már egész megismertem és megbarátkoztam vele. Persze egy bökkenő van: nincsenek előregyártott csomagok RPI-re, csak az alaprendszer. Ezért némi(?) olvasás után a bérelt VPS-emen (amin nyilván FreeBSD van) a számomra szükséges portokból igyekeztem csomagokat gyártani.

FreeBSD 10.0 telepítése RPI-re

Ne keverjük a rendszereket, ezért ha a laptopomon és a VPS-en is 10.0-s verzió van, legyen az RPI-n is. Innen egy bz2-vel tömörített állomány letölthető, amelyet a szokásos módon dd-vel az RPI kártyájára írhatunk.
Az RPI boot-ja után root-ként üres jelszóval léphetünk be, pw-vel új felhasználót adhatunk a rendszerhez (egy kijelző és egy USB-s billentyűzet nem árt). Érdemes a wheel csoporthoz is hozzáadni az új felhasználót, hogy su-val root-tá válhasson. Persze a root jelszavát is érdemes beállítani (nyilván a passwd programmal).
Ezután SSH-val a létrehozott felhasználóval beléphetünk (mert ugye alapértelmezetten a root nem lép be ssh-val, ezért kellett először létrehozni egy felhasználót), illetve root-tá válva beállításokat végezhetünk. Innen kezdve az RPI-re kötött billentyűzetre és a kijelzőre nincs szükség.
Érdemes a /etc/rc.conf-ban a background_fsck-t tiltani, ui. (szabálytalan?) leállás után, ha a fájlrendszer nem tiszta, nem ellenőriz rögtön ("background"), ez nálam kernel pánikot okozott (ilyenkor memóriakártya kivesz, "rendes" gépbe bedug, majd ott fsck, és újra menni fog kernel pánik nélkül). Persze ezzel egyidőben a fsck_y_enable-t yes-re állítani.

Csomagkészítő környezet

A csomagkészítő környezetet a VPS-emen hoztam létre, izzadjon, dolgozzon, ha már fizettem érte. Nyilván saját gépen is létrehozható, nem szükséges VPS-nek lenni.
Tehát a host gépre szintén letöltjük a fenti img.bz2 fájlt, kitömörítjük, mdconfig-gal egy eszközt hozunk létre (mdconfig -f freebsd-arm.img), amit egy könyvtárba felcsatolunk, majd ezt az alaprendszert egy könyvtárba átmásoljuk (ahova majd chroot-tal beléphetünk), legyen ez ${chroot-dir}
Telepítjük a qemu-user-static emulátort, majd a /usr/local/bin/qemu-static-arm fájlt bemásoljuk a ${chroot-dir}/usr/bin könyvtárába, hogy a chroot is lássa majd. A dev-rendszert is felcsatoljuk: mount -t devfs devfs ${chroot-dir}/dev.
Még a host-rendszerből töltsük le és csomagoljuk ki a port-fát: portsnap -p ${chroot-dir}/usr/ports fetch extract (így még a "rendes" rendszer dolgozik, nem az emulált, ami nyilván lassabb lesz).
Érdemes megadni a ${chroot-dir}/etc/make.conf-ban, hogy melyik könyvtárban végezze a fordítást (WRKDIRPREFIX), illetve az elkészült csomagok hova kerüljenek (PACKAGES - alapértelmezetten /usr/ports/packages - nekünk kell létrehozni a könyvtárat!).
Tapasztalatom szerint érdemes még a ${chroot-dir}/etc/resolv.conf-ban megadni egy nameserver-t, hogy legyen net a chroot-on belül is.

Ezzel elvileg kész a környezet, chroot ${chroot-dir} qemu-arm-static sh paranccsal belépünk a környezetbe (nyilván az sh helyett lehet csh is). Első lépésként a pkg csomagot kell telepíteni (a gyári pkg régi, mivel a snapshot se új, és azóta pár dolog változott), a szokásos cd /usr/ports/ports-mgmt/pkg && make install clean paranccsal. Ha a make target-ei közé a package-ot is berakjuk, csomag is készülni fog. Ha a ports-mgmt/portmaster portot telepítjük, a portmaster -g port-category/port paranccsal készít csomagot a telepítés mellett (portupgrade-t nem ismerem, de nyilván ő is rábírható).

Innen kezdődően már csak idő, kedv, meg valami ilyesmik kérdése, hogy elkészüljenek a megfelelő csomagok.

Csomagok használata

Egy "elérhető" helyre másoljuk a csomagokat (All könyvtárba), majd a pkg repo csomagok_könyvtára paranccsal létrehozzuk a csomagtároló katalógusát.
Az RPI-n a /usr/local/etc/pkg/repos/FreeBSD.conf fájlt létrehozzuk (ha a könyvtár nem létezik, mkdir -p /usr/local/etc/pkg/repos), melyben a hivatalos FreeBSD csomagtárolót "kikapcsoljuk": FreeBSD: {enabled: no} tartalommal feltöltjük.
A szokásos módon létrehozunk a /usr/local/etc/pkg/repos fájlt, amelyet a repo adataival töltünk fel.

A lényeg

Az általam legyártott csomagok, illetve a róluk levő információk a http://uzsolt.hu/freebsd/ oldalon elérhetőek. Röviden:
/usr/local/etc/pkg/repos/rpi-uzsolt.conf fájlba:

rpi-uzsolt: {
    url:    "http://uzsolt.hu/freebsd/rpi-packages",
    mirror_type:    NONE,
    signature_type: none,
    enabled:    yes
}

Ha nem friss rendszert használunk (tehát pl. a fenti img.bz2-t), akkor először le kell tölteni a megfelelő pkg-csomagot (jelenlegi állás szerint fetch http://uzsolt.hu/freebsd/rpi-packages/All/pkg-1.3.8_2.txz), majd telepíteni (pkg add pkg-1.3.8_2.txz).
Ezután pkg update letölti a csomaginformációkat, majd a szokásos pkg install foo telepíti (függőségekkel együtt) a foo csomagot.
Az aktuálisan elérhető csomagok listája és fordítási opciói itt elérhetőek.

Megjegyzések

  • Persze lehetséges, hogy az rpi-re magunk készítjük el az img-fájlt, így frissebb rendszert kapunk, és a pkg kézi frissítése helyett, a repó beállítása után rögtön pkg update && pkg install foo.
  • Persze az is lehetséges, hogy magát a fordító-környezetet mi magunk kreáljuk, ehhez a FreeBSD-forrásra szükségünk lesz (általában a /usr/src-ben található), meg persze plusz időre, míg ez is elkészül.
  • Lehetséges a fordítás gyorsítása is, ahol a host fordítóját használjuk (ld. Cross Building Using the Host Cross Compiler szakasz), viszont ez amd64 esetén linkelési gondokat okoz, ahogy meg is tapasztaltam. Elvileg ez a probléma 32bites FreeBSD esetén nem lép fel, tehát ott használható.

Hozzászólások

"az RPI legyen egy szkenner szerver"

Erről majd írsz bővebben? Leginkább az érdekelne, hogy mit használsz, de a technikai megvalósítása is érdekel.

Most reggel, munkába menet előtt játszottam egy kicsit.
A scanimage az RPI-n futtatva generál képet, ezzel nincs gond. Viszont hiába írom az RPI/usr/local/etc/sane.d/saned.conf-ba, hogy 192.168.2.100 (laptop IP-címe), és a LAPTOP/usr/local/etc/sane.d/net-be, hogy 192.168.2.102 (RPI IP-címe), a kérés valahogy nem jut el.
A szkenner egy HP Deskjet F4200, aminek csak a szkenner részét használjuk (a nyomtató részét nem). Próbálom követni az ArchWiki-t követni. A hplip-et is felraktam, próbáltam futtatni mindenhol, de valamit biztos kifelejtek. Majd délután még próbálom.

Szerk.: egy ötlet: a hplip csomagba nem fordítottam SNMP támogatást ("Network/JetDirect support"), lehet, ez a gond. Majd délután kiderül :)

A csomagok listáját? Egy saját szkript :)
Az a rész, ami (szerintem) téged érdekel:

for package in `ls ~/freebsd/rpi-packages/All/*.txz | sort -f`; do
    echo "<tr><td>"
    pkg query -F ${package} "<a href=http://uzsolt.hu/freebsd/rpi-packages/All/%n-%v.txz>%n-%v</a></td><td>"
    if [ `pkg query -F ${package} "%#O"` -gt 0 ]; then
        echo "<ul style='list-style-type:none'>"
        pkg query -F ${package} "<li class='option %Ov'>%Ok - %Ov</li>"
        echo "</ul>"
    fi
    echo "</td></tr>"
done

Magyarázatot lásd man pkg-query.