Tengo un tarball que contiene muchos archivos con raíz:propietario raíz y/o inodos de dispositivos especiales. cpio
solo acepta rutas existentes en el sistema de archivos cuando está creando un archivo cpio. Y no quiero tener que sudo
para transformar tar en cpio, mientras quiero conservar todos los permisos, propietarios e inodos especiales.
¿Hay alguna forma limpia de manejar esto?
EDITAR1:
Creo que fakeroot
puede verse como una forma un tanto limpia. Sin embargo, no escala como se esperaba:casi 1000 veces la diferencia de velocidad:
[[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]$
Basado en la salida de time
comando Supongo que es por la comunicación entre fakeroot
y faked
.
Como referencia, no hay mucha diferencia entre un tarball de 2M y un tarball de 50M cuando cambié fakeroot
en sudo bash
en mi guión. Y también creo que el problema es la cantidad de archivos en el tarball, no el tamaño:usé el mismo script en un tarball de ~10M con dos binarios de 5M, y el script no es tan lento.
Respuesta aceptada:
Puedes usar fakeroot
. Como su nombre lo indica, falsifica al usuario raíz al interceptar varias llamadas al sistema con un LD_LIBRARY_PATH
/LD_PRELOAD
contenedor de la biblioteca, para que el proceso crea que se está ejecutando como root. Esto ha sido creado con el propósito de compilar y empaquetar aplicaciones sin tener que ser root, incluido el uso de make install
que normalmente se ejecutaría como root. Es especialmente adecuado para crear archivos.
Durante esto, un demonio bifurcado faked
se ejecutará para recordar todos los derechos de propiedad de archivos falsos o información sobre archivos especiales que los procesos secundarios creen que crearon. Por lo tanto, todas las operaciones deben realizarse en la misma "instancia" o faked
saldrá y olvidará lo que estaba recordando.
$ fakeroot
# tar xf ...
# find foo ... | cpio -o ...
# exit
$
Otro ejemplo que muestra faked
Interacción de:
$ 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