Ubuntu 26.04 강좌 / 추가 디스크 준비와 fstab 자동 마운트

추가 디스크 자동 마운트는 실제 파일 시스템의 UUID와 마운트 지점을 연결해 설정합니다. 파일이 보인다는 사실만으로 의도한 디스크에 쓰고 있다고 판단하지 말고, 재부팅과 장치 부재 조건까지 확인해야 합니다.

포맷 전에 장치와 기존 자료 확인하기

lsblk -o NAME,SIZE,TYPE,FSTYPE,LABEL,UUID,MOUNTPOINTS
findmnt -rno SOURCE,TARGET,FSTYPE,OPTIONS

마운트 실습은 이미 파일 시스템이 있는 별도 연습 디스크에서 시작합니다. 용량·레이블·UUID를 대조하고 루트·부팅·기존 백업 장치를 제외합니다. 빈 새 디스크만 있다면 다음의 준비 절차를 먼저 수행하고, 기존 자료를 복구해야 하는 디스크는 포맷하지 않습니다.

새 빈 연습 디스크를 ext4로 준비하기

새 VDI 파일을 연결한 것과 ext4 파일 시스템을 준비한 것은 다릅니다. 원본 자료가 없는 새 8GiB 연습 디스크를 VirtualBox에서 만들려면 VM을 종료하고 설정 → 저장소 → 저장장치 컨트롤러의 하드 디스크 추가에서 새 가상 디스크를 만듭니다. 기존 디스크나 호스트 물리 디스크를 선택하지 않습니다.

Server 콘솔에서 아래 준비 스크립트를 사용합니다. 새 빈 VDI 한 개만 대상으로 하며 util-linux의 lsblk·wipefs·fdisk, udevadm, e2fsprogs의 mkfs.ext4가 필요합니다. command -v로 도구를 확인하고 없는 패키지는 출처를 검토해 설치합니다. 가상화 도구의 새 디스크 용량·모델·일련번호와 /dev/disk/by-id 경로를 먼저 대조하며 확신할 수 없으면 중단합니다.

fdisk 안에서는 g로 GPT를 만들고 n으로 새 파티션을 추가합니다. 번호·시작·끝의 기본값을 사용할 수 있지만 p로 대상과 범위를 다시 확인한 뒤에만 w로 저장합니다. 잘못되었으면 w 전에 q로 취소합니다. 이미 데이터가 있는 디스크를 초기화하는 절차가 아니며, 기존 서명·파티션·마운트가 있으면 스크립트가 중단합니다.

이미 파일 시스템이 있고 보존할 자료가 있는 디스크는 이 초기화 절차를 건너뛰고 뒤의 마운트 실습에서 장치·UUID를 확인합니다. 전체를 ~/prepare-empty-lab-disk.sh로 저장하고 bash ~/prepare-empty-lab-disk.sh /dev/disk/by-id/실제새디스크경로로 실행합니다. 디스크 확인과 파일 시스템 생성 전에 각각 실제 장치 경로를 다시 입력해야 진행합니다. mkfs 뒤에는 ext4·lab-data 레이블·UUID를 기록하며, 포맷한 원본 데이터는 설정 복원으로 돌아오지 않습니다.

set -euo pipefail
if [ "$#" -ne 1 ]; then
    printf 'Usage: bash prepare-empty-lab-disk.sh /dev/disk/by-id/ACTUAL_NEW_DISK\n' >&2; exit 2
fi
case "$1" in /dev/disk/by-id/*) ;; *) printf 'Use the verified by-id path.\n' >&2; exit 2 ;; esac
disk=$(readlink -e -- "$1")
test -b "$disk"
if [ "$(lsblk -dnro TYPE "$disk")" != disk ] || [ "$(lsblk -dnro RO "$disk")" != 0 ]; then
    printf 'Not a writable whole disk.\n' >&2; exit 1
fi
if [ "$(lsblk -nr -o NAME "$disk" | wc -l)" -ne 1 ]; then
    printf 'Partitions or dependent devices already exist; stop.\n' >&2; exit 1
fi
if lsblk -nr -o MOUNTPOINTS "$disk" | grep -q '[^[:space:]]'; then
    printf 'A mount is present; stop.\n' >&2; exit 1
fi
signatures=$(sudo wipefs --no-act --noheadings --output TYPE "$disk")
if [ -n "$signatures" ]; then
    printf 'Existing signatures: %s; stop.\n' "$signatures" >&2; exit 1
fi
lsblk -o NAME,SIZE,TYPE,MODEL,SERIAL,FSTYPE,MOUNTPOINTS "$disk"
read -r -p "Type the verified empty disk path ($disk): " confirmed
if [ "$confirmed" != "$disk" ]; then exit 1; fi
sudo fdisk "$disk"
sudo udevadm settle
mapfile -t partitions < <(lsblk -nrpo NAME,TYPE "$disk" | awk '$2 == "part" {print $1}')
if [ "${#partitions[@]}" -ne 1 ]; then
    printf 'Expected one newly created partition; inspect before formatting.\n' >&2; exit 1
fi
partition=${partitions[0]}
if findmnt -rn --source "$partition" >/dev/null; then
    printf 'The partition is mounted; stop.\n' >&2; exit 1
fi
signatures=$(sudo wipefs --no-act --noheadings --output TYPE "$partition")
if [ -n "$signatures" ]; then printf 'Partition already has a signature; stop.\n' >&2; exit 1; fi
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS "$disk"
read -r -p "Type the new partition to format as ext4 ($partition): " confirmed
if [ "$confirmed" != "$partition" ]; then exit 1; fi
sudo mkfs.ext4 -L lab-data "$partition"
sudo blkid "$partition"
lsblk -f "$disk"

이미 별도 연습 디스크에 ext4가 준비되어 있다면 초기화 스크립트를 생략하고 UUID 확인부터 진행합니다. 같은 가상 디스크를 여러 VM에서 동시에 쓰지 않습니다. 아래 영구 마운트 절차는 확인한 파티션의 UUID로 수행합니다.

fdisk 매뉴얼에서 파티션 편집과 디스크 대상의 의미를 확인하세요.

mke2fs 매뉴얼은 mkfs.ext4의 파일 시스템 생성 옵션과 영향을 설명합니다.

fstab의 시스템 마운트와 서비스 의존성

Server에서 영구 마운트는 /etc/fstab의 실제 UUID·마운트 지점·파일 시스템·옵션을 연결해 관리합니다. 디렉터리 생성이나 일회성 mount 성공과 재부팅 뒤의 마운트는 다르므로 원본 백업·검사·재부팅을 구분해 확인합니다. 서비스 데이터 경로라면 마운트 실패 때 서비스가 쓰기를 시작하지 못하도록 의존성도 설계합니다.

부팅 시 필요한 서비스 데이터인지, 없어도 되는 외장 장치인지에 따라 실패 정책이 달라집니다. nofail은 부팅을 계속하게 도울 수 있지만 해당 디스크가 없을 때 앱이 빈 마운트 디렉터리에 쓰는 문제를 막아 주지 않습니다.

백업과 마운트 지점 준비하기

(
set -eu
backup=$(sudo mktemp /root/fstab-backup.XXXXXX)
sudo cp -a /etc/fstab "$backup"
printf 'Backup: %s\n' "$backup"
sudo mkdir -p /srv/lab-data
)

마운트 지점이 이미 사용 중이거나 파일을 담고 있으면 먼저 내용을 보존하고 다른 빈 지점을 선택합니다. 디스크가 마운트되면 그 아래 기존 로컬 파일은 가려질 수 있습니다. 디렉터리를 만들었다고 디스크가 연결된 것은 아닙니다.

실제 UUID로 한 항목 추가하기

sudoedit /etc/fstab으로 열어 기존 내용을 유지하고 한 줄을 추가합니다. 다음은 ext4 연습 디스크를 선택한 경우의 형식 예시입니다. UUID 표시는 lsblk에서 확인한 실제 값으로 바꾸고 파일 시스템이 다르면 그대로 사용하지 않습니다.

UUID=REPLACE_WITH_VERIFIED_UUID /srv/lab-data ext4 defaults,nofail,x-systemd.device-timeout=10s 0 2

위 항목은 장치가 없어도 부팅을 계속하도록 한 실습 예입니다. 서비스 필수 디스크에는 이를 그대로 쓰지 말고 마운트 실패 시 서비스를 시작하지 않는 의존성과 운영 정책을 설계합니다. 공백이 들어간 경로는 fstab 이스케이프 규칙도 확인합니다.

(
set -eu
sudo findmnt --verify --verbose
sudo systemctl daemon-reload
sudo mount /srv/lab-data
findmnt --mountpoint /srv/lab-data
)

검증 오류를 먼저 해결하고 의도한 항목만 마운트합니다. 다른 디스크까지 한꺼번에 처리하는 mount -a보다 실습 대상 하나를 지정하면 영향을 좁힐 수 있습니다. findmnt의 실제 소스와 파일 시스템이 기대한 UUID의 장치인지 대조합니다.

마운트 확인 뒤에만 데이터 쓰기

expected_uuid=REPLACE_WITH_VERIFIED_UUID
actual_uuid=$(findmnt -rn --mountpoint /srv/lab-data -o UUID || true)
if [ "$actual_uuid" != "$expected_uuid" ]; then
    printf 'Expected disk is not mounted; stop the write job.\n' >&2
    exit 1
fi
printf 'Verified the expected mounted filesystem.\n'

위 코드는 ~/check-lab-mount.sh 같은 별도 Bash 스크립트로 저장하고 실제 UUID로 바꾼 뒤 bash ~/check-lab-mount.sh로 실행합니다. 실패 시 스크립트는 1로 종료하며 후속 쓰기 작업도 이 성공 여부를 조건으로 해야 합니다. 확인한 상태에서 연습 파일을 쓰고 재부팅 후 다시 읽습니다. 장치 부재 시험은 안전하게 종료하거나 파일 사용을 마친 뒤 수행합니다.

실패하면 콘솔에서 이번 fstab 항목만 원본과 비교해 복원하고 구문을 다시 검사합니다. 장치가 빠졌을 때 백업·서비스 작업이 로컬 디렉터리에 쓰지 않고 중단되는지도 확인해야 자동 마운트 운영 검증이 끝납니다.

systemd.mount 문서는 fstab 마운트 옵션과 서비스 의존성의 관계를 설명합니다.