GästebuchIhr Eintrag in unser Gästebuch KontaktNehmen Sie Kontakt mit den Autoren auf ArchivAlle Unixwerk- Artikel seit 2003
9. März 2007

Linux im chroot-Container installieren

Inhalt

  1. Einleitung
  2. Beispiel: Installation von Debian Sarge
  3. Beispiel: Installation einer Live-CD
  4. Container-Startskript
  5. X im Container starten
  6. Weiterführende Informationen

1. Einleitung

Die Auswahl an Linux-Distributionen ist nicht eben klein. Distrowatch zählt zur Zeit so an die 350 Linux-Distributionen. Die ein oder andere würde man sich schon gerne mal anschauen. Doch wer möchte deshalb schon seine Lieblingsdistribution von der Platte fegen?

In diesem Artikel geht es darum, wie man eine andere Distribution mit ein paar Tricks in einem eigenen Container innerhalb eines bestehenden Linux (im folgenden Host genannt) installieren kann. Als Beispiel werden ein Debian und eine Live-CD auf einem bestehenden Slackware-System installiert. Das Verfahren lässt sich leicht auf andere Distributionen übertragen.

2. Beispiel: Installation von Debian Sarge

Debian stellt einen Sonderfall dar, da Debian selbst für die Installation weiterer Debian-Instanzen in chroot-Umgebungen bereits vorbereitet ist. Die Installation wird mit «debootstrap» durchgeführt.

Wenn Sie Zugang zu einem Debian-System haben oder der Host selbst gar ein Debian basiertes System ist, können Sie «debootstrap» mit «apt» installieren. Im folgenden Beispiel erzeugen wir auf dem Debian-System «debootstrap» als Slackware-Paket:

debian# apt-get install debootstrap
debian# cd /var/cache/apt/archives
debian# alien -t debootstrap_0.2.45-0.2_i386.deb 
debian# mv debootstrap-0.2.45.tgz debootstrap-0.2.45-i486-1.tgz

Steht Ihnen kein Debian-System zur Verfügung, besorgen Sie sich «debootstrap_0.2.45-0.2_i386.deb» z.B. von rpmseek und entpacken es mit Linux-Bordmitteln:

host# mv debootstrap_0.2.45-0.2_i386.deb /tmp
host# cd /tmp
host# ar x debootstrap_0.2.45-0.2_i386.deb
host# mv data.tar.gz debootstrap-0.2.45-i486-1.tgz
host# installpkg debootstrap-0.2.45-i486-1.tgz¹
¹Das Beispiel bezieht sich auf Slackware. Unter anderen Distributionen benutzen Sie statt «installpkg» einfach «tar»: tar xzf data.tar.gz -C /

Unser Debian Container soll unter /home/debian liegen:

host# debootstrap sarge /home/debian
             .
             . 
             .
I: Base system installed successfully.

Damit es mit dem Internet klappt, benötigen wir ein paar Dateien unter /etc vom Wirt:

host# cp /etc/resolv.conf /home/debian/etc
host# cp /etc/hosts /home/debian/etc
host# cp /etc/X11/xorg.conf /home/debian/etc/X11/xfree86.conf

Nun können wir den Container starten - den Start werden wir noch in ein Skript verpacken. Doch für den ersten Test und die nötigen Anpassungen im Container reicht erstmal ein

host# chroot /home/debian su -

Nun finden wir uns im Debian-Container wieder. Ein paar Dinge wollen wir hier anpassen:

chroot-debian# vi /etc/debian_chroot

SARGE

chroot-debian# vi /root/.bashrc

# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "$debian_chroot" -a -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi

# set a fancy prompt (non-color)
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

Um die apt-Quellen zu erstellen starten wir

chroot-debian# apt-setup

Gegebenfalls wollen wir die apt-Quellen noch auf den richtigen Zweig, z.B. «sarge», zeigen lassen. Dazu passen wir /etc/apt/sources.list an:

chroot-debian# vi /etc/apt/sources.list
deb http://ftp2.de.debian.org/debian/ sarge main
deb-src http://ftp2.de.debian.org/debian/ sarge main

deb http://security.debian.org/ sarge/updates main

und aktualisieren die apt-Datenbank:

chroot-debian# apt-get update

Damit wir im Container Kommandos wie «df» und «mount» sinnvoll verwenden können, erstellen wir die Datei /etc/mtab mit folgendem Inhalt:

chroot-debian# vi /etc/mtab
tmpfs / tmpfs rw 0 0
proc /proc proc rw 0 0
sysfs /sys sysfs rw 0 0

Da beim Starten des Containers alle die Initialisierungen, die normalerweise durch den Bootprozess durchgeführt werden, übergangen werden, verankern wir im Container ein Startskript. Dieses Startskript wird beim Containerstart chroot übergeben (anstelle von su -):

chroot-debian# vi /root/cstart
#!/bin/bash

startuser=${1:-root}

# mount /dev/pts
df | grep -w devpts > /dev/null 2>&1
if [ "$?" = "0" ]; then
  mount -n devpts
else
  mount | grep -w devpts > /dev/null 2>&1
  [ "$?" = "0" ] || mount devpts
fi

# start shell
exec su - $startuser

chroot-debian# chmod +x /root/cstart

Das wär's. Nach dem nächsten Containerstart können wir wie auf einem nativen Debian-System schalten und walten.

3. Beispiel: Installation einer Live-CD

Als Live-CD stand mir back|track zur Verfügung. back|track baut auf SLAX auf.

Aufgrund des speziellen Dateisystems, das Live-CDs im Allgemeinen verwenden, gestaltet sich die Installation etwas ungewöhnlich. So können wir die CD nicht einfach ins Dateisystem hängen und die Daten mit «tar» in ein Verzeichnis kopieren, stattdessen müssen wir tatsächlich zunächst von der CD booten. Doch bevor wir dies tun, finden wir zunächst die Partition heraus, auf der unser Zielverzeichnis /home liegt, z.B.:

host# df /home
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/hda6               224576     44692    179884  20% /home²
²Sehen Sie hier einen /, liegt /home nicht in einer eigenen Partition. Das müssen Sie beim Kopieren später beachten

Nun booten wir die Live-CD....

Nach der Anmeldung im Livesystem müssen wir unser Zielverzeichnis /home zunächst unter den eingehängten Verzeichnissen identifizieren. Gegebenfalls müssen wir die /home-Partition selbst einhängen.

back|track hängt alle Festplattenpartitionen unter /mnt ein, so dass unser /home nun /mnt/hda6³ heißt.

Zunächst legen wir den Container an

live-cd# mkdir /mnt/hda6/slax 

Wir kopieren die Daten und legen einige wichtige Verzeichnisse im Container an:

live-cd# cp --preserve -R /{bin,dev,etc,home,lib,root,sbin,usr,var,opt,pentest} /mnt/hda6/slax
live-cd# mkdir /mnt/hda6/slax/{boot,mnt,proc,sys,tmp}
live-cd# cp /boot/boot/vmlinuz /mnt/hda6/slax/boot
³Liegt Ihr /home nicht in einer eigenen Partition (s.o.), müssen Sie in den obigen Beispielen statt /mnt/hda6 immer/mnt/hda6/home setzen!

Haben wir dies geschafft, booten wir wieder von Platte in unser Host-System und kopieren die nötigen Dateien aus /etc in den neu geschaffenen Container:

host# cp /etc/resolv.conf /home/slax/etc
host# cp /etc/hosts /home/slax/etc

Nun sind wir soweit, dass wir den Container starten können. Zunächst einmal ohne Skript einfach mit

host# chroot /home/slax su -
Schon finden wir uns im Container wieder. Dort passen wir in der Datei .bashrc den Prompt so an, dass wir immer gleich erkennen, dass wir uns im Container bewegen:

chroot-slax# vi /root/.bashrc
PS1='(SLAX)\[\033[01;31m\]\h\[\033[00m\]:\[\033[01;34m\]\w\$ \[\033[00m\]'

Damit wir im Container Kommandos wie «df» und «mount» sinnvoll verwenden können, erstellen wir die Datei /etc/mtab mit folgendem Inhalt:

chroot-slax# vi /etc/mtab
tmpfs / tmpfs rw 0 0
proc /proc proc rw 0 0
sysfs /sys sysfs rw 0 0

Da beim Starten des Containers alle die Initialisierungen, die normalerweise durch den Bootprozess durchgeführt werden, übergangen werden, verankern wir im Container ein Startskript. Dieses Startskript wird beim Containerstart chroot übergeben (anstelle von su -):

chroot-slax# vi /root/cstart
#!/bin/bash

startuser=${1:-root}

# mount /dev/pts
df | grep -w devpts > /dev/null 2>&1
if [ "$?" = "0" ]; then
  mount -n devpts
else
  mount | grep -w devpts > /dev/null 2>&1
  [ "$?" = "0" ] || mount devpts
fi

# start shell
exec su - $startuser

chroot-slax# chmod +x /root/cstart

Das wär's.

4. Container Startskripts

Wir erstellen das Startskript für die Container auf dem Host:

host# vi /usr/local/sbin/start_container
#!/bin/bash

cntroot=/home
cntuser=${2:-root}
container=${1:-debian}

mount | grep ${cntroot}/${container}/dev > /dev/null 2>&1
[ "$?" = "0" ]  || mount -o rw,bind /dev/ ${cntroot}/${container}/dev

mount | grep ${cntroot}/${container}/proc > /dev/null 2>&1
[ "$?" = "0" ]  || mount -t proc proc\($container\) ${cntroot}/${container}/proc

grep -w sysfs ${cntroot}/${container}/etc/mtab > /dev/null 2>&1
if [ "$?" = "0" ]
then
  mount | grep ${cntroot}/${container}/sys > /dev/null 2>&1
  [ "$?" = "0" ]  || mount -t sysfs sysfs\($container\) ${cntroot}/${container}/sys
fi

exec chroot ${cntroot}/${container} /root/cstart ${cntuser}

Container lassen sich jetzt mit dem Kommando

start_container [ <Container> [<Benutzer>] ]
starten. Durch das Skript werden auf dem Host automatisch einige Mounts durchgeführt, die dem Container ermöglichen auf /dev und /proc zuzugreifen. Wenn beide Container gestartet wurden, sehen wir auf dem Host-System die folgenden sechs neuen Mounts:

/dev on /home/debian/dev type none (rw,bind)
proc(debian) on /home/debian/proc type proc (rw)
sysfs(debian) /mnt/debian/sys sysfs rw 0 0
/dev on /home/slax/dev type none (rw,bind)
proc(slax) on /home/slax/proc type proc (rw)
sysfs(slax) on /mnt/slax/sys type sysfs (rw)

5. X im Container starten

Bislang haben wir nichts weiter als eine Shell im Container. Doch will man sich eine neue Distribution einmal wirklich anschauen, will man natürlich auch die neuesten Desktop-Features sehen - wir wollen also X im Container starten. Das ist viel einfacher als man zunächst glauben mag...

Zunächst einmal brauchen wir eine gültige Konfigurationsdatei - diese können wir mit den distributionseigenen Werkzeugen erstellen oder aber einfach von unserem Host, auf dem X ja schon wunderbar konfiguriert ist, kopieren - wie dies im Beispiel Debian bereits gemacht wurde (2. Beispiel: Installation von Debian Sarge).

host# cp /etc/X11/xorg.conf /home/container/etc/X11
Der Start gestaltet sich dann sehr einfach. Im Debian- aber auch im openSUSE-Container starten Sie einfach

container# kdm

und schon können Sie sich auf vt8 ganz normal anmelden.

Unter back|track starten Sie X mit dem Befehl

chroot-slax# gui

wie von der Live-CD aus auch. Damit es klappt, musste ich allerdings in der Datei /usr/X11R6/lib/X11/xinit/xinitrc in der letzen Zeile den vollen Pfad zu startkde angeben:

chroot-slax# vi /usr/X11R6/lib/X11/xinit/xinitrc
             .
             . 
             .
# Start the window manager:
/opt/kde/bin/startkde

6. Weiterführende Informationen