rbind 마운트 후 재귀 적 umount 장착되어 있고 사용중인

chroot를 입력 할 때 -bind 대신 -rbind를 사용하여 / sys 및 / dev를 마운트해야하는 경우가 있습니다.

마운트를 해제 할 때 문제가 발생합니다.

간단한 umount는 항상 실패합니다. 아이들도 장착되어 있고 사용중인 것처럼 보입니다.

$ umount /mnt/chroot/sys
umount: /mnt/chroot/sys: device is busy.
    (In some cases useful info about processes that use
     the device is found by lsof(8) or fuser(1))

또 다른 가능한 해결책은 proc에서 마운트를 나열하고 다음과 같이 각 마운트를 마운트 해제하는 것입니다.

$ grep /mnt/chroot/sys /proc/mounts | cut -f2 -d" " | sort -r | xargs umount

그러나 재귀 마운트가 실제로 mtab에 등록되어 있지 않기 때문에 이것은 실패합니다.

/mnt/chroot/sys/kernel/security is not mounted (according to mtab)

아마도 해결책은 게으른 umount를 수행하는 것이지만 이것은 나에게 꽤 위험한 것 같습니다.

내가 놓친 더 좋은 방법이 있습니까?



답변

이것은 나를 위해 올바르게 작동했습니다 -https : //unix.stackexchange.com/a/264488/4319 :

mount --rbind /dev /mnt/test
mount --make-rslave /mnt/test
umount -R /mnt/test

두 개의 별도의 명령과이 첫 번째 명령을 가지고 중요 : 결합하지 않는 --rbind--make-rslave마운트 한 번 호출.

없이는 --make-rslave동작이 원치 않았으며 성공하지 못했습니다.

  • umount -l 원래의 기존 마운트 지점에도 영향을줍니다.
  • 그리고 umount -R원래 오래된 마운트 포인트에서 바쁜 (오픈) 파일에 의해 영향을받을 것입니다. (매우 예상치 못한 …)

답변

이 답변에 대한 크레딧은 Gilles 로갑니다 . Gilles는 질문에서 ‘-n’스위치가 mtab을 무시하고 / proc / mounts에 나열된 항목을 마운트 해제한다고 언급했습니다.

맨 페이지에서 :

-n     Unmount without writing in /etc/mtab.

따라서 –rbind 마운트를 풀는 방법에 대한 내 질문에 대답하기 위해 이것은 나를 위해 일한 전체 명령입니다.

grep /mnt/chroot/sys /proc/mounts | cut -f2 -d" " | sort -r | xargs umount -n

Merci, Gilles!


답변

이후 폴더의 유틸리티 – 리눅스 v2.23 (25 4 월 2013)는 umount명령이 지원하는 -R, --recursive옵션을 선택합니다.

매뉴얼 페이지는 다음과 같습니다.

지정된 각 디렉토리를 반복적으로 마운트 해제하십시오. 체인에서 마운트 해제 조작이 어떤 이유로 실패하면 각 디렉토리의 재귀가 중지됩니다. 마운트 지점 간의 관계는 /proc/self/mountinfo 항목에 따라 결정됩니다 . 파일 시스템은 마운트 지점 경로로 지정해야합니다. 장치 이름 (또는 UUID)으로 재귀 마운트 해제가 지원되지 않습니다.


답변

고마워 스크립트에서 이것을 사용하여 전체 chroot-tree를 마운트 해제합니다 : ($ MNT를 적절히 설정하십시오)

for dir in $(grep "$MNT" /proc/mounts | cut -f2 -d" " | sort -r)
do
    umount $dir 2> /dev/null
    (( $? )) && umount -n $dir
done