Ho un tarball contenente molti file con root:root owner e/o inode speciali del dispositivo. cpio
accetta solo percorsi esistenti nel file system durante la creazione di un archivio cpio. E non voglio dover sudo
per trasformare tar in cpio, mentre voglio preservare tutti i permessi, i proprietari e gli inode speciali.
C'è un modo pulito per gestirlo?
EDIT1:
Credo che fakeroot
può essere visto come un modo un po' pulito. Tuttavia non si ridimensiona come previsto:una differenza di velocità di quasi 1.000 volte:
[[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]$
Basato sull'output di time
comando Immagino sia dovuto alla comunicazione tra fakeroot
e faked
.
Per riferimento, non c'è molta differenza tra un tarball da 2M e un tarball da 50M quando ho cambiato fakeroot
in sudo bash
nel mio copione. E credo anche che il problema sia il numero di file nel tarball, non la dimensione:ho usato lo stesso script su un tarball da ~10M con due binari da 5M e lo script non è così lento.
Risposta accettata:
Puoi usare fakeroot
. Come dice il nome, falsifica l'utente root, intercettando le syscall del server con un LD_LIBRARY_PATH
/LD_PRELOAD
wrapper della libreria, per fare in modo che il processo creda che sia in esecuzione come root. Questo è stato creato allo scopo di creare e impacchettare applicazioni senza dover essere root, incluso l'uso di make install
che in genere verrebbe eseguito come root. È particolarmente adatto per creare archivi.
Durante questo, un demone biforcato faked
verrà eseguito per ricordare tutti i diritti di proprietà dei file falsi o le informazioni su file speciali che il bambino elabora crede di aver creato. Quindi tutte le operazioni devono essere eseguite nella stessa "istanza" o faked
uscirà e dimenticherà cosa stava ricordando.
$ fakeroot
# tar xf ...
# find foo ... | cpio -o ...
# exit
$
Altro esempio che mostra faked
interazione:
$ 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