Debian mit debootstrap in fremdes Linux-System (IPFire) einbinden

Mo, 25.01.2010 - 17:57 -- Daniel Espendiller

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
esac

Logs

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