Ich habe einen Tarball, der viele Dateien mit Root:Root-Besitzer und/oder speziellen Geräte-Inodes enthält. cpio
akzeptiert nur Pfade, die im Dateisystem vorhanden sind, wenn es ein cpio-Archiv erstellt. Und ich möchte nicht sudo
müssen um tar in cpio umzuwandeln, während ich alle Berechtigungen, Eigentümer und speziellen Inodes beibehalten möchte.
Gibt es einen sauberen Weg, damit umzugehen?
EDIT1:
Ich glaube, dass fakeroot
kann als einigermaßen sauberer Weg angesehen werden. Es skaliert jedoch nicht wie erwartet – fast 1.000-facher Geschwindigkeitsunterschied:
[[email protected] root]$ ls -l ../fanbox.tar
-rw-rw-r-- 1 user user 56555520 May 22 03:33 ../fanbox.tar
[[email protected] root]$ time tar -x --delay-directory-restore -f ../fanbox.tar
tar: dev/null: Cannot mknod: Operation not permitted
tar: dev/random: Cannot mknod: Operation not permitted
tar: dev/urandom: Cannot mknod: Operation not permitted
tar: Exiting with failure status due to previous errors
real 0m0.255s
user 0m0.062s
sys 0m0.193s
[[email protected] root]$ rm -rf *
[[email protected] root]$ time fakeroot tar -x --delay-directory-restore -f ../fanbox.tar
real 3m49.381s
user 0m0.812s
sys 0m2.760s
[[email protected] root]$
Basierend auf der Ausgabe von time
Befehl Ich denke, es liegt an der Kommunikation zwischen fakeroot
und faked
.
Als Referenz, es gibt keinen großen Unterschied zwischen einem 2M-Tarball und einem 50M-Tarball, als ich fakeroot
geändert habe in sudo bash
in meinem Skript. Und ich glaube auch, dass das Problem die Anzahl der Dateien im Tarball ist, nicht die Größe:Ich habe das gleiche Skript auf einem ~10M-Tarball mit zwei 5M-Binärdateien verwendet, und das Skript ist nicht so langsam.
Akzeptierte Antwort:
Sie können fakeroot
verwenden . Wie der Name schon sagt, täuscht es den Root-Benutzer vor, indem es mehrere Syscalls mit einem LD_LIBRARY_PATH
abfängt /LD_PRELOAD
Bibliotheks-Wrapper, um den Prozess glauben zu lassen, dass er als Root ausgeführt wird. Dies wurde zum Erstellen und Packen von Anwendungen erstellt, ohne Root sein zu müssen, einschließlich der Verwendung von make install
was normalerweise als root ausgeführt wird. Es eignet sich besonders gut zum Erstellen von Archiven.
Dabei wird ein Fork-Daemon faked
wird ausgeführt, um sich an alle gefälschten Dateieigentumsrechte oder Informationen zu speziellen Dateien zu erinnern, von denen die untergeordneten Prozesse glauben, dass sie sie gemacht haben. Also müssen alle Operationen in der gleichen „Instanz“ durchgeführt werden, oder faked
verlässt und vergisst, woran es sich erinnert.
$ fakeroot
# tar xf ...
# find foo ... | cpio -o ...
# exit
$
Anderes Beispiel, das faked
zeigt Interaktion:
$ mknod /tmp/vaporware b 8 0
mknod: /tmp/vaporware: Operation not permitted
$ fakeroot
# mknod /tmp/vaporware b 8 0
# ls -l /tmp/vaporware
brw-r--r-- 1 root root 8, 0 May 18 08:33 /tmp/vaporware
# exit
$ ls -l /tmp/vaporware
-rw-r--r--. 1 user user 0 May 18 08:33 /tmp/vaporware