서버에 데이터용 디스크를 새로 붙이면 lsblk에는 보이지만 파티션도 파일시스템도 없어 바로 쓸 수 없다. 마운트 후 재부팅하면 사라지고, /etc/fstab에 잘못 등록하면 부팅이 멈추기도 한다. 이 글에서는 Ubuntu 24.04에서 새 디스크 확인 → GPT 파티션 생성 → ext4 포맷 → 마운트 → UUID로 fstab 등록까지 진행하고, nofail과 장치 대기 시간이 부팅에 미치는 영향을 실제 재부팅으로 확인한다.
실습은 테스트 VM에서 2GB 이미지 파일을 루프 디바이스(/dev/loop5)로 붙여 새 디스크처럼 다뤘다. 실제 디스크라면 /dev/sdb(파티션 /dev/sdb1)나 /dev/nvme1n1(파티션 /dev/nvme1n1p1)로 바꿔 읽으면 된다.
$ sudo truncate -s 2G /var/tmp/disk2.img
$ sudo losetup -fP --show /var/tmp/disk2.img
/dev/loop5
새 디스크 확인
파티션이 없는 디스크는 lsblk에서 자식 항목 없이 나오고 fdisk -l에도 파티션 테이블 정보가 없다.
$ lsblk /dev/loop5
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop5 7:5 0 2G 0 loop
$ sudo fdisk -l /dev/loop5
Disk /dev/loop5: 2 GiB, 2147483648 bytes, 4194304 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
파티션 생성 (fdisk)
fdisk에서 g(새 GPT 테이블) → n(새 파티션, 번호·시작·끝은 엔터로 기본값) → w(기록) 순서로 입력한다. 아래는 같은 키 입력을 파이프로 넘긴 결과다.
$ printf 'g\nn\n\n\n\nw\n' | sudo fdisk /dev/loop5
Welcome to fdisk (util-linux 2.39.3).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS (MBR) disklabel with disk identifier 0xb5bdefb3.
Command (m for help): Created a new GPT disklabel (GUID: 530C323E-8DBD-4A44-9A42-139707542B4F).
Command (m for help): Partition number (1-128, default 1): First sector (2048-4194270, default 2048): Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-4194270, default 4192255):
Created a new partition 1 of type 'Linux filesystem' and of size 2 GiB.
Command (m for help): The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
$ lsblk /dev/loop5
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop5 7:5 0 2G 0 loop
└─loop5p1 259:0 0 2G 0 part
스크립트에서 쓸 때는 대화형 입력이 없는 parted가 편하다. 2TB가 넘는 디스크는 MBR로 다룰 수 없으므로 GPT를 기본으로 쓴다.
sudo parted -s /dev/sdb mklabel gpt mkpart data ext4 1MiB 100%파일시스템 생성
-L로 붙인 레이블은 나중에 LABEL=data로 지정할 때 쓸 수 있다. 출력의 UUID가 fstab에 들어갈 값이다.
$ sudo mkfs.ext4 -L data /dev/loop5p1
mke2fs 1.47.0 (5-Feb-2023)
Discarding device blocks: done
Creating filesystem with 523776 4k blocks and 131072 inodes
Filesystem UUID: f24a53fb-f307-4cf5-9f57-3e544a6b111e
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
$ sudo blkid /dev/loop5p1
/dev/loop5p1: LABEL="data" UUID="f24a53fb-f307-4cf5-9f57-3e544a6b111e" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="13edb1c8-39ff-41f1-8e9b-8aa42dc8dbfe"
포맷 직후 lsblk -f가 빈칸으로 나올 수 있다. lsblk가 읽는 udev DB가 아직 갱신되지 않은 탓이니 blkid로 확인하거나 sudo udevadm trigger로 갱신한 뒤 다시 보면 된다.
$ lsblk -f /dev/loop5
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
loop5
└─loop5p1
마운트
마운트 지점 디렉터리를 만들고 붙인다. 새 파일시스템의 루트는 root 소유라 일반 사용자가 쓰려면 소유권을 넘긴다.
$ sudo mkdir -p /data
$ sudo mount /dev/loop5p1 /data
$ df -hT /data
Filesystem Type Size Used Avail Use% Mounted on
/dev/loop5p1 ext4 2.0G 24K 1.9G 1% /data
$ findmnt /data
TARGET SOURCE FSTYPE OPTIONS
/data /dev/loop5p1 ext4 rw,relatime
$ sudo chown $USER:$USER /data
$ touch /data/hello && ls -l /data
total 16
-rw-rw-r-- 1 noble noble 0 Oct 18 16:25 hello
drwx------ 2 root root 16384 Oct 18 16:25 lost+found
fstab에 등록해 재부팅 후에도 유지
/dev/sdb1 같은 장치 이름은 디스크 연결 순서에 따라 바뀔 수 있으므로 UUID로 지정한다. 수정 전에 원본을 백업해 둔다.
# <장치> <마운트 지점> <타입> <옵션> <dump> <fsck>
UUID=f24a53fb-f307-4cf5-9f57-3e544a6b111e /data ext4 defaults,nofail 0 2| 필드 | 값 | 의미 |
|---|---|---|
| 장치 | UUID=… / LABEL=… / PARTUUID=… | blkid로 확인. /dev/sdX는 비권장 |
| 마운트 지점 | /data | 미리 만든 디렉터리 |
| 타입 | ext4, xfs, vfat … | blkid의 TYPE |
| 옵션 | defaults,nofail | defaults=rw,suid,dev,exec,auto,nouser,async. nofail은 장치가 없어도 부팅 계속 |
| dump | 0 | 사실상 쓰지 않음 |
| fsck | 0 / 1 / 2 | 1은 루트 전용, 데이터 디스크는 2, 검사 안 함은 0 |
fstab을 고친 뒤에는 systemd가 생성하는 mount 유닛도 다시 만들어야 하므로 daemon-reload를 먼저 한다. mount -a는 fstab의 마운트 안 된 항목을 모두 붙여서 재부팅 없이 문법을 확인하는 용도로 쓴다.
$ sudo cp /etc/fstab /etc/fstab.bak
$ sudo umount /data
$ echo 'UUID=f24a53fb-f307-4cf5-9f57-3e544a6b111e /data ext4 defaults,nofail 0 2' | sudo tee -a /etc/fstab
UUID=f24a53fb-f307-4cf5-9f57-3e544a6b111e /data ext4 defaults,nofail 0 2
$ sudo systemctl daemon-reload
$ sudo mount -a
$ findmnt /data
TARGET SOURCE FSTYPE OPTIONS
/data /dev/loop5p1 ext4 rw,relatime
$ systemctl list-units --type=mount | grep data
data.mount loaded active mounted /data
findmnt –verify로 fstab 검사
재부팅 전에 findmnt --verify로 오타를 잡는다. 존재하지 않는 UUID를 일부러 넣어 봤다.
$ sudo findmnt --verify
0 parse errors, 0 errors, 1 warning
none
[W] non-bind mount source /swap.img is a directory or regular file
$ echo 'UUID=0000-typo /backup ext4 defaults 0 2' | sudo tee -a /etc/fstab
UUID=0000-typo /backup ext4 defaults 0 2
$ sudo findmnt --verify
0 parse errors, 2 errors, 2 warnings
none
[W] non-bind mount source /swap.img is a directory or regular file
/backup
[E] unreachable on boot required target: No such file or directory
[E] unreachable on boot required source: UUID=0000-typo
[W] your fstab has been modified, but systemd still uses the old version;
use 'systemctl daemon-reload' to reload
/swap.img 경고는 Ubuntu 기본 스왑 파일이라 무시해도 된다. [E]가 나온 항목은 nofail이 없으면 부팅을 응급 모드(emergency mode)로 떨어뜨린다.
nofail과 장치 대기 시간
디스크를 떼어낸 상황을 만들려고 루프 디바이스를 붙이지 않은 채 재부팅했다. nofail 덕에 부팅은 끝났지만 장치를 기본 90초 동안 기다렸다.
$ systemctl status data.mount --no-pager | head -6
○ data.mount - /data
Loaded: loaded (/etc/fstab; generated)
Active: inactive (dead)
Where: /data
What: /dev/disk/by-uuid/f24a53fb-f307-4cf5-9f57-3e544a6b111e
Docs: man:fstab(5)
$ journalctl -b | grep -E 'dev-disk-by.*uuid-f24a53fb|data.mount' | head -5
Oct 18 16:26:44 noble systemd[1]: Expecting device dev-disk-by\x2duuid-f24a53fb\x2df307\x2d4cf5\x2d9f57\x2d3e544a6b111e.device - /dev/disk/by-uuid/f24a53fb-f307-4cf5-9f57-3e544a6b111e...
Oct 18 16:28:19 noble systemd[1]: dev-disk-by\x2duuid-f24a53fb\x2df307\x2d4cf5\x2d9f57\x2d3e544a6b111e.device: Job dev-disk-by\x2duuid-f24a53fb\x2df307\x2d4cf5\x2d9f57\x2d3e544a6b111e.device/start timed out.
Oct 18 16:28:19 noble systemd[1]: Timed out waiting for device dev-disk-by\x2duuid-f24a53fb\x2df307\x2d4cf5\x2d9f57\x2d3e544a6b111e.device - /dev/disk/by-uuid/f24a53fb-f307-4cf5-9f57-3e544a6b111e.
Oct 18 16:28:19 noble systemd[1]: Dependency failed for systemd-fsck@dev-disk-by\x2duuid-f24a53fb\x2df307\x2d4cf5\x2d9f57\x2d3e544a6b111e.service - File System Check on /dev/disk/by-uuid/f24a53fb-f307-4cf5-9f57-3e544a6b111e.
Oct 18 16:28:19 noble systemd[1]: Dependency failed for data.mount - /data.
이동식 디스크나 없을 수도 있는 디스크라면 x-systemd.device-timeout으로 대기 시간을 줄인다. 같은 조건에서 다시 재부팅하니 5초 만에 포기했다.
$ tail -1 /etc/fstab
UUID=f24a53fb-f307-4cf5-9f57-3e544a6b111e /data ext4 defaults,nofail,x-systemd.device-timeout=5s 0 2
$ journalctl -b | grep -E 'Expecting device dev-disk-by.x2duuid-f24a|Timed out waiting' | cut -c1-80
Oct 18 16:28:17 noble systemd[1]: Expecting device dev-disk-by\x2duuid-f24a53fb\
Oct 18 16:28:22 noble systemd[1]: Timed out waiting for device dev-disk-by\x2duu
언마운트
셸이나 프로세스가 마운트 지점 안에 있으면 target is busy로 실패한다. fuser -vm으로 누가 잡고 있는지 확인한다.
$ cd /data && sudo umount /data
umount: /data: target is busy.
$ sudo fuser -vm /data
USER PID ACCESS COMMAND
/data: root kernel mount /data
noble 27251 ..c.. bash
root 27426 ..c.. sudo
$ cd ~ && sudo umount /data && findmnt /data; echo "exit=$?"
exit=1
ACCESS의 c는 현재 디렉터리(cwd)로 쓰고 있다는 뜻이다. 셸을 빠져나오니 바로 해제됐다.
주의사항
| 증상 | 원인 | 조치 |
|---|---|---|
| 재부팅 후 마운트가 사라짐 | mount 명령만 실행하고 fstab에 등록하지 않음 | UUID로 fstab 등록 후 mount -a로 확인 |
| 재부팅 시 응급 모드로 진입 | fstab의 장치가 없거나 UUID 오타, nofail 없음 | 재부팅 전 findmnt –verify. 데이터 디스크는 nofail 권장 |
| 부팅이 90초 정도 멈춤 | nofail이어도 장치를 기본 타임아웃까지 기다림 | x-systemd.device-timeout=5s 등으로 단축 |
| fstab 수정이 반영되지 않음 | systemd가 예전 fstab으로 만든 mount 유닛 사용 | sudo systemctl daemon-reload |
| 디스크 순서가 바뀌어 다른 파티션이 마운트됨 | /dev/sdX 이름으로 등록 | UUID 또는 PARTUUID 사용 |
| mkfs 후 기존 데이터 소실 | 이미 사용 중인 디스크를 포맷함 | lsblk -f와 blkid로 FSTYPE이 비어 있는지 먼저 확인 |
| lsblk -f에 UUID가 안 보임 | udev DB가 아직 갱신되지 않음 | blkid로 확인하거나 udevadm trigger로 갱신 |
| umount: target is busy | 프로세스가 마운트 지점을 cwd나 열린 파일로 사용 | fuser -vm 또는 lsof +f — /data로 확인 |
마무리
새 디스크는 lsblk 확인 → fdisk/parted로 GPT 파티션 → mkfs → mount → UUID로 fstab 등록 → daemon-reload와 mount -a, findmnt --verify 순서로 붙인다. 없어도 되는 디스크는 nofail과 짧은 x-systemd.device-timeout을 함께 넣어 부팅을 막지 않게 한다.