LabHub

스토리지와 마운트 · 마운트와 /etc/fstab 읽고 쓰기 · 이론

fstab 여섯 필드를 정확히

LabHub 에서 이어서 보기

한 줄 요약

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

왜 이게 필요했나

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 --verbosemount -a           # 실제로 붙여 본다 (특권 필요)

현장에서 만나는 모습

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

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

다음 실습에서 할 것

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