리눅스에서 디스크 마운트 자동 설정 (fstab 제대로 쓰는 방법)

조회수: 0

fstab를 알아야 하는 이유

서버나 개발 워크스테이션에서 추가 디스크를 연결한 뒤 재부팅하면 마운트가 풀려 곤란해지는 경우가 많다. /etc/fstab은 부팅 시 디스크·파티션·네트워크 스토리지를 자동으로 마운트하는 표준 메커니즘이다. 구조를 이해하고 안전한 옵션을 고르면 부팅 실패 없이 일관된 경로를 보장할 수 있다.

기본 개념과 준비 사항

자동 마운트를 설정하기 전 다음을 확인한다.

  • 디스크 식별자: /dev/sdX1처럼 장치 이름은 변할 수 있어 UUID 또는 LABEL 사용이 권장된다.
  • 파일시스템 타입: ext4, xfs, btrfs, ntfs, exfat, nfs, cifs
  • 마운트 지점: 비어 있는 디렉터리를 미리 만든다(예: /mnt/data).
  • 권한과 소유자: 서비스 계정이 접근해야 하면 UID/GID를 맞춘다.

필수 명령어 예시:

lsblk -f          # 디스크/파티션과 파일시스템, UUID 확인
blkid /dev/sdb1   # 특정 파티션의 UUID, TYPE 확인
sudo mkdir -p /mnt/data
sudo chown -R ubuntu:ubuntu /mnt/data

/etc/fstab 형식 완벽 이해

/etc/fstab의 각 행은 공백/탭으로 구분된 6개 필드로 구성된다.

<device>  <mountpoint>  <fstype>  <options>  <dump>  <pass>
  • <device>: UUID=... 또는 LABEL=... 권장
  • <mountpoint>: 마운트 경로
  • <fstype>: 파일시스템 타입
  • <options>: 쉼표로 구분된 마운트 옵션
  • <dump>: 백업 유틸리티 dump 사용 여부(대부분 0)
  • <pass>: 부팅 시 fsck 검사 순서(루트 1, 기타 2, 검사 안 함 0)

안전한 저장을 위해 편집 전 백업한다.

sudo cp /etc/fstab /etc/fstab.bak
sudo nano /etc/fstab

가장 흔한 로컬 디스크 예제

ext4

UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx  /mnt/data  ext4  defaults,noatime  0  2
  • defaults: rw, suid, dev, exec, auto, nouser, async의 묶음
  • noatime: 파일 접근 시간 기록 억제로 불필요한 쓰기 감소

xfs

UUID=yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy  /var/lib/app  xfs  defaults,inode64,noatime  0  2
  • inode64: 대용량 디스크에서 성능 안정화

btrfs (서브볼륨 사용)

UUID=zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz /btr  btrfs  subvol=@,compress=zstd,noatime  0  0
  • compress=zstd: 투명 압축으로 공간 절약 및 I/O 감소

NVMe SSD에서 TRIM 주기화

실시간 TRIM(discard)은 일부 워크로드에서 지연을 유발할 수 있다. 주기적 fstrim이 일반적이다.

sudo systemctl enable fstrim.timer --now

교차 플랫폼 드라이브(NTFS, exFAT)

외장 드라이브를 고정 경로로 마운트하려면 사용자 권한 옵션이 중요하다.

NTFS (ntfs-3g)

UUID=aaaa-BBBB  /mnt/share  ntfs-3g  defaults,uid=1000,gid=1000,umask=022  0  0

exFAT

UUID=cccc-DDDD  /mnt/usb  exfat  defaults,uid=1000,gid=1000,umask=022  0  0

네트워크 스토리지 자동 마운트

네트워크가 늦게 올라오는 상황을 고려해 _netdev와 시간 제한을 사용한다.

NFS

server.example.com:/export/data  /mnt/nfs  nfs  defaults,_netdev,timeo=600,retrans=2  0  0

SMB/CIFS(윈도우 공유)

민감 정보는 별도 크리덴셜 파일에 저장한다.

# /etc/fstab
//fileserver/share  /mnt/cifs  cifs  credentials=/root/.smbcred,iocharset=utf8,vers=3.0,_netdev,nofail  0  0
# /root/.smbcred (권한 600)
username=USER
password=SECRET
domain=WORKGROUP
  • nofail: 공유가 일시적으로 내려가도 부팅을 중단하지 않음
  • vers=3.0: 서버와 협상 가능한 최신 프로토콜 버전 지정

systemd의 지연 마운트와 자동 마운트

대용량 또는 느린 장치를 부팅 속도에 영향 없이 필요 시점에 붙이고 싶다면 다음 옵션이 유용하다.

  • x-systemd.automount: 접근할 때 자동 마운트
  • x-systemd.device-timeout=30s: 장치 준비 대기 시간
  • noauto: 기본적으로 자동 마운트하지 않음(automount와 함께 쓰면 on-demand)
    예시:
UUID=...  /mnt/archive  ext4  noauto,x-systemd.automount,x-systemd.device-timeout=30s  0  2

바인드 마운트와 가상 파일시스템

특정 디렉터리를 다른 경로에 투영하려면 bind를 사용한다.

/opt/app/data  /srv/data  none  bind  0  0

메모리 기반 임시 디렉터리:

tmpfs  /run/cache  tmpfs  size=512m,mode=0755  0  0

스왑 파티션:

UUID=eeee-ffff  none  swap  sw  0  0

안전하게 적용하는 절차(체크리스트)

  1. 디스크 식별 확보: lsblk -f로 UUID 확인, 메모해 둔다.
  2. 마운트 지점 생성: sudo mkdir -p /mnt/<name>
  3. 권한 설정: 서비스 사용자에게 chown -R 또는 chmod 적용
  4. fstab 편집: 적절한 옵션과 pass 값 설정
  5. 문법 검증: 다음 두 단계로 반드시 테스트한다.
sudo mount -a        # 에러가 없어야 한다
systemd-analyze verify /etc/fstab
  1. 실제 마운트 확인:
findmnt /mnt/<name>
df -h | grep <name>
  1. 재부팅 검증: sudo rebootfindmnt로 상태 재확인

자주 발생하는 문제와 해결

  • 부팅이 멈춤: 네트워크 마운트에 _netdev,nofail,x-systemd.automount를 추가한다.
  • 장치 이름이 바뀜: /dev/sdb1 대신 UUID=를 사용한다.
  • 권한 오류: NTFS/exFAT에서는 uid/gid/umask로 사용자 권한을 명시한다.
  • CIFS 인증 실패: /root/.smbcred 권한을 600으로 맞추고 vers를 서버와 호환되게 조정한다.
  • SSD 쓰기 성능 저하: noatime 적용, 주기적 fstrim 활성화, 커널 메시지에서 컨트롤러 오류 확인
  • fsck 대기 과다: 대용량 데이터 파티션은 pass=0으로 fsck 제외하거나 주기 관리(필요 시 수동 fsck)

보안과 운영 팁

  • 크리덴셜은 전용 파일로 분리하고 권한을 최소화한다.
  • 백업과 복구: fstab 백업을 형상관리(Git)하거나 구성관리 도구(Ansible 등)로 일관성 유지
  • 모니터링: systemd-mount, journalctl -b, dmesg로 부팅 시점 로그를 정기 점검
  • 장치 헬스체크: smartctl -a로 에러 카운터와 재할당 블록 감시

실전 예시: 데이터 디스크 한 방에 구성

가정: /dev/sdb1(ext4), 애플리케이션이 app 사용자로 동작

# 1) 파일시스템 생성
sudo mkfs.ext4 -F /dev/sdb1

# 2) 마운트 지점과 권한
sudo mkdir -p /mnt/data
sudo chown -R app:app /mnt/data

# 3) UUID 확인
blkid /dev/sdb1  # UUID=1234-5678-...

# 4) fstab 편집
UUID=12345678-90ab-cdef-1234-567890abcdef  /mnt/data  ext4  defaults,noatime,nofail  0  2

# 5) 테스트 및 확인
sudo mount -a
findmnt /mnt/data

서비스는 /mnt/data 경로를 기준으로 설정하면 이후 재부팅에도 그대로 유지된다.

마이그레이션과 롤백 전략

운영 중인 서버에서 경로를 바꾸면 애플리케이션 장애로 이어질 수 있다. 단계적으로 진행한다.

  1. 새 디스크를 임시 경로에 마운트(/mnt/newdata)
  2. rsync로 데이터 동기화(rsync -aHAX --delete)
  3. 서비스 중지 후 최종 동기화
  4. fstab에 새 경로 등록하고 구 경로 대신 새 디스크를 마운트(필요 시 bind로 호환 레이어 제공)
  5. 검증 후 구 디스크 언마운트 및 제거

결론

/etc/fstab는 단순한 표 한 줄이 아니라 부팅 안정성과 서비스 가용성을 좌우하는 핵심 설정이다. UUID 기반 식별, 워크로드에 맞는 옵션 선택, 네트워크/지연 마운트 조합, 테스트 절차를 갖추면 재부팅·장애 상황에서도 파일시스템을 일관되게 유지할 수 있다. 위의 체크리스트와 예시를 그대로 적용해 환경에 맞게 커스터마이즈하면 안전하고 예측 가능한 자동 마운트를 구현할 수 있다.