RHCSA 2일차

유연한 스토리지 관리의 미학.

Jun Noh

어제 Root 비밀번호 뚫기가 ‘해커’의 영역이었다면, 오늘은 ‘건축가’의 영역이다.

서버를 운영하다 보면 가장 식은땀 나는 순간 중 하나가 “디스크 용량 부족” 알림이 떴을 때다.

전통적인 파티션 방식은 한번 크기를 정하면(예: 10GB), 그걸 늘리기 위해 데이터를 백업하고, 파티션을 깨고, 다시 잡아야 했다.

마치 콘크리트 벽을 세우는 것과 같다.

나중에 방이 좁다고 벽을 밀 수는 없지 않은가.

그럴 때 필요한게 LVM: Logical Volume Manager은 달랐다.

이건 찰흙이다.

여러 개의 디스크를 뭉쳐서 하나의 거대한 덩어리로 만들고, 거기서 필요한 만큼만 떼어내서 쓴다.

부족하면? 찰흙을 더 갖다 붙이면 그만이다.

서버를 끄지 않고도 확장이 가능하다니, 확실히 배워둘 가치가 있었다.

LVM 구축 5단계: 케이크 층 쌓기

처음엔 용어가 헷갈려서 한참을 헤맸다. PV, VG, LV…

복잡해 보이지만, [정찰 -> 파티션 -> 재료 손질 -> 반죽 뭉치기 -> 면 뽑기 -> 요리 -> 그릇 담기] 순서만 기억하면 된다.

0단계: 정찰 및 밑작업 (Recon & Partition)

LVM 명령어를 치기 전에, 하드웨어 상태부터 확인해야 한다. 가상머신에 추가한 디스크가 제대로 붙었는지도 모르고 시작할 순 없으니까.

  1. 디스크 확인 (Recon)
lsblk

# sda (메인 OS) 말고 sdb (또는 nvme...) 같은 낯선 녀석이 보여야 한다. 안 보이면 VMware 설정에서 하드디스크 추가를 안 한 거다. (내가 그랬다.)
  1. 파티션 생성 및 타입 변경 (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 실습을 하다가 꼬였을 때, 무턱대고 지우면 에러가 뿜어져 나온다.

생성의 역순으로 철거해야 한다. 건물을 지을 때 기초부터 올렸으니, 부술 때는 지붕부터 뜯어야 하는 원리다.

  1. umount /data: 마운트 해제 (fstab 내용도 지울 것!)
  2. lvremove: 논리 볼륨 삭제
  3. vgremove: 볼륨 그룹 삭제
  4. pvremove: 물리 볼륨 라벨 제거
  5. fdisk: 파티션 삭제

마치며

솔직히 LVM이 시스템 아키텍처 관점에서 얼마나 우아하고 효율적인 기술인지는… 아직 피부로 와닿지 않는다.

그냥… 간지 난다.

마우스로 아이콘을 ‘딸깍’거리는 게 아니라, 까만 화면에 fdisk를 치고, 8e 코드를 입력하고, w를 눌러 저장하는 그 순간. 마치 영화 속 엔지니어가 되어 시스템의 심장부를 건드리는 듯한 그 기분이 묘하게 중독성 있다.

이런 맛이라도 있어야 지루한 검은 화면을 견디는 거지.

마침.

다른 글 보기