Linux im chroot-Container installieren
Inhalt
- Einleitung
- Beispiel: Installation von Debian Sarge
- Beispiel: Installation einer Live-CD
- Container-Startskript
- X im Container starten
- 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¹
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²
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
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/X11Der 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
- Debian GNU/Linux von einem anderen Unix/Linux-System aus installieren
- Setting up a Debian chroot under Red Hat
- Debian Reference: 8.6.35 chroot