이전 루트 파일 시스템을 마운트 해제하려면 `pivot_root` 다음에 `exec`를 실행해야 하는 이유는 무엇입니까?

이전 루트 파일 시스템을 마운트 해제하려면 `pivot_root` 다음에 `exec`를 실행해야 하는 이유는 무엇입니까?

요약:

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()루트 디렉터리 및 현재 작업 디렉터리 변경프로세스 또는 스레드당동일한 마운트 네임스페이스에서새로운 뿌리이전 루트 디렉터리를 가리키는 경우.

관련 정보