리눅스 mount 명령어 사용법 - fstab, UUID, 바인드 마운트와 재부팅 사고 방지
이 명령어를 언제 쓰는가
새 볼륨을 붙여 /data로 쓰려고 할 때, NFS 공유를 연결할 때, ISO 이미지를 열어 볼 때 쓴다. 리눅스는 디스크를 드라이브 문자로 다루지 않고 디렉터리 트리의 한 지점에 끼워 넣는다. 그 끼워 넣는 동작이 mount다.
운영에서 mount가 무서운 이유는 실수의 결과가 즉시 나타나지 않는다는 데 있다. 지금 손으로 마운트한 것은 잘 돌지만 /etc/fstab에 오타가 있으면 몇 달 뒤 재부팅에서 서버가 emergency mode로 떨어진다. 반대로 fstab에 안 넣으면 재부팅 후 애플리케이션이 빈 디렉터리에 데이터를 쓴다. 그래서 mount 작업은 붙이는 것 절반, 검증이 절반이다.
기본 형식
mount [-t 타입] [-o 옵션들] 디바이스 마운트지점
디바이스는 /dev/sdb1 같은 경로 외에 UUID=..., LABEL=... 형태도 쓸 수 있다. 타입은 대부분 자동 감지되므로 생략해도 되고, NFS나 CIFS처럼 네트워크 파일시스템일 때만 명시한다. 마운트 지점 디렉터리는 미리 만들어져 있어야 한다.
인자 없이 mount만 치면 현재 마운트 목록이 나오지만, 요즘은 읽기 좋고 정렬·필터가 되는 findmnt를 쓰는 편이 낫다. findmnt는 util-linux에 포함돼 있어 별도 설치가 필요 없다.
자주 쓰는 옵션
| 옵션 | 의미 | 예시 |
|---|---|---|
| -t 타입 | 파일시스템 타입 지정(xfs, ext4, nfs, cifs, iso9660) | mount -t nfs4 ... |
| -o 옵션 | 마운트 옵션을 쉼표로 나열 | mount -o ro,noexec ... |
| -a | fstab에 있는 항목 중 아직 안 붙은 것을 전부 마운트 | sudo mount -a |
| --bind | 이미 있는 디렉터리를 다른 위치에도 겹쳐 보이게 한다 | mount --bind /data/www /var/www |
| -o remount | 마운트를 유지한 채 옵션만 바꾼다 | mount -o remount,ro /data |
| -r | 읽기 전용. -o ro와 같다 | mount -r /dev/sdc1 /mnt |
| -o loop | 이미지 파일을 디바이스처럼 마운트 | mount -o loop x.iso /mnt/iso |
알아 둘 마운트 옵션
| 옵션 | 의미 |
|---|---|
| defaults | rw, suid, dev, exec, auto, nouser, async 묶음 |
| noatime | 읽기 때마다 접근 시각을 쓰지 않는다. I/O가 줄어든다 |
| nofail | 부팅 시 이 장치가 없어도 부팅을 계속한다 |
| noexec, nosuid, nodev | 실행·setuid·디바이스 파일을 막는다. 업로드 디렉터리에 유용 |
| _netdev | 네트워크가 올라온 뒤 마운트한다. NFS·iSCSI에 필수 |
| x-systemd.automount | 실제 접근하는 순간 마운트. 느린 NFS의 부팅 지연 회피 |
실전 예제
1) 새 볼륨을 임시로 붙여 확인한다. fstab에 넣기 전에 손으로 한 번 붙여 보는 순서를 지킨다.
sudo mkdir -p /data
sudo mount /dev/sdb1 /data
findmnt /data
TARGET SOURCE FSTYPE OPTIONS
/data /dev/sdb1 xfs rw,relatime,attr2,inode64,noquota
2) UUID로 fstab에 등록하고 즉시 검증한다. 이 검증을 안 하면 재부팅 때 알게 된다.
UUID=$(sudo blkid -s UUID -o value /dev/sdb1)
echo "UUID=$UUID /data xfs defaults,noatime,nofail 0 2" | sudo tee -a /etc/fstab
sudo findmnt --verify
sudo umount /data && sudo mount -a && findmnt /data
fstab의 여섯 칸은 순서대로 디바이스, 마운트 지점, 타입, 옵션, dump 여부, fsck 순서다. 루트는 1, 나머지는 2, 검사하지 않으려면 0을 쓴다.
3) 실행 중인 서비스를 건드리지 않고 읽기 전용으로 바꾼다. 파일시스템 점검이나 스냅샷 직전에 쓴다.
sudo mount -o remount,ro /data
findmnt -o TARGET,OPTIONS /data
sudo mount -o remount,rw,noatime /data
4) 바인드 마운트로 같은 디렉터리를 두 곳에서 보이게 한다. 심볼릭 링크를 못 따라가는 chroot나 컨테이너 환경에서 쓴다.
sudo mount --bind /data/www /var/www
sudo mount -o remount,bind,ro /var/www
읽기 전용 바인드 마운트는 커널이 한 번에 처리해 주지 않는다. util-linux 2.27부터는 mount -o bind,ro 원본 대상 한 줄도 받아 주지만, 이는 내부적으로 마운트 후 remount를 한 번 더 호출하는 비원자적 구현이라 그 짧은 사이에는 쓰기가 가능하다. 그보다 낮은 버전에서는 ro가 그냥 무시되고 읽기 쓰기로 붙는다. 위처럼 두 줄로 나누는 고전적인 방식이 버전을 타지 않는다. 또한 읽기 전용이 되는 것은 새로 만든 마운트 지점뿐이고 원본 디렉터리는 여전히 쓰기 가능하다.
5) NFS 공유를 붙인다. 응답 없는 서버에 시스템 전체가 묶이지 않도록 옵션을 준다.
sudo mount -t nfs4 -o rw,_netdev,soft,timeo=30,retrans=2 10.0.1.20:/export/share /mnt/share
6) 백업 이미지 안을 들여다본다. 복구 전에 내용을 확인할 때 쓴다.
sudo mount -o loop,ro /backup/rootfs.img /mnt/img
ls /mnt/img
함정과 주의점
fstab 오타는 다음 재부팅에 서버를 못 뜨게 한다. 가장 자주 나는 사고이자 가장 뼈아픈 사고다. systemd는 fstab을 마운트 유닛으로 변환해 처리하므로, 필수로 표시된 항목이 실패하면 부팅이 emergency shell에서 멈춘다. 콘솔 접근이 없는 클라우드 인스턴스라면 그 순간 손쓸 방법이 사라진다. 방어책은 세 가지다. 첫째, 항목을 추가한 직후 sudo findmnt --verify로 문법을 검사한다. 둘째, sudo umount /data && sudo mount -a로 실제 부팅과 같은 경로를 리허설한다. 셋째, 없어도 서비스가 죽지 않는 볼륨에는 nofail을 넣는다. fstab을 고친 뒤에는 sudo systemctl daemon-reload도 함께 실행해 systemd가 새 내용을 반영하게 한다.
마운트 지점에 이미 파일이 있으면 그 파일은 가려진다. 지워지는 것은 아니고 마운트한 동안 안 보일 뿐이지만, 이게 반대 방향으로 사고를 만든다. 부팅 시 마운트가 실패한 상태에서 애플리케이션이 /data에 계속 쓰면, 그 데이터는 별도 볼륨이 아니라 루트 파티션에 쌓인다. 며칠 뒤 루트가 가득 차서 서버가 멈추고, 급히 볼륨을 다시 마운트하면 그동안 쓴 데이터가 통째로 사라진 것처럼 보인다. 마운트 지점은 비워 두고, 감시 스크립트에서 mountpoint -q /data로 마운트 여부를 주기적으로 확인하라.
/dev/sdb1 같은 이름은 재부팅 후 바뀔 수 있다. 디스크를 추가하거나 컨트롤러 인식 순서가 달라지면 어제의 sdb가 오늘의 sdc가 된다. 손으로 붙일 때는 상관없지만 fstab에 커널 이름을 적으면 언젠가 엉뚱한 디스크를 /data에 붙인다. fstab에는 반드시 UUID=나 LABEL=을 쓴다.
remount는 지정하지 않은 옵션을 되돌릴 수 있다. mount -o remount,rw /data만 실행하면 앞서 걸어 둔 noatime이나 nosuid가 fstab 기준으로 되돌아가는 경우가 있다. 되돌리는 명령에서도 유지하고 싶은 옵션을 전부 다시 나열하는 습관을 들여라.
루트가 갑자기 읽기 전용이 됐다면 디스크 오류를 의심하라. ext4는 I/O 에러를 만나면 기본적으로 파일시스템을 읽기 전용으로 전환한다. 이때 mount -o remount,rw /로 억지로 되돌리는 것은 임시방편일 뿐이며, 원인을 확인하지 않으면 손상이 번진다. dmesg -T | tail과 smartctl -a로 하드웨어 상태를 먼저 본다.
macOS의 mount는 사용법이 다르다. 옵션 이름과 지원 파일시스템이 리눅스와 다르고, 일상적으로는 diskutil mount를 쓴다. /etc/fstab도 기본적으로 존재하지 않는다. 이 글의 예제는 리눅스 기준이다.
함께 보면 좋은 명령어
- umount — 반대 동작. 붙이는 것보다 떼는 쪽이 사고가 더 잦다.
- blkid / lsblk — fstab에 넣을 UUID와 파일시스템 타입을 확인할 때.
- df — 마운트가 실제로 반영됐는지, 용량이 기대대로인지 확인할 때.