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