Transformar o tar no cpio sem fazer o root?

3

Eu tenho um tarball contendo muitos arquivos com raiz: proprietário da raiz e / ou inodes do dispositivo especial. cpio só aceita caminhos existentes no sistema de arquivos quando está criando um arquivo cpio. E eu não quero ter que sudo para transformar tar em cpio, enquanto eu quero preservar todas as permissões, proprietários e inodes especiais.

Existe alguma maneira limpa de lidar com isso?

EDIT1:

Eu acredito que fakeroot pode ser visto como uma maneira um pouco limpa. No entanto, não é dimensionado como esperado - quase uma diferença de velocidade de 1.000x:

[user@computer root]$ ls -l ../fanbox.tar
-rw-rw-r-- 1 user user 56555520 May 22 03:33 ../fanbox.tar
[user@computer 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
[user@computer root]$ rm -rf *
[user@computer root]$ time fakeroot tar -x --delay-directory-restore -f ../fanbox.tar

real    3m49.381s
user    0m0.812s
sys 0m2.760s
[user@computer root]$ 

Com base na saída do comando time , acho que é devido à comunicação entre fakeroot e faked .

Para referência, não há muita diferença entre um tarball de 2M e um tarball de 50M quando mudei fakeroot para sudo bash no meu script. E também acredito que o problema é o número de arquivos no tarball, não o tamanho: usei o mesmo script em um tarball de ~ 10M com dois binários de 5M, e o script não é tão lento.

    
por Thiner 18.05.2018 / 08:02

1 resposta

3

Você pode usar fakeroot . Como o nome diz, ele falsifica o usuário root, interceptando syscalls de servidor com um wrapper de biblioteca LD_LIBRARY_PATH / LD_PRELOAD , para que o processo acredite que está sendo executado como root. Isso foi criado com o propósito de construir e empacotar aplicativos sem ter que ser root, incluindo o uso de make install , que normalmente seria executado como root. É especialmente adequado para criar arquivos.

Durante isso, um daemon bifurcado faked será executado para lembrar todos os direitos de propriedade de arquivos falsos ou informações sobre arquivos especiais que os processos filhos acreditam ter feito. Assim, todas as operações devem ser feitas na mesma "instância", ou faked sairá e esquecerá do que estava lembrando.

$ fakeroot
# tar xf ...
# find foo ... | cpio -o ...
# exit
$ 

Outro exemplo mostrando a interação de faked :

$ 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
    
por 18.05.2018 / 08:22