Featured image of post [GBS] device is busy 문제 해결 방법

[GBS] device is busy 문제 해결 방법

리눅스에서 gbs로 개발을 하다보면 gbsroot가 제대로 unmount가 되지 않아서 문제가 발생할 수 있다. 이러한 경우에 해결하는 방법을 알아 보자.

문제 상황

1
2
3
error: there're mounted directories to build root. Please unmount them manually to avoid being deleted unexpectly:
        / ==> /home1/jong-min.kim/VBS-ROOT/local/BUILD-ROOTS/scratch.armv7l.0/dev/shm
error: <gbs>some packages failed to be built

위 로그 처럼 제대로 unmount가 되지 않아서 문제가 발생한것을 알 수 있다.

Unmount 사용

1
2
3
4
5
$ sudo umount -n /home1/jong-min.kim/VBS-ROOT/local/BUILD-ROOTS/scratch.armv7l.0/dev/shm
[sudo] password for jong-min.kim:
umount: /home1/jong-min.kim/VBS-ROOT/local/BUILD-ROOTS/scratch.armv7l.0/dev/shm: device is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))

unount 명령어를 사용해서 문제가 되는 디렉토리 제거를 시도해보면 제거가 잘 되지 않는것을 볼 수 있다.

-l 또는 -f 옵션 사용

1
$ umount -l /datadisk

또는

1
$ umount -f /datadisk
  • -f 옵션 : 않되는 경우도 있음
  • -l 옵션 : 지연된 언마운트(lazy umount), 지연된 언마운트(lazy umount)는 디바이스가 사용되지 않을 때까지 대기한 후에 디렉토리 트리로부터 파일시스템을 언마운트한다.
1
$ sudo umount -nl /home1/jong-min.kim/VBS-ROOT/local/BUILD-ROOTS/scratch.armv7l.0/dev/shm

이때 -l 옵션을 사용하여 디렉토리를 unmount 시켜주면 원하는 동작이 잘 이루어지는것을 볼 수 있다.

fuser 사용

1
2
fuser -ck /datadisk
umount /datadisk

fuser 명령어

fuser명령어는 특정파일을 어떤프로세스에서 사용하고 있는지 확인이 필요할 때, 또는 특정 파일이 사용되고 있는 프로세스 ID를 확인하고자 할때 사용되는 명령어로 특정 파일과 PID를 KILL 또는 재시작 할 수도 있다.

옵션

  • -a : 사용되고 있지 않은 파일까지도 표시한다.
  • -k : 지정된 파일과 관련된 모든 프로세스들을 KILL 한다.
  • -i : 프로세스를 KILL 하기전에 사용자에게 확인한다.
  • -n space : 지정된 공간(file, udp, or , tcp)내에서 검색한다.
  • -s : 결과를 간략히 출력한다.
  • -u : 프로세스 ID(PID)의 소유자를 보여준다.