I2P in einer chroot-Umgebung betreiben

Untenstehend soll erklärt werden, wie man I2P in einer chroot-Umgebung betreibt. Momentan teste ich das und schreibe die Schritte auf. Wer es probieren wil, sollte daher extrem vorsichtig sein. Denn es könnte vieles schief gehen.

Vorbereitung der chroot-Umgebung

Zunächst muss die Umgebung entsprechend eingerichtet werden, d.h. eine Verzeichnisstruktur ähnlich der unten / anzutreffenden wird in einem Unterverzeichnis eingerichtet. Du musst dir daher zunächst Gedanken machen, wo deine chroot-Umgebung liegen soll. Ich habe mich im Beispiel für das Verzeichnis /mnt/i2p-chroot entschieden. Neben den Verzeichnissen sind bestimmte Gerätedateien sowie das Verzeichnis proc wichtig.

mkdir -p /mnt/i2p-chroot
mkdir -p /mnt/i2p-chroot{bin,dev,etc,lib,proc,tmp,var}
chmod 1777 tmp
mount -t proc proc /mnt/i2p-chroot/proc
mknod /mnt/i2p-chroot/dev/null c 1 3
mknod /mnt/i2p-chrootdev/random c 1 8
mknod /mnt/i2p-chroot/dev/urandom c 1 9

Im nächsten Schritt wird dann die Bash bzw. die dash in die chroot-Umgebung kopiert. Das Programm ist dynamisch gelinkt, d.h. neben der eigentlichen ausführbaren Datei werden weitere Bibliotheken eingebunden. Welche das sind, lässt sich mit dem Befehl ldd herausfinden. Die so angezeigten Dateien werden in die entsprechenden Verzeichnisse in der chroot-Umgebung kopiert. Eventuell müssen vorher Unterverzeichnisse angelegt werden. Vorsicht: Viele der Bibliotheken sind nur symbolische Links. Daher solltet ihr darauf achten, auch die wirkliche Datei zu kopieren.

cp -a /bin/{,ba,da}sh /mnt/i2p-chroot/bin
ldd /bin/bash
        linux-gate.so.1 =>  (0xffffe000)
        libncurses.so.5 => /lib/libncurses.so.5 (0xb774e000)
        libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb774a000)
        libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7603000)
        /lib/ld-linux.so.2 (0xb778d000)
cp -a /lib/libncurses.so.5* /mnt/i2p-chroot/lib
mkdir -p /mnt/i2p-chroot/lib/i686/cmov
cp -a /lib/i686/cmov/lib{dl*,c-*,c.*} /mnt/i2p-chroot/lib/i686/cmov
cp -a /lib/ld-* /mnt/i2p-chroot/lib
chroot /mnt/i2p-chroot/

Der letzte Befehl sollte in die Umgebung wechseln. Jetzt kannst du vorerst mit der bash arbeiten.

Anpassung der Java-Umgebung

Ich verwende das OpenJDK als Debianpaket. Das kann von der Paketseite heruntergeladen werden. Ein anderer Weg sind die folgenden Befehle. Hierfür ist eine Debianinstallation notwendig. Die Option -t unstable kann eventuell weggelassen oder an deine Debianversion angepasst werden.

DOWNLOADURI=`apt-get -qq --reinstall --print-uris -y -t unstable\
 install openjdk-6-jre-headless | sed "s/'//g" | awk '{ print $1 }'`
cd /tmp
wget $DOWNLOADURI

Dann befindet sich im Verzeichnis eine Datei mit der Endung .deb. Diese kann mit dem Befehl

ar x openjdk-6-jre-headless*.deb

entpackt werden (ar steckt in den GNU Binutils). Der Inhalt des Paketes besteht aus zwei Dateien, control.tar.gz, data.tar.gz und debian-binary. Die Datei data.tar.gz enthält die wichtigen Dateien und wird mittels

tar xfz data.tar.gz

entpackt.

Im Verzeichnis /tmp befindet sich nun eine lokale Struktur wie in der Dateiliste. Wer einfach haben will, kann die Dateien aus dem Unterverzeichnis /usr/lib in das Verzeichnis /mnt/i2p-chroot/ kopieren. Dann liegen alle Dateien innerhalb der chroot-Umgebung und man spart sich das untenstehende manuelle Suchen der Dateien.

Manuelle Suche der benötigten Dateien

Ich will aber nur unbedingt notwendige Dateien im chroot haben. Daher beginnt jetzt etwas Detektivarbeit. Zuerst ist die ausführbare Datei sowie die dynamischen Bibliotheken ins chroot zu kopieren.

mkdir -p /mnt/i2p-chroot/usr/lib/jvm/java-6-openjdk/jre/bin/
cp -a /tmp/openjdk/usr/lib/jvm/java-6-openjdk/jre/bin/java /mnt/i2p-chroot/usr/lib/jvm/java-6-openjdk/jre/bin/
ldd /tmp/openjdk/usr/lib/jvm/java-6-openjdk/jre/bin/java
        linux-gate.so.1 =>  (0xffffe000)
        libz.so.1 => /usr/lib/libz.so.1 (0xb7791000)
        libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb7778000)
        libjli.so => /tmp/openjdk/./usr/lib/jvm/java-6-openjdk/jre/bin/../lib/i386/jli/libjli.so (0xb7774000)
        libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7770000)
        libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7629000)
        /lib/ld-linux.so.2 (0xb77ad000)
        libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb760b000)
cp -a /usr/lib/libz.so.1* /mnt/i2p-chroot/usr/lib
mkdir -p /mnt/i2p-chroot/lib/i686/cmov
cp -a /lib/i686/cmov/libpthread* /mnt/i2p-chroot/lib/i686/cmov
mkdir -p /mnt/i2p-chroot/usr/lib/jvm/java-6-openjdk/jre/lib/i386/jli
cp -a /tmp/openjdk/usr/lib/jvm/java-6-openjdk/jre/lib/i386/jli/libjli.so /mnt/i2p-chroot/usr/lib/jvm/java-6-openjdk/jre/lib/i386/jli
cp -a /lib/libgcc_s.so.1 /mnt/i2p-chroot/lib

Nun kann das Programm java in der chroot-Umgebung aufgerufen werden. Dabei sollte immer die Option -version mit angegeben werden. Ein Aufruf ohne Option ergibt andere, irreführende Fehlermeldungen. Mit der obigen Option erscheint folgende Meldung.

usr/lib/jvm/java-6-openjdk/jre/bin/java -version
Error: could not find libjava.so
Error: could not find Java 2 Runtime Environment.

Das heißt, die libjava.so muss ebenfalls kopiert werden.

cp -a /tmp/openjdk/usr/lib/jvm/java-6-openjdk/jre/lib/i386/libjava.so /mnt/i2p-chroot/usr/lib/jvm/java-6-openjdk/jre/lib/i386

Weiteres Aufrufen der Datei bringt dann Hinweise auf weitere fehlende Bibliotheken.

cp -a /tmp/openjdk/usr/lib/jvm/java-6-openjdk/jre/lib/i386/jvm.cfg-default /mnt/i2p-chroot/usr/lib/jvm/java-6-openjdk/jre/lib/i386
mkdir -p /mnt/i2p-chroot/usr/lib/jvm/java-6-openjdk/jre/lib/i386/server/
cp -a /tmp/openjdk/usr/lib/jvm/java-6-openjdk/jre/lib/i386/server/libjvm.so /mnt/i2p-chroot/usr/lib/jvm/java-6-openjdk/jre/lib/i386/server/
cp -a /tmp/openjdk/usr/lib/jvm/java-6-openjdk/jre/lib/i386/libverify.so /mnt/i2p-chroot/usr/lib/jvm/java-6-openjdk/jre/lib/i386/
mkdir /mnt/i2p-chroot/usr/lib/jvm/java-6-openjdk/jre/lib/i386/native_threads
cp -a /tmp/openjdk/usr/lib/jvm/java-6-openjdk/jre/lib/i386/native_threads/libhpi.so /mnt/i2p-chroot/usr/lib/jvm/java-6-openjdk/jre/lib/i386/native_threads
cp -a /tmp/openjdk/usr/lib/jvm/java-6-openjdk/jre/lib/i386/libzip.so /mnt/i2p-chroot/usr/lib/jvm/java-6-openjdk/jre/lib/i386

Wenn nun die ausführbare Datei erneut aufgerufen wird, so ergibt sich ein Fehler, der nicht ohne weiteres zu klären ist.

usr/lib/jvm/java-6-openjdk/jre/bin/java        
Error occurred during initialization of VM
java/lang/NoClassDefFoundError: java/lang/Object

Quellen

Weblinks

 
i2p/chroot.txt · Zuletzt geändert: 2010/03/19 21:34 von Jens Kubieziel
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki