요약:
pivot_root new_root put_old
질문:
exec
이전 루트 파일 시스템( )을 마운트 해제하기 위해 실행 중인 실행 파일을 변경 해야 하는 이유는 무엇입니까 put_old
?
put_old
새로운 루트 파일 시스템( ) 내에 있지 않은 디렉토리로 이동한다고 가정합니다 new_root
. 그래도 제거할 수 있나요?
chroot
실행 후에도 여전히 필요한 이유는 무엇입니까 pivot_root
? new_root
이것이 새로운 루트 파일 시스템이 되었습니다.
pivot_root
마지막으로 상위 프로세스(예: bash
)가 셸에서 분기된 경우 해당 루트 디렉터리를 어떻게 변경할 수 있습니까? 변경 사항이 pivot_root
프로세스 자체 에만 영향을 미치면 안 되나요 ? 페이지의 "현재 프로세스"는 man
상위 프로세스를 참조합니까, 아니면 pivot_root
자체를 참조합니까?
예:
mount /dev/hda1 /new-root
cd /new-root
pivot_root . old-root
exec chroot . sh <dev/console >dev/console 2>&1
umount /old-root
man pivot_root
:
exec chroot
나중에 이전 루트를 제거해야 하는 경우 실행 중인 실행 파일을 변경해야 합니다 .
답변1
묻다:
exec
이전 루트 파일 시스템( )을 마운트 해제하기 위해 실행 중인 실행 파일을 변경 해야 하는 이유는 무엇입니까put_old
?
사용 중인 경우 파일 시스템을 마운트 해제할 수 없고 실행 중인 실행 파일(예: bash
) 또는 해당 공유 라이브러리가 이전 루트 파일 시스템에 있는 경우 계속 사용 중입니다.
묻다:
put_old
새로운 루트 파일 시스템( ) 내에 있지 않은 디렉토리로 이동한다고 가정합니다new_root
. 그래도 제거할 수 있나요?
이것은 허용되지 않습니다put_old밖의새로운 뿌리. ~에서시스템 호출 매뉴얼 페이지:
put_old이하이어야 합니다.새로운 뿌리
묻다:
chroot
실행 후에도 여전히 필요한 이유는 무엇입니까pivot_root
?new_root
이것이 새로운 루트 파일 시스템이 되었습니다.
더 이상 필요하지 않습니다.원본 매뉴얼 페이지왜냐하면 시스템콜은2019년에 대폭 재작성됨[대체 링크] 및 업데이트된 매뉴얼 페이지 [아카이브 링크][대체 링크]는 행동 및 역사적 불확실성을 설명합니다.
pivot_root()
동일한 마운트 네임스페이스에 있는 각 프로세스 또는 스레드의 루트 디렉터리와 현재 작업 디렉터리를 다음으로 변경합니다.새로운 뿌리이전 루트 디렉터리를 가리키는 경우....
[이 동작]은 커널 스레드가 루트 디렉토리 및 현재 작업 디렉토리와 함께 이전 루트 마운트를 계속 사용하는 것을 방지하는 데 필요합니다 [...]
...
역사적 기록
수년에 걸쳐 매뉴얼 페이지에는 다음 텍스트가 포함되었습니다.
pivot_root()
이전 루트 디렉터리를 사용하는 프로세스나 스레드의 현재 루트 디렉터리와 현재 작업 디렉터리는 변경될 수도 있고 변경되지 않을 수도 있습니다. 호출자는pivot_root()
루트 디렉터리나 현재 작업 디렉터리가 이전 루트 디렉터리에 있는 프로세스가 두 경우 모두 올바르게 실행되는지 확인해야 합니다. 이를 확인하는 쉬운 방법은 루트 디렉터리와 현재 작업 디렉터리를 다음으로 변경하는 것입니다. 새로운 뿌리전화하기 전에pivot_root()
.이 기사는 커널에서 시스템 호출 구현이 완료되기 전에 작성되었으며, 아마도 최종 릴리스 전에 구현이 변경될 수 있음을 당시 사용자에게 경고하기 위한 것 같습니다. 그러나 설명에 설명된 동작은 이 시스템 호출이 처음 구현된 이후 일관성을 유지했으며 지금도 변경되지 않습니다.
묻다:
pivot_root
마지막으로 상위 프로세스(예:bash
)가 셸에서 분기된 경우 해당 루트 디렉터리를 어떻게 변경할 수 있습니까? 변경 사항이pivot_root
프로세스 자체 에만 영향을 미치면 안 되나요 ? 페이지의 "현재 프로세스"는man
상위 프로세스를 참조합니까, 아니면pivot_root
자체를 참조합니까?
pivot_root()
운영하고 있기 때문입니다 .마운트 네임스페이스상위 프로세스와 공유되는 호출 프로세스에 대한 정보입니다. 유틸리티의 매뉴얼 페이지(피벗_루트(8))에서는 이를 명시적으로 언급하지 않지만 시스템 호출에 대한 업데이트된 매뉴얼 페이지(피벗_루트(2)) 실제로 (강조 추가):
pivot_root()
루트 마운트 변경마운트 네임스페이스에서호출 과정. [...]
pivot_root()
루트 디렉터리 및 현재 작업 디렉터리 변경프로세스 또는 스레드당동일한 마운트 네임스페이스에서새로운 뿌리이전 루트 디렉터리를 가리키는 경우.