chroot를 실행한 후 마운트된 디렉토리를 올바르게 마운트 해제하는 방법은 무엇입니까?

chroot를 실행한 후 마운트된 디렉토리를 올바르게 마운트 해제하는 방법은 무엇입니까?

일반적으로 다음과 같이 일부 디렉터리를 chroot 환경에 마운트합니다.

mount -t proc /proc /mnt/chroot/proc
mount --rbind /dev /mnt/chroot/dev
mount --rbind /sys /mnt/chroot/sys
mount --rbind /run /mnt/chroot/run

그러나 완료 시 마운트된 디렉토리를 마운트 해제할 수 없으며 디렉토리를 사용하여 실행 중인 프로세스 목록을 가져오라는 메시지가 표시됩니다. 이는 여러 프로세스 목록 행을 제공합니다. 그렇다면 이러한 디렉토리를 올바르게 제거하는 방법은 무엇입니까?

답변1

파일 시스템 마운트 해제를 방해하는 원인을 찾는 일반적인 방법은 파일이 열려 있는 프로세스(또는 파일 설명자 또는 현재 디렉터리 등)를 나열하는 것입니다.

lsof /path/to/mount/point
fuser -m /path/to/mount/point

프로세스 목록을 보고 필요한 경우 종료합니다.

커널 자체는 커널 아래에 다른 마운트 지점이 있는 경우와 같은 여러 가지 방법으로 마운트 해제를 방지할 수도 있습니다(예: /mnt/chroot마운트된 동안에는 마운트 해제할 수 없습니다)./mnt/chroot/proc

바인드 마운트를 수행할 때 위와 같은 명령은 파일 시스템의 모든 경로를 통해 목록 파일을 엽니다. 예를 들어 를 통해 또는 를 통해 fuser -m /mnt/chroot/run이 파일 시스템에서 파일을 여는 프로세스를 나열합니다 ./run/mnt/chroot/run

마운트 지점을 사용하는 프로세스를 찾으려면 프로세스와 해당 프로세스의 열린 파일에 대한 경로를 나열하고 경로에 대해 일부 필터링을 수행합니다. 예를 들어:

lsof /mnt/chroot/run | grep /mnt/chroot

아니면 다 얻으세요

lsof | grep /mnt/chroot

또는 /proc직접 방문하실 수도 있습니다:

ls -l /proc/[0-9]*/fd/* | grep /mnt/chroot

자동 처리의 경우(최근 널 구분 기호가 sed지원된다고 가정 -z):

find /proc/[0-9]*/fd -type l -printf '%p %l/\0' |
sed -nz 's!^/proc/\([0-9]*\)/fd/[0-9]* /mnt/chroot/.*!\1!p' |
sort -nu

마운트된 파일 시스템의 내용을 실제로 찾을 수 없지만 마운트 지점을 다시 가져와야 하는 경우 어딘가에 빈 디렉토리를 만들고 실행하여 이를 수행할 수 있습니다 mount --move /current/mount/point /empty/directory/out/of/the/way. 또한 지연된 마운트 해제( umount -l)를 수행할 수도 있습니다. 파일 시스템은 모든 마운트 지점에 마운트되지 않지만(따라서 해당 파일을 더 이상 열 수 없음) 열려 있는 파일이나 다른 참조가 있는 한 계속 마운트됩니다.

답변2

chroot "내부"에서 실행 중인 프로세스가 있는 경우(셸이 종료된 후에도) 파일 ​​시스템을 마운트 해제하지 못할 수 있습니다(즉, 해당 프로세스 아래에서 파일 시스템을 끌어낼 수는 없습니다).

이 경우, 쉘에서 chroot를 다시 입력하고 서비스를 중지하거나 상태 등에 관심이 없다면 서비스를 직접 종료하십시오(chroot "외부"에서도).

관련 정보