RHCSA 2일차
유연한 스토리지 관리의 미학.
어제 Root 비밀번호 뚫기가 ‘해커’의 영역이었다면, 오늘은 ‘건축가’의 영역이다.
서버를 운영하다 보면 가장 식은땀 나는 순간 중 하나가 “디스크 용량 부족” 알림이 떴을 때다.
전통적인 파티션 방식은 한번 크기를 정하면(예: 10GB), 그걸 늘리기 위해 데이터를 백업하고, 파티션을 깨고, 다시 잡아야 했다.
마치 콘크리트 벽을 세우는 것과 같다.
나중에 방이 좁다고 벽을 밀 수는 없지 않은가.
그럴 때 필요한게 LVM: Logical Volume Manager은 달랐다.
이건 찰흙이다.
여러 개의 디스크를 뭉쳐서 하나의 거대한 덩어리로 만들고, 거기서 필요한 만큼만 떼어내서 쓴다.
부족하면? 찰흙을 더 갖다 붙이면 그만이다.
서버를 끄지 않고도 확장이 가능하다니, 확실히 배워둘 가치가 있었다.
LVM 구축 5단계: 케이크 층 쌓기
처음엔 용어가 헷갈려서 한참을 헤맸다. PV, VG, LV…
복잡해 보이지만, [정찰 -> 파티션 -> 재료 손질 -> 반죽 뭉치기 -> 면 뽑기 -> 요리 -> 그릇 담기] 순서만 기억하면 된다.
0단계: 정찰 및 밑작업 (Recon & Partition)
LVM 명령어를 치기 전에, 하드웨어 상태부터 확인해야 한다. 가상머신에 추가한 디스크가 제대로 붙었는지도 모르고 시작할 순 없으니까.
- 디스크 확인 (Recon)
lsblk
# sda (메인 OS) 말고 sdb (또는 nvme...) 같은 낯선 녀석이 보여야 한다. 안 보이면 VMware 설정에서 하드디스크 추가를 안 한 거다. (내가 그랬다.)
- 파티션 생성 및 타입 변경 (fdisk) 통 디스크(sdb)를 바로 써도 되지만, 표준 절차(Standard Practice)는 파티션을 나누고 “이건 LVM용이야”라고 딱지를 붙여주는 것이다.
fdisk /dev/sdb
여기서부턴 대화형 프롬프트와의 싸움이다. 순서를 외워두는 게 속 편하다.
n (New): 새 파티션 생성
p (Primary): 주 파티션
Enter x 2: 파티션 번호랑 시작 섹터는 그냥 기본값(Default)으로 넘긴다.
+1G: 중요! 용량을 1GB로 지정한다. (그냥 엔터 치면 전체 다 쓴다.)
t (Type): 파티션 타입을 바꾼다. 이게 핵심이다.
8e: Hex code 입력. 8e가 'Linux LVM'이다. 이걸 해줘야 시스템이 "아, 이거 LVM용이구나" 하고 알아먹는다.
w (Write): 저장하고 나가기. (q 누르면 다 날아간다. 주의.)
1단계: 재료 손질 (Physical Volume - PV)
가장 먼저, 리눅스에게 “이 디스크(파티션)는 이제 LVM용으로 쓸 거야”라고 라벨을 붙여주는 작업이다.
- PV (Physical Volume): 물리적 볼륨. LVM의 가장 기본 단위.
# /dev/sdb1 파티션을 PV로 초기화
pvcreate /dev/sdb1
2단계: 반죽 뭉치기 (Volume Group - VG)
손질된 재료들(PV)을 모아 하나의 거대한 스토리지 풀을 만든다.
여기가 핵심이다.
물리적으로 떨어져 있는 디스크들을 논리적으로 하나로 합치는 단계다.
- VG (Volume Group): 볼륨 그룹. 여러 PV가 모인 거대한 그릇.
# 'my_vg'라는 이름으로 그룹 생성
vgcreate my_vg /dev/sdb1
# (심화) -s 옵션으로 PE(Physical Extent) 크기를 조절할 수 있다.
# PE는 레고 블록 한 칸의 크기라고 보면 된다. (기본 4MB)
3단계: 면 뽑기 (Logical Volume - LV)
이제 거대한 반죽(VG)에서 내가 실제로 필요한 만큼만 뚝 떼어낸다. 사용자는 물리 디스크가 몇 개인지 알 필요 없다. 그냥 이 LV만 바라보면 된다.
- LV (Logical Volume): 논리 볼륨. 실제 우리가 파티션처럼 다루게 될 녀석.
# my_vg 그룹에서 500MB를 떼어내 'my_lv'라는 이름으로 생성
lvcreate -n my_lv -L 500M my_vg
여기서 -n은 Name, -L은 Length(Size)의 약자다. 직관적이라 외우기 쉽다.
4단계: 요리 / 인테리어 (File System - FS)
공간은 만들었지만, 아직 텅 빈 방이다. 데이터를 저장할 수 있게 바닥 공사(포맷)를 해야 한다.
# ext4 파일 시스템으로 포맷
mkfs.ext4 /dev/my_vg/my_lv
# 또는 RHEL의 기본인 xfs 사용
mkfs.xfs /dev/my_vg/my_lv
- mkfs: Make File System의 약자.
5단계: 그릇 담기 (Mount & Persistence)
요리가 끝났으면 그릇에 담아야 먹을 수 있다.
리눅스에서는 특정 디렉토리에 연결(Mount)해야 접근이 가능하다.
mkdir /data
mount /dev/my_vg/my_lv /data
하지만 여기서 안심하면 큰일 난다.
mount 명령어는 휘발성이다. 재부팅하면 기껏 연결한 게 다 끊어진다.
반드시 /etc/fstab 파일에 등록해야 한다.
(시험에서 이거 까먹으면 바로 0점 처리된다고 한다.)
# /etc/fstab 편집
/dev/my_vg/my_lv /data ext4 defaults 0 0
장치명(/dev/...) 대신 UUID를 쓰는 게 안전하다. 디스크 순서가 바뀌어도 꼬이지 않기 때문. lsblk -f로 UUID를 확인하자.
솔직히 그 긴 UUID(36자리)를 일일이 보고 치는 건 미친 짓이다. 오타가 하나라도 나면 재부팅 시 Emergency Mode로 떨어지기 때문이다.
나는 쫄보라서, 리다이렉션(>>)을 써서 시스템이 직접 파일에 적게 만들었다.
# 1. UUID 정보를 fstab 맨 아래에 '이어쓰기' 한다. (덮어쓰기 > 절대 금지! 무조건 >>)
blkid /dev/my_vg/my_lv >> /etc/fstab
이제 vi /etc/fstab을 열어보면 맨 마지막 줄에 UUID가 덩그러니 들어와 있다.
(파일 맨 끝에 추가된 내용)
/dev/my_vg/my_lv: UUID="a1b2-..." BLOCK_SIZE="4096" TYPE="ext4"
필요한 명령어
공부하다 보니 손에 익은 확인용 명령어들이다.
lsblk(List Block Devices): 전체 디스크 구조를 나무(Tree) 형태로 보여준다. 가장 많이 쓴다.pvs,vgs,lvs: 각 단계별 상태를 짧게 요약해서 보여준다. (뒤에display를 붙이면 너무 길어서 눈 아프다.s가 최고다.)
망했을 때 되돌리기 (Rollback)
LVM 실습을 하다가 꼬였을 때, 무턱대고 지우면 에러가 뿜어져 나온다.
생성의 역순으로 철거해야 한다. 건물을 지을 때 기초부터 올렸으니, 부술 때는 지붕부터 뜯어야 하는 원리다.
umount /data: 마운트 해제 (fstab 내용도 지울 것!)lvremove: 논리 볼륨 삭제vgremove: 볼륨 그룹 삭제pvremove: 물리 볼륨 라벨 제거fdisk: 파티션 삭제
마치며
솔직히 LVM이 시스템 아키텍처 관점에서 얼마나 우아하고 효율적인 기술인지는… 아직 피부로 와닿지 않는다.
그냥… 간지 난다.
마우스로 아이콘을 ‘딸깍’거리는 게 아니라, 까만 화면에 fdisk를 치고, 8e 코드를 입력하고, w를 눌러 저장하는 그 순간. 마치 영화 속 엔지니어가 되어 시스템의 심장부를 건드리는 듯한 그 기분이 묘하게 중독성 있다.
이런 맛이라도 있어야 지루한 검은 화면을 견디는 거지.
마침.
다른 글 보기
SEO 엔지니어링 및 트러블슈팅
티스토리 시절보다 못한 유입량의 원인을 분석하다 발견한 치명적인 문제와, 이를 해결하기 위한 기술적 SEO 적용기.
Prisma, 넌 누구니?
MyBatis의 노가다와 TypeORM의 배신을 넘어, Prisma는 얼마나 합리적인가
RHCSA 1일차
RHCSA를 따보자.
코딩 종말?, 앤드류 응이 내게 건넨 확신
내가 느꼈던 Cursor의 죄책감과 가트너의 경고. 앤드류 응의 강연이 나의 지난 1년을 증명해주었다.