리눅스 umount 명령어 사용법 - target is busy 해결과 lazy 언마운트의 위험
이 명령어를 언제 쓰는가
디스크를 교체하거나 볼륨을 떼어 다른 서버에 붙일 때, 마운트 옵션을 처음부터 다시 잡을 때, 응답 없는 NFS 마운트를 정리할 때 쓴다. 붙이는 mount보다 떼는 umount에서 사고가 더 자주 나는데, 이유는 단순하다. 누군가 그 파일시스템을 쓰고 있는 상태에서 떼려 하기 때문이다.
그래서 umount 작업의 실체는 명령을 치는 것이 아니라 "지금 이걸 누가 쓰고 있는지"를 찾아내는 일이다. 이 순서를 건너뛰고 -l이나 -f로 밀어붙이면 그 순간은 넘어가지만 데이터가 조용히 사라진다.
기본 형식
umount [옵션] 마운트지점_또는_디바이스
마운트 지점(/data)을 주는 쪽을 권한다. 같은 디바이스가 여러 곳에 마운트될 수 있어 디바이스 이름으로는 어느 것을 떼는지 모호해질 수 있기 때문이다. 명령 이름에 n이 없다는 점(unmount가 아니라 umount)도 처음에는 자주 틀리는 지점이다.
자주 쓰는 옵션
| 옵션 | 의미 | 예시 |
|---|---|---|
| (없음) | 정상 해제. 사용 중이면 거부된다 | sudo umount /data |
| -l | lazy. 트리에서 즉시 떼고 참조가 끝나면 실제 해제 | 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 /로 빠져나온 뒤 다시 시도하라. 그래도 안 되면 lsof와 fuser로 확인한다.
-l(lazy)은 문제를 해결하는 게 아니라 감춘다. lazy 언마운트는 디렉터리 트리에서만 즉시 떼어 낼 뿐, 그 파일시스템의 파일을 열고 있던 프로세스는 계속 보이지 않는 파일에 계속 쓴다. df에는 안 나오는데 디스크는 계속 차고, 그 상태에서 디바이스를 분리하거나 스냅샷을 뜨면 데이터가 중간에 잘린다. 임시로 트리를 정리해야 할 때만 쓰고, 반드시 원인 프로세스를 종료해 실제 해제까지 확인하라. 실제 해제 여부는 cat /proc/self/mountinfo | grep /data나 lsof로 본다.
-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 유닛을 먼저 멈출 때.