루트 없이 tar를 cpio로 변환하시겠습니까?

루트 없이 tar를 cpio로 변환하시겠습니까?

루트:루트 소유자 및/또는 특수 장치 inode가 있는 많은 파일이 포함된 tarball이 있습니다. cpiocpio 아카이브를 생성할 때 파일 시스템에 존재하는 경로만 허용됩니다. sudo모든 권한, 소유자 및 특수 inode를 유지하면서 tar를 cpio로 변환하고 싶지 않습니다 .

이 문제를 해결할 수 있는 깨끗한 방법이 있나요?

편집 1:

나는 이것이 fakeroot일종의 깨끗한 방법이라고 볼 수 있다고 믿습니다. 그러나 예상대로 확장되지 않습니다. 속도 차이가 1,000배에 가깝습니다.

[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.

참고로 스크립트에서 변경해 보면 fakeroot2M 타르볼과 50M 타르볼 사이에는 큰 차이가 없습니다 . sudo bash그리고 문제는 크기가 아니라 타르볼에 있는 파일 수라고 생각합니다. 두 개의 5M 바이너리가 포함된 ~10M 타르볼에서 동일한 스크립트를 사용했는데 스크립트가 그렇게 느리지는 않았습니다.

답변1

당신은 그것을 사용할 수 있습니다fakeroot. 이름에서 알 수 있듯이 LD_LIBRARY_PATH/ LD_PRELOAD라이브러리 래퍼를 사용하여 여러 시스템 호출을 가로채서 루트 사용자를 위조하고 프로세스가 루트로 실행되고 있다고 믿게 만듭니다. make install일반적으로 루트로 실행되는 응용 프로그램을 사용하는 것을 포함하여 루트 없이 응용 프로그램을 구축하고 패키징하기 위해 만들어졌습니다 . 특히 아카이브 생성에 적합합니다.

이 시간 동안 포크된 데몬은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

답변2

bsd tar를 사용해 보십시오(GNU tar 아님) -마법@tarball 파일 이름 앞에 다음을 추가하세요.

bsdtar --format=cpio -cf - @root.tar.gz > root.cpio

답변3

lxc-usernsexec아카이브를 추출하고 재생성하는 환경 으로 사용할 수 있습니다 .

lxc-usernsexec
mkdir tmp
cd tmp
tar xf ../archive.tar
find . -print0 | cpio -0o > ../archive.cpio
exit

$HOME/.config/lxc/default.conf이는 Linux 컨테이너가 존재 하도록 올바르게 설정했다고 가정합니다 (올바르게 /etc/subuid설정됨 /etc/subgid). 자세한 내용은 다음을 참조하세요.

https://wiki.debian.org/LXC#Unprivileged_container

Debian Buster에 대한 참고사항:

$ lxc-usernsexec 
Failed to find subuid or subgid allocation

이는 버그인 것 같지만 다음 스크립트를 사용하면 문제가 해결됩니다.

#!/bin/bash

ARGS=()

while read -ru6 what equals rest
do
        [ ".$what" = ".lxc.idmap" ] || continue
        [ ".$equals" = ".=" ] || continue
        ARGS+=(-m "${rest// /:}")
done 6<"$HOME/.config/lxc/default.conf"

exec /usr/bin/lxc-usernsexec "${ARGS[@]}" -- "$@"

관련 정보