Ich nutze als Router IPFire auf einem kleinen VIA-ITX Board. Das Problem solcher fertigen Router-Distributionen ist, dass sie sich meist kaum erweitern lassen bzw. nur durch Pakete, die gesondert für die System erstellt werden müssen. Jeder Sicherheitsfanatiker wird gleich aufschreien und sagen, dass das nicht ohne Grund so ist, aber stellt sich zu Hause schon zig Geräte hin, wenn genügend Hardware-Reserven zur Verfügung stehen.
Bisher hatte ich immer daran gedacht eine zusätzliche virtuelle Umgebung per Xen oder QEMU zu installieren (Pakete für IPFire vorhanden), nur dafür ist die einfache ITX Hardware nicht wirklich geeignet, so bin ich dann irgendwann auf die Idee gekommen ein komplettes Debian innerhalb von IPFire per chroot und debootstrap einzurichten. Dazu wird einfach ein Pfad auf der Festplatte einrichtet und ein komplettes Debian System angelegt, wo drauf man sich dann einloggen kann als wäre es ein eigenständiges System, apt-get und co. stehen dann ganz normal zur Verfügung.
benötigte Binaries
debootstrap benötigt zum entpacken der Paket ar, tar und gzip, welche bis auf ar auch bereits im IPFire enthalten sind. ar ist Bestandteil der binutils, welche allerdings bisher nicht für den IPFire bereitstehen. Ohne jetzt eine riesen "kompilierwahn" zustarten nimmt man dazu einfach die nötigen libs und binaries aus einem fertigen Debian System :).
/usr/bin/ar /usr/lib/libbfd-2.17.so
Einfach die Datei kopieren, mit den nötigen chmod Rechten versehen und einmal testen ob der ar Befehl ausgeführt wird
debootstrap installieren
Innerhalb eines Debian System läßt sich debootstrap über apt-get install debootstrap installieren, da wir allerdings in einem Fremdsystem unterwegs sind, müssen wir uns das Debian-Paket selber runterladen und entpacken (z.B. debootstrap_0.X.X_all.deb). Da deb-Pakete nichts anderes sind als normale Archiv-Dateien können wir es mit tar oder bzw 7zip ansehen. Dort finden sich zwei Datei control.tar.gz und data.tar.gz, uns interessiert allerdings nur data.tar.gz, dort ist das eigentliche debootstrap enthalten. Mit folgenden Befehlen entpacken wir das Archiv unterhalb des Rootstammes!.Unter /usr/sbin/debootstrap findest sich dann das gute Stück.
cd / zcat data.tar.gz | tar xv
Basissystem installieren
Zur Installation von Debian erstellen wir uns ein neues Verzeichnis, wo dann das komplette System installiert werden soll. Per --arch wir der Prozessortyp (i386=x86; x64...) definiert und eine Debian-Version z.B. mit lenny (lenny=5.0; etch=4.0).
mkdir /mnt/hdd/debian /usr/sbin/debootstrap --arch i386 lenny /mnt/hdd/debian http://ftp.de.debian.org/debian
Nun legt er los:
I: Retrieving Packages I: Validating Packages I: Resolving dependencies of required packages... I: Resolving dependencies of base packages... I: Checking component main on http://ftp.de.debian.org/debian... [...] I: Base system installed successfully.
Einloggen und nutzen des System
Wurde das System ohne Probleme installiert, so können wir uns dann über chroot auf dem System einloggen und es unabhängig vom Hauptsystem nutzen.
mount -t proc /proc /mnt/hdd/debian/proc LANG=C chroot /mnt/hdd/debian /bin/bash
USB-Geräte in Chroot-Umgebung
Um angeschlossene USB-Geräte innerhalb der Chroot-Umgebung ansteuern zu können, müssen wir uns diese zusätzlich Mounten. Zum Testen ob das Mounten erfolgreich war nutzen wir lsusb aus dem usbutils Paket von Debian.
mount -t usbfs usbfs /mnt/hdd/debian/proc/bus/usb
lsusb
Bus 5 Device 1: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 4 Device 2: ID 04d8:c002 Microchip Technology, Inc.
alle benötigten System zugänglich machen
Eventuell alle Geräte durch reichen, wenn man z.B. /dev/ttyUSB0 nutzen will. HowTo/AlixBoards - FunkFeuer
mount -o bind /dev /mnt/hdd/debian/dev mount -t proc proc /mnt/hdd/debian/proc mount -t sysfs sys /mnt/hdd/debian/sys
Laufwerk mounten
Will man nun noch auf die Festplatte des Hauptsystem zugreifen kann man mittels mount --bind die Festplatte einbinden. Achtung Symlinks kann man hier nicht benutzen. Vorteil von der bind Methode im Gegensatz zum normalen mount ist, dass auch auch auf Ordner verwiesen werden kann.
mount --bind /mnt/hdd/folder /mnt/hdd/debian/folder
Dienste und init-script
Zum Einfachen starten eines Programmes innerhalb des Debian System, kann dieses einfache Skript genutzt werden:
#!/bin/bash ROOT="/mnt/hdd/debian" echo "starting xxx in $ROOT"; mount -o bind /proc $ROOT/proc chroot $ROOT /bin/bash << EOF /mnt/xxx/xxxx.sh
Ebenso ein einfaches init-script:
#!/bin/bash
#
# Copyright (c) 2008 Kai Hildebrandt
#
# Authors: Kai Hildebrandt <kai.hildebrandt@web.de>
#
# /etc/init.d/debian-chroot
#
### BEGIN INIT INFO
# Provides: debian-chroot
# Required-Start: $local_fs $remote_fs $network
# Required-Stop: $local_fs $remote_fs $network
# Default-Start: 3 5
# Default-Stop: 0 1 2 6
# Short-Description: chrooted debian etch
# Description: Start a chrooted debian etch (spamassassin)
### END INIT INFO
ROOT="/srv/debian-chroot"
case "$1" in
start)
echo "starting chrooted debian system (spamassassin) in $ROOT";
mount -o bind /proc $ROOT/proc
chroot $ROOT /bin/bash << EOF
/etc/init.d/sysklogd start
/etc/init.d/spamassassin start
EOF
;;
stop)
echo "stopping chrooted debian system (spamassassin) in $ROOT";
chroot $ROOT /bin/bash << EOF
/etc/init.d/spamassassin stop
/etc/init.d/sysklogd stop
EOF
umount $ROOT/proc
;;
restart)
$0 stop
$0 start
esacLogs
debootstrap legt während der Installation eine Log Datei an.
/mnt/hdd/debian/var/log/bootstrap.log
Errors
Hier fehlte der Befehl ar. Die Installation endet bei Extracting x ...
zcat: stdin: unexpected end of file tar: This does not look like a tar archive tar: Exiting with failure status due to previous errors /usr/share/debootstrap/functions: line 734: ar: command not found