alix2c2 und alix2c3 sind kleine, leistungsfähige Motherboards mit einem sehr niedrigen Verbrauch. Diese Boards beinhalten praktisch alles, was ein Rechner benötigt - naja, vielleicht fehlt dem einen oder anderen soetwas wie Tastatur- oder Monitor-Anschluss. Aber wer braucht das schon! Weiterhin gibt es preiswert passendes Gehäuse und Netzteil. Dann noch eine CompactFlash-Card und fertig ist der gesamte Rechner. Selbstverständlich kann man auch andere Produkte verwenden - aber für diese habe ich mich entschieden und es hat funktioniert. Beim Hersteller der alix-Boards PC Engines GmbH gibt es auch eine Liste von Bezugsquellen.
Da weit weniger als 1 GB für das System benötigt werden, reicht also bereits eine 1 GB CompactFlash-Card. Vielleicht will man aber manchmal noch mehr speichern.
Das alix2c2 ist x86 kompatibel. Das einzige Ungewöhnliche für normale PC-Benutzer ist die Tatsache, dass es weder Tastatur noch Bildschirm gibt. Die Lösung ist die serielle Konsole. Man verbindet also die serielle Schnittstelle des Boards mit der seriellen Schnittstelle des eigenen Rechners mit einem Nullmodem-Kabel - de.wikipedia.org/Nullmodem-Kabel. Dadurch erdet man gleichzeitig das Gehäuse - dies ist besonders interessant, da durch das Steckernetzteil keine echte Erde vorhanden ist.
Die einfachste und praktischste serielle Konsole bot mir nun screen. Einfach in einer Konsole wie xterm oder Eterm starten:
screen /dev/ttyS0 38400
Die 38400 sind alix2 und alix3 spezifisch, kann aber im tinyBios auch angepasst werden, während /dev/ttyS0 das entsprechende Device am eigenen Rechner ist. Mir ist leider nicht bekannt, wie man diese serielle Konsole wieder beendet. Aber sie stört auch nicht wirklich - dank screen kann sie ja detached und reattached werden.
OpenBSD 4.3 kann bereits mit dem tinyBios v0.98 installiert werden, aber zum booten des installierten Systems ist tinyBios v0.99 notwendig. Daher sollte/kann man auch gleich das Bios-Update machen.
freedos-boot-Image besorgen und anpassen - beispielsweise fdboot.img von www.ibiblio.org mit dem Bios alixb099.zip von www.pcengines.ch. Dieses dann per netboot booten: www.openbsd.org - PXE-Booting
Die alix2c2 und alix2c3 können nur von LAN3/POE booten.
Anscheinend funktioniert hierbei die serielle Konsole nur sehr begrenzt - also man sieht lediglich die Ausgabe vom alix2c2-Board, kann aber nicht kommunizieren. Als Abhilfe kann das Bios-Update vollautomatisch ausgeführt werden. Dazu muss fdauto.bat angepasst werden.
Datei: fdauto.bat |
... sb |
Dadurch wird direkt nach dem booten sb.com ausgeführt.
Erstellen des Image zum Booten unter Linux |
wget http://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/distributions/1.0/fdboot.img wget http://www.pcengines.ch/file/alixb099.zip cp -p fdboot.img fdboot-tinyBIOS-V0.99.img unzip alixb099.zip mkdir t mount -v -o loop fdboot-tinyBIOS-V0.99.img t/ cp -p alix1.bin alix2.bin alixbios.txt sb.com t/ vim t/fdconfig.sys vim t/freedos/fdauto.bat umount -v t rmdir t |
Datei: fdconfig.sys |
SWITCHES=/N DEVICE=a:\driver\HIMEM.EXE SHELL=a:\COMMAND.COM a:\ /E:2048 /F /MSG /P=a:\FREEDOS\FDAUTO.BAT DOS=HIGH FILES=20 BUFFERS=20 |
Datei: fdauto.bat |
@prompt $p$g @path=a:\freedos @mode COM1:38400,n,8,1 @ctty COM1 @sb |
Die Angaben zu mode und ctty in fdauto.bat sind zwar eigentlich OK, aber bei mir wirkungslos!
Nun muss dieses Image zum Booten übers Netzwerk zur Verfügung gestellt werden. Dies kann auf einem OpenBSD-System analog zu www.openbsd.org - PXE-Booting geschehen - unter Linux (beispielsweise gentoo) muss man entsprechend umdenken, funktioniert aber natürlich auch. Ich habe dazu syslinux verwendet.
Ausschnitt der Datei: /etc/dhcpd.conf |
... filename "pxelinux.0"; ... |
Nun die notwendigen Dateien für tftp bereit legen: (Unter OpenBSD ist bereis alles verfügbar; unter gentoo kann man das Paket net-ftp/tftp-hpa wählen.)
cp -p fdboot-tinyBIOS-V0.99.img /tftpboot cp -p .../syslinux/pxelinux.0 /tftpboot cp -p .../syslinux/memdisk /tftpboot mkdir /tftpboot/pxelinux.cfg vim /tftpboot/pxelinux.cfg/default
Datei: /tftpboot/pxelinux.cfg/default |
SERIAL 0 38400 0 timeout 42 default fdos prompt 1 say FreeDOS via PXE label fdos kernel memdisk append initrd=fdboot-tinyBIOS-V0.99.img raw |
Der eigentliche Update-Prozess kann dann auf der seriellen Konsole ungefähr so aussehen:
PC Engines ALIX.2 v0.98 640 KB Base Memory 261120 KB Extended Memory Press |
Nun einfach das alix.2-Board durch Ausstecken und Einstecken neu booten und schon ist das neue Bios vorhanden:
PC Engines ALIX.2 v0.99 640 KB Base Memory 261120 KB Extended Memory ... |
Per netboot die OpenBSD-Installation über pxeboot booten und installieren.
Dazu etc/boot.conf entsprechend anpassen damit die serielle Konsole funkioniert:
stty com0 38400 set tty com0 time machine diskinfo machine memory boot bsd.rd
Am besten noch vor dem ersten reboot sollte man folgende Dateien anpassen, damit die serielle Konsole stets verfügbar ist:
www.openbsd.org - Wie kann ich eine serielle Konsole benutzen?
Datei: /etc/boot.conf |
stty com0 38400 set tty com0 |
Ausschnitt der Datei: /etc/ttys |
... tty00 "/usr/libexec/getty std.38400" vt220 on secure ... |
Nach der Installation noch entsprechende Pakete installieren:
pkg_add ddclient dnsmasq rsyncNun OpenBSD als Router konfigurieren:
vi /etc/resolv.conf vi /etc/ntpd.conf vi /etc/rc.conf.local vi /etc/sysctl.conf vi /etc/hostname.vr0 vi /etc/hostname.vr1 vi /etc/hostname.vr2 adduser vi /etc/myname vi /etc/dhcpd.interfaces vi /etc/dhcpd.conf touch /var/db/dhcpd.leases vi /etc/ppp/ppp.conf vi /etc/ppp/ppp.linkup vi /etc/ppp/ppp.linkdown chmod 600 /etc/ppp/ppp.conf /etc/ppp/ppp.linkup /etc/ppp/ppp.linkdown vi /etc/pf.conf vi /etc/hosts vi /etc/ddclient/ddclient.conf echo /usr/bin/touch /etc/ppp/firsttime >> /etc/netstart echo /usr/sbin/ppp -ddial pppoe >> /etc/netstart vi /etc/dnsmasq.conf echo "/usr/local/sbin/dnsmasq &" >> /etc/rc.local vi /etc/ssh/sshd_config vi /etc/fstab
Datei: /etc/rc.conf.local |
ntpd_flags="-s -f /etc/ntpd.conf" dhcpd_flags="vr0" |
Ausschnitt der Datei: /etc/sysctl.conf |
... net.inet.ip.forwarding=1 # 1=Permit forwarding (routing) of IPv4 packets ... |
Datei: /etc/hostname.vr0 |
inet 192.168.0.1 255.255.255.0 NONE |
Datei: /etc/hostname.vr1 |
up media 10baseT |
Datei: /etc/dhcpd.interfaces |
vr0 |
Ausschnitt der Datei: /etc/ssh/sshd_config |
... PermitRootLogin no ... |
vi /etc/fstab mkdir -p /mfs/var/log mkdir -p /mfs/var/db rsync --archive --update --delete-after /var/log/ /mfs/var/log/ rsync --archive --update --delete-after /var/db/ /mfs/var/db/ vi /etc/rc vi /etc/rc.shutdown crontab -e
Datei: /etc/fstab |
/dev/wd0a / ffs rw,noatime 1 1 # /tmp mit 8 MB swap /tmp mfs rw,-s=16384,nodev,noatime 0 0 # /var/log mit 16 MB swap /var/log mfs rw,-s=32768,nodev,noatime,noexec 0 0 # /var/run mit 2 MB swap /var/run mfs rw,-s=4096,nodev,noatime,noexec 0 0 # /var/tmp mit 8 MB swap /var/tmp mfs rw,-s=16384,nodev,noatime,noexec 0 0 # /var/db mit 4 MB swap /var/db mfs rw,-s=8192,nodev,noatime,noexec 0 0 |
Ausschnitt der Datei: /etc/rc |
... rm -f /fastboot # XXX (root now writeable) # restore /var/log directory echo -n "copying log-files to mfs ..." /usr/local/bin/rsync --archive --update /mfs/var/log/ /var/log/ && echo " done." || echo " not done!" # restore /var/db directory echo -n "copying db-files to mfs ..." /usr/local/bin/rsync --archive --update /mfs/var/db/ /var/db/ && echo " done." || echo " not done!" random_seed ... |
Ausschnitt der Datei: /etc/rc.shutdown |
... # backup to CF # backup /var/log directory echo -n "saving log-files to CF ..." /usr/local/bin/rsync --archive --update --delete-after /var/log/ /mfs/var/log/ echo " done." # backup /var/db directory echo -n "saving db-files to CF ..." /usr/local/bin/rsync --archive --update --delete-after /var/db/ /mfs/var/db/ echo " done." |
Ausschnitt der crontabs zum stündlichen sichern der logs auf CF |
... # saving log-files db-files to CF 0 * * * * /usr/local/bin/rsync --archive --update --delete-after /var/log/ /mfs/var/log/ 0 * * * * /usr/local/bin/rsync --archive --update --delete-after /var/db/ /mfs/var/db/ ... |
vi /etc/fstab mkdir -p /mfs/etc mkdir -p /mfs/var/log mkdir -p /mfs/var/db mkdir -p /mfs/dev mkdir -p /mfs/home rsync --archive --update --delete-after /etc/ /mfs/etc/ rsync --archive --update --delete-after /var/log/ /mfs/var/log/ rsync --archive --update --delete-after /var/db/ /mfs/var/db/ rsync -pogDtW /dev/MAKEDEV /mfs/dev/ rsync --archive --update --delete-after /home/ /mfs/home/ vi /etc/rc
Die Verzeichnisse /etc und /dev existieren 2-mal. Einmal dort wo sie später hingemountet werden und einmal unter /mfs. dies ist nötig, da diese Dateibereiche bereits beim Booten benötigt werden. Sie werden daher auch nicht automatisch über die /etc/fstab gemountet, sondern zum richtigen Zeitpunkt per /etc/rc. Man sollte also stets /etc und /mfs/etc identisch halten. /dev wird lediglich jedesmal neu aus /dev/MAKEDEV erstellt. Da das mfs-Dateisystem sehr schnell ist, geht dies auch viel schneller, als auf herkömmlichen Festplatten.
Sollte man irgendwann doch mal wieder etwas schreiben wollen, so kann man das Dateisystem wieder schreibend mounten:
mount -v -u -w /
Bzw. anschließend wieder nur lesend:
mount -v -u -r -f /
Da unter /etc ja noch das echte /etc liegt, kann auch dieses ungemountet werden, um es mit /mfs/etc zu syncronisieren:
umount -v /etc rsync --archive --update --delete-after /mfs/etc/ /etc/ mount_mfs -s 8192 -o nodev -o noatime -P /mfs/etc/ swap /etc
Datei: /etc/fstab |
/dev/wd0a / ffs ro,noatime 1 1 # /dev mit 8 MB (wird durch /etc/rc gemountet) # swap /dev mfs rw,-s=16384 0 0 # /etc mit 4 MB (wird durch /etc/rc gemountet) # swap /etc mfs rw,-s=8192,nodev,noatime 0 0 # /tmp mit 4 MB swap /tmp mfs rw,-s=8192,nodev,noatime 0 0 # /var/log mit 16 MB swap /var/log mfs rw,-s=32768,nodev,noatime,noexec 0 0 # /var/run mit 2 MB swap /var/run mfs rw,-s=4096,nodev,noatime,noexec 0 0 # /var/tmp mit 4 MB swap /var/tmp mfs rw,-s=8192,nodev,noatime 0 0 # /var/db mit 4 MB swap /var/db mfs rw,-s=8192,nodev,noatime,noexec 0 0 # /home mit 16 MB swap /home mfs rw,-s=32768,noatime 0 0 |
Ausschnitt der Datei: /etc/rc |
... rm -f /fastboot # XXX (root now writeable) # restore /etc directory echo -n "copying etc-files to mfs ..." mount_mfs -s 8192 -o nodev -o noatime -P /mfs/etc/ swap /etc && echo " done." || echo " not done!" # restore/create /dev echo -n "restore/creating /dev ..." (mount_mfs -s 16384 -P /mfs/dev/ swap /dev && cd /dev && sh MAKEDEV all) && echo " done." || echo " not done!" # restore /var/log directory echo -n "copying log-files to mfs ..." /usr/local/bin/rsync --archive --update /mfs/var/log/ /var/log/ && echo " done." || echo " not done!" # restore /var/db directory echo -n "copying db-files to mfs ..." /usr/local/bin/rsync --archive --update /mfs/var/db/ /var/db/ && echo " done." || echo " not done!" # restore /home directory echo -n "copying home-files to mfs ..." /usr/local/bin/rsync --archive --update /mfs/home/ /home/ && echo " done." || echo " not done!" random_seed ... |
Da auf dem alix2c2 keine Batterie vorhanden ist, geht die Uhrzeit nach jedem Booten falsch. Um nach der DSL-Einwahl die Uhrzeit gestellt zu bekommen lasse ich kurz nach der Einwahl durch /etc/ppp/ppp.linkup ntpd neu starten und die Uhrzet stellen:
Datei: /etc/ppp/ppp.linkup |
MYADDR: ! sh -c "/sbin/ifconfig pflog0 up" add! default HISADDR ! sh -c "/sbin/pflogd" ! sh -c "/sbin/pfctl -e -F all -f /etc/pf.conf" ! sh -c "/usr/local/sbin/ddclient -daemon 300 -syslog" ! sh -c "(sleep 60 ; /usr/bin/pkill ntpd ; /usr/sbin/ntpd -s -f /etc/ntpd.conf)&" |
Eigentlich ein Image der CompactFlash-Card erstellen. Per netboot die OpenBSD-Installation booten und in die Shell wechseln:
# ftp 192.168.0.2 Connected to 192.168.0.2. 220 (vsFTPd 2.0.6) Name (192.168.0.2:root): anonymous 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> put "| dd if=/dev/rwd0c" router.img local: | dd if=/dev/rwd0c remote: router.img 227 Entering Passive Mode (192,168,0,2,252,13) 150 Ok to send data. 7831153+0 records in 7831153+0 records out 4009550336 bytes transferred in 2252.378 secs (1780141 bytes/sec) 226 File receive OK. 4009550336 bytes sent in 2252.40 seconds (1.70 MB/s) ftp> quit 421 Timeout. #
Autor: Daniel Mohr
Datum: 2008-05-18, 2008-10-07, 2009-12-13