Devin.KR
로그인

리눅스 umount 명령어 사용법 - target is busy 해결과 lazy 언마운트의 위험

개발자 조회 1

이 명령어를 언제 쓰는가

디스크를 교체하거나 볼륨을 떼어 다른 서버에 붙일 때, 마운트 옵션을 처음부터 다시 잡을 때, 응답 없는 NFS 마운트를 정리할 때 쓴다. 붙이는 mount보다 떼는 umount에서 사고가 더 자주 나는데, 이유는 단순하다. 누군가 그 파일시스템을 쓰고 있는 상태에서 떼려 하기 때문이다.

그래서 umount 작업의 실체는 명령을 치는 것이 아니라 "지금 이걸 누가 쓰고 있는지"를 찾아내는 일이다. 이 순서를 건너뛰고 -l이나 -f로 밀어붙이면 그 순간은 넘어가지만 데이터가 조용히 사라진다.

기본 형식

umount [옵션] 마운트지점_또는_디바이스

마운트 지점(/data)을 주는 쪽을 권한다. 같은 디바이스가 여러 곳에 마운트될 수 있어 디바이스 이름으로는 어느 것을 떼는지 모호해질 수 있기 때문이다. 명령 이름에 n이 없다는 점(unmount가 아니라 umount)도 처음에는 자주 틀리는 지점이다.

자주 쓰는 옵션

옵션의미예시
(없음)정상 해제. 사용 중이면 거부된다sudo umount /data
-llazy. 트리에서 즉시 떼고 참조가 끝나면 실제 해제sudo umount -l /mnt/nfs
-f강제. 사실상 응답 없는 NFS 전용sudo umount -f /mnt/nfs
-R하위에 겹쳐 마운트된 것까지 재귀적으로 해제sudo umount -R /mnt/root
-a현재 마운트된 것을 전부 해제(운영 중 사용 금지)umount -a -t nfs4
-v무엇을 떼는지 출력sudo umount -v /data

실전 예제

1) 정상적으로 해제하고 결과를 확인한다. findmnt가 아무것도 못 찾으면 성공이다.

sudo umount /data
findmnt /data || echo "unmounted"

2) target is busy가 났을 때 범인을 찾는다. 가장 많이 쓰는 두 명령이다.

sudo lsof +f -- /data
sudo fuser -vm /data
                     USER        PID ACCESS COMMAND
/data:               root      kernel mount /data
                     mysql      2145 F....  mysqld

fuser의 ACCESS 열에서 c는 현재 디렉터리, f는 열린 파일, 대문자 F는 쓰기용으로 열린 파일, e는 실행 중인 바이너리, m은 메모리 맵을 뜻한다. 위 예처럼 F가 보이면 쓰기가 진행 중이라는 뜻이므로 mysqld를 먼저 멈춰야 한다.

3) 서비스를 정지한 뒤 순서대로 해제한다. 실제 작업은 대개 이 형태다.

sudo systemctl stop mysqld
sudo umount /data || sudo fuser -vm /data

4) 응답 없는 NFS 마운트를 떼어 낸다. df조차 멈춰 있을 때의 처방이다.

sudo umount -f -l /mnt/share
findmnt -t nfs4

5) chroot 작업 후 하위 마운트까지 한 번에 정리한다. /proc, /sys, /dev를 바인드해 둔 상태를 되돌린다.

sudo umount -R /mnt/root

함정과 주의점

내가 그 안에 서 있어서 안 떨어지는 경우가 제일 많다. cd /data 상태로 sudo umount /data를 치면 당연히 busy다. 자기 셸도 사용자 중 하나다. 다른 터미널에 열려 있는 세션, 백그라운드 잡, tmux 창까지 전부 해당한다. 우선 cd /로 빠져나온 뒤 다시 시도하라. 그래도 안 되면 lsoffuser로 확인한다.

-l(lazy)은 문제를 해결하는 게 아니라 감춘다. lazy 언마운트는 디렉터리 트리에서만 즉시 떼어 낼 뿐, 그 파일시스템의 파일을 열고 있던 프로세스는 계속 보이지 않는 파일에 계속 쓴다. df에는 안 나오는데 디스크는 계속 차고, 그 상태에서 디바이스를 분리하거나 스냅샷을 뜨면 데이터가 중간에 잘린다. 임시로 트리를 정리해야 할 때만 쓰고, 반드시 원인 프로세스를 종료해 실제 해제까지 확인하라. 실제 해제 여부는 cat /proc/self/mountinfo | grep /datalsof로 본다.

-f는 로컬 파일시스템에 쓰는 옵션이 아니다. 원래 의도는 서버가 응답하지 않는 NFS 마운트를 끊는 것이다. 로컬 디스크에 강제 해제를 시도하면 캐시에 남은 쓰기가 버려져 파일이 깨질 수 있다. 로컬은 sync 후 프로세스를 정리해 정상 해제하는 것이 유일한 정답이다.

떼자마자 다시 붙는 경우가 있다. systemd의 automount 유닛이나 x-systemd.automount 옵션이 걸려 있으면 누군가 그 경로에 접근하는 순간 자동으로 다시 마운트된다. 이때는 sudo systemctl stop data.automount data.mount처럼 해당 유닛을 멈춰야 한다. 유닛 이름은 systemctl list-units --type=mount로 확인한다.

해제 후 그 디렉터리에 옛 파일이 보일 수 있다. 마운트 이전에 그 경로에 남아 있던 파일이 다시 드러난 것이다. 이걸 "데이터가 남아 있네" 하고 지우거나, 반대로 "마운트가 아직 살아 있네"로 오해하기 쉽다. 확인은 mountpoint /data로 한다. 마운트 지점이면 종료 코드 0을 준다.

umount -a는 운영 서버에서 치지 마라. fstab에 적힌 것만 떼는 것이 아니라 /proc/self/mountinfo에 있는 현재 마운트된 파일시스템 전부를 떼려 시도한다(proc, sysfs, devpts 등 몇몇은 제외). fstab에 없는 수동 마운트나 컨테이너용 바인드 마운트까지 대상이 되므로, 성공하는 항목이 하나라도 있으면 그 위에서 도는 서비스가 즉시 깨진다. 범위를 좁히려면 -t nfs4처럼 타입을 반드시 함께 주고, 대상을 명시하지 않는 마운트 관련 명령은 항상 위험하다고 생각하라.

함께 보면 좋은 명령어

  • lsof — busy의 원인이 되는 열린 파일과 프로세스를 특정할 때. 첫 번째 도구다.
  • mount — 반대 동작이자, 해제 후 옵션을 바꿔 다시 붙일 때.
  • systemctl — 파일시스템을 쓰는 서비스나 automount 유닛을 먼저 멈출 때.