Inhaltsverzeichnis

alix2c2 oder alix2c3 als Router mit OpenBSD und 4 W Verbrauch

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.

zurück zum Inhaltsverzeichnis

Bios-Update

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  key to display network boot option menu
Try network boot first , then local drives
01F0 Master 044A TRANSCEND
Phys C/H/S 7769/16/63 Log C/H/S 971/128/63

Intel UNDI, PXE-2.0 (build 082)
Copyright (C) 1997,1998,1999  Intel Corporation
VIA Rhine III Management Adapter v2.43 (2005/12/15)

CLIENT MAC ADDR: 00 00 00 00 00 00
CLIENT IP: 192.168.0.2  MASK: 255.255.255.0  DHCP IP: 192.168.0.1
GATEWAY IP: 192.168.0.1
TFTP.
PXELINUX 3.31 2006-09-25  Copyright (C) 1994-2005 H. Peter Anvin
Booting FreeDOS via PXE 
boot: 
Loading memdisk....
Loading fdboot-tinyBIOS-V0.99.img.........................
Ready.
MEMDISK 3.31 2006-09-25  Copyright 2001-2005 H. Peter Anvin
e820: 0000000000000000 00000000000a0000 1
e820: 00000000000f0000 0000000000010000 2
e820: 00000000fff00000 0000000000100000 2
e820: 0000000000100000 000000000ff00000 1
Ramdisk at 0x0fe78000, length 0x00168000
command line: initrd=fdboot-tinyBIOS-V0.99.img raw BOOT_IMAGE=memdisk 
Disk is floppy 0, 1440 K, C/H/S = 80/2/18
Using raw access to high memory
Total size needed = 1901 bytes, allocating 2K
Old dos memory at 0x9fc00 (map says 0xa0000), loading at 0x9f400
1588: 0xffff  15E801: 0x3c00 0x0ee7
INT 13 08: Failure, assuming this is the only drive
old: int13 = f000b396  int15 = f000ad42
new: int13 = 9f400008  int15 = 9f400290
Loading boot sector... booting...
FreeDOS123
FreeDOS kernel build 2036 cvs [version Aug 18 2006 compiled Aug 18 2006]

Kernel compatibility 7.10 - WATCOMC - 80386 CPU required - FAT32 support

(C) Copyright 1995-2006 Pasquale J. Villani and The FreeDOS Project.
All Rights Reserved. This is free software and comes with ABSOLUTELY NO
WARRANTY; you can redistribute it and/or modify it under the terms of the
GNU General Public License as published by the Free Software Foundation;
either version 2, or (at your option) any later version.

 - InitDiskFreeDOS HIMEM64 3.26 [Aug 25 2006] (c) 1995, Till Gerken 2001-2006 tom ehlert

HIMEM - Always On A20 method used
Kernel: allocated 43 Diskbuffers = 22876 Bytes in HMA

FreeCom version 0.84-pre2 XMS_Swap [Aug 28 2006 00:29:00]

ALIX flash update (C)2007 PC Engines GmbH
Flash ID = 1 FFFF GPI = FF
Flash ID = 0 9D37 GPI = 01
Reading 512KB flash image alix1.bin................
Compare Erase Program Verify - update OK.

A:\>

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
...

zurück zum Inhaltsverzeichnis

Installation

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 rsync
Nun 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
...

zurück zum Inhaltsverzeichnis

wenig auf CompactFlash-Card schreiben

Damit möglichst wenig auf die CompactFlash-Card geschrieben wird: (CF-Cards haben nur eine sehr beschränkte Anzahl an Schreibvorgägen. Daher sollten häufige Schreibvorgänge vermieden werden - bzw. in den Arbeitsspeicher verlagert werden. de.wikipedia.org/Flash-Speicher)
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/                    
...

zurück zum Inhaltsverzeichnis

nichts auf CompactFlash-Card schreiben

Auch wenn nur wenig geschrieben wird, bedeutet dies beim Stromausfall (oder Stecker ziehen) ein potenziell defektes Dateisystem. Daher kann man natürlich auch das Dateisystem nur lesend verwenden. Dazu muss außer den Ordnern im vorhergehenden Abschnitt noch weiterhin folgendes umgebogen werden: (Hierbei wird nun komplett auf ein sichern von beispielsweise log-Files verzichtet!)
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
...

zurück zum Inhaltsverzeichnis

Uhrzeit

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)&"

zurück zum Inhaltsverzeichnis

Backup

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.
# 

zurück zum Inhaltsverzeichnis


Autor: Daniel Mohr
Datum: 2008-05-18, 2008-10-07, 2009-12-13


zurück zu Rechnerprobleme