mount 명령어: 디스크와 이미지 파일 마운트, umount 해제와 target is busy 해결

mount 명령어는 디스크 파티션이나 이미지 파일의 파일 시스템을 디렉터리에 연결하는 리눅스 명령어이고, 연결을 해제할 때는 umount를 사용합니다. AlmaLinux 9 시험 서버에서 연습용 이미지의 파티션을 마운트해 읽기 전용 전환과 해제까지 진행했고, 해제할 때 나온 target is busy 오류는 fuser로 사용 중인 프로세스를 찾아 해결했습니다.
아래 명령은 AlmaLinux 9 시험 서버의 root 계정에서 truncate로 만든 2 GiB 이미지를 루프 장치 /dev/loop0에 연결해 실행했고, 출력은 util-linux 2.37.4의 mount로 받은 값 그대로입니다. 이미지의 1번 파티션은 ext4, 2번 파티션은 xfs로 포맷했습니다. 마운트 지점으로 사용한 /mnt/data, /mnt/backup, /mnt/x 디렉터리는 mkdir로 먼저 만들었고, 시뮬레이터에 나오는 접속 주소는 예시 값입니다.
1️⃣ mount 명령어 기본 사용법
mount는 장치와 마운트 지점을 차례로 적어 실행합니다. 마운트하기 전에 lsblk로 연습용 장치의 파티션과 파일 시스템 형식을 먼저 확인했습니다.
lsblk -o NAME,FSTYPE,LABEL,MOUNTPOINTS /dev/loop0NAME FSTYPE LABEL MOUNTPOINTS
loop0
|-loop0p1 ext4 data
`-loop0p2 xfs backup loop0p1은 ext4, loop0p2는 xfs였고 MOUNTPOINTS 칸이 비어 있어 두 파티션 모두 마운트되지 않은 상태였습니다. 1번 파티션을 /mnt/data에 마운트했습니다.
mount /dev/loop0p1 /mnt/data마운트에 성공하면 아무것도 출력하지 않습니다. 결과는 findmnt에 마운트 지점을 넣어 확인했습니다.
findmnt /mnt/dataTARGET SOURCE FSTYPE OPTIONS
/mnt/data /dev/loop0p1 ext4 rw,relatime,seclabelSOURCE 칸에 장치, FSTYPE 칸에 파일 시스템 형식, OPTIONS 칸에 마운트 옵션이 나왔습니다. 옵션을 지정하지 않아 읽기와 쓰기가 모두 가능한 rw로 마운트되었습니다. 용량은 [df -h]로 확인했습니다.
df -h /mnt/dataFilesystem Size Used Avail Use% Mounted on
/dev/loop0p1 974M 24K 907M 1% /mnt/data1 GiB 파티션이 974M 크기로 /mnt/data에 연결되었습니다. 새로 만든 ext4 파일 시스템이어서 ls에는 lost+found 디렉터리만 나왔습니다.
ls /mnt/datalost+foundmount를 인자 없이 실행하면 지금 마운트된 파일 시스템이 모두 나옵니다. 이 서버에서는 26줄이 나와 grep으로 /mnt/data 줄만 출력했습니다.
mount | wc -l26mount | grep /mnt/data/dev/loop0p1 on /mnt/data type ext4 (rw,relatime,seclabel)한 줄에 장치, 마운트 지점, 형식, 옵션이 차례로 나옵니다. 장치 없이 -t에 형식만 적으면 그 형식으로 마운트된 줄만 나옵니다.
mount -t ext4/dev/vda2 on / type ext4 (rw,relatime,seclabel)
/dev/loop0p1 on /mnt/data type ext4 (rw,relatime,seclabel)루트(/)의 /dev/vda2와 방금 마운트한 /dev/loop0p1 두 줄이 나왔습니다.
마운트할 때 -t를 붙이면 파일 시스템 형식을 지정합니다. xfs로 포맷한 2번 파티션을 [-t xfs]로 /mnt/backup에 마운트했습니다.
mount -t xfs /dev/loop0p2 /mnt/backupfindmnt /mnt/backupTARGET SOURCE FSTYPE OPTIONS
/mnt/backup /dev/loop0p2 xfs rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquotaFSTYPE 칸이 xfs로 나왔습니다. -t를 생략하면 mount가 파일 시스템 형식을 자동으로 확인합니다. 같은 파티션을 해제한 뒤 -t 없이 다시 실행했을 때도 오류 없이 마운트되었습니다.
umount /mnt/backupmount /dev/loop0p2 /mnt/backup부팅할 때 자동으로 마운트할 파일 시스템은 /etc/fstab에 적습니다. fstab에 줄을 추가하는 순서는 리눅스 디스크 마운트 글에서 확인할 수 있습니다.
2️⃣ mount 옵션: 읽기 전용과 remount
-o 뒤에는 마운트 옵션을 쉼표로 이어 적습니다. ro는 읽기 전용 옵션으로, 내용을 변경하면 안 되는 파일 시스템을 열 때 사용합니다. /mnt/data를 해제한 뒤 [-o ro]로 다시 마운트했습니다.
umount /mnt/datamount -o ro /dev/loop0p1 /mnt/datafindmnt -o TARGET,OPTIONS /mnt/dataTARGET OPTIONS
/mnt/data ro,relatime,seclabelOPTIONS 칸의 첫 값이 rw에서 ro로 바뀌었습니다. 이 상태에서 touch로 파일을 만들자 오류가 나왔습니다.
touch /mnt/data/test.txttouch: cannot touch '/mnt/data/test.txt': Read-only file system[Read-only file system] 오류가 나왔고 종료 코드는 1이었습니다. 쓰기가 필요하면 해제하지 않고 [-o remount,rw]로 옵션만 변경할 수 있습니다. remount에는 장치 없이 마운트 지점만 적었습니다.
mount -o remount,rw /mnt/datatouch /mnt/data/test.txtfindmnt -o TARGET,OPTIONS /mnt/dataTARGET OPTIONS
/mnt/data rw,relatime,seclabel같은 touch가 오류 없이 끝났고 OPTIONS 칸은 다시 rw가 되었습니다.
3️⃣ umount 명령어와 target is busy
마운트를 해제할 때는 umount에 마운트 지점을 적습니다. /mnt/backup을 해제했습니다.
umount /mnt/backup해제에 성공하면 mount와 같이 아무것도 출력하지 않습니다. 그 파일 시스템을 사용 중인 프로세스가 있으면 해제되지 않습니다. 작업 디렉터리가 /mnt/data인 sleep 프로세스를 백그라운드로 실행해 둔 상태에서 umount를 실행했습니다.
umount /mnt/dataumount: /mnt/data: target is busy.[target is busy] 오류가 나왔고 종료 코드는 32였습니다. 사용 중인 프로세스는 [fuser -vm]으로 확인했습니다.
fuser -vm /mnt/data USER PID ACCESS COMMAND
/mnt/data: root kernel mount /mnt/data
root 6444 ..c.. sleepkernel 줄은 마운트 자체이고, 그 아래 줄이 사용 중인 프로세스입니다. PID 6444인 sleep 프로세스가 나왔습니다. 같은 내용을 lsof로 확인했습니다.
lsof +f -- /mnt/dataCOMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sleep 6444 root cwd DIR 259,2 4096 2 /mnt/dataFD 칸에 cwd가 나와, 이 프로세스의 작업 디렉터리가 /mnt/data인 것을 확인했습니다. 프로세스를 종료한 뒤 umount를 다시 실행했습니다.
kill 6444umount /mnt/data이번에는 오류 없이 끝났고, [findmnt /mnt/data]에 아무것도 나오지 않아 해제된 것을 확인했습니다.
프로세스를 종료하지 않고 해제하는 옵션은 [umount -l]입니다. 매뉴얼은 -l을 파일 시스템을 디렉터리 구조에서 바로 분리하고, 사용이 끝나면 남은 참조를 정리하는 옵션으로 설명합니다. 다시 마운트하고 같은 방법으로 sleep 프로세스를 실행해 둔 상태에서 -l로 해제했습니다.
mount /dev/loop0p1 /mnt/dataumount -l /mnt/datalsblk /dev/loop0NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 2G 0 loop
|-loop0p1 259:2 0 1G 0 part
`-loop0p2 259:3 0 1023M 0 part [umount -l]은 오류 없이 끝났고 lsblk의 MOUNTPOINTS 칸에서 /mnt/data가 사라졌습니다. sleep 프로세스는 그때까지 실행 중이어서 kill로 종료했습니다.
4️⃣ 이미지 파일과 bind 마운트
디스크 이미지 파일은 [-o loop]로 바로 마운트할 수 있습니다. truncate로 200 MiB 파일을 만들고 mkfs.ext4로 포맷했습니다. mkfs.ext4는 ext4 파일 시스템을 만드는 명령입니다. 파티션이 아닌 일반 파일에도 만들도록 -F를, 진행 내용을 출력하지 않도록 -q를 붙였습니다.
truncate -s 200M /root/lab/fs.imgmkfs.ext4 -q -F /root/lab/fs.imgmount -o loop /root/lab/fs.img /mnt/xfindmnt /mnt/xTARGET SOURCE FSTYPE OPTIONS
/mnt/x /dev/loop1 ext4 rw,relatime,seclabelSOURCE 칸이 이미지 파일이 아닌 /dev/loop1로 나왔습니다. mount가 비어 있는 루프 장치에 이미지 파일을 연결한 뒤 그 장치를 마운트했기 때문입니다. umount로 해제하자 루프 장치 연결도 함께 해제되어, losetup 목록에는 처음부터 있던 /dev/loop0만 남았습니다.
umount /mnt/x--bind는 장치가 아닌 디렉터리를 다른 경로에 한 번 더 연결합니다. /root/lab 디렉터리를 /mnt/x에 연결했습니다.
mount --bind /root/lab /mnt/xfindmnt /mnt/xTARGET SOURCE FSTYPE OPTIONS
/mnt/x /dev/vda2[/root/lab] ext4 rw,relatime,seclabelSOURCE 칸에는 원래 파일 시스템의 장치 /dev/vda2 뒤에 연결한 디렉터리 /root/lab이 대괄호로 붙어 나왔습니다. ls로 /mnt/x를 확인했습니다.
ls /mnt/xdisk.img
fs.img/root/lab에 있는 disk.img와 fs.img가 그대로 나왔습니다.
umount /mnt/x--bind로 연결한 경로도 다른 마운트와 같이 umount로 해제했습니다.
🔲 mount 명령어 옵션
| 옵션 | 복사 | 설명 |
|---|---|---|
| -t--types | 파일 시스템 형식을 지정해 마운트. 장치 없이 적으면 그 형식으로 마운트된 목록만 출력 | |
| -o ro | 읽기 전용으로 마운트 | |
| -o remount,rw | 마운트된 파일 시스템을 해제하지 않고 읽기와 쓰기로 전환 | |
| -o loop | 이미지 파일을 루프 장치에 연결해 마운트 | |
| -o loop,ro | 이미지 파일을 읽기 전용으로 마운트 | |
| --bind-B | 디렉터리를 다른 경로에 한 번 더 연결 | |
| umount | 마운트 지점이나 장치 이름을 적어 마운트 해제 | |
| umount -l--lazy | 디렉터리 구조에서 바로 분리하고 사용이 끝나면 정리 |
| 옵션 | 복사 | 설명 |
|---|---|---|
| -a--all | fstab에 적힌 파일 시스템을 모두 마운트 | |
| -r--read-only | 읽기 전용으로 마운트(-o ro와 같음) | |
| -w--rw | 읽기와 쓰기로 마운트(기본값) | |
| -L--label | 파일 시스템 라벨로 장치를 지정 | |
| -U--uuid | 파일 시스템 UUID로 장치를 지정 | |
| -v--verbose | 진행 내용을 출력 | |
| -f--fake | 실제로 마운트하지 않고 시험 실행 | |
| -T--fstab | /etc/fstab 대신 사용할 파일을 지정 | |
| -R--rbind | 디렉터리와 그 아래 마운트까지 다른 경로에 연결 | |
| -M--move | 마운트된 디렉터리를 다른 경로로 이동 | |
| umount -a--all | 파일 시스템을 모두 해제 | |
| umount -f--force | 강제로 해제(연결할 수 없는 NFS에 사용) | |
| umount -R--recursive | 마운트 지점과 그 아래 마운트까지 차례로 해제 | |
| umount -d--detach-loop | 루프 장치를 마운트한 경우 그 루프 장치도 해제 | |
| umount -r--read-only | 해제에 실패하면 읽기 전용으로 다시 마운트 | |
| umount -q--quiet | not mounted 오류 메시지를 출력하지 않음 |
🔲 mount 명령어 시뮬레이터
아래 시뮬레이터에서 본문의 mount와 umount 명령을 칩이나 키보드로 입력할 수 있습니다. [cd /mnt/data]로 이동한 뒤 umount를 실행하면 [target is busy] 오류까지 확인할 수 있습니다.
5️⃣ mount 명령어 실무 예시
이 장은 같은 시험 서버에서 연습용 이미지를 새로 만들어 진행한 결과이며, 같은 순서를 mount 명령어 시뮬레이터에서 직접 입력해 볼 수 있습니다.
🔲 mount 읽기 전용 마운트 예시
백업 파티션에서 파일을 복사할 때는 내용을 실수로 변경하지 않도록 읽기 전용으로 마운트했습니다. 먼저 xfs 파티션을 마운트해 설정 파일 app.conf를 만들어 두고 해제했습니다.
mount /dev/loop0p2 /mnt/backuptouch /mnt/backup/app.confumount /mnt/backup같은 파티션을 [-o ro]로 마운트하고 findmnt로 옵션을 확인했습니다.
mount -o ro /dev/loop0p2 /mnt/backupfindmnt -o TARGET,SOURCE,OPTIONS /mnt/backupTARGET SOURCE OPTIONS
/mnt/backup /dev/loop0p2 ro,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquotaOPTIONS 칸이 ro로 시작합니다. 이 상태에서 파일 목록을 확인하고 cp로 app.conf를 /root/lab에 복사했습니다.
ls /mnt/backupapp.confcp /mnt/backup/app.conf /root/lab/ls /root/labapp.conf
disk.img복사는 오류 없이 끝났습니다. 같은 파일을 rm으로 삭제하려 하자 오류가 나왔습니다.
rm /mnt/backup/app.confrm: cannot remove '/mnt/backup/app.conf': Read-only file system[Read-only file system] 오류가 나와 삭제되지 않았습니다. 작업을 마친 뒤 umount로 해제했습니다.
umount /mnt/backup이미지 파일은 옵션을 쉼표로 이어 [-o loop,ro]로 마운트하면 읽기 전용이 됩니다. truncate와 mkfs.ext4로 200 MiB 이미지 fs.img를 새로 만든 뒤 /mnt/x에 마운트하고, findmnt와 losetup으로 확인했습니다.
mount -o loop,ro /root/lab/fs.img /mnt/xfindmnt -o TARGET,SOURCE,FSTYPE,OPTIONS /mnt/xTARGET SOURCE FSTYPE OPTIONS
/mnt/x /dev/loop1 ext4 ro,relatime,seclabellosetup -l -O NAME,RO,BACK-FILENAME RO BACK-FILE
/dev/loop1 1 /root/lab/fs.img
/dev/loop0 0 /root/lab/disk.imgfindmnt의 OPTIONS 칸이 ro였고, losetup의 RO 칸도 fs.img를 연결한 /dev/loop1만 1이었습니다. umount로 해제한 뒤 losetup을 다시 실행했습니다.
umount /mnt/xlosetup -l -O NAME,RO,BACK-FILENAME RO BACK-FILE
/dev/loop0 0 /root/lab/disk.img/dev/loop1 줄이 사라지고 /dev/loop0만 남았습니다.
🔲 mount 사용 시 자주 하는 실수
처음 사용할 때 하기 쉬운 실수는 만들지 않은 디렉터리를 마운트 지점으로 적는 경우입니다. 없는 디렉터리 /mnt/nodir을 적어 실행했습니다.
mount /dev/loop0p1 /mnt/nodirmount: /mnt/nodir: mount point does not exist.[mount point does not exist.] 오류가 나왔습니다. mount는 마운트 지점을 만들지 않으므로 mkdir로 디렉터리를 먼저 만들어야 합니다.
파티션 대신 디스크 전체를 적는 실수도 확인했습니다. 파일 시스템은 파티션 /dev/loop0p1에 있는데 /dev/loop0을 적은 경우입니다.
mount /dev/loop0 /mnt/datamount: /mnt/data: wrong fs type, bad option, bad superblock on /dev/loop0, missing codepage or helper program, or other error.[wrong fs type, bad option, bad superblock] 오류가 나왔습니다. -t에 실제와 다른 형식을 적었을 때도 같은 오류였습니다. xfs 파티션에 [-t ext4]를 지정한 결과입니다.
mount -t ext4 /dev/loop0p2 /mnt/xmount: /mnt/x: wrong fs type, bad option, bad superblock on /dev/loop0p2, missing codepage or helper program, or other error.이 오류가 나오면 lsblk에서 장치 이름(NAME 칸)과 파일 시스템 형식(FSTYPE 칸)부터 확인합니다. 파티션이 없는 새 디스크는 gdisk 명령어로 파티션을 만들고 mkfs로 파일 시스템을 만든 뒤 마운트합니다.
이미 마운트한 장치를 같은 마운트 지점에 다시 마운트했을 때는 [already mounted] 오류가 나왔습니다.
mount /dev/loop0p1 /mnt/datamount: /mnt/data: /dev/loop0p1 already mounted on /mnt/data.해제한 마운트 지점에 umount를 한 번 더 실행했을 때는 [not mounted] 오류였습니다.
umount /mnt/dataumount: /mnt/data: not mounted.마운트 지점 안에서 umount를 실행하는 실수도 있습니다. 셸의 현재 디렉터리가 /mnt/data인 상태에서 [umount /mnt/data]를 실행했습니다.
pwd/mnt/dataumount /mnt/dataumount: /mnt/data: target is busy.셸이 마운트 지점을 사용 중이어서 [target is busy] 오류가 나왔습니다. cd로 마운트 지점 밖으로 이동한 뒤 다시 실행해야 합니다. 이 장의 mount와 umount 오류는 모두 종료 코드가 32였습니다.
🔲 mount 출력 변화 확인
mount와 umount는 성공해도 출력이 없어, 결과는 findmnt와 df의 출력을 실행 전후로 비교해 확인했습니다. 마운트하기 전에는 [findmnt /mnt/data]가 아무것도 출력하지 않았고 종료 코드는 1이었습니다. df에 같은 경로를 넣자 루트 파일 시스템이 나왔습니다.
df --output=source,fstype,target /mnt/dataFilesystem Type Mounted on
/dev/vda2 ext4 //mnt/data가 아직 루트(/) 파일 시스템에 있는 일반 디렉터리라는 의미입니다. 이 상태에서 저장한 파일은 연습용 파티션이 아닌 루트 디스크에 기록됩니다. 1번 파티션을 마운트한 뒤 같은 명령을 실행했습니다.
df --output=source,fstype,target /mnt/dataFilesystem Type Mounted on
/dev/loop0p1 ext4 /mnt/dataFilesystem 칸이 /dev/vda2에서 /dev/loop0p1로, Mounted on 칸이 /에서 /mnt/data로 바뀌었습니다. lsblk에서도 loop0p1 줄의 MOUNTPOINTS 칸에 /mnt/data가 나왔습니다.
lsblk -o NAME,FSTYPE,LABEL,MOUNTPOINTS /dev/loop0NAME FSTYPE LABEL MOUNTPOINTS
loop0
|-loop0p1 ext4 data /mnt/data
`-loop0p2 xfs backup 스크립트에서는 출력 대신 종료 코드로 확인할 수 있습니다. findmnt의 종료 코드는 마운트된 상태에서 0, 마운트되지 않은 상태에서 1이었습니다.
🔢 FAQ & 추천 콘텐츠
Linux · 디스크
리눅스 blkid 명령어 | UUID와 GUID 차이
블록 장치의 파일 시스템 유형과 UUID를 확인하는 blkid 명령어 사용법입니다.
Linux · 디스크
스왑 메모리(Swap Memory) 설정: 파티션&파일 2가지 방식 | swapon, mkswap 명령어
디스크 공간을 메모리처럼 사용하는 스왑을 파티션과 파일 두 가지 방식으로 만들고 mkswap, swapon으로 활성화하는 방법입니다.
ℹ️ 제휴 안내
본 사이트의 콘텐츠에는 제휴 링크가 포함되어 있습니다. 방문자가 이 링크를 통해 상품 또는 서비스를 구매하면 본 사이트는 판매처로부터 수수료를 지급받습니다. 이 과정에서 구매자가 지불하는 금액(이벤트 할인 시 금액이 내려갑니다↓)은 오르지 않습니다. 게시된 가격·할인·재고 정보는 작성 시점 기준이며 실제와 다를 수 있으므로, 구매 전 판매처에서 최종 확인하시기 바랍니다. 상품 선정과 평가는 자체 기준에 따라 작성되며, 수수료 지급 여부가 소개 순서나 평가 내용에 영향을 주지 않습니다.