Saya memiliki tarball yang berisi banyak file dengan root:root owner dan/atau inode perangkat khusus. cpio
hanya menerima jalur yang ada di sistem file saat membuat arsip cpio. Dan saya tidak mau harus sudo
untuk mengubah tar menjadi cpio, sementara saya ingin mempertahankan semua izin, pemilik, dan inode khusus.
Apakah ada cara yang bersih untuk menangani ini?
EDIT1:
Saya percaya bahwa fakeroot
dapat dilihat sebagai cara yang agak bersih. Namun skalanya tidak seperti yang diharapkan – perbedaan kecepatan hampir 1.000x:
[[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]$
Berdasarkan keluaran time
perintah Saya kira itu karena komunikasi antara fakeroot
dan faked
.
Sebagai referensi, tidak ada banyak perbedaan antara tarball 2M dan tarball 50M ketika saya mengubah fakeroot
ke sudo bash
dalam naskah saya. Dan saya juga percaya bahwa masalahnya adalah jumlah file dalam tarball, bukan ukurannya:Saya menggunakan skrip yang sama pada ~10M tarball dengan dua binari 5M, dan skripnya tidak terlalu lambat.
Jawaban yang Diterima:
Anda dapat menggunakan fakeroot
. Seperti namanya, itu memalsukan pengguna root, dengan mencegat panggilan sistem server dengan LD_LIBRARY_PATH
/LD_PRELOAD
library wrapper, agar proses percaya bahwa itu berjalan sebagai root. Ini dibuat untuk tujuan membangun dan mengemas aplikasi tanpa harus menjadi root, termasuk menggunakan make install
yang biasanya akan dijalankan sebagai root. Ini sangat cocok untuk membuat arsip.
Selama ini, daemon bercabang faked
akan berjalan untuk mengingat semua hak kepemilikan file palsu atau informasi pada file khusus yang diyakini telah dibuat oleh proses anak. Jadi semua operasi harus dilakukan dalam "instance" yang sama, atau faked
akan keluar dan melupakan apa yang diingatnya.
$ fakeroot
# tar xf ...
# find foo ... | cpio -o ...
# exit
$
Contoh lain yang menampilkan faked
interaksi:
$ 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