모든 컴퓨터 운영 체제는 부팅 시에 마운트한 파일 시스템의 일관성을 확인한다.
즉, 내부 데이터 구조와 맵핑한 연결된 스토리지에 오류가 없는지 확인한다. UNIX,
Linux® 및 기타 UNIX 계열 운영 체제에서는 효과적인 방법을 통해 파일 시스템의
일관성을 확인할 필요가 있는지 여부를 결정한다(일반적으로 fast
명령 사용). 이러한 시스템에서는 파일 시스템을 마운트할 때 파일 시스템을 DIRTY로
표시하는 값을 파일 시스템 헤더에 설정한다. 이 값은 해당 파일 시스템이 사용 중이므로
업데이트가 작성될 때 일시적으로 일관되지 않을 수도 있음을 의미한다. 파일 시스템이
시스템 종료 과정에서 마운트 해제되는 경우에는 CLEAN으로
표시된다. 파일 시스템이 다시 부팅되면 여전히 DIRTY로
표시된 파일 시스템만 일관성을 확인하면 된다.
파일 시스템은 일반적으로 비시스템 프로세스가 모두 종료된 후에 발생하는 시스템 종료 프로세스 중에 자동으로 마운트 해제된다. 그럼에도 불구하고 파일 시스템을 마운트 해제하는 작업이 실패하면서 다음과 같은 일반적인 메시지가 표시될 수 있다.
$ sudo umount /mnt/NAS umount: /mnt/NAS: device is busy |
이 경우 busy는 해당 파일 시스템에 쓰기
작업을 수행하고 있거나 실행 중인 프로세스가 있음을 의미한다. 이러한 경우에
파일 시스템을 마운트 해제할 수 없다는 사실은 컴퓨터 시스템의 기본 규칙 중
하나이다. @@@이러한 경우에 해당되지 않는다면 일부 프로세스가 파일 시스템에 있는
파일에 쓰기 작업을 수행하는 동안 해당 파일 시스템을 마운트 해제할 수 있다.
이 경우 파일은 불일치 상태로 남게 되는 반면 파일 시스템 자체는 CLEAN으로
표시된다.@@@
표준 Linux 버전의 umount 명령에는 사용 중인
파일 시스템을 마운트 해제하는 데 도움이 되는 레이지(lazy) 마운트 해제 옵션인
-l 옵션이 있다. 이 명령을 사용하려면 Linux 커널
버전이 2.4.11 이상이어야 하며 오늘날에는 이로 인한 문제가 많이 발생하지 않고
있다. umount -l /name/of/file system을 실행하면
새 프로세스에서 해당 파일 시스템을 사용할 수 없도록 지정된 파일 시스템이
시스템의 디렉토리 계층 구조에서 분리되며, 그런 다음 파일 시스템에 액세스하고
있던 모든 프로세스가 종료되면 파일 시스템이 마운트 해제된다. 이 명령은 쉽게
사용할 수는 있지만 파일 시스템을 지금 당장 마운트 해제해야 하는 경우에는
적합하지 않은 명령이다.
파일 시스템을 지금 당장 마운트 해제해야 하는데 해당 파일 시스템이 사용 중일 때 사용할 수 있는 몇 가지 옵션이 있다. 현재 사용자가 시스템의 유일한 사용자일 경우 파일 시스템의 마운트 해제에 장애가 되는 프로세스를 종료하는 작업은 모든 창에서 해당 파티션에 쓰기 작업을 수행하고 있거나 해당 파티션을 현재 작업 디렉토리로 사용하고 있는 일시중단된 프로세스 또는 백그라운드 프로세스를 검색하여 종료하는 작업처럼 쉽게 수행할 수 있다. 하지만 로컬 및 원격 사용자가 많이 있는 다중 사용자 시스템에서는 이 방법이 실용적이지 않다. 다행스럽게도 오픈 소스 커뮤니티에서 그러한 프로세스를 쉽게 식별하여 종료할 수 있는 몇 가지 명령을 제공하고 있다.
lsof(list open files) 명령은 특정 파일 시스템, 디렉토리
또는 장치에서 열려 있는 모든 파일 및 관련 프로세스를 보여 주는 목록을 표시한다. lsof
명령은 IBM® AIX®, BSD®(Berkeley Software Distribution), HP-UX®(Hewlett
Packard UNIX), Linux 및 Solaris®를 포함한 대부분의 UNIX 및 UNIX 계열 시스템에서 사용할
수 있다. 참고자료에서 사용 중인 시스템에서 사용할 수 있는 lsof에
대한 다운로드 정보를 확인할 수 있다.
기본적으로 lsof 명령은 현재 열려 있는
모든 파일, 공유 라이브러리 및 디렉토리를 나열하고 각 항목에 대한 정보를
최대한으로 제공한다. 이 명령은 로드 용량이 작은 시스템이라고 할지라도
많은 양의 결과를 출력하므로 일반적으로 디렉토리 이름을 명령행 인수로
제공하거나 파이프를 사용하여 출력을 필터링한다. 예를 들어, /opt2 디렉토리에
마운트된 파일 시스템을 마운트 해제하려는 경우 /opt2 디렉토리에 연관된
모든 프로세스를 보려면 Listing 1과 같은 명령을 실행한다.
Listing 1. 마운트된 파일 시스템에 연관된 프로세스
$ lsof /opt2 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 23334 wvh cwd DIR 8,17 4096 2 /opt2 more 23402 wvh cwd DIR 8,17 4096 2 /opt2 more 23402 wvh 3r REG 8,17 10095 264 /opt2/resume.txt |
/opt2 파티션을 마운트 해제하려면 먼저 이러한 프로세스를 모두 종료해야
한다. 이 목록의 프로세스 중에는 파일을 쓰고 있는 프로세스가 없기 때문에 kill
명령을 사용하여 두 번째 열에 나열된 PID(Process ID)를 종료하고 별다른 문제
없이 파티션을 마운트 해제할 수 있다. 이 목록에서 PID 23402는 마지막 두 행과
연관되어 있다. 첫 번째 행은 more 명령이 /opt2의
현재 작업 디렉토리(cwd)에서 실행되고 있음을 나타내고
두 번째 행은 more 명령이 /opt2/resume.txt 파일을
열어 놓고 있음을 나타낸다.
하지만 lsof 명령의 출력이 Listing 2와 같다고 가정해 보자.
Listing 2. 마운트된 파일 시스템에 연관된 다른 프로세스 세트
$ lsof /opt2 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 23334 wvh cwd DIR 8,17 4096 2 /opt2 more 23402 wvh cwd DIR 8,17 4096 2 /opt2 more 23402 wvh 3r REG 8,17 10095 264 /opt2/resume.txt bash 21343 djf cwd DIR 8,17 4096 2 /opt2 emacs 21405 djf cwd DIR 8,17 4096 2 /opt2 |
/opt2 디렉토리와 관련된 처음 세 명령은 같은 사용자에 의해 실행되고 있지만 나머지
두 명령은 다른 사용자에 의해 실행되고 있다. 이러한 명령 중에서 emacs
명령은 파일 편집을 위해 설계된 명령이므로 해당 프로세스를 종료하기 전에 USER
열에 나열된 사용자를 저장하고 종료할 수 있다.
앞 섹션에서는 로컬 장치에서 열려 있는 파일 및 디렉토리를 식별하는 방법을 살펴보았다. 하지만 마운트된 원격 파일 시스템에 대해서도 동일한 정보를 쉽게 가져올 수 있다.
이 기사에서는 일관된 예제 세트를 제공하기 위해 모든 명령 및 출력 예제는 Listing 3에서 보여 주는 시스템의 마운트된 파티션을 참조한다.
Listing 3. 이 기사에서 사용하는 파일 시스템
$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 230528596 201462232 17356188 93% /
/dev/sdb1 240362656 12533532 215619324 6% /opt2
//nas.vonhagen.org/writing
100790048 75945920 197241926 80% /mnt/NAS
192.168.6.166:/mnt/disk1
714854640 386972432 291569696 58% /mnt/yellowmachine
|
Listing 3에서 볼 수 있듯이 /mnt/NAS는 nas.vonhagen.org 장치에서
공유하고 있는 writing이라는 이름의 Samba 공유를 위한 마운트 지점이다. 마운트 지점의 이름을
lsof 명령에 대한 인수로 지정하면 Listing 2와
유사하지만 해당 장치 및 디렉토리에 관한 정보만 출력된다(Listing 4 참조).
Listing 4. 원격 파일 시스템에 연관된 프로세스
$ lsof /mnt/NAS COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME bash 23236 wvh cwd DIR 0,27 4096 6406145 /mnt/NAS/writing \ (nas.vonhagen.org:/writing) |
또한 lsof 명령에는 특정 유형의 장치에서 열려 있는 파일 및
디렉토리만 보고하도록 출력을 제한할 수 있는 옵션이 있다. 예를 들어, Listing
3에서 보듯이 /mnt/yellowmachine 디렉토리는 192.168.6.166 장치에 있는 /mnt/disk1 디렉토리의
NFS(Network File System) 마운트를 위한 마운트 지점이다. Listing 5와 같이
이 장치에 대한 마운트 지점의 이름을 lsof 명령에 대한 인수로 쉽게
제공할 수 있다.
Listing 5. 원격 NFS 파일 시스템에 연관된 프로세스
$ lsof /mnt/yellowmachine COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 23334 wvh cwd DIR 0,23 4096 2 /mnt/yellowmachine \ (192.168.6.166:/mnt/disk1) |
또한 lsof 명령의 -N 옵션을 사용하여
NFS 마운트 장치에서 사용 중인 파일 및 디렉토리만 나열할 수 있다(Listing 6 참조).
Listing 6. 마운트된 모든 NFS 파티션에 연관된 프로세스
$ lsof -N COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 23334 wvh cwd DIR 0,23 4096 2 /mnt/yellowmachine (192.168.6.166:/mnt/disk1) |
lsof 명령에는 다양한 유형의 파일 시스템에 있는 열려 있는
파일 및 디렉토리뿐만 아니라 네트워크 소켓을 열어 놓은 프로세스 및 특정 바이너리를 사용
중인 프로세스 등을 식별하는 데 사용할 수 있는 여러 가지 옵션이 있다. lsof
명령의 단점은 항상 사용자에게 연락하여 특정 프로세스를 종료하도록 요청하거나 해당 프로세스를
직접 종료해야 한다는 것이다. fuser 명령은 좀 더 까다롭기는 하지만
루트 사용자로 실행하면서 프로세스 종료 작업을 효과적으로 수행할 수 있는 강력한 명령이다.
fuser(find user processes) 명령은 파일 시스템의
마운트 해제에 장애가 되는 프로세스를 식별하는 데 사용할 수 있는 또 하나의 오픈
소스 애플리케이션이다. fuser 명령은 명령행 인수로
제공된 모든 유형의 파일, 디렉토리 또는 파일 시스템 마운트 지점에 연관된 사용자
프로세스를 찾는다. 이 기사에서는 주로 fuser를 파일
시스템 마운트 지점과 함께 사용하는 방법을 설명한다. fuser
명령에 대한 일반 정보는 해당 온라인 참조 정보를 참조한다. fuser
명령을 사용하려면 시스템에서 /proc 파일 시스템을 지원해야 한다. 따라서 이 명령은 모든
Linux 배포판 및 FreeBSD 시스템에서 사용할 수 있다. 참고자료에서
fuser 명령의 소스 코드에 대한 다운로드 정보를 확인할 수 있다.
lsof 명령을 사용할 때와 마찬가지로 fuser
명령을 사용하여 파일 시스템의 마운트 해제에 장애가 되는 프로세스를 가장 쉽게 식별하는 방법은 다음과
같이 파일 시스템 마운트 지점의 이름을 명령행 인수로 제공하는 것이다.
$ fuser /mnt/yellowmachine /mnt/yellowmachine: 23334c 23697c |
fuser 명령의 출력은 단순히 지정된 마운트 지점을 사용하고
있는 프로세스의 PID를 식별한다. 각 PID 뒤에는 해당 PID에 연관된 프로세스에서 지정된
마운트 지점을 사용하고 있는 방법을 식별하는 단일 문자가 있다. 이러한 문자의 가장 일반적인
예로는 이전 예제에서 보았던 문자 c가 있다. 이 문자는 지정된
프로세스가 해당 파일 시스템의 디렉토리를 현재 작업 디렉토리로 사용하고 있음을 나타낸다.
아쉽게도 fuser 명령의 기본 출력은 Linux 표준임에도
불구하고 일반 사용자가 이해하기가 쉽지 않다. fuser 명령에는
표준 ps 명령의 출력과 비슷한 약간의 출력을 fuser
명령의 출력에 추가하는 -v 옵션이 있다(Listing 7 참조).
Listing 7. 마운트된 NFS 파일 시스템의 사용자 프로세스
$ fuser -v /mnt/yellowmachine
USER PID ACCESS COMMAND
/mnt/yellowmachine: wvh 23334 ..c.. bash
wvh 23697 ..c.. emacs
|
이 출력은 프로세스에 대한 정보를 식별할 수 있기 때문에 기본 출력보다는
쉽게 이해할 수 있다. fuser 명령을 통해 PID 정보를
확인한 후에는 프로세스를 종료하기 전에 표준 ps 및
egrep 명령 조합을 사용하여 프로세스의 세부 정보를
최대한으로 확인할 수 있다(Listing 8 참조).
Listing 8. 시스템의 특정 프로세스 검색하기
# ps alxww |egrep '23334|23697' 4 1000 23334 23332 20 0 18148 2076 wait Ss pts/13 0:00 -bash 0 1000 23697 23334 20 0 75964 12352 poll_s S+ pts/13 0:00 emacs -nw file2.txt 0 0 23703 23665 20 0 6060 632 - R+ pts/16 0:00 egrep 23334|23697 |
표준 kill 명령을 사용하여 지정된 프로세스를 수동으로
종료하거나 다음 섹션에서 설명하는 대로 fuser 명령의 일부
고급 기능을 사용하여 프로세스를 자동으로 종료할 수 있다.
fuser 명령의 -k 옵션은
인수로 지정한 마운트 지점을 사용 중인 것으로 검색된 프로세스를 자동으로 종료한다. 물론
다른 사용자가 소유하고 있는 프로세스를 종료할 수 있으려면 fuser
명령을 루트 사용자로 실행해야 한다(Listing 9 참조).
Listing 9. 마운트된 NFS 파일 시스템에 연관된 프로세스 종료하기
# fuser -k /mnt/yellowmachine /mnt/yellowmachine: 23334c 23697c Could not kill process 23697: No such process |
이 경우 두 번째 프로세스(emacs)는 첫 번째 프로세스(bash 쉘)의 하위
프로세스였기 때문에 첫 번째 프로세스가 fuser
명령에 의해 종료될 때 함께 종료되었다.
기본 물리적 장치에 포함되어 있는 파일 시스템에 대한 마운트 지점 대신
기본 물리적 장치의 이름을 지정하려면 -m 옵션을
지정해야 한다(Listing 10 참조).
Listing 10. 마운트 지점 및 장치에 대한 프로세스 목록
# fuser -v /opt2
USER PID ACCESS COMMAND
/opt2: wvh 23712 ..c.. bash
wvh 23753 ..c.. emacs
# fuser -v /dev/sdb1
# fuser -vm /dev/sdb1
USER PID ACCESS COMMAND
/dev/sdb1: wvh 23712 ..c.. bash
wvh 23753 ..c.. emacs
|
첫 번째 명령은 파일 시스템에 대한 마운트 지점을 참조하기 때문에 예상하고
있던 출력을 리턴한다. 두 번째 명령은 표준 fuser 옵션을
사용하여 기본 장치를 직접 쿼리할 수 없기 때문에 출력을 리턴하지 않는다. 세 번째
명령의 출력을 보면 -m 옵션을 사용하여 장치를 직접 지정할
수 있다는 것을 알 수 있다. 이 예제의 첫 번째 또는 세 번째 명령에 -k
옵션을 추가하여 /dev/sdb1 장치에 있는 파일 시스템의 프로세스를 종료할 수 있다.
모든 Linux 또는 UNIX 시스템 관리자에게는 비상 상황에 대처하기 위해 파티션을
마운트 해제해야 하거나 단순히 마운트된 CD-ROM 또는 DVD와 같은 장치를 제거해야
하는 상황이 발생할 수 있다. 장치가 사용 중이어서 해당 장치를 마운트 해제할 수
없을 때 시스템의 모든 프로세스를 조사하려면 그 작업이 매우 번거롭고 많은 시간이
걸리게 된다. lsof 및 fuser
명령을 사용하면 파일 시스템의 마운트 해제에 장애가 되는 프로세스를 쉽게 식별할
수 있다. 게다가 매우 바쁠 때는 fuser 명령을 사용하여
해당 프로세스를 종료할 수도 있다.
교육
-
developerWorks의 AIX와 UNIX 영역에서는 AIX 시스템 관리의 모든 부분과 관련된 다양한 정보를 볼 수 있다.
-
AIX와 UNIX 입문에서 AIX와 UNIX에 대한 자세한 정보를 볼 수 있다.
-
기술 서점에서
다양한 기술 주제와 관련된 서적을 살펴보자.
제품 및 기술 얻기
-
lsof명령은 대부분의 Linux 시스템에서 기본적으로 설치되며lsof의 소스 패키지는 해당 배포판의 저장소에서 사용할 수 있다. 최신 버전의lsof는 lsof.itap.purdue.edu의 익명 FTP(File Transfer Protocol)를 통해 pub/tools/unix/lsof 디렉토리에서 다운로드할 수 있다. FTP URL ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof에서도lsof를 다운로드할 수 있다. -
fuser명령은 PSmisc 패키지의 일부이며 이 패키지에는pstree및killall등의 명령도 있다. -
Linux Foundation에서 제공하는 Forced
Unmount 또는
fumount라는 간단한 스크립트는 자동으로 수많은fuser명령을 적합한 마운트 해제 명령과 결합하여 지정된 파티션을 강제로 마운트 해제하려고 시도한다.
토론
-
developerWorks 포럼 & 블로그를 통해 developerWorks 커뮤니티에 참여하자.
- Twitter의 developerWorks 페이지를 살펴보자.
- My developerWorks 커뮤니티에 참여하자.
-
AIX 및 UNIX 포럼에 참여하자.
- AIX Forum
- AIX Forum for developers
- Cluster Systems Management
- IBM Support Assistant Forum
- Performance Tools Forum
- Virtualization Forum
- 기타 AIX and UNIX Forums