Wrap unter OpenBSD

Betrifft OS:
OpenBSD

Die Wireless Router Application Platform (WRAP) von PC Engines eignet sich hervorragend um einen (Wireless) Router mit Hilfe von OpenBSD zu installieren.

Einleitung

Unter OpenBSD on Soekris wird eine Installation über das Netzwerk detailiert erklärt. Leider verweigert das WRAP auf Grund eines Bugs im BIOS das Booten mittels PXE. Es gibt diverse Berichte, dass das Problem mit der BIOS Version 1.11 gelöst sein soll. Leider ist dies nicht der Fall. Wer ausschliesslich den Wrap als Router vorliegen hat und auf die Installation per FTP angewiesen ist, wird per PXE nicht weit kommen.

Die Wrap Plattform wurde vor einigen Monaten durch Alix abgelöst. Das PXE Problem liegt bei Alix nicht mehr vor.

Um dieses Problem zu umgehen, gibt es folgende Alternativen:

  • Installation mittels PC-Emulator

OpenBSD lässt sich auf einem anderen PC unter *BSD mittels Qemu direkt auf die CompactFlash-Karte oder den Micro Drive (weiterhin wird nur noch von CF-Karte gesprochen) installieren. Neben Qemu benötigt die hier vorgestellte Methode einen Internet-Zugang und einen Cardreader, welcher sich unter *BSD ansprechen lässt.

Qemu findet sich unter FreeBSD und OpenBSD in den Ports oder als Package.

Anstelle von Qemu lässt sich jeder PC-Emulator verwenden, welcher in der Lage ist, eine x86-CPU zu simulieren und Gerätedateien als Festplatten-Images unterstützt.

  • Installation mittels serieller Schnittstelle

Das OpenBSD Boot Floppie Image wird über einen Kartenleser o.Ä. an einem PC auf die CF-Karte oder den Microdrive kopiert. Die Installation selbst erfolgt dann mit Hilfe der Seriellen Schnittstelle und einer Netzwerkverbindung direkt am Wrap.

  • Installation mittels CF zu IDE-Adapter

Die CF Karte wird über einen PCMCIA oder CF zu IDE-Adapter als „normale“ Festplatte in einem PC/Notebook erkannt. Die Installationsroutine wird dann ganz gewöhnlich durchgeführt.

  • Installation mittels eines Installationsscripts

Ein für den Wrap vorgefertigtes, stark abgespecktes OpenBSD wird durch ein Script auf einer schon vorhandenen OpenBSD Installation auf einem PC erstellt und anschliessend auf den Datenträger des Wrap kopiert.

Bei allen hier vorgestellten Methoden der Installation muss die Kapazität des Datenträgers berücksichtigt werden! Eine abgespeckte Version von OpenBSD passt auf eine 128MB Compact Flash Karte. Eine Standardinstallation wie sie für Router vorgesehen ist (ohne X, Compiler, Manpages und Games) passt auf eine 512MB Karte.

Allgemeine Installationshinweise

Generell muss man bei einem so kleinen Speicher wie einer CF Karte nicht anfangen die Slices von Hand anzulegen. Es reicht wenn man die Frage

Do you want to use *all* of wd0 for OpenBSD? [no]
mit Yes beantwortet und danach nur ein Label für / darin anlegt. Swap kann im Falle eines Routers ebenso ignoriert werden. Beim Labeln werden zuerst alle Partitionen gelöscht (c kann nicht gelöscht werden) und dann eine Einzige angelegt:
> d *
> a a
offset: [*] 
size: [*] 
Rounding to nearest cylinder: *
FS type: [4.2BSD] Enter
mount point: [none] /
* = kann variieren

Auf einem Router sollte man nur die folgenden Sets installieren:

[X] bsd
[ ] bsd.rd
[ ] bsd.mp
[X] base41.tgz
[X] etc41.tgz
[X] misc41.tgz
[ ] comp41.tgz
[X] man41.tgz
[ ] game41.tgz
[ ] xbase41.tgz
[ ] xetc41.tgz
[ ] xshare41.tgz
[ ] xfont41.tgz
[ ] xserv41.tgz
Der Ramdisk-Kernel wird nicht benötigt, Compiler haben auf einem Router nichts zu suchen und X sowie die Games werden nicht benötigt. Über das Vorhandensein von Manpages lässt sich streiten :)

Der sshd wird beim Bootvorgang gestartet

Start sshd(8) by default? [yes]
Da der Wrap keine interne Uhr besitzt (blöde Formulierung) wird die Uhrzeit per ntpd geholt:
Start ntpd(8) by default? [no] y
X wird nicht benötigt
Do you expect to run the X Window System? [no] 
Die Console soll auf com0 gelegt werden. Das Wrap Bios bietet als höchste Baud Rate 57600, die von Hand im Bios eingestellt werden muss.
Change the default console to com0? [no] y
Available speeds are: 9600 19200 38400 57600 115200.
Which one should com0 use? (or 'done') [9600] 57600

Wird die Installation nicht direkt auf dem Wrap durchgeführt, so sollten die wärend der Installation angezeigten CHS Werte der Karte mit denen übereinstimmen, die das Wrap-Bios anzeigt. Wenn nicht, so muss man diese anpassen. Bios Ausgabe:

Phys C/H/S 7936/16/63 Log C/H/S 992/128/63
Es müssen die logischen CHS Werte genommen werden.

Installation mittels PC-Emulator

Vorbereitung

Zuerst wird das ISO-Image für die Boot-CD von OpenBSD heruntergeladen. Für OpenBSD 4.1 findet sich dieses Image z. B. unter ftp.openbsd.org.

Die Device-Datei für die CF-Card unter /dev muss bekannt sein. Hier ist es /dev/da3 (FreeBSD).

Um Qemu mit den unten aufgeführten Parametern starten zu können müssen vorgängig als root unter FreeBSD noch folgende Befehle abgesetzt werden:

# kldload if_tap
# kldload bridge
# sysctl net.link.ether.bridge.enable=1
# sysctl net.link.ether.bridge.config=sis0,tap0
# sysctl net.link.tap.user_open=1

Installation

Qemu lässt sich mit folgendem Befehl in einem X-Terminal starten:

[user@host ~]$ qemu -hda /dev/da3 -boot d -cdrom ~/cd40.iso -m 128 -net nic -net tap &

Die einzelnen Schalter haben folgende Bedeutung:

-hda /dev/sd3Verwende /dev/sd3 als 1. IDE-Festplatte
-boot dBoote von CD-ROM
-cdrom ~/cd40.isoVerwende ~/cd40.iso als CD-ROM
-m 128Stelle in der Emulation 128 MB RAM zur Verfügung (analog WRAP)
-net nicStelle einen Ethernet-Anschluss zur Verfügung
-net tapStelle über ein tap|4|FreeBSD-Interface eine Verbindung zum realen LAN her

Die Boot-CD von OpenBSD startet und das System kann ganz normal auf die CF-Karte installiert werden.

Installation mittels serieller Schnittstelle

Vorbereitung

Das Boot-Floppyimage wird von ftp.openbsd.org heruntergeladen und mit dd auf die CF-Karte kopiert.

# dd if=floppy41.fs of=/dev/da0
Pfad und korrekte Deviceangabe ggf. anpassen Damit die Konsole auf die serielle Schnittstelle umgeleitet wird muss auf der CF-Karte zusätzlich die Datei /etc/boot.conf auf der CF-Karte angepasst werden. Folgende Einträge sind notwendig:

set tty com0
stty com0 *Baudrate*

Installation

Um mit der Seriellen Schnittstelle überhaupt etwas zu sehen, wird ein Terminalemulator gestartet. Unter *BSD wird hierzu <tt>cu, tip</tt> oder <tt>minicom</tt> verwendet. Unter Windows kann man das Hyperterminal verwenden.

# cu -l /dev/ttyd0 -s 9600
ggf. Devicenamen und Baudrate anpassen

Installation mittels PCMCIA / CF IDE Adapter

Vorbereitung

Boot-CD oder Boot-Floppy einlegen und Booten.

Installation

Da die CF-Karte durch die Adapter wie eine gewöhnliche Festplatte erkannt werden sollte, ist die Installation nicht weiter schwierig.

Installation mittels eines Installationsscripts

Achtung: Viele Scripte sind auf Soekris Boxen ausgerichtet, meist existiert jedoch ein angepasster Kernel inkl. Hinweise für Wraps.

Installationsscripte, die OpenBSD auf ein minimales System schrumpfen, gibt es mittlerweile in verschiedenen Ausführungen. Das bekannteste stellt Flashdist da, auf dem auch Bowlfish basiert.

Hinter Flashboot verbirgt sich eine Infrastruktur aus Scripten und Tools, mit denen sich ein auf Embedded Systeme zugeschnittenes OpenBSD erstellen lässt. Es basiert auf den Scripten, die zur Erstellung der OpenBSD Installationsmedien genutzt werden. Fertige Binaries (auf Stand von OpenBSD 4.2) mit diversen, auf spezielle Plattformen zugeschnittenen Kerneln, können von Rickard Dahlstrand bezogen werden.

Zusätzlich gibt es die Möglichkeit den OpenBSD Installer Yaifo mit RC Scripten, ähnlich Flashdist, zu nutzen. Das Howto ist auf undeadly.org nachzulesen. Ein Howto ist zusätzlich auf Onlamp verfügbar.

Die Hinweise der Installation mittels diverser Scripte ist den entsprechenden Webseiten zu entnehmen.

Nach der Installation

Nachdem die Installationsroutine beendet ist (ausgenommen die Installation mittels Script), chrooten wir das installierte System, um die fehlenden Anpassungen durchzuführen. Das System kann natürlich auch im Wrap angepasst werden, aber warum umständlich wenn wir es direkt vor uns liegen haben.

# /mnt/usr/sbin/chroot /mnt

Zuerst wird geprüft, ob die Angaben in /etc/fstab stimmen. Wurde das System nicht direkt auf dem Wrap installiert ist es möglich, dass nicht wd0 zur installation ausgewählt wurde.

# cat /etc/fstab
/dev/wd0a / ffs rw 1 1

Danach wird geprüft, ob die Datei /etc/boot.conf folgende Angaben enthält.

# cat /etc/boot.conf
stty com0 57600
set tty com0
Meistens wird durch die Installation nur com ohne 0 angegeben, was ärgerlich ist, wenn man wärend des ersten Bootvorgangs auf dem Wrap erstmal die Console konfigurieren muss, obwohl diese eigentlich bei der Installation vorbereitet wurde.

Will man generell nicht per serieller Schnittstelle auf den Wrap zugreifen, sollte man die NIC, über die man auf den Wrap per SSH zugreift, konfigurieren (hostname.if|5|OpenBSD).

# echo "inet 192.168.0.1 255.255.255.0 NONE" > /etc/hostname.sis1

Danach wird das System mit

#{{man|halt|8|OpenBSD}}
gestoppt.

Besonderheit Qemu: Nach Abschluss der Installation von OpenBSD wird mittels <tt>Ctrl-Alt-2</tt> in den Kommando-Modus von Qemu gewechselt. Anschliessend muss Qemu mit dem Befehl <tt>quit</tt> beendet werden. Bevor jedoch die CF-Card ins WRAP eingesetzt werden kann, muss das soeben installierte System nochmals mittels Qemu gebootet werden. Für einen fehlerfreien Betrieb von Qemu müssen noch Anpassungen an der Konfiguration von OpenBSD vorgenommen werden. Speziell sei hier nochmals empfohlen, die Netzwerk-Karten des WRAP zu konfigurieren.

Folgender Befehl startet das frisch installierte System:

[user@host ~]$ qemu -hda /dev/da5 -m 128 -net nic -net tap &

Wenn bei der Installation alles geklappt hat bootet OpenBSD nun bis zum Login durch. Nach der erfolgreichen Anmeldung als root empfiehlt sich die Lektüre von afterboot|8|OpenBSD

Nun ist die CF-Card bereit für ihren Einsatz im WRAP.

Um die Lebensdauer einer CF Karte zu verlängern, sollte man sich die Artikel von Jonathan Weiss näherbringen, um OpenBSD im Read Only Modus zu betreiben.

zusätzliche "Spielereien"

Die LEDs ansteuern

gpioctl

Die LEDs können über gpioctl|8|OpenBSD angesteuert werden. Die drei LEDs liegen auf den Pins 2, 3 und 18 (lnr). Folgendes Beispiel zeigt wie man den Status eines Pins auslesen kann:

# gpioctl 2        # Erste LED
pin 2: state 1     # "1" bedeutet die LED ist aus; "0" die LED leuchtet.
Um die LEDs zu setzen bzw. zurückzusetzten, muss man sie zu erst mal konfigurieren, dies geschiet mit dem schalter <tt>-c</tt>:
# gpioctl -c 2 pp out  # Aktiviert Port 2 als "push-pull output"
Dies muss für jede LED geschehen (noch für 3 und 18 wiederholen). Nun kann die LED ein/aus-geschaltet werden:
# gpioctl 2 0  # LED an
# gpioctl 2 1  # LED aus
Dies funktioniert analog für die Pins 3 und 18.

Damit die Pins für die LEDs automatisch eingetellt werden, lässt man dies am besten gleich beim booten erledigen. Dazu fügt man dieses kleine Code-Fragment in <tt>/etc/rc.local</tt> ein:

for i in 2 3 18; do
          gpioctl -c $i out pp 2>&1 1>/dev/null;
          gpioctl $i 1 2>&1 1>/dev/null;
done

gpioflicker

Man kann mit gpioflicker auf einer LED anzeigen lassen, ob Pakete von pf auf pflog0 gelogt werden. :On the Net4501, this small giveaway lets the Error LED flash whenever pf logs something to pflog0.

Man muss aber darauf achten, dass über den Schalter -p ein GPIO Port mitgegeben wird, denn die Voreinstellung ist Port 9, jedoch befinden sich die LEDs beim WRAP auf Port 2, 3 oder 18.

Den Status des Tasters auslesen

Der Taster ist über den Pin 40 auslesbar:

# gpioctl 40
pin 40: state 1   # Taster "normal"
# gpioctl 40
pin 40: state 0   # Taster gedrückt

Temperatur überwachen

Der auf der Platform montierte LM77 thermal monitor lmtemp|4|OpenBSD kann mit sysctl|8|OpenBSD sehr einfach ausgelesen werden:

$ sysctl hw.sensors.0
hw.sensors.0=lmtemp0, TEMP, temp, 36.50 degC / 97.70 degF
Man könnte so zum Beispiel die Temperatur mit Hilfe von sensorsd|8|OpenBSD überwachen lassen.

Der I²C Bus

Der I²C Bus kann recht einfach genutzt werden, um zum Beispiel weitere Temperatur-Sensoren, Taster oder auch ein kleines Display anzuschließen.

Read-only mounten von /

Bei der Nutzung von CF-Karten als Medium für das Betriebssystem kann es durchaus vorteilhaft sein, die root-Partition read-only zu mounten. Viele Infos sind im Internet dazu zu finden, wirklich kurz, knapp und gut ist aber Punkt 2.2 unter diesem Link: OpenBSD 3.7 on WRAP

Das Low Pin Count Interface (LPC)

Siehe auch