Einrichten einer CHROOT-Umgebung unter Debian Wheezy
Im Folgenden beschreibe ich, wie man unter Debian Wheezy eine CHROOT-Umgebung einrichten kann, die man z.B. zum Compilieren von Quellpaketen nutzt.
Wir schaffen die Voraussetzungen
Verwendetes System
System: Debian Wheezy Stand 12. September 2014 (amd64)
Shell: bash
Verwenden von 'sudo'
Aus Sicherheitsgründen arbeiten wir als normaler Benutzer und verschaffen uns Superuser-Rechte über 'sudo'.
Ob sudo für den aktuellen User eingerichtet ist, kann man so testen (die Passwortabfrage erfolgt in Abhängigkeit von den Systemeinstellungen):
$ sudo echo "Hallo"
[sudo] password for beispielbenutzer:
Hallo
So etwa sieht es aus, wenn es funktioniert, ansonsten wird hier eine Fehlermeldung angezeigt.
Wenn es nicht funktioniert, dann empfehle ich z.B. diesen Link.
Mitglied von der Gruppe 'staff' werden
Wir richten unsere CHROOT-Umgebung unter '/usr/local' ein. Dort hat die Gruppe 'staff' Schreibrechte.
Wir fügen daher unseren Benutzer dieser Gruppe hinzu:
sudo gpasswd -a $USER staff
Installieren der benötigten Tools
sudo apt-get install binutils debootstrap screen
Sonstiges
Damit wir diese Arbeiten auch auf entfernten Maschinen und/oder System ohne grafische Oberfläche durchführen können, erledigen wir alle Arbeiten auschließlich an der Konsole.
Nun fangen wir an
Umgebungsvariablen setzen
Um uns Tipparbeit zu ersparen und mögliche Fehlerquellen auszuschließen, sorgen wir dafür, dass uns die Umgebungsvariablen auch nach dem Wiedereinloggen zur Verfügung stehen.
mkdir -p ~/.bashrc.d # Verzeichnis anlegen
touch ~/.bashrc.d/placeholder.sh # Platzhalter
editor ~/.bashrc.d/setchrootenv.sh #Datei anlegen
In den nun geöffneten Editor kopieren wir folgenden Text und passen ihn nach unseren Wünschen an:
MYCHROOT_DIST="wheezy"
MYCHROOT_VARIANT=amd64
MYCHROOT_NAME="example2"
MYCHROOT_DEBOOTSTRAP_VARIANT="buildd"
MYCHROOT_BASE="/usr/local/src/build-chroot"
MYCHROOT_SECTIONS="main contrib non-free"
MYCHROOT_REPOS="http://ftp.de.debian.org/debian"
MYCHROOT_TARBALL="${MYCHROOT_BASE}/${MYCHROOT_DIST}-${MYCHROOT_VARIANT}-${MYCHROOT_DEBOOTSTRAP_VARIANT}.tgz"
MYCHROOT_PATH="${MYCHROOT_BASE}/${MYCHROOT_NAME}/${MYCHROOT_DIST}/${MYCHROOT_VARIANT}"
Getestest habe ich das Ganze allerdings nur mit den hier angezeigten Werten.
Dann speichern wir die Datei und beenden den Editor.
Das Folgende sorgt dafür, dass Dateien mit dem Muster ~/.bashrc.d/*.sh beim Einloggen in das System verarbeitet werden (wenn wir keine abweichende Shell nutzen).
echo -e "\
\n\
# Einlesen lokale Einstellungen\n\
if [ -d ~/.bashrc.d ]; then\n\
for i in ~/.bashrc.d/*.sh; do\n\
if [ -r \$i ]; then\n\
. \$i\n\
fi\n\
done\n\
unset i\n\
fi\n\
" >> ~/.bashrc
Dannach loggen wir uns aus und wieder ein.
Einrichten der CHROOT-Umgebung
Umgebungsvariablen gesetzt?
Wir testen zunächst, ob unsere Umgebungsvariablen korrekt gesetzt sind:
set | grep MYCHROOT
Nun sollten unsere gesetzen Werte ausgeben werden:
MYCHROOT_BASE=/usr/local/src/build-chroot
MYCHROOT_DEBOOTSTRAP_VARIANT=buildd
MYCHROOT_DIST=wheezy
MYCHROOT_NAME=example2
MYCHROOT_PATH=/usr/local/src/build-chroot/example2/wheezy/amd64
MYCHROOT_REPOS=http://ftp.de.debian.org/debian
MYCHROOT_SECTIONS='main contrib non-free'
MYCHROOT_TARBALL=/usr/local/src/build-chroot/wheezy-amd64-buildd.tgz
MYCHROOT_VARIANT=amd64
Nur wenn alles OK ist, machen wir weiter, ansonsten heißt es Fehlersuche!
Zur Sache - wir legen die CHROOT-Umgebung an!
# Basis-Verzeichnis anlegen, wenn noch nicht vorhanden
sudo mkdir -p ${MYCHROOT_PATH}
# verwenden von 'tarball', um bei Wiederholung nicht nochmals alle Pakete laden zu muessen
# - Die folgende Zeile setzt die Variable MYCHROOT_TARBALL_PARAM, die wir in der nächsten Zeile verwenden
test -f ${MYCHROOT_TARBALL} && tar tfz ${MYCHROOT_TARBALL} 2> /dev/null > /dev/null && MYCHROOT_TARBALL_PARAM="--unpack-tarball=${MYCHROOT_TARBALL}" || MYCHROOT_TARBALL_PARAM="--make-tarball=${MYCHROOT_TARBALL}"
# chroot installieren
sudo debootstrap ${MYCHROOT_TARBALL_PARAM} --variant=${MYCHROOT_DEBOOTSTRAP_VARIANT} --arch ${MYCHROOT_VARIANT} ${MYCHROOT_DIST} ${MYCHROOT_PATH} ${MYCHROOT_REPOS}
Nun werden die Pakete installiert. Wenn vorhanden, wird der in einem vorherigen Lauf angelegte Tarball verwendet, ansonsten wird einer angelegt. Diese Zeilen müssen zwei Mal ausgeführt werden, damit der zuerst erstelle Tarbal beim nächsten Mal entpackt werden kann.
'fstab' des Echtsystems bearbeiten:
Damit die CHROOT-Umgebung korrekt funktioniert, müssen wir Subsysteme/Verzeichnisse des Echtsystems verwenden. Wir fügen hierfür ein paar Einträge in der 'fstab' des Echtsystems hinzu.
# Im Echtsystem Sicherheitskopie von fstab anlegen
sudo cp -a /etc/fstab /etc/fstab.sav
# Mount-Einstellungen fuer fstab festlegen
myfstab_settings="\
/dev ${MYCHROOT_PATH}/dev auto bind 0 0 #entry for ${MYCHROOT_NAME}\n\
/dev/pts ${MYCHROOT_PATH}/dev/pts auto bind 0 0 #entry for ${MYCHROOT_NAME}\n\
/proc ${MYCHROOT_PATH}/proc auto bind 0 0 #entry for ${MYCHROOT_NAME}\n\
"
# - ggfs noch Installationsverzeichnis in die Testumgebung haengen, um Kopierarbeit zu sparen
# In diesem Beispiel gehen wir davon aus, dass dies '/opt' ist.
# Achtung: in diesem Verzeichnis vorhandene Dateien im ECHTSYSTEM werden in diesem Fall ueberschrieben!
myfstab_settings="${myfstab_settings}/opt ${MYCHROOT_PATH}/opt auto bind 0 0 #entry for ${MYCHROOT_NAME}\n"
# - in die fstab schreiben
echo -e ${myfstab_settings} | sudo tee -a /etc/fstab > /dev/null
# anwenden
sudo mount -a
Fertigstellen der CHROOT-Umgebung
# Paketquellen festlegen
echo -e "#\n# /etc/apt/sources.list\n#\n\n\n#\n# ${MYCHROOT_DIST}\ndeb ${MYCHROOT_REPOS}/ ${MYCHROOT_DIST} ${MYCHROOT_SECTIONS}\ndeb-src ${MYCHROOT_REPOS}/ ${MYCHROOT_DIST} ${MYCHROOT_SECTIONS}\n\n#\n# Security updates\n#\ndeb security.debian.org ${MYCHROOT_DIST}/updates ${MYCHROOT_SECTIONS}\ndeb-src security.debian.org ${MYCHROOT_DIST}/updates ${MYCHROOT_SECTIONS}" | sudo tee ${MYCHROOT_PATH}/etc/apt/sources.list > /dev/null
# Das Folgende soll verhindern, dass vom System versucht wird, Daemon-Prozesse innerhalb der CHROOT-Umgebung neu zu starten:
echo -e "##/bin/sh\nexit 101" | sed 's/^##/#!/g' | sudo tee ${MYCHROOT_PATH}/usr/sbin/policy-rc.d > /dev/null
# Paketquellen einlesen
sudo chroot ${MYCHROOT_PATH} apt-get update
# System aktualisieren
sudo chroot ${MYCHROOT_PATH} apt-get upgrade
# Wo sind wir? - Ausgabe '/'
sudo chroot ${MYCHROOT_PATH} pwd
# Wer sind wir? - Ausgabe 'root'
sudo chroot ${MYCHROOT_PATH} whoami
# Workarround für Bug #685034 [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=685034]
sudo chroot ${MYCHROOT_PATH} dpkg-divert --divert /usr/bin/ischroot.debianutils --rename /usr/bin/ischroot
sudo chroot ${MYCHROOT_PATH} ln -s /bin/true /usr/bin/ischroot
# Einige Tools installieren
sudo chroot ${MYCHROOT_PATH} apt-get install vim-nox mc less wget
# aufraeumen
sudo chroot ${MYCHROOT_PATH} apt-get clean
Arbeiten mit der CHROOT-Umgebung
# Wechseln in die CHROOT-Umgebung
sudo chroot ${MYCHROOT_PATH} /bin/bash
# Ausgabe: '/': '/'
pwd
# Ausgabe: 'root'
whoami
Aufräumen
Wenn wir die CHROOT-Umgebung irgendwann nicht mehr brauchen, sollte sie sauber entfernt werden. Bloß nicht einfach löschen, denn dann löschen wir unter Umständen Teile unseres Echtsystems!
Aushängen in umgekehrter Reihenfolge
grep "#entry for ${MYCHROOT_NAME}" /etc/fstab | cut -f2 -d' ' | tac | while read x; do sudo umount "${x}"; done
Entfernen der fstab-Einträge
# Noch eine Sicherheitskopie
sudo cp -a /etc/fstab /etc/fstab.sav2
# Testlauf
sed "/#entry for ${MYCHROOT_NAME}$/d" /etc/fstab
# Echtlauf
sudo sed -i "/#entry for ${MYCHROOT_NAME}$/d" /etc/fstab
Löschen der CHROOT-Umgebung
# Testlauf - Alles richtig, stimmt der Pfad?
echo sudo rm -rf "${MYCHROOT_PATH}"
# Echtlauf - Vorsicht
sudo rm -rf "${MYCHROOT_PATH}"
Skript zum Setzen der Umgebungsvariablen deaktivieren
mv ~/.bashrc.d/setchrootenv.sh ~/.bashrc.d/setchrootenv.sh.disabled
Nun loggen wir uns neu ein und prüfen, ob die Umgebungsvariablen noch gesetzt sind.
set | grep MYCHROOT
Diesmal sollte das Ergebnis leer sein.