리눅스 디스크 마운트: lsblk, 파티션, mkfs, mount, fstab 정리
리눅스 디스크 마운트는 파티션의 파일 시스템을 디렉터리 트리의 한 지점(예: /data)에 연결하는 작업입니다. 새 디스크는 lsblk로 찾고, fdisk나 parted로 나누고, mkfs.ext4로 포맷한 뒤 mount /dev/sdb1 /data로 연결합니다. 재부팅 후에도 유지하려면 UUID를 적은 줄을 /etc/fstab에 추가하고 mount -a로 점검합니다.
리눅스에는 드라이브 문자가 없습니다. 모든 저장 장치는 /에서 시작하는 하나의 디렉터리 트리에 붙습니다. 디스크 마운트는 파티션의 파일 시스템을 빈 디렉터리, 즉 마운트 포인트에 "매다는" 작업입니다. 새 디스크를 쓰는 과정은 언제나 같습니다. 장치를 찾고(lsblk), 파티션을 나누고(fdisk 또는 parted), 파일 시스템을 만들고(mkfs), 마운트하고(mount), /etc/fstab에 등록합니다. 각 단계를 살펴보고, df와 du로 용량이 어디로 갔는지 확인하는 방법도 설명합니다.
리눅스의 디스크와 파티션 구조
커널은 디스크마다 /dev에 장치 파일을 만듭니다. 이름은 연결 방식에 따라 달라집니다.
| 이름 | 설명 | 파티션 |
|---|---|---|
/dev/sda, /dev/sdb | SATA/SAS/USB 디스크, 많은 가상 디스크 | /dev/sda1, /dev/sda2 |
/dev/vda | KVM 가상 머신의 virtio 디스크 | /dev/vda1 |
/dev/nvme0n1 | NVMe SSD | /dev/nvme0n1p1 |
/dev/mapper/... | LVM 논리 볼륨, 암호화 볼륨 | — |
디스크는 파티션으로 나뉘고, 파티션 위에 파일 시스템(ext4, xfs, btrfs)을 만든 뒤에 디렉터리에 마운트합니다. 마운트되지 않은 파티션의 파일은 디스크가 물리적으로 연결되어 있어도 접근할 수 없습니다.
디스크 확인: lsblk와 blkid
디스크 작업의 첫 명령은 lsblk입니다. 장치 트리, 크기, 마운트 위치를 보여 줍니다.
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 39G 0 part /
sdb 8:16 0 100G 0 disk
여기서 sdb는 파티션도 마운트 위치도 없는 100GB의 새 디스크입니다. 유용한 옵션은 다음과 같습니다.
lsblk -f— 각 파티션의 파일 시스템 종류, 레이블, UUID 표시lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT,MODEL— 필요한 열만 출력sudo blkid— 모든 파티션의 UUID와 파일 시스템 종류sudo fdisk -l— 모든 디스크의 파티션 테이블과 섹터 정보
가상 머신에 디스크를 실행 중에 추가했는데 lsblk에 보이지 않는다면, 커널에 버스를 다시 검사하라고 요청하십시오: echo "- - -" | sudo tee /sys/class/scsi_host/host*/scan.
파티션 나누기: fdisk와 parted
파티션을 만들기 전에 장치를 정확히 골랐는지 다시 확인하십시오. 파티션 테이블을 시스템 디스크에 쓰면 데이터가 모두 사라집니다. lsblk 출력에서 크기와 마운트 지점이 없는 장치인지 확인하십시오.
GPT 또는 MBR
새 디스크에는 GPT를 쓰십시오. 2TB를 넘는 디스크를 지원하고 파티션을 최대 128개까지 만들 수 있습니다. MBR(dos)은 BIOS 부팅을 쓰는 오래된 시스템에서 부트로더가 요구할 때만 필요합니다.
fdisk로 나누기
최신 fdisk는 GPT와 MBR을 모두 다룹니다. 대화형으로 진행합니다.
$ sudo fdisk /dev/sdb
Command (m for help): g # 빈 GPT 테이블 만들기
Command (m for help): n # 새 파티션
Partition number (1-128, default 1): Enter
First sector: Enter
Last sector, +/-sectors or +/-size{K,M,G,T,P}: Enter # 디스크 전체 사용
Command (m for help): w # 변경 사항을 쓰고 종료
w를 누르기 전까지는 디스크에 아무것도 기록되지 않습니다. 변경 없이 나가려면 q를 누르십시오.
parted로 한 줄에 나누기
스크립트에서는 대화 없이 동작하는 parted가 편합니다.
$ sudo parted -s /dev/sdb mklabel gpt
$ sudo parted -s /dev/sdb mkpart primary ext4 0% 100%
$ lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sdb 8:16 0 100G 0 disk
└─sdb1 8:17 0 100G 0 part
백분율로 경계를 지정하면 파티션이 올바르게 정렬됩니다. 새 파티션이 보이지 않으면 sudo partprobe /dev/sdb로 커널이 파티션 테이블을 다시 읽게 하십시오.
파일 시스템 만들기: mkfs
파티션은 블록의 범위일 뿐입니다. 파일을 저장하려면 그 위에 파일 시스템을 만들어야 합니다.
$ sudo mkfs.ext4 -L data /dev/sdb1
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 26214144 4k blocks and 6553600 inodes
...
Writing superblocks and filesystem accounting information: done
-L 옵션은 나중에 쉽게 찾을 수 있도록 레이블을 붙입니다. 파일 시스템은 다음과 같이 고르십시오.
| 파일 시스템 | 명령 | 적합한 경우 |
|---|---|---|
| ext4 | mkfs.ext4 | 무난한 기본 선택. 축소도 가능 |
| XFS | mkfs.xfs | 큰 파일과 큰 볼륨. RHEL의 기본값. 확장만 가능 |
| Btrfs | mkfs.btrfs | 스냅숏, 압축, 서브볼륨이 필요한 경우 |
| vfat/exFAT | mkfs.vfat, mkfs.exfat | Windows, macOS와 주고받는 USB 메모리 |
mkfs는 파티션에 있던 모든 것을 지웁니다. 비어 있는 파티션이라도 확인을 묻지 않으므로 장치 이름을 한 번 더 확인하십시오.
mount로 리눅스 디스크 마운트하기
마운트 포인트가 될 디렉터리를 만들고 파티션을 연결합니다.
$ sudo mkdir -p /data
$ sudo mount /dev/sdb1 /data
$ df -h /data
Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 98G 24K 93G 1% /data
mount는 파일 시스템 종류를 스스로 알아내지만, mount -t xfs처럼 직접 지정할 수도 있습니다. /data에 이미 파일이 있었다면 마운트해도 지워지지 않습니다. 새 파일 시스템 밑에 가려졌다가, 마운트를 해제하면 다시 나타납니다.
마운트 옵션
옵션은 -o 뒤에 쉼표로 구분해 적습니다.
ro/rw— 읽기 전용 또는 읽기와 쓰기noatime— 읽을 때마다 접근 시각을 갱신하지 않아 불필요한 쓰기를 줄임noexec— 이 파티션의 프로그램 실행 금지(/tmp나 다운로드 디렉터리에 유용)nosuid,nodev— SUID 비트와 장치 파일 무시remount— 마운트를 해제하지 않고 옵션 변경:sudo mount -o remount,ro /data
무엇이 어떤 옵션으로 마운트되어 있는지는 findmnt로 확인하십시오: findmnt /data 또는 findmnt -t ext4.
마운트한 디스크의 권한
새 ext4의 루트 디렉터리는 root 소유이므로 일반 사용자는 쓸 수 없습니다. 마운트한 뒤 해당 사용자에게 디렉터리를 넘기십시오: sudo chown alice:alice /data. vfat와 exFAT에는 유닉스 권한이 없으므로, 마운트할 때 uid=, gid=, umask= 옵션으로 소유자를 지정합니다.
umount로 마운트 해제하기: target is busy 오류
마운트 해제는 umount(n이 없음)로 장치나 디렉터리를 지정해서 합니다.
$ sudo umount /data
umount: /data: target is busy.
이 오류는 어떤 프로세스가 그 파일 시스템의 파일을 열고 있거나, 그 안을 현재 작업 디렉터리로 쓰고 있다는 뜻입니다. cd /data를 한 뒤 열어 둔 터미널이 바로 그런 경우가 많습니다. 원인을 찾으려면 다음을 쓰십시오.
$ sudo lsof +f -- /data
$ sudo fuser -vm /data
프로세스를 멈추거나 디렉터리에서 나온 뒤 다시 시도하십시오. 최후의 수단은 umount -l(lazy)입니다. 파일 시스템은 디렉터리 트리에서 즉시 분리되고, 프로세스가 파일을 닫을 때 실제로 해제됩니다.
부팅 시 자동 마운트: /etc/fstab
mount 명령은 재부팅 전까지만 유효합니다. 디스크를 자동으로 연결하려면 /etc/fstab에 줄을 추가하십시오. 장치는 /dev/sdb1 같은 이름이 아니라 UUID로 지정하는 것이 좋습니다. 디스크를 추가하면 이름의 순서가 바뀔 수 있지만, UUID는 변하지 않습니다.
$ sudo blkid /dev/sdb1
/dev/sdb1: LABEL="data" UUID="3f1c9a2e-7b5d-4c1e-9a8f-2d6e4b0c1a77" TYPE="ext4" PARTUUID="..."
한 줄은 여섯 개의 필드로 구성됩니다.
# <장치> <마운트 지점> <종류> <옵션> <dump> <fsck>
UUID=3f1c9a2e-7b5d-4c1e-9a8f-2d6e4b0c1a77 /data ext4 defaults,noatime 0 2
| 필드 | 의미 |
|---|---|
| 장치 | UUID=..., LABEL=... 또는 경로 |
| 마운트 지점 | 마운트할 디렉터리(미리 존재해야 함) |
| 종류 | ext4, xfs, swap, nfs 등 |
| 옵션 | defaults와 필요한 옵션(예: noatime, nofail) |
| dump | 거의 항상 0 |
| fsck | 검사 순서: 루트는 1, 나머지는 2, 검사하지 않으려면 0 |
재부팅 전에 fstab을 반드시 검사하십시오
/etc/fstab에 오류가 있으면 부팅 때 서버가 긴급 모드에 빠질 수 있습니다. 콘솔이 없는 클라우드 서버에서는 특히 곤란합니다. 수정한 직후에 다음을 실행하십시오.
$ sudo findmnt --verify
$ sudo systemctl daemon-reload
$ sudo mount -a
$ findmnt /data
mount -a는 fstab에 있으면서 아직 마운트되지 않은 항목을 모두 마운트하고, 오류가 있으면 바로 보여 줍니다. 분리형 디스크나 네트워크 디스크에는 nofail 옵션을 추가하십시오. 장치가 없어도 부팅이 계속됩니다. systemd에서는 fstab의 각 줄이 .mount 유닛으로 바뀌며, 예를 들어 data.mount의 상태는 systemctl status data.mount로 볼 수 있습니다.
남은 용량 확인: df
df는 마운트된 파일 시스템의 사용률을 보여 줍니다.
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 39G 37G 1.1G 98% /
/dev/sda1 974M 180M 727M 20% /boot
/dev/sdb1 98G 24K 93G 1% /data
-h— 사람이 읽기 쉬운 단위로 표시-T— 파일 시스템 종류 열 추가-i— inode 사용량 표시. 작은 파일이 너무 많으면 용량이 남아도 디스크가 가득 찰 수 있습니다-x tmpfs -x devtmpfs— 가상 파일 시스템 숨기기
Size가 Used + Avail와 같지 않은 이유는 ext4가 약 5%의 공간을 root용으로 예약해 두기 때문입니다. 시스템이 디스크가 꽉 찬 상황에서도 동작하도록 하기 위함입니다. 데이터용 파티션이라면 예약량을 줄일 수 있습니다: sudo tune2fs -m 1 /dev/sdb1.
용량이 어디로 갔나: du
df는 디스크가 찼다고 알려 줄 뿐, 무엇이 차지하고 있는지는 말해 주지 않습니다. 이때 du를 씁니다. 디렉터리별로 파일 크기를 합산합니다.
$ sudo du -sh /var/log
4.2G /var/log
$ sudo du -xh --max-depth=1 / 2>/dev/null | sort -rh | head
37G /
21G /var
9.8G /home
3.1G /usr
-s— 디렉터리의 합계만 표시.-a는 파일마다 표시--max-depth=1(또는-d 1) — 한 단계 깊이까지만 표시. 가장 큰 디렉터리로 내려가며 확인하십시오-x— 다른 파일 시스템으로 넘어가지 않음. 없으면/data,/proc, 네트워크 디스크까지 합산됩니다sort -rh— 사람이 읽는 크기 단위로 정렬해서 가장 큰 것을 위로
큰 파일 하나를 찾을 때는 find가 더 적합합니다: sudo find / -xdev -type f -size +1G -exec ls -lh {} +.
df는 가득 찼다고 하는데 du는 그렇지 않을 때
고전적인 상황은 큰 로그를 지웠는데 용량이 돌아오지 않는 경우입니다. 파일은 디렉터리에서 사라졌지만, 웹 서버 같은 프로세스가 아직 열어 두고 있어서 블록이 해제되지 않은 것입니다. 이런 파일은 다음으로 찾습니다.
$ sudo lsof +L1
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NLINK NODE NAME
nginx 812 www 5w REG 8,2 8589934592 0 13054 /var/log/nginx/access.log (deleted)
프로세스를 재시작하거나 로그를 다시 열도록 하면 용량이 돌아옵니다. 앞으로는 활성 로그를 지우지 말고 비우십시오: sudo truncate -s 0 /var/log/nginx/access.log. 불일치의 또 다른 원인은 마운트 포인트 아래에 숨은 파일입니다. 이 파일들은 루트 파티션의 용량을 차지하지만, 그 위에 다른 파일 시스템이 마운트되어 있으면 du에 보이지 않습니다.
흔한 오류와 해결 방법
| 메시지 | 원인 | 해결 |
|---|---|---|
mount point /data does not exist | 디렉터리가 없음 | sudo mkdir -p /data |
wrong fs type, bad option, bad superblock | 파티션에 파일 시스템이 없거나 종류가 다르거나 드라이버가 없음 | lsblk -f로 확인. exFAT/NTFS라면 exfatprogs, ntfs-3g 설치 |
only root can do that | sudo 없이 마운트 | sudo로 실행하거나 fstab에 user 옵션 추가 |
target is busy | 프로세스가 디렉터리를 사용 중 | lsof/fuser로 확인 후 디렉터리에서 나오기 |
| 긴급 모드로 부팅 | fstab 오류 또는 디스크 없음 | root로 들어가 fstab 수정, nofail 추가 |
단계별 실습: 데이터용 새 디스크
lsblk로 새 디스크 찾기(예:/dev/sdb).sudo parted -s /dev/sdb mklabel gpt mkpart primary ext4 0% 100%로 파티션 나누기.sudo mkfs.ext4 -L data /dev/sdb1로 파일 시스템 만들기.sudo mkdir -p /data로 마운트 포인트 만들기.sudo blkid /dev/sdb1로 UUID를 확인하고/etc/fstab에 줄 추가.sudo mount -a && df -h /data로 마운트하고 확인.sudo chown 사용자: /data로 권한 지정.
서비스를 멈추지 않고 용량을 늘리거나 여러 디스크를 하나로 묶으려면 일반 파티션 대신 LVM을 씁니다. 디스크가 물리 볼륨이 되고, 그 위에 잘라 낸 논리 볼륨은 lvextend -r로 나중에 늘릴 수 있습니다.
정리
리눅스 디스크 마운트는 lsblk → 파티션 나누기 → mkfs → mount → /etc/fstab의 순서로 진행됩니다. 파티션은 UUID로 지정하고, 재부팅 전에 mount -a로 fstab을 검사하며, 필수가 아닌 디스크에는 nofail을 쓰십시오. 용량이 부족할 때는 df -h로 어느 파티션이 찼는지, du -xh --max-depth=1 | sort -rh와 lsof +L1로 무엇이 차지하는지 확인할 수 있습니다. 디스크, 파티션, 스왑, LVM, RAID는 강의 실습에서 함께 다룹니다.
자주 묻는 질문
리눅스에서 USB 메모리는 어떻게 마운트하나요?
lsblk로 장치를 찾고(보통 /dev/sdb1), 디렉터리를 만든 뒤 sudo mount /dev/sdb1 /mnt/usb를 실행하십시오. 데스크톱 환경에서는 보통 /media/사용자이름이나 /run/media에 자동으로 마운트됩니다.
ISO 이미지는 어떻게 마운트하나요?
sudo mount -o loop,ro image.iso /mnt/iso를 실행하십시오. loop 옵션이 파일을 블록 장치처럼 연결합니다. 해제는 일반 umount로 합니다.
fstab으로 네트워크 공유 폴더를 연결하려면 어떻게 하나요?
NFS는 server:/export /mnt/nfs nfs defaults,_netdev,nofail 0 0 형식이고, SMB는 //server/share /mnt/smb cifs credentials=/root/.smbcred,_netdev,nofail 0 0 형식입니다. _netdev 옵션은 네트워크가 올라올 때까지 기다리게 합니다.
UUID와 PARTUUID는 무엇이 다른가요?
UUID는 파일 시스템에 속하며 다시 mkfs를 하면 바뀝니다. PARTUUID는 GPT 테이블의 파티션에 속하며 다시 포맷해도 유지됩니다. fstab에는 보통 UUID를 씁니다.
파일 시스템에 오류가 있는지 어떻게 검사하나요?
파티션을 마운트 해제한 뒤 ext4라면 sudo fsck -f /dev/sdb1, XFS라면 sudo xfs_repair /dev/sdb1을 실행하십시오. 마운트된 상태에서 쓰기 검사를 하면 데이터가 손상될 수 있으므로 하지 마십시오.