하위디렉토리 모두 마운트해제하기

사용자들이 직접 작성하는 실전팁!

Moderator: Dry8r3aD

Post Reply
protochaos
Posts: 1714
Joined: 2011/05/19 Thu 7:43 pm

하위디렉토리 모두 마운트해제하기

Post by protochaos » 2013/07/22 Mon 10:42 am

보통 매개변수없이 mount명령을 사용하거나, cat /proc/mounts 명령으로
마운트지점을 확인하기 마련이지만,
이 경우, mount -R 혹은 mount --rbind에 의해 병합된 지점은 나타나지 않을 수 있습니다.
웹검색을 통해 /proc/self/mountinfo라는 파일에 정보가 저장됨을 알았고,
다음과 같은 스크립트로, 해당디렉토리 하위의 모든 마운트지점을 해제할 수 있습니다.

[code:2s3d81oj]
was_mounted() {
sed -r 's/[^[^/]+\/\S*\s+(\S+)\s.*$/\1/g' /proc/self/mountinfo|grep "^$1$" &>/dev/null
}
umount_tree() {
MNTS=$(sed -r 's/[^[^/]+\/\S*\s+(\S+)\s.*$/\1/g' /proc/self/mountinfo|grep -E "^$1(/|$)"|sort -r)
[ -n "$MNTS" ] && sudo umount $MNTS
}
export -f umount_tree was_mounted
[/code:2s3d81oj]

** 코드 설명 **
모든 마운트정보를 얻은 후, 마운트지점만을 추려서, 원하는 위치를 검색하고,
서브 마운트된 지점을 먼저 언마운트하기 위해, 역순 정렬하여 마운트 지점들을 구한 뒤,
umount 매개변수를 없음 오류를 피하기 위해 마운트지점이 하나라도 있는지 체크한 뒤,
한번에 마운트해제 합니다.
물론 for문을 사용해서 하나가 실패하더라도, 다른 모든것을 마운트해제 할 수 도 있지만,
어떻게 보면 하나의 트랜잭션과 비슷하기 때문에, 몽땅 성공 혹은 몽땅 실패로 보는 것이
더 합당하리라 봅니다.

마지막 export -f 문은 함수를 하위 프로세스들에게도 내보내기 합니다.

이것을 .bashrc 파일에 추가하시면 됩니다.

** 활용 예 **
#!/bin/sh
trap 'umount_tree /myroot' EXIT QUIT INT TERM
sudo mount -R / /myroot
원하는 작업

해당 스크립트가 종료되면 자동으로 마운트해제함.

Post Reply