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