스냅숏으로 되돌리고, XFS 는 늘리고, ext4 는 줄인다
목표
변경 직전에 LVM 스냅숏을 뜨고, 틀린 변경을 병합으로 되돌리고, XFS 는 온라인으로 늘리고 ext4 는 데이터를 지키며 오프라인으로 줄이고, 씬 풀로 과할당을 만들어 봅니다.
왜 중요한가
변경 작업은 "잘못되면 되돌린다" 를 전제로 승인됩니다. 스냅숏은 그 전제를 몇 초 만에 만들어 주지만, 크기를 잘못 잡으면 작업 중에 조용히 무효가 되고, 되돌리는 절차(마운트 해제 → 병합 → 다시 마운트)를 모르면 새벽에 헤맵니다. 파일시스템 선택도 마찬가지입니다 — XFS 는 늘릴 수는 있어도 줄이지 못한다고 보고 설계하므로, 줄일 가능성이 있는 볼륨에 무엇을 골랐는지가 나중의 선택지를 정합니다.
이 실습은 우분투 24.04 VM 에서 root 로 돕니다. 빈 디스크가 없으므로 3GiB 희소 파일을 루프 장치로 붙여 디스크 대신 씁니다. 세션은 60분에 시작해 최대 180분까지 연장할 수 있고, VM 은 세션이 끝나면 사라집니다.
단계
/var/lib/sto/lvm.img를 3GiB 로 만들어 루프 장치로 붙이고, PV 로 초기화해 볼륨 그룹vg_sto를 만드세요.- 600MiB LV
lv_app을 XFS 로 포맷해/srv/app에 마운트하세요./srv/app/app.conf에version=1,/srv/app/orders.csv에 세 줄 이상의 CSV 를 쓰고,sha256sum /srv/app/orders.csv출력을/root/sto/snap/orders.sha256에 저장하세요. - 스냅숏
lv_app_snap을 200MiB 로 만들고,lvs -o lv_name,origin,lv_attr,lv_size vg_sto출력을/root/sto/snap/snap.txt에 저장하세요. - 틀린 변경:
app.conf를version=2로,orders.csv를 삭제,/srv/app/junk.bin에 60MiB 쓰기. 그 뒤lvs -o lv_name,origin,data_percent vg_sto출력을/root/sto/snap/usage.txt에 저장하세요. - 스냅숏을 병합해 되돌리세요.
lv_app_snap은 없어지고,/srv/app이 다시 마운트돼 있고,version=1·orders.csv체크섬 일치·junk.bin없음이어야 합니다. lv_app을 900MiB 로 늘리고 XFS 도 마운트한 채로 늘리세요.- 500MiB LV
lv_logs를 ext4 로/srv/logs에 마운트하고,/srv/logs/keep.log에 5MiB 를 쓴 뒤sha256sum /srv/logs/keep.log출력을/root/sto/snap/keep.sha256에 저장하세요. lv_logs를 300MiB 로 줄이세요. 파일시스템도 함께 줄고, 다시 마운트돼 있고,keep.log가 체크섬과 같아야 합니다.- 400MiB 씬 풀
pool위에 가상 크기 1GiB 씬 볼륨lv_thin을 만들고,lvs -o lv_name,lv_size,pool_lv,data_percent vg_sto출력을/root/sto/snap/thin.txt에 저장하세요.
참고
- 스냅숏:
lvcreate -s -L 200M -n lv_app_snap vg_sto/lv_app, 되돌리기:lvconvert --merge. - 확장:
lvextend -r -L 900M vg_sto/lv_app. 축소:e2fsck -f→resize2fs <작게>→lvreduce→resize2fs. - 씬:
lvcreate --type thin-pool,lvcreate -V 1G -T vg_sto/pool -n lv_thin. - 흔한 실수 1: 마운트된 채로
lvconvert --merge를 하고 "왜 안 돌아왔지" 하는 경우 — 병합이 다음 활성화까지 미뤄진 것입니다. - 흔한 실수 2:
lvreduce를 먼저 하고resize2fs를 나중에 하는 경우 — 파일시스템 끝이 잘려 나갑니다.
루프 장치 위에 VG 세우기
/var/lib/sto/lvm.img 를 3GiB 희소 파일로 만들어 루프 장치로 붙이고, PV 로 초기화한 뒤 그 하나로 볼륨 그룹 vg_sto 를 만드세요.
truncate → losetup -f --show → pvcreate → vgcreate 순서입니다. 루프 번호는 losetup -j <파일> 로 되찾습니다.
XFS 볼륨과 지킬 데이터
vg_sto 에 600MiB LV lv_app 을 만들어 XFS 로 포맷하고 /srv/app 에 마운트하세요. /srv/app/app.conf 에 한 줄 version=1 을, /srv/app/orders.csv 에 세 줄 이상의 아무 CSV 를 쓰고, sha256sum /srv/app/orders.csv 출력을 /root/sto/snap/orders.sha256 에 저장하세요.
lvcreate -L 600M -n lv_app vg_sto, mkfs.xfs, mount 순서입니다. 체크섬 파일에 절대 경로가 들어가야 나중에 sha256sum -c 로 검사할 수 있습니다.
변경 직전 스냅숏
lv_app 의 스냅숏 lv_app_snap 을 200MiB 로 만드세요. 그리고 lvs -o lv_name,origin,lv_attr,lv_size vg_sto 출력을 /root/sto/snap/snap.txt 에 저장하세요.
lvcreate -s -L <크기> -n <이름> vg_sto/lv_app 입니다. 스냅숏의 lv_attr 는 s 로 시작하고 Origin 열에 원본 이름이 보입니다.
틀린 변경과 스냅숏 사용률
틀린 변경을 흉내 내세요: /srv/app/app.conf 를 version=2 로 바꾸고, /srv/app/orders.csv 를 지우고, /srv/app/junk.bin 에 60MiB 를 쓰세요. 그 뒤 lvs -o lv_name,origin,data_percent vg_sto 출력을 /root/sto/snap/usage.txt 에 저장하세요.
dd if=/dev/urandom of=... bs=1M count=60 으로 쓸 수 있습니다. 쓴 뒤 sync 를 해야 스냅숏 사용률(Data%)에 반영됩니다. 스냅숏보다 많이 쓰면 스냅숏이 무효가 되니 크기를 지키세요.
병합으로 되돌리기
스냅숏을 원본에 병합해 틀린 변경 이전으로 되돌리세요. 끝나면 lv_app_snap 은 없어야 하고, /srv/app 이 다시 마운트돼 있고, app.conf 는 version=1, orders.csv 는 체크섬과 같아야 하며, junk.bin 은 없어야 합니다.
lvconvert --merge 는 원본이 마운트돼 있으면 다음 활성화까지 미뤄집니다. 마운트를 먼저 풀고 병합한 뒤 다시 마운트하세요.
XFS 를 마운트한 채로 늘리기
lv_app 을 900MiB 로 늘리고, 마운트를 풀지 않은 채 XFS 도 함께 늘리세요. df 로 본 /srv/app 이 커져야 합니다.
lvextend -r 은 LV 를 늘린 뒤 파일시스템에 맞는 도구(XFS 면 xfs_growfs)를 불러 줍니다. xfs_growfs 는 마운트된 상태에서만 동작합니다.
줄일 수 있는 볼륨 만들기
vg_sto 에 500MiB LV lv_logs 를 만들어 ext4 로 포맷하고 /srv/logs 에 마운트하세요. /srv/logs/keep.log 에 5MiB 임의 데이터를 쓰고 sha256sum /srv/logs/keep.log 출력을 /root/sto/snap/keep.sha256 에 저장하세요.
2단계와 같은 흐름이고 파일시스템만 ext4 입니다. 다음 단계에서 이 볼륨을 줄입니다.
ext4 를 데이터를 지키며 줄이기
lv_logs 를 300MiB 로 줄이세요. 파일시스템도 함께 줄어야 하고, 끝나면 /srv/logs 에 다시 마운트돼 있고 keep.log 가 체크섬과 같아야 합니다.
ext4 는 마운트를 푼 상태에서만 줄어듭니다. 순서가 중요합니다 — 파일시스템을 목표보다 작게 먼저 줄이고(e2fsck -f 가 먼저 필요합니다), 그다음 LV 를 줄이고, 마지막에 파일시스템을 LV 크기에 다시 맞추세요.
씬 풀과 과할당
vg_sto 에 400MiB 씬 풀 pool 을 만들고, 그 풀 위에 가상 크기 1GiB 씬 볼륨 lv_thin 을 만드세요. lvs -o lv_name,lv_size,pool_lv,data_percent vg_sto 출력을 /root/sto/snap/thin.txt 에 저장하세요.
lvcreate --type thin-pool -L 로 풀을, lvcreate -V <가상 크기> -T vg_sto/pool -n <이름> 으로 씬 볼륨을 만듭니다. 풀보다 큰 볼륨을 만들면 과할당 경고가 나오는데, 그것이 이 단계에서 보려는 것입니다.