Ubuntu 24.04 하드 디스크 마운트하기

서버에 데이터용 디스크를 새로 붙이면 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,nofaildefaults=rw,suid,dev,exec,auto,nouser,async. nofail은 장치가 없어도 부팅 계속
dump0사실상 쓰지 않음
fsck0 / 1 / 21은 루트 전용, 데이터 디스크는 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을 함께 넣어 부팅을 막지 않게 한다.

참고

답글 남기기