Inhaltsverzeichnis

alix3d3 als Terminal mit OpenBSD und ca. 5 W Verbrauch

alix3d3 ist ein kleines, leistungsfähiges Motherboards mit einem sehr niedrigen Verbrauch. Diese Boards beinhalten praktisch alles, was ein Rechner benötigt. Weiterhin gibt es preiswert passendes Gehäuse, Bracket 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 weniger als 1 GB für das System (inkl. X) benötigt werden, reicht bereits eine 1 GB CompactFlash-Card. Vielleicht will man aber manchmal noch mehr speichern. Falls man alle hier genannten Pakete installiert, so benötigt man ca. 3 GB für das System. Somit macht eine 4 GB CompactFlash-Card durchaus Sinn.

Das alix3d3 ist x86 kompatibel.

zurück zum Inhaltsverzeichnis

Installation

Per netboot die OpenBSD-Installation über pxeboot booten und installieren.

Um entsprechende Pakete zu installieren gibt es die Anleitung www.openbsd.org - The OpenBSD packages and ports system.

Datei: /root/.profile
alias l="ls -lah"
export PKG_PATH=ftp://openbsd.ftp.fu-berlin.de/pub/OpenBSD/4.6/packages/`machine -a`/

Beispielsweise Tools: (144 MB)

pkg_add bash bzip2 GeoIP logsurfer ndiff nmap p7zip rdiff-backup rsync rtorrent rzip screen-4.0.3p1 unzip vim-7.2.190p1-gtk2 wget zip

Beispielsweise Window Manager: (241 MB)

pkg_add -n dwm enlightenment fluxbox fvwm2+fvicons-2.4.20-i18n gdm

Beispielsweise Browser: (127 MB)

pkg_add -n elinks firefox-i18n-de gnash mozilla-firefox

Beispielsweise für Remote-Verbindungen: (je unter 1 MB)

pkg_add -n ssvnc-viewer
pkg_add -n tightvnc-viewer
pkg_add -n xdmchoose

Beispielsweise für Remote-Verbindungen mit Windows: (90 MB)

pkg_add -n rdesktop samba-3.0.34p1-cups-ldap samba-docs

Beispielsweise weitere Programme: (96 MB)

pkg_add -n desktop-file-utils gnuls emacs-22.3p0-gtk xemacs-21.4.19p8 system-config-printer

Beispielsweise Viewer: (503 MB)

pkg_add -n epdfview-0.1.7p0-cups.tgz feh gqview gv pdfjam pktstat xpdf

Beispielsweise Dateimanager: (571 MB)

pkg_add -n emelfm2 nautilus pcmanfm rox-filer

Beispielsweise Sound: (79 MB)

pkg_add -n aqualung esound ffmpeg gmpc mpg321 speex vorbis-tools xine-ui

Beispielsweise Gimmicks: (6 MB)

pkg_add -n aalib-1.4p1 aamath cowsay clamav

Beispielsweise java: (218 MB)

pkg_add -n jdk jre

Nun OpenBSD konfigurieren:
vi /etc/resolv.conf
vi /etc/ntpd.conf
vi /etc/rc.conf.local
vi /etc/sysctl.conf
vi /etc/hostname.vr0
adduser
vi /etc/myname
vi /etc/pf.conf
vi /etc/hosts
vi /etc/ssh/sshd_config
vi /etc/fstab
Datei: /etc/rc.conf.local
ntpd_flags=             # enabled during install
xdm_flags=              # enabled during install
Datei: /etc/hostname.vr0
dhcp
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! Weiterhin habe ich eine eigene Partition /realhome verwendet, um diese vom User bei Bedarf selbständig mounten und somit syncen zu lassen.
vi /etc/fstab
mkdir -p /mfs/etc
mkdir -p /mfs/var/log
mkdir -p /mfs/var/db
mkdir -p /mfs/dev
mkdir -p /realhome/mfs
mkdir -p /realhome/readonly
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/ /realhome/mfs/
rsync --archive --update --delete-after /home/ /realhome/readonly/ && (rm -rf /realhome/readonly/*/* ; rm -rf /realhome/readonly/*/.*)
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 -vuw /
mount -vuw /realhome

Bzw. anschließend wieder nur lesend:

mount -vurf /
mount -vurf /realhome

Da unter /etc ja noch das echte /etc liegt, kann auch dieses ungemountet werden, um es mit /mfs/etc zu synchronisieren:

umount -v /etc
rsync --archive --update --delete-after /mfs/etc/ /etc/
mount_mfs -s 16384 -o nodev -o noatime -P /mfs/etc/ swap /etc

Datei: /etc/fstab
/dev/wd0a / ffs ro,noatime 1 1
/dev/wd0e /realhome ffs ro,noauto,noatime,nodev 1 2
# /dev mit 8 MB (wird durch /etc/rc gemountet, da bereits zur Bootzeit das echte /dev benötigt wird)
# swap /dev mfs rw,-s=16384 0 0
# /etc mit 8 MB (wird durch /etc/rc gemountet, da bereits zur Bootzeit das echte /etc benötigt wird)
# swap /etc mfs rw,-s=16384 ,nodev,noatime 0 0
# /tmp mit 4 MB
swap /tmp mfs rw,-s=8192,nodev,noatime 0 0
# /var/log mit 4 MB
swap /var/log mfs rw,-s=8192,nodev,noatime,noexec 0 0
# /var/run mit 1 MB
swap /var/run mfs rw,-s=2048,nodev,noatime,noexec 0 0
# /var/tmp mit 4 MB
swap /var/tmp mfs rw,-s=8192,nodev,noatime 0 0
# /var/db mit 48 MB
swap /var/db mfs rw,-s=98304,nodev,noatime,noexec 0 0
# /home mit 16 MB
swap /home mfs rw,-s=32768,noatime 0 0

Ausschnitt der Datei: /etc/rc
...
mount -a -t nonfs,vnd
mount -u /              # root on nfs requires this, others aren't hurt
rm -f /fastboot         # XXX (root now writeable)

# restore /etc directory
echo -n "copying etc-files to mfs ..."
mount_mfs -s 16384 -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 ..."
mount -s /realhome && (/usr/local/bin/rsync --archive --update /realhome/mfs/ /home/ && echo " done." || echo " not done!") || echo " no /realhome available!"
umount /realhome

random_seed
...

Man kann sich die Arbeit erleichtern, wenn man passende Skripten schreibt und diese zur Verfügung stellt.

Skript mount-root-writeable für root um / schreibend zu machen:
#!/bin/sh
echo "mounting / writeable"
mount -vuw / && echo "/ is writeable now." || echo "error: / not writeable!"

Skript mount-root-readonly für root um / lesend zu machen:
#!/bin/sh
echo "mounting / readonly"
mount -vurf / && echo "/ is readonly now." || echo "error: possible / still writeable!"

Skript synchronize-var_log für root um /var/log zu synchronisieren:
#!/bin/sh
echo "mounting / writeable"
mount -vuw / && (
echo -n "copying log-files from mfs ..."
rsync --archive --update --delete-after /var/log/ /mfs/var/log/ && echo " done." || echo " not done!"
sleep 1
echo "mounting / readonly"
mount -vurf / && echo "/ is readonly now." || echo "error: / still writeable!") || echo "error: / not writeable!"

Skript synchronize-etc für root um /etc zu synchronisieren:
#!/bin/sh
echo "mounting / writeable"
mount -vuw / && echo "/ is writeable now." || echo "error: / not writeable!"
echo -n "copying etc-files from mfs to /mfs/etc ..."
rsync --archive --update --delete-after /etc/ /mfs/etc/ && echo " done." || echo " not done!"
sleep 1
echo "umount /etc"
umount -v /etc && echo "/etc is now real /etc." || echo "error: /etc ist still mfs!"
echo -n "copying etc-files from /mfs/etc to real /etc ..."
rsync --archive --update --delete-after /mfs/etc/ /etc/ && echo " done." || echo " not done!"
sleep 1
echo -n "copying/restoring etc-files to mfs ..."
mount_mfs -s 16384 -o nodev -o noatime -P /mfs/etc/ swap /etc && echo " done." || echo " not done!"
echo "mounting / readonly"
mount -vurf / && echo "/ is readonly now." || echo "error: / still writeable!"

Skript synchronize-home für root um /home zu synchronisieren:
#!/bin/sh
echo "mounting /realhome writeable"
mount -vw /realhome &&
  (echo -n "copying home-files from mfs ..."
  rsync --archive --update --delete-after /home/ /realhome/mfs/ &&
    echo " done." ||
    echo " not done!"
  sleep 1
  umount -v /realhome &&
    echo "/realhome is unmounted." ||
    echo "error: /realhome still writeable!") ||
echo "error: /realhome not available!"

Skript synchronize für root um alles sinnvolle zu synchronisieren:
#!/bin/sh
echo "mounting / writeable"
mount -vuw / || echo "error: / not writeable!"
echo -n "copying db-files from mfs ..."
rsync --archive --update --delete-after /var/db/ /mfs/var/db/ && echo " done." || echo " not done!"
echo -n "copying log-files from mfs ..."
rsync --archive --update --delete-after /var/log/ /mfs/var/log/ && echo " done." || echo " not done!"
echo -n "copying etc-files from mfs to /mfs/etc ..."
rsync --archive --update --delete-after /etc/ /mfs/etc/ && echo " done." || echo " not done!"
sleep 1
echo "umount /etc"
umount -v /etc
echo -n "copying etc-files from /mfs/etc to real /etc ..."
rsync --archive --update --delete-after /mfs/etc/ /etc/ && echo " done." || echo " not done!"
sleep 1
echo -n "copying/restoring etc-files to mfs ..."
mount_mfs -s 16384 -o nodev -o noatime -P /mfs/etc/ swap /etc && echo " done." || echo " not done!"
echo "mounting / readonly"
mount -vurf / && echo "/ is readonly now." || echo "error: / still writeable!"

echo "mounting /realhome writeable"
mount -vw /realhome &&
  (echo -n "copying home-files from mfs ..."
  rsync --archive --update --delete-after /home/ /realhome/mfs/ &&
    echo " done." ||
    echo " not done!"
  sleep 1
  umount -v /realhome &&
    echo "/realhome is unmounted." ||
    echo "error: /realhome still writeable!") ||
echo "error: /realhome not available!"

Damit auch ein normaler User /realhome mounten darf, muß kern.usermount=1 gesetzt sein: (Dadurch kann der User allerdings auch anderes mounten, wie beispielsweise smbmounts. Dies hat damit Vorteile aber eben auch Nachteile!)

# sysctl kern.usermount

Damit dies nach einem Neustart erhalten bleibt sollte dies dauerhaft eingestellt werden:

Ausschnitt der Datei /etc/sysctl.conf
kern.usermount=1

Weiterhin wird eine Gruppe benötigt, die die entsprechenden Rechte zur Verfügung stellt:

groupadd mounters
usermod -G mounters root
usermod -G mounters benutzer

Nun kann der Device für /realhome mit entsprechenden Rechten versehen werden:

ls -dl /dev/wd0e
chgrp mounters /dev/wd0e
chmod 660 /dev/wd0e
ls -dl /dev/wd0e

Der Benutzer kann nun /realhome entsprechend mounten. Damit der Benutzer sein eigenes home-Verzeichnis sichern kann, hilft wieder ein Skript:

Skript synchronize für einen Benutzer um sein home-Verzeichnis zu synchronisieren:
#!/usr/local/bin/bash
wohin=/tmp/realhome-$(whoami)-$(date +%s)
mkdir $wohin
echo "mounte wd0e -> $wohin:"
/sbin/mount /dev/wd0e $wohin &&
  (echo -n "copying home-files from mfs ..."
  rsync --archive --update --delete-after /home/$(whoami)/ $wohin/mfs/$(whoami)/ &&
    echo " done." ||
    echo " not done!"
  sleep 1
  /sbin/umount -v $wohin &&
    echo "wd0e is unmounted" ||
    echo "error: wd0e alias $wohin not unmounted!"
  rmdir $wohin) ||
echo "konnte wd0e nicht mounten!"

Da /dev hier stets neu erstellt wird, müssen auch stets die Rechte angepasst werden:

Ausschnitt der Datei: /etc/rc
...
echo -n "restore/creating /dev ..."
(mount_mfs -s 16384 -P /mfs/dev/ swap /dev && cd /dev && sh MAKEDEV all && 
  chgrp mounters /dev/wd0e && chmod 660 /dev/wd0e) && echo " done." || echo " not done!"
# restore /var/log directory
...

gdm

Leider schreibt der Display-Manager gdm in den Ordner

/var/gdm/
Daher muss dieser noch verschoben werden:

mount-root-writeable
mv /var/gdm /var/db   
cd /var/
ln -s db/gdm
synchronize

Eine andere Moegichkeit ist, die Konfiguration anzupassen:

Ausschnitt der Datei: /etc/X11/gdm/custom.conf
...
[daemon]
ServAuthDir=/var/db/gdm
...

zurück zum Inhaltsverzeichnis

Backup

Eigentlich ein Image der CompactFlash-Card erstellen.

Backup mit OpenBSD 4.3

In 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: 2009-12-13, 2009-12-19, 2009-12-25


zurück zu Rechnerprobleme