Siehe auch

alix2c2-wlan-openbsd4.8

Inhaltsverzeichnis

alix2c2 als Router mit OpenBSD und 4 W Verbrauch bzw. 5 W mit WLAN

alix2c2 ist ein kleines, leistungsfähiges Motherboard mit einem sehr niedrigen Verbrauch. Diese alix-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 das Gehäuse case1c2redu und ein passendes 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.

Wenn man zusätzlich mittels einer MiniPCI-Karte WLAN möchte, so gibt es leider kein passendes Gehäuse. Aber das oben erwähnte case1c2redu kann leicht modifiziert werden um auch eine Antenne einzubauen.

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

PC Engines ALIX.2 v0.99h
640 KB Base Memory
261120 KB Extended Memory
...

Bei mir war bereits das aktuelle tinyBios v0.99h installiert. Daher spare ich mir Erläuterungen dazu. Unter alix2c2 oder alix2c3 als Router mit OpenBSD und 4 W Verbrauch habe ich mich bereits dem Thema gewidmet und unter alix2/alix3 - Support information gibt PC Engines GmbH entsprechende Informationen.

zurück zum Inhaltsverzeichnis

Installation

Per netboot die OpenBSD-Installation über pxeboot booten und installieren. (Die deutschsprachigen Versionen folgender Dokumente waren leider nur bis OpenBSD 4.4 vorhanden.)

Das alix-Board unterstützt nur auf LAN1 im tinyBios PXE-Boot durch drücken von N während dem Speichertest oder kann auch im Setup dauerhaft eingestellt werden.

Als dhpcd-Server hat mir eine OpenBSD-Maschine gedient. Damit ein netboot funktioniert, müssen im wesentlichen folgende passende Zeilen vorhanden sein:

Datei: /etc/dhcpd.conf
next-server 192.168.0.2;
filename "pxeboot";

Als tftpd-Server habe ich eine Linux-Maschine mit OpenBSD TFTP server verwendet. Als Konfiguration reicht:

Datei: /etc/conf.d/in.tftpd
INTFTPD_PATH="/tftproot/openbsd"
INTFTPD_OPTS="-R 4096:32767 -s ${INTFTPD_PATH}"

Was gebootet werden soll findet sich nun im Ordner /tftproot/openbsd. Dort entsprechend www.openbsd.org - PXE booting alle Dateien zur Verfügung stellen. Weiterhin etc/boot.conf entsprechend anpassen damit die serielle Konsole funkioniert:

stty com0 38400
set tty com0
time
machine diskinfo
machine memory
boot bsd.rd

Wenn man wie unter www.openbsd.org - PXE booting vorgeschlagen gebootet hat, kann man sich in der Shell die Ausgabe von dmesg ansehen:

dmesg
OpenBSD 4.8 (GENERIC) #136: Mon Aug 16 09:06:23 MDT 2010
    deraadt@i386.openbsd.org:/usr/src/sys/arch/i386/compile/GENERIC
cpu0: Geode(TM) Integrated Processor by AMD PCS ("AuthenticAMD" 586-class) 499 MHz
cpu0: FPU,DE,PSE,TSC,MSR,CX8,SEP,PGE,CMOV,CFLUSH,MMX
real mem  = 268009472 (255MB)
avail mem = 253669376 (241MB)
mainbus0 at root
bios0 at mainbus0: AT/286+ BIOS, date 12/10/07, BIOS32 rev. 0 @ 0xfceb2
pcibios0 at bios0: rev 2.1 @ 0xf0000/0x10000
pcibios0: pcibios_get_intr_routing - function not supported
pcibios0: PCI IRQ Routing information unavailable.
pcibios0: PCI bus #0 is the last bus
bios0: ROM list: 0xe0000/0xa800
cpu0 at mainbus0: (uniprocessor)
pci0 at mainbus0 bus 0: configuration mode 1 (bios)
pchb0 at pci0 dev 1 function 0 "AMD Geode LX" rev 0x33
glxsb0 at pci0 dev 1 function 2 "AMD Geode LX Crypto" rev 0x00: RNG AES
vr0 at pci0 dev 9 function 0 "VIA VT6105M RhineIII" rev 0x96: irq 10, address xx:xx:xx:xx:xx:xx
ukphy0 at vr0 phy 1: Generic IEEE 802.3u media interface, rev. 3: OUI 0x004063, model 0x0034
vr1 at pci0 dev 11 function 0 "VIA VT6105M RhineIII" rev 0x96: irq 12, address xx:xx:xx:xx:xx:xx
ukphy1 at vr1 phy 1: Generic IEEE 802.3u media interface, rev. 3: OUI 0x004063, model 0x0034
athn0 at pci0 dev 12 function 0 "Atheros AR9280" rev 0x01: irq 9, address xx:xx:xx:xx:xx:xx
athn0: AR9280 rev 2 (2T2R), ROM rev 21
glxpcib0 at pci0 dev 15 function 0 "AMD CS5536 ISA" rev 0x03: rev 3, 32-bit 3579545Hz timer, watchdog, gpio
gpio0 at glxpcib0: 32 pins
pciide0 at pci0 dev 15 function 2 "AMD CS5536 IDE" rev 0x01: DMA, channel 0 wired to compatibility, channel 1 wired to compatibility
wd0 at pciide0 channel 0 drive 0: 
wd0: 1-sector PIO, LBA, 3823MB, 7831152 sectors
wd0(pciide0:0:0): using PIO mode 4, Ultra-DMA mode 2
pciide0: channel 1 ignored (disabled)
ohci0 at pci0 dev 15 function 4 "AMD CS5536 USB" rev 0x02: irq 15, version 1.0, legacy support
ehci0 at pci0 dev 15 function 5 "AMD CS5536 USB" rev 0x02: irq 15
usb0 at ehci0: USB revision 2.0
uhub0 at usb0 "AMD EHCI root hub" rev 2.00/1.00 addr 1
isa0 at glxpcib0
isadma0 at isa0
com0 at isa0 port 0x3f8/8 irq 4: ns16550a, 16 byte fifo
com0: console
pcppi0 at isa0 port 0x61
spkr0 at pcppi0
npx0 at isa0 port 0xf0/16: reported by CPUID; using exception 16
usb1 at ohci0: USB revision 1.0
uhub1 at usb1 "AMD OHCI root hub" rev 1.00/1.00 addr 1
biomask e9ef netmask ffef ttymask ffff
mtrr: K6-family MTRR support (2 registers)
nvram: invalid checksum
softraid0 at root
root on wd0a swap on wd0b dump on wd0b
clock: unknown CMOS layout

Bei der Installation kann bereits die serielle Konsole standardmäßig eingerichtet werden:

...
Change the default console to com0? [no] yes
Available speeds are: 9600 19200 38400 57600 115200.
Which one should com0 use? (or 'done') [38400]
...

Da keinerlei X läuft, sollten follgende Dateisets reichen: (Für Pakete wie pfstat benötigt man noch: xbase47.tgz)

    [X] bsd           [X] etc49.tgz     [ ] xbase49.tgz   [ ] xserv49.tgz
    [X] bsd.rd        [X] comp49.tgz    [ ] xetc49.tgz
    [ ] bsd.mp        [X] man49.tgz     [ ] xshare49.tgz
    [X] base49.tgz    [X] game49.tgz    [ ] xfont49.tgz

Falls nicht bereits während der Installation sollte man noch vor dem ersten reboot 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 bzw. unmittelbar nach der Installation /mnt/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: (www.openbsd.org - pkg_add)

pkg_add bash ddclient dnsmasq rsync screen-4.0.3p2 smartmontools vim-7.3.3p1-no_x11 wget

Nun OpenBSD als Router konfigurieren:

vim /etc/resolv.conf (CCC - DNS Howto, www.openbsd.org - resolv.conf)
search cadae.de
nameserver 85.214.73.63
nameserver 213.73.91.35
lookup file bind
vim /etc/ntpd.conf (NTP Pool Project, www.openbsd.org - ntpd.conf)
listen on *
servers de.pool.ntp.org
vim /etc/rc.conf.local (www.openbsd.org - rc.conf.local)
ntpd_flags=             # enabled during install
dhcpd_flags="vr0 ath0"
vim /etc/sysctl.conf (www.openbsd.org - sysctl.conf)
net.inet.ip.forwarding=1        # 1=Permit forwarding (routing) of IPv4 packets
vim /etc/hostname.vr0 (www.openbsd.org - hostname.if)
inet 192.168.0.1 255.255.255.0 NONE
!route add default 192.168.0.1
vim /etc/hostname.vr1 (DSL-Modem)
up media 10baseT
vim /etc/hostname.athn0 (WLAN) (www.openbsd.org - Wireless, www.openbsd.org - athn)
inet 192.168.1.2 255.255.255.0 NONE media autoselect mediaopt hostap nwid netzwerkname -nwkey -powersave wpa wpaakms psk wpaprotos wpa2 wpapsk `wpa-psk netzwerkname xxxxxxxxxxxxxxxxxxxxxxx`
Hierbei kann das Passwort beispielsweise mit
dd bs=10 count=100 if=/dev/random 2>/dev/null | tr -dc 'a-zA-Z0-9' | dd bs=1 count=63 2>/dev/null ; echo
erzeugt werden. /dev/random ist allerdings typischerweise recht langsam, da auf zufällige Daten gewartet werden muß. /dev/urandom liefert zwar keine so höhe Qualität, dafür aber eine sehr hohe Entropie!
adduser
vim /etc/myname
bla.cadae.de
vim /etc/dhcpd.interfaces
vr0 athn0
vim /etc/dhcpd.conf (www.openbsd.org - 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
vim /etc/pf.conf (www.openbsd.org - pf.conf, www.openbsd.org - PF)
vim /etc/hosts
192.168.0.1 bla.cadae.de bla
vim /etc/ddclient/ddclient.conf
...
echo /usr/bin/touch /etc/ppp/firsttime >> /etc/netstart
echo /usr/sbin/ppp -ddial pppoe >> /etc/netstart
vim /etc/dnsmasq.conf
resolv-file=/etc/resolv.conf
server=213.73.91.35
echo "/usr/local/sbin/dnsmasq &" >> /etc/rc.local
vim /etc/ssh/sshd_config (www.openbsd.org - sshd_config)
...
PermitRootLogin no
...
vim /etc/fstab ()

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.

Backup mit OpenBSD 4.3

Seit OpenBSD 4.6 ist leider ftp in der bsd.rd eingeschränkt. Mit OpenBSD 4.3 funktionert es. Per netboot die OpenBSD-Installation von OpenBSD 4.3 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" terminal.img 
local: | dd if=/dev/rwd0c remote: terminal.img
227 Entering Passive Mode (192,168,0,2,252,13)
150 Ok to send data.
7831152+0 records in
7831152+0 records out
4009549824 bytes transferred in 2531.709 secs (1583732 bytes/sec)
226 File receive OK.
4009549824 bytes sent in 2531.71 seconds (1.51 MB/s)
ftp> quit
421 Timeout.
# 

zurück zum Inhaltsverzeichnis

Backup mit OpenBSD 4.6 und ftp

Wenn man wie unter nichts auf CompactFlash-Card schreiben beschrieben alle Partitionen readonly hat, dann kann man direkt aus dem laufenden System sein Backup erstellen:

# 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" terminal.img
local: | dd if=/dev/rwd0c remote: terminal.img
150 Ok to send data.
7831152+0 records in
7831152+0 records out
4009549824 bytes transferred in 2531.709 secs (1583732 bytes/sec)
226 File receive OK.
200 NOOP ok.
200 NOOP ok.
200 NOOP ok.
200 NOOP ok.
200 NOOP ok.
200 NOOP ok.
200 NOOP ok.
4009549824 bytes sent in 2531.71 seconds (1.51 MB/s)
ftp> quit
421 Timeout.
# 

zurück zum Inhaltsverzeichnis

Backup mit OpenBSD 4.6 und ssh

Wenn man wie unter nichts auf CompactFlash-Card schreiben beschrieben alle Partitionen readonly hat, dann kann man direkt aus dem laufenden System sein Backup erstellen. Und im laufenden System hat man dann natürlich auch so mächtige Programme verfügbar wie ssh:

dd if=/dev/rwd0c | ssh -l benutzer 192.168.0.2 "cd /wohinauchimmer/ ; cat > terminal.img"

Oder man kann gleich eine Komprimierung einschalten um Netzwerkbandbreite zu sparen. Allerdings ist die Rechenleistung von dem alix-Board nicht sehr hoch:

dd if=/dev/rwd0c | gzip | ssh -l benutzer 192.168.0.2 "cd /wohinauchimmer/ && cat > terminal.img.gz"

Wenn man ein dickes Netzwerk (LAN) und ein leistungstarkes Zielsystem hat, so kann man dies natürlich auch dem Zielrechner überlassen:

dd if=/dev/rwd0c | ssh -l benutzer 192.168.0.2 "cd /wohinauchimmer/ && gzip > terminal.img.gz"

zurück zum Inhaltsverzeichnis


Autor: Daniel Mohr
Datum: 2008-05-18, 2008-10-07, 2009-12-13, 2010-06-06, 2011-01-02


zurück zu Rechnerprobleme