/MyDir/a 및 /MyDir/MySubDir/b라는 2개의 파일이 있고 /a 파일이 /b 파일을 가리키도록 코드를 추가하려는 bash 스크립트를 실행 중입니다. 단, 현재 프로세스와 그 하위 항목에 대해서만 해당됩니다.
/MyDir/a가 현재 프로세스의 컨텍스트(후손 제외)에서만 /MyDir/MySubDir/b를 가리키도록 하기 위해 먼저 작은 명령을 실행하여 현재 프로세스가 자체 설치 네임스페이스에서 내 스크립트를 실행하도록 만들었습니다. 명령 C 프로그램이 실행됨
unshare(CLONE_NEWNS)
그런 다음
mount --bind /MyDir/MySubDir/b /MyDir/a.
불행하게도 시스템 호출이 성공을 보고했지만 설치가 여전히 다른 프로세스에 표시되었기 때문에 예상대로 작동하지 않았습니다.
또 다른 시도에서는 다음을 호출하여 C 코드에서 마운트를 시도했습니다.
mount("/MyDir/a", "/MyDir/MySubDir/b", "ext3", MS_BIND, null)
그러나 이는 마운트가 전혀 적용되지 않기 때문에 작동하지 않습니다(호출이 성공을 보고하더라도).
현재 프로세스와 그 하위 프로세스의 컨텍스트에서 /MyDir/a가 /MyDir/MySubDir/b를 가리키도록 bash 스크립트를 사용하는 방법이 있습니까?
chroot에 관한 내용도 읽었지만 이는 / 디렉토리에서만 작동합니다... 특정 하위 디렉토리에서만 작동하는 chroot와 유사한 것이 있습니까?
시간 내 주셔서 감사합니다!
답변1
쉘 전용 솔루션은 다음과 같습니다.
대화형 셸의 경우:
# unshare --mount
# mount --bind /MyDir/MySubDir/b /MyDir/a
#
비대화형 방식으로 이러한 설정에 대한 스크립트를 이해해야 합니다.
# unshare --mount sh -c 'mount --bind /MyDir/MySubDir/b /MyDir/a; exec somethingelse'
이것공유 취소맨페이지에서는 공유 하위 트리 마운트 문제에 대해서도 경고합니다. 이를 비활성화해야 하는 경우 --make-private
마운트를 추가하는 것을 고려하세요.
Hauke가 말했듯이 네임스페이스는 사라지기 때문에 생성 후 바로 나가지 않도록 주의해야 합니다.
필요한 경우 프로세스 없이 네임스페이스를 유지하는 방법이 있습니다. 네임스페이스를 마운트하려면 마운트가 필요하기 때문에 약간 까다롭습니다. 다음은 대화형 예입니다.
shell1# unshare --mount
shell1# echo $$
12345
shell1#
shell2# : > /root/mntreference
shell2# mount --bind /proc/12345/ns/mnt /root/mntreference
이제 참조가 마운트된 상태로 유지되는 한 프로세스에서 더 이상 네임스페이스를 사용하지 않더라도 네임스페이스는 사라지지 않습니다. 을 사용하면 nsenter --mount=/root/mntreference
다른 스크립트를 쉽게 실행할 수 있습니다.
C에서 이에 상응하는 것을 사용하는 것은 문제가 되지 않습니다.
답변2
불행히도 C 프로그램과 스크립트가 어떻게 관련되어 있는지 설명하지 않았습니다.
문제의 가능한(여기서 가능한) 원인 중 하나는 스크립트에서 C 프로그램을 호출하지만 네임스페이스 변경 사항은 C 프로그램(및 가능하면 서브루틴) 내에서만 유효하다는 것입니다. 프로그램이 존재하면 모든 후속 명령에 대해 상황이 변경되지 않습니다.
execve()
원하는 쉘을 호출하여 C 프로그램에서 쉘을 시작해야 합니다.
답변3
다른 사람들이 설명했듯이 네임스페이스를 생성하고( 를 사용하여 unshare
) 그 안에서 명령을 실행해야 합니다.
루트가 필요하지 않고 올바른 신호 및 반환 상태 처리 기능을 갖춘 미리 만들어진 솔루션이 필요한 경우 이 faketree
유틸리티를 사용할 수 있습니다. 사용 가능여기 github에서, 하나 있어요블로그 게시물그 용도와 목적을 설명합니다.
다음과 같이 사용할 수 있습니다.
faketree --mount /MyDir/MySubDir/b:/MyDir/a -- /path/to/your/script.sh