fakeroot cdebootstrap: 공유를 해제할 수 없습니다: 작업이 허용되지 않습니다.

fakeroot cdebootstrap: 공유를 해제할 수 없습니다: 작업이 허용되지 않습니다.

Debian에서 실행할 때:

$ fakeroot cdebootstrap stable /tmp/foo

cdebootstrap은 패키지를 다운로드하지만 패키지를 풀어야 할 때 다음 오류가 발생합니다:

E: Failed to unshare: Operation not permitted

루트가 아닌 사용자로 cdebootstrap을 실행하는 방법은 무엇입니까?

unshare 매뉴얼의 이 섹션은 관련성이 있는 것 같지만 어떻게 되는지는 잘 모르겠습니다.

EPERM (since Linux 3.9)
              CLONE_NEWUSER was specified in flags and the caller is in a
              chroot environment (i.e., the caller's root directory does not
              match the root directory of the mount namespace in which it
              resides).

답변1

질문

귀하의 문제는 권한 상속과 관련이 있습니다. cdbootstrap권한은 상속되며 fakeroot권한을 통해 상승될 수 있습니다 sudo. 질문:

sudo fakeroot cdbootstrap /tmp/foo

위 명령이 성공하면 권한 /tmp문제가 있는 것입니다. 바라보다/tmp에는 어떤 공통 권한이 있습니까? 실수로 모든 것을 재귀적으로 공개로 설정했습니다., 기본 권한은 무엇입니까? 일반적으로 /tmp애플리케이션에 넣지 않은 내용을 작성하는 것은 좋지 않은 생각이며 fakeroot그 자체로 문제가 있습니다. 매뉴얼 페이지에서:

한정

라이브러리 버전

fakeroot 내에서 실행되는 모든 명령은 fakeroot 자체와 동일한 버전의 C 라이브러리에 연결되어야 합니다.

open()/create()

fakeroot 줄 바꿈 등이 없습니다 open(). create()따라서 사용자가 그렇게 joost 하면

  touch foo
  fakeroot
  ls -al foo

혹은 그 반대로도,

  fakeroot
  touch foo
  ls -al foo

fakeroot
첫 번째 경우에는 의 소유자가 foo 실제로 이어야 joost하고 두 번째 경우에는 의 소유자가 되어야 하는지
알 수 있는 방법이 없습니다 root. 데비안 패키징의 경우
모든 "알 수 없는" 파일에 대해 기본적으로 uid=gid=0을 제공하는 것은 항상 괜찮습니다. 이 문제에 대한 실제 해결책은 sum 을
래핑하는 것입니다 . 그러나 이는 패키지에 표시된 것처럼 다른 문제를 야기합니다 . 이 패키지에는 더 많은 기능이 포함되어 있으며 그 이상을 수행하려는 시도가 있습니다. libc의 작은 업그레이드( 함수를 사용하지 않는 업그레이드에서 (어떤 경우에는) 사용하는 업그레이드로 ) 설명할 수 없는 segfault가 발생할 수 있는 것으로 나타났습니다(예: libc6 이 호출됨 ). 이 경우 설명할 수 없는 세그폴트가 발생합니다). 그런 다음 libc6 등을 호출하십시오.) 이를 수정하는 것은 그리 쉽지 않지만, 일단 수정되면 다른 운영 체제로 포팅하는 것은 고사하고 다른 기능이 사용되기 시작하는 것은 시간 문제일 뿐입니다 . 따라서 나는 "충돌" 가능성을 제한하기 위해 래핑된 함수의 수를 가능한 한 적게 유지하기로 결정했습니다 .open()create()
libtricks

fakeroot
stat()open()stat()open()stat()open()stat()

open()

fakeroot

실수

포장되지 않습니다 open(). 이것은 그 자체로는 나쁘지 않지만 프로그램이 open("file", O_WRONLY, 000)"file" 파일에 쓰고 닫은 다음 파일을 읽기 위해 다시 열려고 시도하면 파일 모드가 000이므로 열기가 실패합니다. 오류는 루트가 동일한 작업을 수행하면 open() 루트의 파일 권한이 전혀 확인되지 않기 때문에 성공한다는 것입니다. 나는 libc의 다른 많은 함수(또한 이미 래핑된 함수)에서 수행되는 것처럼 open()Wrap 을 선택하지 않았으므로 루프(또는 다양한 libc 함수의 구현이 약간 변경될 때 향후 루프가 발생할 수 있음)를 생성했습니다.open()


더 나은 솔루션

원하는 것을 달성하기 위해 권한 상승을 사용하는 대신 적절한 사용을 고려하십시오 chroot.Ubuntu용 DebootstrapChroot 문서, 또는DebBootStrap 공식 데비안 문서.

답변2

어쩌면 /tmp가 문제일 수도 있습니다. 노력하다

$fakeroot cdebootstrap 안정 $HOME/somedir

관련 정보