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.
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 jreNun 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 ... |
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 /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 ... |
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 ... |
Eigentlich ein Image der CompactFlash-Card erstellen.
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. #
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. #
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"
Autor: Daniel Mohr
Datum: 2009-12-13, 2009-12-19, 2009-12-25