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.
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.
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.
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