LabHub
배우기 러닝패스 코스

ストレージとマウント

fstabの六フィールドを正確に

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

한 줄 요약

fstab 한 줄은 장치 / 마운트지점 / 타입 / 옵션 / dump / pass 여섯 필드다. 마지막 두 숫자를 대충 적어 부팅이 멈추는 일이 실제로 있다.

概念マップ: 장치 / 마운트지점 / 타입 / 옵션 / dump / pass・1. 장치 식별자.・장치 경로는 불안정하므로 UUID 를 쓴다.・2. 마운트 지점.

왜 이게 필요했나

fstab 은 시스템에서 가장 위험한 파일 중 하나다. 잘못 쓰면 부팅 도중 멈추고, 콘솔이 없으면 손쓸 방법이 없다. 그런데 형식이 단순해서 사람들이 대충 복사해 붙인다.

어떻게 동작하나

UUID=1a2b...  /srv/data  ext4  defaults,noatime,nofail  0  2
[----1----]  [---2---]  [-3-]  [--------4---------]     5  6

1. 장치 식별자. UUID=, LABEL=, PARTUUID=, 또는 장치 경로. 네트워크 파일시스템이면 server:/export 형식. 장치 경로는 불안정하므로 UUID 를 쓴다.

2. 마운트 지점. 절대 경로. 공백이 들어가면 \040 으로 이스케이프한다.

3. 파일시스템 타입. ext4, xfs, tmpfs, nfs4, none(바인드 마운트), auto.

4. 옵션. 쉼표로 구분. 자주 쓰는 것들:

옵션 언제
defaults rw,suid,dev,exec,auto,nouser,async 기본
noatime 읽을 때 접근 시각을 갱신하지 않음 대부분의 서버에서 권장
nofail 마운트 실패해도 부팅을 계속 데이터 디스크에 필수
_netdev 네트워크가 준비된 뒤 마운트 NFS/iSCSI 에 필수
noexec,nosuid,nodev 실행/setuid/장치 파일 금지 /tmp, 사용자 업로드 경로
ro 읽기 전용 감사 대상 데이터
bind 바인드 마운트 아래 참조

nofail 이 없으면 데이터 디스크 하나가 죽었을 때 서버 전체가 부팅되지 않는다. 루트가 아닌 모든 항목에는 사실상 필수다.

5. dump. 옛날 dump 백업 도구용 플래그. 요즘은 거의 항상 0.

6. pass — fsck 검사 순서. 이게 진짜 함정이다.

의미
0 검사하지 않음 (tmpfs, NFS, 바인드 마운트)
1 루트 파일시스템만. 가장 먼저, 단독으로 검사
2 그 외 로컬 파일시스템. 1 이 끝난 뒤 병렬로 검사

루트가 아닌데 1 을 주면 부팅 시 여러 파일시스템을 동시에 단독 검사하려다 순서가 꼬인다. 네트워크 파일시스템에 1 이나 2 를 주면 네트워크가 없는 초기 부팅 단계에서 검사하려다 멈춘다.

바인드 마운트

같은 파일시스템의 한 디렉터리를 다른 경로에도 보이게 한다.

/srv/data  /var/www/data  none  bind  0  0

심볼릭 링크와 뭐가 다른가? 심링크는 경로 문자열이고 바인드 마운트는 진짜 마운트다. 그래서 chroot 안이나 컨테이너 안처럼 경로 해석 범위가 제한된 곳에서 심링크는 깨지지만 바인드 마운트는 동작한다. 또 바인드 마운트에는 ro 같은 별도 옵션을 줄 수 있다 — 원본은 쓰기 가능하고 이 경로에서만 읽기 전용으로 보이게 할 수 있다.

검증

fstab 을 고친 뒤 재부팅 전에 반드시 확인한다. 재부팅해서 확인하는 것은 확인이 아니라 도박이다.

findmnt --verify --verbose
mount -a           # 실제로 붙여 본다 (특권 필요)

현장에서 만나는 모습

NFS 항목에 _netdev 를 빼먹는다. 부팅 중 네트워크가 준비되기 전에 마운트를 시도하다 타임아웃까지 기다린다. 서버 부팅이 5분 늘어난다.

용량 확장 후 fstab 을 안 고친다. LVM 을 확장하고 resize2fs 까지 했는데 재부팅하면 옛 크기로 돌아온다? 사실은 fstab 이 다른 볼륨을 가리키고 있던 것이다.

systemd 가 fstab 을 읽는다

요즘 리눅스에서 fstab 은 그 자체로 실행되는 것이 아니라, 부팅 때 systemd 가 읽어 마운트 유닛으로 변환한다. 이 사실을 알면 두 가지가 설명된다.

첫째, systemctl status 로 마운트 상태를 볼 수 있다. /srv/datasrv-data.mount 라는 유닛이 된다(경로의 슬래시가 대시로 바뀐다). 마운트가 실패했을 때 journalctl -u srv-data.mount 로 원인을 보면, fstab 만 들여다볼 때보다 훨씬 구체적인 메시지가 나온다.

둘째, fstab 옵션 중 일부는 사실 systemd 에게 주는 지시다. nofail 은 그 마운트가 실패해도 다른 유닛을 막지 말라는 뜻이고, _netdev 는 네트워크가 준비된 뒤로 순서를 미루라는 뜻이다. x-systemd. 로 시작하는 옵션들은 아예 systemd 전용이다. 그중 실무에서 값어치가 큰 것 둘만 짚는다.

fstab 을 고친 뒤 systemd 에게 다시 읽으라고 알려야 한다는 점도 잊기 쉽다. systemctl daemon-reload 를 하지 않으면 systemd 는 옛 유닛을 그대로 들고 있어서, mount -a 로는 붙는데 재부팅하면 다르게 동작하는 혼란스러운 상태가 된다. 앞에서 말한 findmnt --verifymount -a 에 이것을 더해 세 줄로 확인하는 습관을 들이면, fstab 때문에 부팅이 멈추는 사고는 거의 사라진다.

다음 실습에서 할 것

망가진 fstab 픽스처를 규칙에 따라 감사해 문제 줄을 찾고, 고친 뒤, 직접 검증 스크립트를 작성한다. 채점기가 그 스크립트를 정상 입력과 불량 입력 양쪽으로 실행해 제대로 판별하는지 본다.