우리는 왜 지시해야 하는가 fakeroot
? 단순히 sudo
or 명령을 사용할 수는 없나요 su
?
매뉴얼 페이지에는 다음과 같이 나와 있습니다.
fakeroot - 가짜 루트 권한이 있는 환경에서 명령을 실행합니다.파일 작업
About.com은 이렇게 말했습니다.
가짜 루트 환경을 제공합니다. 이 패키지는 다음 기능을 달성하도록 설계되었습니다.
dpkg-buildpackage -rfakeroot
즉, 패키지 구축을 위해 루트 사용자가 될 필요가 없습니다. 이는 , , , , ... 주위에 래퍼를 제공하는LD_PRELOAD
로 설정하여 수행 되며, 이로써 가짜 루트 환경이 생성됩니다. 이것을 이해하지 못한다면 그럴 필요가 없습니다 !libfakeroot.so
getuid
chown
chmod
mknod
stat
fakeroot
내 질문은 해결되지 않는 단순 su
하거나 특별한 목적을 해결하는가입니다 . sudo
예를 들어 우분투에 설치된 모든 패키지를 다시 패키지하려면 다음 명령을 사용합니다.
$ fakeroot -u dpkg-repack `dpkg --get-selections | grep install | cut -f1`
fakeroot 대신 sudo 또는 su를 사용하여 다음과 같이 위 명령을 실행할 수 있습니다.
$ sudo dpkg-repack `dpkg --get-selections | grep install | cut -f1`
편집하다:
달리기:
$ sudo dpkg-repack `dpkg --get-selections | grep install | cut -f1`
나에게 다음과 같은 오류가 발생합니다.
제어 디렉터리에 대한 권한 오류 700(>=0755 및 <=0775여야 함)
이유가 있나요?
답변1
당신이 원격 서버에서 작업하는 개발자/패키지 관리자/등이라고 상상해 보십시오. 패키지의 내용을 업데이트하고 다시 빌드하고, kernel.org에서 커널을 다운로드하여 사용자 정의하고 빌드하는 등의 작업을 원합니다. 이러한 작업을 수행하려고 할 때 일부 단계 에서는 다양한 이유(보안, 간과된 권한 등)로 인해 root
권한( UID
및 0) 이 필요하다는 것을 알게 됩니다 . 하지만 원격 컴퓨터에서 작업 중이기 때문에 권한을 GID
얻는 것은 불가능합니다 (다른 많은 사용자도 귀하와 같은 문제를 겪고 있습니다). 이것이 바로 그 일입니다. root
필요한 환경 에서는 fakeroot
유효한 척하고 0인 척합니다 .UID
GID
실제로는 실제 권한을 얻을 수 없습니다( root
당신이 언급한 것과는 반대로).su
sudo
답변2
대답은 (나 자신에게는) 이해하기 어렵고 그것을 이해하려면 약간의 생각이 필요하기 때문에 (이 댓글이것을 이해하게 해주세요) 그러면 더 나은 설명을 드리겠습니다.
1. fakeroot에서는 무슨 일이 벌어지나요?
이는 귀하의 사용자에게 일어나는 일입니다. 더 이상은 절대 아닙니다. fakeroot
(호출될 때 새로운 쉘이 제공될 것입니다 sudo
) 권한이 필요한 작업을 수행한 다음 종료하면 아무 일도 일어나지 않습니다 .
생각해보면 완전 시간 낭비다. 실제로 일어나지도 않을 일을 왜 하려고 합니까? 너무 미쳤어. 아무 것도 할 수 없고 아무런 흔적도 남지 않기 때문에 별 차이가 없을 것입니다.
잠깐만요...
2. 가짜뿌리의 흔적
거기할 수 있다흔적을 남겨주세요 fakeroot
. 내부 명령을 살펴 보겠습니다.Mortensikl의 답변이것은 매우 좋으며 엄지손가락을 치켜세울 가치가 있습니다.
$ fakeroot
# echo "Wow I have root access" > root.tst
# ls -l root.tst
-rw-rw-r-- 1 root root 23 Oct 25 12:13 root.tst
# ls -l /root
ls: cannot open directory /root: Permission denied
# exit
$ ls -l root.tst
-rw-rw-r-- 1 ubuntu ubuntu 23 Oct 25 12:13 root.tst
언뜻 보면 사용법은 fakeroot
완전한 시간 낭비처럼 보일 수 있습니다. 결국, 그것을 사용하지 않으면 fakeroot
똑같은 결과를 얻게 될 것입니다 .
여기서 미묘한 점은 다음과 같습니다.
$ cat root.tst
Wow I have root access
이는 파일의 내용이 여전히 루트 디렉터리로 기억된다는 의미입니다. 그것을 사용하지 않으면 fakeroot
같은 결과가 나올 것이라고 말할 수도 있습니다 . 당신 말이 맞아요. 이 예는 너무 간단합니다.
또 다른 예를 들어보겠습니다:
$ fakeroot
# touch x
# touch y
# chown myuser:myuser x
# ls -l > listing
# exit
$ ls -l
total 4
-rw-rw-r-- 1 myuser myuser 152 Jan 7 21:39 listing
-rw-rw-r-- 1 myuser myuser 0 Jan 7 21:39 x
-rw-rw-r-- 1 myuser myuser 0 Jan 7 21:39 y
$ cat listing
total 0
-rw-rw-r-- 1 root root 0 Jan 7 21:39 listing
-rw-rw-r-- 1 myuser myuser 0 Jan 7 21:39 x
-rw-rw-r-- 1 root root 0 Jan 7 21:39 y
무슨 일이 일어났는지 봅시다. 나는 그것이 root
완전히 유효하지 않은 인 척하고 x
and를 만들었습니다 y
. 나는 x
속한 척 myuser
하고 y
속한 척합니다 root
. 실제로는 모두 myuser
(마지막으로 본 것처럼) 속해 있지만 저는 단지~인 척하다그러면 그렇게 해.
그런 다음 목록을 만들고 상상한 내용을 파일에 저장했습니다. 나중에 파일을 다시 보면 그 파일이 누구에게 속해야 한다고 상상했는지 알 수 있습니다. 다시 말하지만, 그들은 실제로 내가 상상하는 사람들의 것이 아닙니다. 나는 단지 그들을 상상하고 있을 뿐입니다.
3. 그럼... 왜 또 그걸 원하는 거죠?
이 목록을 만들기 위해 루트인 척할 필요는 없다고 말할 수도 있습니다. 간단히 목록을 만든 다음 편집하여 내 상상을 반영할 수 있습니다. 당신 말이 맞아요, 그럴 필요는 없어요 fakeroot
. 사실, 이것이 fakeroot
실제로 아무 것도 하지 않는다는 것을 알면, 이전에 갖지 못했던 능력을 얻을 가능성은 거의 없습니다.
하지만, 그게 fakeroot
전부입니다. 목록을 편집하는 것이 간단하지 않을 수 있습니다. 시스템에 설치할 수 있는 소프트웨어 패키지와 마찬가지로 파일을 함께 저장하고 해당 권한과 소유자를 기억할 수 있는 tar
ed, gzip
ed, xz
ed, bzip2
ed 또는 기타 형식이 있습니다. 압축 파일을 쉽게 수정하고 파일 소유권을 편집할 수 있습니까? 나는 당신에 대해 모르지만 방법이 생각나지 않습니다.
모든 것이 압축되면 압축된 파일을 수정하고 프로그래밍 방식으로 소유권과 권한을 편집하는 도구를 구축할 수 있습니까? 예, 괜찮습니다. 따라서 압축하기 전에 소유권을 위조하거나 압축 후에 소유권을 변경할 수 있습니다. 데비안 사람들은 전자가 더 쉽다고 생각합니다.
4. 왜 직접 사용하지 않습니까 sudo
?
첫째, 소프트웨어를 빌드하기 위해 루트 액세스가 필요하지 않으며 소프트웨어를 압축하기 위해 루트 액세스가 필요하지 않습니다. 따라서 필요하지 않은 경우 해당 권한을 고려하려면 실제로 Windows 사용자여야 합니다. 하지만 비꼬는 말은 제쳐두고 루트 비밀번호조차 갖고 있지 않을 수도 있습니다.
또한 루트 액세스 권한이 있다고 가정합니다. 파일이 루트 디렉터리에 대한 읽기 권한만 갖고 있다고 가정해 보겠습니다. 따라서 sudo
실제로 파일 소유자와 권한을 으로 변경하고 root
루트 셸을 종료한 후 모든 것을 패키징해 봅니다. 이제 루트 액세스 권한이 없기 때문에 더 이상 파일을 읽을 수 없기 때문에 실패했습니다. 따라서 sudo
루트로 패키지를 압축하고 빌드해야 합니다. 실제로 모든 작업을 루트로 수행해야 합니다.
이것은 나쁜 TM 입니다 .
패키저로서 루트 액세스 권한이 필요하지 않으며 루트 액세스 권한을 얻어서도 안 됩니다. 패키지를 설치할 때 특정 파일을 루트( )로 설치해야 할 수 있으며 A
, 이때 루트 권한이 필요합니다. fakeroot
이것을 가능하게 하기 위해 모든 것이 이루어졌습니다 . 아카이버가 루트 소유로 패커를 나열하므로 A
사용자가 패키지 압축을 풀 때 아카이버는 루트 권한이 필요하며 A
루트 소유로 생성됩니다.
답변3
fakeroot와 실제 sudo/su의 차이점을 명확하게 확인하려면 다음을 수행하세요.
$ fakeroot
# echo "Wow I have root access" > root.tst
# ls -l root.tst
-rw-rw-r-- 1 root root 23 Oct 25 12:13 root.tst
# ls -l /root
ls: cannot open directory /root: Permission denied
# exit
$ ls -l root.tst
-rw-rw-r-- 1 ubuntu ubuntu 23 Oct 25 12:13 root.tst
fakeroot 쉘에 있는 한, 실제로 루트 권한이 필요한 작업을 수행하려고 하지 않는 한 루트인 것처럼 보일 것입니다. 이것이 바로 모든 기계에서 적합한 패키징을 만들기 위해 패키징 도구에 필요한 것입니다.
실제로 패키징에 fakeroot를 사용할 때 달성하고자 하는 것은 fakeroot에서 실행하는 도구가 파일이 루트의 소유인지 확인하도록 하는 것입니다. 그 이상도 이하도 아닌. 따라서 실제로 su 또는 sudo는 올바른 파일 소유권을 얻을 수 없습니다.
답변4
나는 이것을 패키지 빌드 스크립트에 사용했습니다. 스크립트를 실행하는 사람이 루트 수준 액세스 권한을 갖고 있는지 확실하지 않지만 스크립트는 여전히 루트에 속한 파일이 포함된 tar 파일을 생성해야 합니다. 가장 간단한 방법은 fakeroot에서 패키지 빌드 스크립트를 실행하는 것입니다. 그러면 아카이버가 파일이 루트에 속한다고 믿도록 속이고 해당 파일을 아카이브에 패키징합니다. 이렇게 하면 패키지가 대상 컴퓨터(완전히 다른 컴퓨터에 있음)에 압축이 풀릴 때 파일이 이상하거나 존재하지 않는 사용자에게 속하지 않습니다.
생각해보면, 내가 본 유일한 곳은 임베디드 시스템용 rootfs, tar.gz 아카이브, rpm 패키지, .deb 패키지 등 일종의 아카이브를 구축하는 것이었습니다.