GNU/Linux >> Znalost Linux >  >> Linux

Transformovat Tar na Cpio bez rootování?

Mám tarball obsahující mnoho souborů s vlastníkem root:root a/nebo speciálními inody zařízení. cpio přijímá pouze cesty existující v systému souborů, když vytváří archiv cpio. A já nechci sudo za účelem transformace tar na cpio, přičemž chci zachovat všechna oprávnění, vlastníky a speciální inody.

Existuje nějaký čistý způsob, jak to vyřešit?

EDIT1:

Věřím, že fakeroot lze považovat za poněkud čistý způsob. Nezmenšuje se však podle očekávání – téměř 1000x rozdíl v rychlosti:

[[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]$ 

Na základě výstupu time příkaz Myslím, že je to kvůli komunikaci mezi fakeroot a faked .

Pro informaci, není žádný velký rozdíl mezi 2M tarballem a 50M tarballem, když jsem změnil fakeroot do sudo bash v mém scénáři. A také se domnívám, že problémem je počet souborů v tarballu, nikoli velikost:použil jsem stejný skript na ~10M tarball se dvěma 5M binárními soubory a skript není tak pomalý.

Přijatá odpověď:

Můžete použít fakeroot . Jak název napovídá, předstírá uživatele root tím, že zachytí serverová systémová volání pomocí LD_LIBRARY_PATH /LD_PRELOAD knihovna wrapper, aby proces věřil, že běží jako root. Toto bylo vytvořeno za účelem vytváření a balení aplikací bez nutnosti být root, včetně použití make install který by se obvykle spouštěl jako root. Je zvláště vhodný pro vytváření archivů.

Během toho se rozvětvený démon faked se spustí, aby si zapamatoval všechna falešná vlastnická práva k souborům nebo informace o speciálních souborech, o kterých se dítě domnívá, že je vytvořilo. Takže všechny operace musí být provedeny ve stejné „instanci“ nebo faked ukončí se a zapomene, co si pamatoval.

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

Jiný příklad ukazující faked interakce:

$ 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

Linux
  1. Vytvořit archiv dehtu rozdělený na bloky maximální velikosti?

  2. Změnit root heslo pomocí Sudo, bez Su?

  3. Jak spustit příkaz bez vlastností root?

  1. Tar:Extrahovat jeden soubor do adresáře bez vytváření podsložek?

  2. Jak mohu tarovat adresář bez zachování adresářové struktury?

  3. cd do adresáře bez povolení

  1. Je možné nainstalovat g++ na CentOS bez root?

  2. Instalovat zsh bez přístupu root?

  3. Zkontrolujte, zda je adresář úložištěm git (aniž byste do něj museli cd)