fakeroot(1) | Debian-Handbuch | fakeroot(1) |
fakeroot - einen Befehl zur Dateimanipulation in einer Umgebung mit fingierten Root-Rechten ausführen
fakeroot [-l|--lib Bibliothek] [--faked fingiertes_Programm] [-i zu_ladende_Datei] [-s zu_speichernde_Datei] [-u|--unknown-is-real ] [-b|--fd-base ] [-h|--help ] [-v|--version ] [--] [Befehl]
fakeroot führt einen Befehl in einer Umgebung aus, in der es scheint, als habe er Root-Rechte zur Dateimanipulation. Auf diese Weise können einfache Benutzer Archive (tar, ar, .deb etc.) erstellen, welche Dateien enthalten, die Root-Rechte haben/Root gehören. Ohne fakeroot wären Root-Rechte nötig, um die einzelnen Dateien des Archivs mit den korrekten Zugriffs- und Besitzrechten zu erstellen und sie einzuhüllen oder diese Archive müssten direkt, ohne Benutzung des Archivierungsprogramms, erstellt werden.
Die Funktionsweise von fakeroot besteht darin, die Bibiliotheken zur Dateimanipulation (chmod(2), stat(2) etc.) durch solche zu ersetzen, die sich so verhalten als ob der Benutzer Root wäre. Diese Wrapper-Funktionen liegen in einer Laufzeit-Bibliothek /usr/lib/libfakeroot.so* bzw. an dem entsprechenden Speicherort auf Ihrer Plattform. Das gemeinsame Objekt wird durch den LD_PRELOAD-Mechanismus des dynamischen Ladeprogramms geladen. (Siehe ld.so(8))
Falls Sie beabsichtigen, Pakete mit fakeroot zu bauen, versuchen Sie bitte zuerst, das fakeroot-Paket zu bauen: Der Abschnitt »debian/rules build« enthält ein paar Tests (meist wird getestet, ob Fehler in alten fakeroot-Versionen vorliegen). Falls diese Tests fehlschlagen (zum Beispiel, weil Sie bestimmte libc5-Programme auf Ihrem System haben), wird der Bau anderer Pakete mit fakeroot ziemlich wahrscheinlich ebenfalls scheitern, aber möglicherweise auf subtilere Art.
Beachten Sie außerdem, dass es am Besten ist, nicht den Bau der Pakete selbst unter fakeroot vorzunehmen. Insbsondere mögen es »configure« und Co. nicht, wenn sich das System plötzlich anders als von ihnen erwartet verhält (oder sie löschen den Inhalt einiger Umgebungsvariablen, die fakeroot benötigt).
Hier folgt eine Beispielsitzung mit fakeroot. Beachten Sie, dass innerhalb der fingierten Root-Umgebung eine Dateimanipulation, die Root-Rechte erfordert, erfolgreich ist, obwohl sie nicht wirklich stattfindet.
$ whoami joost $ fakeroot /bin/bash # whoami root # mknod hda3 b 3 1 # ls -ld hda3 brw-r--r-- 1 root root 3, 1 Jul 2 22:58 hda3 # chown joost:root hda3 # ls -ld hda3 brw-r--r-- 1 joost root 3, 1 Jul 2 22:58 hda3 # ls -ld / drwxr-xr-x 20 root root 1024 Jun 17 21:50 / # chown joost:users / # chmod a+w / # ls -ld / drwxrwxrwx 20 joost users 1024 Jun 17 21:50 / # exit $ ls -ld / drwxr-xr-x 20 root root 1024 Jun 17 21:50 // $ ls -ld hda3 -rw-r--r-- 1 joost users 0 Jul 2 22:58 hda3
In Wirklichkeit geschieht nur das, was Benutzer joost sowieso tun könnte.
fakeroot wurde vor allem geschrieben, um es Benutzern zu ermöglichen, Debian-GNU/Linux-Pakete (im deb(5)-Format) zu erstellen, ohne ihnen Root-Rechte zu geben. Dies kann durch Befehle wie dpkg-buildpackage -rfakeroot oder debuild -rfakeroot erledigt werden (tatsächlich ist -rfakeroot heutzutage in debuild Vorgabe, so dass Sie dieses Argument nicht benötigen).
fakeroot ist ein normales nicht-setuid-Programm. Es erweitert weder die Benutzerrechte, noch vermindert es die Sicherheit des Systems.
/usr/lib/libfakeroot/libfakeroot.so* – die Laufzeit-Bibliothek, welche die Wrapper-Funktionen enthält.
touch foo fakeroot ls -al foo
oder andersherum
fakeroot touch foo ls -al foo
ausführt, hat fakeroot im ersten Fall keine Möglichkeit zu wissen, dass der Benutzer von foo wirklich joost sein soll, während es im zweiten Fall root gewesen sein soll. Für die Debian-Paketierung ist es immer in Ordnung, allen »unbekannten« Dateien uid=gid=0 zu geben. Der wahre Weg, das zu umgehen ist, open() und create() einzuhüllen, aber es erzeugt neue Probleme, wie vom Paket libtricks gezeigt wird. Dieses Paket hüllte viel mehr Funktionen ein und versuchte viel mehr als fakeroot zu tun. Es stellte sich heraus, dass ein unbedeutendes Upgrade von libc (von einer, in der die Funktion stat() open() nicht nutzte, zu einer mit einer stat()-Funktion, die (in einigen Fällen) open() benutzte), unerklärbare Speicherzugriffsfehler verursachen würde (das heißt, das libc6-stat() ruft das eingehüllte open() auf, das dann libc6-stat() aufrufen würde, etc). Das Beheben war alles andere als einfach, aber einmal behoben, war es nur eine Frage der Zeit, bevor eine andere Funktion begann, open() zu benutzen, ganz zu schweigen vom Versuch, es auf andere Betriebssysteme zu portieren. Daher wurde entschieden, die Anzahl der von fakeroot eingehüllten Funktionen so klein wie möglich zu halten, um die Wahrscheinlichkeit von »Zusammenstößen« so gering wie möglich zu halten.
Es hüllt open() nicht ein. Das ist an sich nicht schlecht, aber falls ein Programm open("Datei", O_WRONLY, 000) aufruft, in die Datei »Datei« schreibt, sie schließt und dann erneut versucht, die Datei zum Lesen zu öffnen, schlägt das Öffnen fehl, da der Modus der Datei 000 sein wird. Der Fehler liegt darin, dass, falls Root das Gleiche tut, open() erfolgreich sein wird, da die Dateirechte für Root überhaupt nicht geprüft werden. Es wurde entschieden, open() nicht einzuhüllen, da open() von vielen anderen Funktionen in libc benutzt wird (auch von jenen, die bereits eingehüllt sind), wodurch Schleifen erzeugt werden (oder möglicherweise zukünftige Schleifen, wenn die Implementierung verschiedener libc-Funktionen sich ein wenig ändert).
fakeroot wird unter den Bedingungen der GNU General Public License (GPL 2.0 oder höher) weitergegeben.
Übersetzung bei Chris Leick <debian-l10n-german@lists.debian.org>
größtenteils von J.H.M. Dassen <jdassen@debian.org>. Ziemlich viele Veränderungen/Zusätze von Joost und Clint.
, faked(1), debuild(1), dpkg-buildpackage(1), /usr/share/doc/fakeroot/DEBUG
5. Oktober 2014 | Debian-Projekt |