Intereting Posts

Превратить tar в cpio без рута?

У меня есть архив, содержащий много файлов с root: владельцем root и / или специальными инодами устройств. cpio принимает только пути, существующие в файловой системе, при создании архива cpio. И я не хочу использовать sudo для преобразования tar в cpio, в то время как я хочу сохранить все разрешения, владельцев и специальные inode.

Есть какой-то чистый способ справиться с этим?

EDIT1:

Я считаю, что fakeroot можно рассматривать как довольно чистый способ. Однако он не масштабируется, как ожидалось – почти 1000-кратная разница в скорости:

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

Основываясь на выводе команды time я думаю, это из-за связи между fakeroot и faked .

Для справки, между 2M tarball и 50M tarball нет большой разницы, когда я изменил fakeroot в sudo bash в своем скрипте. Кроме того, я считаю, что проблема заключается в количестве файлов в тарболе, а не в размере: я использовал один и тот же скрипт на тарболе ~ 10M с двумя двоичными файлами 5M, и скрипт не такой медленный.

    Вы можете использовать fakeroot . Как следует из названия, он подделывает пользователя root, перехватывая несколько системных вызовов с помощью оболочки библиотеки LD_LIBRARY_PATH / LD_PRELOAD , чтобы процесс поверил, что он работает от имени пользователя root. Это было создано с целью создания и упаковки приложений без необходимости иметь права root, включая использование make install которая обычно запускается с правами root. Это особенно хорошо подходит для создания архивов.

    Во время этого будет запущен faked демон faked , чтобы запомнить все поддельные права владения файлами или информацию о специальных файлах, которые дочерние процессы считают созданными. Таким образом, все операции должны быть выполнены в одном и том же «экземпляре», иначе faked выйдет и забудет, что она помнила.

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

    Другой пример, показывающий 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