LabHub
배우기 러닝패스 코스

LFCS — 리눅스 재단 시스템 관리자 · 스토리지를 손으로 — LVM·fstab·swap·NFS·autofs · 이론

늘리는 일은 두 층에서 따로 일어난다 — LVM·fstab·swap·NFS·autofs

LabHub 에서 이어서 보기

한 줄 요약

스토리지는 이다. 블록 장치 위에 LVM 이, 그 위에 파일시스템이, 그 위에 마운트가 있고, 각 층은 자기 아래층만 안다. 그래서 LV 를 늘려도 파일시스템은 모르고, fstab 을 고쳐도 커널은 모르며, /etc/exports 를 고쳐도 NFS 서버는 모른다. 이 모듈의 실습은 그 "모른다" 를 하나씩 손으로 알려 주는 연습이다.

왜 이게 필요했나

앞 모듈(lfcs-storage)은 파드에서 돌았다. 거기에는 mountpvcreate 도 없었고, 읽기 자료 스스로 "가상 머신이나 루프백 장치를 쓸 수 있는 환경에서 따로 연습하기를 권한다" 고 적어 두었다. LFCS 의 Storage 도메인은 20% 인데 그 전부가 개념 설명에 머물러 있었다.

이 모듈은 우분투 24.04 VM 에서 돈다. root 이고 systemd 가 PID 1 이라 전부 진짜로 된다. 다만 빈 디스크는 없다. 플랫폼이 붙여 주는 스크래치 디스크는 cloud-init 이 이미 ext4 로 포맷해 바인드하기 때문이다. 그래서 첫 단계가 losetup 이다. [losetup(8)](https://man7.org/linux/man-pages/man8/losetup.8.html) 은 일반 파일을 블록 장치처럼 보이게 하는 루프 장치를 다루는 도구이고, 디스크 없이 LVM·RAID·파일시스템을 시험할 때 실무에서도 정확히 이렇게 쓴다. 우분투 클라우드 이미지는 snap 이 /dev/loop0 부터 몇 개를 이미 쓰고 있어서 번호를 박으면 "장치가 바쁩니다" 를 만난다. losetup -f --show 로 비어 있는 것을 받고, 나중에 losetup -j <파일> 로 되찾는다.

어떻게 동작하나

LVM 은 세 층이다. [lvm(8)](https://man7.org/linux/man-pages/man8/lvm.8.html) 의 용어로 PV(physical volume) 는 LVM 라벨을 쓴 블록 장치, VG(volume group) 는 PV 들을 모은 풀, LV(logical volume) 는 그 풀에서 잘라 낸 블록 장치다. VG 는 익스텐트(기본 4MiB) 단위로 공간을 관리하므로 lvcreate -L 600M 은 익스텐트 150개를 잡는다. 디스크를 더 붙이는 일은 pvcreatevgextend 로 VG 에 넣는 것이고, LV 는 그 뒤에 늘린다. 파티션을 다시 나누지 않아도 되는 것이 LVM 을 쓰는 이유다.

| 층 | 만드는 명령 | 늘리는 명령 | 보는 명령 |
| --- | --- | --- | --- |
| PV | pvcreate | — | pvs |
| VG | vgcreate | vgextend | vgs |
| LV | lvcreate | lvextend | lvs |
| 파일시스템 | mkfs.ext4 | resize2fs | df |

여기서 시험이 가장 자주 파고드는 자리가 마지막 두 줄이다. [lvextend(8)](https://man7.org/linux/man-pages/man8/lvextend.8.html) 는 LV 라는 블록 장치를 키울 뿐이고, 그 위의 ext4 는 자기가 900MiB 짜리 장치 위에 앉아 있다는 사실을 모른다. lvs 는 900M 인데 df 는 그대로인 상태가 그것이다. [resize2fs(8)](https://man7.org/linux/man-pages/man8/resize2fs.8.html) 가 파일시스템 층을 맞추고, ext4 는 마운트된 채로(온라인) 키울 수 있다. lvextend -r 은 이 두 층을 한 번에 처리하는 옵션이다.

fstab 은 장치 이름이 아니라 UUID 로 적는다. [fstab(5)](https://man7.org/linux/man-pages/man5/fstab.5.html) 의 첫 필드는 장치인데, /dev/sdb1 이나 /dev/loop3 같은 이름은 부팅 순서에 따라 바뀔 수 있다. 파일시스템에 새겨진 UUID 는 바뀌지 않는다. blkid 로 읽어서 UUID=… 로 적고, 여섯 필드(장치·마운트 지점·타입·옵션·dump·pass) 를 공백으로 나눈다. 고친 뒤에는 두 가지를 더 해야 한다. systemd 는 fstab 을 .mount 유닛으로 번역하므로 systemctl daemon-reload, 그리고 mount -a 로 그 줄이 실제로 동작하는지 지금 확인한다. findmnt --verify[E] 를 하나라도 내면 다음 부팅에서 emergency 셸을 만난다.

스왑 파일은 권한이 600 이어야 한다. [mkswap(8)](https://man7.org/linux/man-pages/man8/mkswap.8.html) 은 권한이 넓은 파일에 "insecure permissions" 경고를 낸다. 스왑에는 메모리의 사본이 들어가므로 다른 사용자가 읽을 수 있으면 안 된다. 만들기·chmod 600·mkswap·swapon 순서이고, fstab 의 마운트 지점 자리는 none, 타입은 swap 이다.

NFS 서버는 파일을 고친 것을 모른다. [exports(5)](https://man7.org/linux/man-pages/man5/exports.5.html) 형식은 디렉터리 클라이언트(옵션) 이고, 클라이언트와 여는 괄호 사이에 공백을 넣으면 그 옵션이 클라이언트가 아니라 모두에게 적용된다 — man 페이지가 명시적으로 경고하는 함정이다. 파일을 고친 뒤 [exportfs(8)](https://man7.org/linux/man-pages/man8/exportfs.8.html) 의 -ra 로 서버에 알리고, exportfs -v 로 실제로 내보내지는지 본다. NFSv4 는 2049 하나로 동작하므로 이 실습처럼 같은 VM 안에서 127.0.0.1:/srv/share 를 마운트할 수 있다.

autofs 는 접근할 때 붙인다. [auto.master(5)](https://man7.org/linux/man-pages/man5/auto.master.5.html) 의 마스터 맵이 "어느 디렉터리 아래를 어느 맵으로" 를 정하고, [autofs(5)](https://man7.org/linux/man-pages/man5/autofs.5.html) 의 맵 파일이 "키 옵션 원본" 을 정한다. 우분투의 /etc/auto.master 는 끝에 +dir:/etc/auto.master.d 가 있어 그 디렉터리의 *.autofs 파일이 마스터 맵으로 읽힌다. 맵을 쓴 뒤 데몬을 재시작해야 하고, ls /nfs/share 가 곧 마운트의 방아쇠다. 한 가지 놀랄 점: 서버가 자기 자신이면 autofs 는 NFS 대신 bind 마운트로 붙인다. auto.master(5) 는 nobind 옵션을 "local NFS filesystems 의 bind mounting 을 막는다" 고 설명하는데, 그 문장이 기본 동작을 말해 준다.

현장에서 만나는 모습

"디스크를 늘렸는데 왜 공간이 그대로냐" 는 질문은 클라우드에서도 매주 나온다. 볼륨을 키우는 것(클라우드 콘솔)·파티션 또는 LV 를 키우는 것·파일시스템을 키우는 것은 세 층의 일이고, 콘솔에서 크기를 바꾼 사람은 첫 층만 한 것이다. 노드에 들어가 lsblk 로 장치가 커졌는지, lvs 로 LV 가 커졌는지, df 로 파일시스템이 커졌는지를 위에서 아래로 내려가며 보면 어느 층에서 멈췄는지 한 번에 보인다.

쿠버네티스의 ReadWriteMany 볼륨은 대개 NFS 다. 파드가 mount.nfs: access denied by server 로 멈추면 서버 쪽 /etc/exports 의 클라이언트 범위가 노드 IP 를 포함하는지, 그리고 exportfs -v 에 정말 그 항목이 있는지를 본다. 파일에는 있는데 exportfs -ra 를 안 한 경우가 생각보다 많다.

디스크 성능 문제는 [iostat(1)](https://man7.org/linux/man-pages/man1/iostat.1.html) 과 [vmstat(8)](https://man7.org/linux/man-pages/man8/vmstat.8.html) 로 가른다. 둘 다 첫 표본은 부팅 이후 누적 평균이라 버려야 하고, iostat -x%utilawait 가 디스크가 바쁜지를, vmstatsi/so 열이 스왑을 치고 있는지를 말해 준다.

다음 실습에서 할 것

루프 장치 두 개 → PV → VG vg_lfcs → LV lv_data(ext4) → /srv/data 마운트와 UUID fstab 줄 → 온라인 확장 → 256MiB 스왑 파일 → /srv/share 를 127.0.0.1 에만 NFS 로 내보내고 마운트 → 같은 공유를 autofs 로 → iostat·vmstat 지표와 요약 파일. 채점기는 파일만 보지 않고 vgs·lvs·findmnt·swapon --show·exportfs -v 로 지금 시스템을 본다. 그러니 "파일을 고쳤다" 에서 멈추지 말고 "데몬이 알았는가" 까지 가라.