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

공정위 광고 문구 Ver 3.1
공정위 광고 문구 Ver 3.2(모바일 전용)
테스트 환경RHEL 계열AlmaLinux 9.8root 계정
디스크 · 마운트 명령어mount위치/usr/bin/mount
파티션과 이미지 파일 마운트 작업 확인

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/loop0
NAME      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/data
TARGET    SOURCE       FSTYPE OPTIONS
/mnt/data /dev/loop0p1 ext4   rw,relatime,seclabel

SOURCE 칸에 장치, FSTYPE 칸에 파일 시스템 형식, OPTIONS 칸에 마운트 옵션이 나왔습니다. 옵션을 지정하지 않아 읽기와 쓰기가 모두 가능한 rw로 마운트되었습니다. 용량은 [df -h]로 확인했습니다.

df -h /mnt/data
Filesystem      Size  Used Avail Use% Mounted on
/dev/loop0p1    974M   24K  907M   1% /mnt/data

1 GiB 파티션이 974M 크기로 /mnt/data에 연결되었습니다. 새로 만든 ext4 파일 시스템이어서 ls에는 lost+found 디렉터리만 나왔습니다.

ls /mnt/data
lost+found

mount를 인자 없이 실행하면 지금 마운트된 파일 시스템이 모두 나옵니다. 이 서버에서는 26줄이 나와 grep으로 /mnt/data 줄만 출력했습니다.

mount | wc -l
26
mount | 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/backup
findmnt /mnt/backup
TARGET      SOURCE       FSTYPE OPTIONS
/mnt/backup /dev/loop0p2 xfs    rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota

FSTYPE 칸이 xfs로 나왔습니다. -t를 생략하면 mount가 파일 시스템 형식을 자동으로 확인합니다. 같은 파티션을 해제한 뒤 -t 없이 다시 실행했을 때도 오류 없이 마운트되었습니다.

umount /mnt/backup
mount /dev/loop0p2 /mnt/backup

부팅할 때 자동으로 마운트할 파일 시스템은 /etc/fstab에 적습니다. fstab에 줄을 추가하는 순서는 리눅스 디스크 마운트 글에서 확인할 수 있습니다.

2️⃣ mount 옵션: 읽기 전용과 remount

-o 뒤에는 마운트 옵션을 쉼표로 이어 적습니다. ro는 읽기 전용 옵션으로, 내용을 변경하면 안 되는 파일 시스템을 열 때 사용합니다. /mnt/data를 해제한 뒤 [-o ro]로 다시 마운트했습니다.

umount /mnt/data
mount -o ro /dev/loop0p1 /mnt/data
findmnt -o TARGET,OPTIONS /mnt/data
TARGET    OPTIONS
/mnt/data ro,relatime,seclabel

OPTIONS 칸의 첫 값이 rw에서 ro로 바뀌었습니다. 이 상태에서 touch로 파일을 만들자 오류가 나왔습니다.

touch /mnt/data/test.txt
touch: cannot touch '/mnt/data/test.txt': Read-only file system

[Read-only file system] 오류가 나왔고 종료 코드는 1이었습니다. 쓰기가 필요하면 해제하지 않고 [-o remount,rw]로 옵션만 변경할 수 있습니다. remount에는 장치 없이 마운트 지점만 적었습니다.

mount -o remount,rw /mnt/data
touch /mnt/data/test.txt
findmnt -o TARGET,OPTIONS /mnt/data
TARGET    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/data
umount: /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.. sleep

kernel 줄은 마운트 자체이고, 그 아래 줄이 사용 중인 프로세스입니다. PID 6444인 sleep 프로세스가 나왔습니다. 같은 내용을 lsof로 확인했습니다.

lsof +f -- /mnt/data
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sleep   6444 root  cwd    DIR  259,2     4096    2 /mnt/data

FD 칸에 cwd가 나와, 이 프로세스의 작업 디렉터리가 /mnt/data인 것을 확인했습니다. 프로세스를 종료한 뒤 umount를 다시 실행했습니다.

kill 6444
umount /mnt/data

이번에는 오류 없이 끝났고, [findmnt /mnt/data]에 아무것도 나오지 않아 해제된 것을 확인했습니다.

프로세스를 종료하지 않고 해제하는 옵션은 [umount -l]입니다. 매뉴얼은 -l을 파일 시스템을 디렉터리 구조에서 바로 분리하고, 사용이 끝나면 남은 참조를 정리하는 옵션으로 설명합니다. 다시 마운트하고 같은 방법으로 sleep 프로세스를 실행해 둔 상태에서 -l로 해제했습니다.

mount /dev/loop0p1 /mnt/data
umount -l /mnt/data
lsblk /dev/loop0
NAME      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.img
mkfs.ext4 -q -F /root/lab/fs.img
mount -o loop /root/lab/fs.img /mnt/x
findmnt /mnt/x
TARGET SOURCE     FSTYPE OPTIONS
/mnt/x /dev/loop1 ext4   rw,relatime,seclabel

SOURCE 칸이 이미지 파일이 아닌 /dev/loop1로 나왔습니다. mount가 비어 있는 루프 장치에 이미지 파일을 연결한 뒤 그 장치를 마운트했기 때문입니다. umount로 해제하자 루프 장치 연결도 함께 해제되어, losetup 목록에는 처음부터 있던 /dev/loop0만 남았습니다.

umount /mnt/x

--bind는 장치가 아닌 디렉터리를 다른 경로에 한 번 더 연결합니다. /root/lab 디렉터리를 /mnt/x에 연결했습니다.

mount --bind /root/lab /mnt/x
findmnt /mnt/x
TARGET SOURCE               FSTYPE OPTIONS
/mnt/x /dev/vda2[/root/lab] ext4   rw,relatime,seclabel

SOURCE 칸에는 원래 파일 시스템의 장치 /dev/vda2 뒤에 연결한 디렉터리 /root/lab이 대괄호로 붙어 나왔습니다. ls로 /mnt/x를 확인했습니다.

ls /mnt/x
disk.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--allfstab에 적힌 파일 시스템을 모두 마운트
-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--quietnot mounted 오류 메시지를 출력하지 않음

🔲 mount 명령어 시뮬레이터

아래 시뮬레이터에서 본문의 mount와 umount 명령을 칩이나 키보드로 입력할 수 있습니다. [cd /mnt/data]로 이동한 뒤 umount를 실행하면 [target is busy] 오류까지 확인할 수 있습니다.

mount 명령어 시뮬레이터AlmaLinux 9.8
[root@server work]#
브라우저 안에서만 동작합니다. 마운트와 해제는 이 화면의 가상 서버 상태만 바꾸는 흉내입니다.

5️⃣ mount 명령어 실무 예시

  • ↪️ 읽기 전용으로 마운트한 백업 파티션과 이미지 파일, 자주 하는 실수

이 장은 같은 시험 서버에서 연습용 이미지를 새로 만들어 진행한 결과이며, 같은 순서를 mount 명령어 시뮬레이터에서 직접 입력해 볼 수 있습니다.

🔲 mount 읽기 전용 마운트 예시

백업 파티션에서 파일을 복사할 때는 내용을 실수로 변경하지 않도록 읽기 전용으로 마운트했습니다. 먼저 xfs 파티션을 마운트해 설정 파일 app.conf를 만들어 두고 해제했습니다.

mount /dev/loop0p2 /mnt/backup
touch /mnt/backup/app.conf
umount /mnt/backup

같은 파티션을 [-o ro]로 마운트하고 findmnt로 옵션을 확인했습니다.

mount -o ro /dev/loop0p2 /mnt/backup
findmnt -o TARGET,SOURCE,OPTIONS /mnt/backup
TARGET      SOURCE       OPTIONS
/mnt/backup /dev/loop0p2 ro,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota

OPTIONS 칸이 ro로 시작합니다. 이 상태에서 파일 목록을 확인하고 cp로 app.conf를 /root/lab에 복사했습니다.

ls /mnt/backup
app.conf
cp /mnt/backup/app.conf /root/lab/
ls /root/lab
app.conf
disk.img

복사는 오류 없이 끝났습니다. 같은 파일을 rm으로 삭제하려 하자 오류가 나왔습니다.

rm /mnt/backup/app.conf
rm: 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/x
findmnt -o TARGET,SOURCE,FSTYPE,OPTIONS /mnt/x
TARGET SOURCE     FSTYPE OPTIONS
/mnt/x /dev/loop1 ext4   ro,relatime,seclabel
losetup -l -O NAME,RO,BACK-FILE
NAME       RO BACK-FILE
/dev/loop1  1 /root/lab/fs.img
/dev/loop0  0 /root/lab/disk.img

findmnt의 OPTIONS 칸이 ro였고, losetup의 RO 칸도 fs.img를 연결한 /dev/loop1만 1이었습니다. umount로 해제한 뒤 losetup을 다시 실행했습니다.

umount /mnt/x
losetup -l -O NAME,RO,BACK-FILE
NAME       RO BACK-FILE
/dev/loop0  0 /root/lab/disk.img

/dev/loop1 줄이 사라지고 /dev/loop0만 남았습니다.

🔲 mount 사용 시 자주 하는 실수

처음 사용할 때 하기 쉬운 실수는 만들지 않은 디렉터리를 마운트 지점으로 적는 경우입니다. 없는 디렉터리 /mnt/nodir을 적어 실행했습니다.

mount /dev/loop0p1 /mnt/nodir
mount: /mnt/nodir: mount point does not exist.

[mount point does not exist.] 오류가 나왔습니다. mount는 마운트 지점을 만들지 않으므로 mkdir로 디렉터리를 먼저 만들어야 합니다.

파티션 대신 디스크 전체를 적는 실수도 확인했습니다. 파일 시스템은 파티션 /dev/loop0p1에 있는데 /dev/loop0을 적은 경우입니다.

mount /dev/loop0 /mnt/data
mount: /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/x
mount: /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/data
mount: /mnt/data: /dev/loop0p1 already mounted on /mnt/data.

해제한 마운트 지점에 umount를 한 번 더 실행했을 때는 [not mounted] 오류였습니다.

umount /mnt/data
umount: /mnt/data: not mounted.

마운트 지점 안에서 umount를 실행하는 실수도 있습니다. 셸의 현재 디렉터리가 /mnt/data인 상태에서 [umount /mnt/data]를 실행했습니다.

pwd
/mnt/data
umount /mnt/data
umount: /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/data
Filesystem     Type Mounted on
/dev/vda2      ext4 /

/mnt/data가 아직 루트(/) 파일 시스템에 있는 일반 디렉터리라는 의미입니다. 이 상태에서 저장한 파일은 연습용 파티션이 아닌 루트 디스크에 기록됩니다. 1번 파티션을 마운트한 뒤 같은 명령을 실행했습니다.

df --output=source,fstype,target /mnt/data
Filesystem     Type Mounted on
/dev/loop0p1   ext4 /mnt/data

Filesystem 칸이 /dev/vda2에서 /dev/loop0p1로, Mounted on 칸이 /에서 /mnt/data로 바뀌었습니다. lsblk에서도 loop0p1 줄의 MOUNTPOINTS 칸에 /mnt/data가 나왔습니다.

lsblk -o NAME,FSTYPE,LABEL,MOUNTPOINTS /dev/loop0
NAME      FSTYPE LABEL  MOUNTPOINTS
loop0                   
|-loop0p1 ext4   data   /mnt/data
`-loop0p2 xfs    backup 

스크립트에서는 출력 대신 종료 코드로 확인할 수 있습니다. findmnt의 종료 코드는 마운트된 상태에서 0, 마운트되지 않은 상태에서 1이었습니다.

🔢 FAQ & 추천 콘텐츠

마운트되어 있는 동안에는 나오지 않고, 해제하면 다시 나옵니다. /mnt/x에 before.txt를 만들어 둔 뒤 ext4 파티션을 마운트하자 ls에는 lost+found만 나왔고, umount로 해제한 뒤에는 before.txt가 다시 나왔습니다.

-r은 -o ro와 같은 옵션입니다. [mount -r /dev/loop0p1 /mnt/data]로 마운트한 뒤 findmnt로 확인하자 OPTIONS 칸이 ro,relatime,seclabel로 나왔습니다.

마운트 지점 대신 장치 이름을 적어도 해제됩니다. /dev/loop0p1을 /mnt/data에 마운트한 상태에서 [umount /dev/loop0p1]을 실행하자 오류 없이 끝났고, [findmnt /mnt/data]에는 아무것도 나오지 않았습니다.

ℹ️ 제휴 안내
본 사이트의 콘텐츠에는 제휴 링크가 포함되어 있습니다. 방문자가 이 링크를 통해 상품 또는 서비스를 구매하면 본 사이트는 판매처로부터 수수료를 지급받습니다. 이 과정에서 구매자가 지불하는 금액(이벤트 할인 시 금액이 내려갑니다↓)은 오르지 않습니다. 게시된 가격·할인·재고 정보는 작성 시점 기준이며 실제와 다를 수 있으므로, 구매 전 판매처에서 최종 확인하시기 바랍니다. 상품 선정과 평가는 자체 기준에 따라 작성되며, 수수료 지급 여부가 소개 순서나 평가 내용에 영향을 주지 않습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Prove your humanity: 9   +   1   =