개요
리눅스에서 GBS(Generic Build System, 예: Tizen GBS)로 패키지를 빌드하다 보면, 빌드 루트(gbsroot)가 정상적으로 언마운트되지 않아 후속 빌드나 정리가 실패하는 경우가 있다. 이때 터미널에는 device is busy 메시지가 뜨며, umount만으로는 마운트 포인트를 해제하기 어렵다. 이 글에서는 device is busy의 원인과 umount -l·-f 옵션, fuser를 이용한 점유 프로세스 처리까지 포함한 해결 절차를 정리한다.
대상 독자: GBS·Tizen 등 리눅스 기반 빌드 환경을 쓰는 개발자, 시스템 관리자.
문제 상황
GBS 빌드 중 또는 빌드 실패 후 정리 단계에서 다음과 비슷한 로그가 나올 수 있다.
| |
즉, 빌드 루트 아래에 마운트된 디렉터리(예: dev/shm)가 남아 있어, 자동 정리 시 예기치 않게 삭제될 수 있다는 경고다. 이 상태에서 수동으로 해당 경로를 언마운트하려 하면:
| |
원인: 해당 파일시스템(또는 마운트 포인트)을 어떤 프로세스가 사용 중이기 때문이다. 예를 들어 현재 작업 디렉터리가 그 안에 있거나, 파일을 열어 두었거나, 공유 메모리 등을 사용 중일 수 있다. 커널은 “사용 중인” 파일시스템을 즉시 언마운트하지 않도록 되어 있어 device is busy가 발생한다.
해결 흐름도
아래는 device is busy가 났을 때 시도할 수 있는 해결 절차를 요약한 흐름이다.
flowchart LR
subgraph problem["문제"]
A[빌드 루트에마운트 잔존]
B["device is busy오류"]
end
subgraph step1["1단계"]
C[umount -l 시도]
D[성공]
end
subgraph step2["2단계"]
E[umount -f 시도]
F[성공]
end
subgraph step3["3단계"]
G["fuser -ck마운트포인트"]
H[umount 재시도]
I[성공]
end
A --> B
B --> C
C -->|"해제됨"| D
C -->|"여전히 busy"| E
E -->|"해제됨"| F
E -->|"여전히 busy"| G
G --> H
H --> I
- 1단계:
umount -l(lazy umount)로 시도. - 2단계: 안 되면
umount -f(force) 시도. - 3단계: 그래도 실패하면
fuser -ck로 해당 경로를 사용하는 프로세스를 종료한 뒤umount재시도.
해결 방법 1: umount -l / -f 옵션
umount -l (lazy umount)
-l(또는 --lazy)은 지연 언마운트다. 즉시 마운트를 끊지 않고, 해당 파일시스템을 사용하는 프로세스가 모두 빠져 나갈 때까지 기다렸다가 그때 해제한다. GBS 빌드 루트처럼 일시적으로 프로세스가 붙어 있는 경우에 유용하다.
| |
/etc/mtab에 기록하지 않으려면 -n을 함께 쓸 수 있다.
| |
많은 경우 이렇게 하면 원하는 대로 디렉터리가 언마운트된다.
umount -f (force)
-f(또는 --force)는 강제 언마운트를 시도한다. 주로 NFS처럼 원격이 끊겼을 때 사용하며, 로컬 파일시스템에서는 안 되는 경우도 있다. -l로 해결되지 않을 때 시도해 볼 수 있다.
| |
주의: force 옵션은 시스템 호출이 멈출 수 있어, 가능하면 절대 경로를 쓰고 심볼릭 링크를 피하는 것이 좋다(공식 매뉴얼 권장).
해결 방법 2: fuser로 점유 프로세스 확인·종료 후 umount
device is busy 메시지에서도 안내하듯, 해당 장치·파일을 사용 중인 프로세스를 찾으려면 lsof(8) 또는 **fuser(1)**를 쓸 수 있다. 여기서는 fuser를 이용해 “마운트 포인트를 쓰는 프로세스를 종료한 뒤 umount”하는 방법을 정리한다.
기본 사용 패턴
| |
-k: 해당 파일(또는 파일시스템)을 사용하는 모든 프로세스에 SIGKILL을 보낸다.-c: 지정한 경로를 마운트된 파일시스템으로 간주하고, 그 파일시스템을 사용하는 프로세스를 대상으로 한다. (일부 환경에서는-m과 동일한 의미로 쓰인다.)
예시(마운트 포인트 기준):
| |
주의: -k는 프로세스를 강제 종료하므로, 중요한 작업이 그 안에서 돌고 있지 않은지 확인한 뒤 사용해야 한다. 확인만 하고 싶다면 -k 없이 fuser -v 또는 fuser -uv로 어떤 프로세스가 붙어 있는지 먼저 보는 것이 좋다.
fuser 주요 옵션 요약
| 옵션 | 설명 |
|---|---|
-a | 사용 중이지 않은 파일까지 모두 표시 |
-k | 지정한 파일·파일시스템을 사용하는 프로세스에 SIGKILL 전송 |
-i | 프로세스를 종료하기 전에 사용자에게 확인 (kill 시) |
-n space | 지정한 공간(file, udp, tcp 등)에서만 검색 |
-s | 결과를 간략히 출력 |
-u | PID와 함께 프로세스 소유자(사용자) 표시 |
-v | 자세한(verbose) 출력, ps 스타일로 표시 |
-m | 경로를 마운트 포인트로 간주하고 해당 파일시스템 사용 프로세스만 대상 |
예: 먼저 누가 쓰는지 확인한 뒤 종료하려면:
| |
주의사항 및 요약
- umount -l: “지연 언마운트”로, 사용 중인 프로세스가 없어질 때까지 기다렸다가 해제한다. GBS 빌드 루트 정리 시 우선 시도할 만한 방법이다.
- umount -f: 강제 시도이며, 로컬 파일시스템에서는 실패할 수 있다. NFS 등에서 유용하다.
- fuser -ck: 해당 경로(또는 파일시스템)를 사용하는 프로세스를 종료하므로, 중요한 서비스나 작업이 그 안에 있으면 중단될 수 있다. 가능하면
fuser -v등으로 점유 프로세스를 확인한 뒤 사용한다. - GBS 빌드 실패 후 정리할 때는, 위 순서(1. umount -l → 2. umount -f → 3. fuser -ck 후 umount)대로 적용하면 대부분의 device is busy 상황을 정리할 수 있다.
참고 문헌
- umount(8) - Linux manual page — util-linux, 마운트 해제 및
-l,-f등 옵션 설명. - fuser(1) - Linux manual page — 파일·소켓을 사용하는 프로세스 확인 및 종료.
- lsof(8) - Linux manual page — 열린 파일 목록 확인 시
fuser와 함께 자주 참고되는 도구.
![Featured image of post [Linux] GBS build 시 device is busy·umount 오류 해결 방법](/post/2021-07-12-unmout-vbsbuild/wordcloud_hu_95f248408307ee37.webp)
![[Hardware] LattePanda Alpha에 Ubuntu 16.04 LTS 설치 가이드](/post/2018-12-06-install-ubuntu-16.04-on-lattepanda/wordcloud_hu_fc536f8de2cbd4bf.webp)
![[Rust] Comprehensive Rust 무료 강의 정리 및 코스 구조](/post/2022-12-30-comprehensive-rust/wordcloud_hu_d1420ff38434cdb6.webp)
![[RPM] Spec 파일에서 주석과 매크로 동시 사용 시 주의사항](/post/2021-11-24-rpm-spec-comments/wordcloud_hu_6d09ac09623081c7.webp)
![[Hyper-V] 가상 머신 해상도 설정: Set-VMVideo 활용 가이드](/post/2025-05-24-hyper-v-virtual-machine-resolution-setting-set-vmvideo-utilization-guide/image_hu_96966cce8efeeb71.webp)
![[Tutorial] Learn Prompting - 프롬프트 엔지니어링 무료 가이드 정리](/post/2022-12-30-learn-prompting/wordcloud_hu_6a9d105de4834753.webp)