Red Hat Certified System Administrator (RHCSA) #5 로컬 storage 1: 파티션, swap, LVM 기초
#4 부팅과 시스템에서 systemd와 GRUB2, 그리고 password recovery까지 다뤘습니다. 이제 RHCSA에서 작업 수가 가장 많고 합격을 가르는 영역인 로컬 storage로 들어갑니다. 이번 글은 그 첫 번째로, 빈 디스크 하나를 받아 파티션을 만들고, swap을 추가하고, LVM을 구성해 파일 시스템을 영구 마운트하는 전체 흐름을 손으로 완주하겠습니다.
스토리지 작업의 핵심은 재부팅 후에도 유지되는가입니다. mkswap만 하고 fstab에 안 적으면 재부팅 후 swap이 사라지고, mount만 하고 fstab에 안 적으면 마운트가 풀립니다. 그래서 이 글은 만드는 명령뿐 아니라 fstab에 영구로 남기는 과정까지 한 묶음으로 다루겠습니다.
디스크부터 확인한다 #
작업 전에 지금 시스템에 어떤 디스크가 있고, 어디가 비어 있는지를 먼저 봅니다. 엉뚱한 디스크를 건드리면 복구가 어려우므로, 확인 단계는 생략하지 않겠습니다.
lsblk는 블록 장치를 트리로 보여 주어 전체 그림을 잡기에 가장 좋습니다.
# 블록 장치 트리. 디스크와 파티션, 마운트 위치를 한눈에 본다
lsblk
# 파일 시스템 타입과 UUID까지 함께 본다
lsblk -f출력에서 disk 타입이 디스크 전체이고, 그 아래 들여쓰기된 part가 파티션입니다. MOUNTPOINT가 비어 있으면 아직 마운트되지 않은 것입니다.
fdisk -l은 디스크 크기와 파티션 테이블 형식(MBR/GPT)을 자세히 보여 줍니다.
# 모든 디스크의 파티션 테이블을 자세히 본다
fdisk -l
# 특정 디스크만 본다
fdisk -l /dev/vdb이번 글에서는 비어 있는 추가 디스크를 /dev/vdb로 가정하겠습니다. 실제 시험에서는 lsblk로 본인 환경의 빈 디스크 이름을 먼저 확인해야 합니다. 환경에 따라 /dev/sdb나 /dev/nvme0n1처럼 이름이 다릅니다.
파티션 만들기 #
빈 디스크에 파티션을 직접 나눠 보겠습니다. 도구는 fdisk(대화형)와 parted가 있고, 시험에서는 둘 중 손에 익은 쪽을 쓰면 됩니다.
fdisk로 만들기 #
fdisk는 대화형 메뉴로 동작합니다. 각 단계에서 한 글자 명령을 입력합니다.
fdisk /dev/vdbfdisk 안에서 입력하는 흐름은 다음과 같습니다.
Command (m for help): n # 새 파티션 생성
Partition type: p # primary(기본값이므로 Enter도 가능)
Partition number (1-4): 1 # 1번
First sector: (Enter) # 시작 섹터는 기본값
Last sector: +2G # 크기를 2GiB로 지정
Command (m for help): t # 파티션 타입 변경(선택)
Hex code: 82 # 82 = Linux swap, 8e = Linux LVM, 83 = Linux
Command (m for help): p # 현재 파티션 표 미리 보기
Command (m for help): w # 디스크에 기록하고 종료크기는 +2G처럼 +크기 형식으로 지정하면 시작 섹터부터 그만큼을 잡아 줍니다. 타입 코드는 swap이면 82, LVM에 쓸 파티션이면 8e로 바꿉니다. 타입은 표식일 뿐이라 안 바꿔도 동작하지만, LVM,swap의도를 명확히 남기려면 지정하는 편이 좋습니다.
마지막에 w로 기록해야 실제로 반영됩니다. q로 나가면 변경이 버려지므로 주의하겠습니다.
parted로 만들기 #
parted는 명령을 한 줄로 줄 수 있어 스크립트에 유리합니다. 큰 디스크(2TiB 초과)나 GPT가 필요하면 parted를 씁니다.
# GPT 라벨 생성(빈 디스크일 때)
parted /dev/vdb mklabel gpt
# 1MiB부터 2GiB까지 파티션 생성
parted /dev/vdb mkpart primary 1MiB 2GiB
# 현재 상태 확인
parted /dev/vdb print커널에 파티션 변경 알리기 #
파티션 표를 바꾼 뒤 커널이 인식하지 못하면 다음 명령으로 다시 읽힙니다.
# 커널에 파티션 테이블 변경을 통지한다
partprobe /dev/vdb
# 새 파티션이 보이는지 확인한다
lsblk /dev/vdb이제 /dev/vdb1처럼 파티션 장치가 생겼습니다. 이 위에 swap이나 파일 시스템을 올리겠습니다.
swap 추가하기 #
swap은 물리 메모리가 부족할 때 디스크를 보조 메모리로 쓰는 공간입니다. RHCSA에서는 “swap 파티션을 만들어 영구로 활성화하라"가 단골 작업입니다.
흐름은 파티션 생성 → mkswap → swapon → fstab 등록 순서입니다. 위에서 만든 파티션 타입을 82(Linux swap)로 지정한 /dev/vdb1을 swap으로 쓰겠습니다.
# 파티션을 swap 포맷으로 만든다. 출력의 UUID를 메모해 둔다
mkswap /dev/vdb1
# 지금 즉시 swap을 켠다
swapon /dev/vdb1
# 현재 활성화된 swap 목록을 확인한다
swapon --show
free -h여기까지는 임시입니다. 재부팅하면 swapon이 풀리므로, /etc/fstab에 등록해 영구로 만들어야 합니다.
# swap 파티션의 UUID를 확인한다
blkid /dev/vdb1blkid가 알려 준 UUID를 /etc/fstab에 한 줄로 추가합니다.
UUID=여기에-실제-UUID none swap defaults 0 0| 필드 | swap 항목 값 | 의미 |
|---|---|---|
| 장치 | UUID=... | swap 영역(UUID로 지정 권장) |
| 마운트 위치 | none | swap은 마운트 위치가 없음 |
| 타입 | swap | swap 영역임을 명시 |
| 옵션 | defaults | 기본 옵션 |
| dump | 0 | dump 대상 아님 |
| fsck | 0 | 부팅 시 검사 안 함 |
등록 후에는 반드시 검증합니다. 다음 명령은 fstab을 다시 읽어 swap을 켜며, fstab에 문법 오류가 있으면 여기서 드러납니다.
# fstab에 적힌 모든 swap을 활성화한다(검증 목적)
swapon -a
swapon --show장치 이름(/dev/vdb1)은 디스크 추가 순서에 따라 바뀔 수 있으므로, fstab에는 UUID로 적는 습관을 들이겠습니다.
LVM 기초 #
RHCSA에서 가장 자주 나오는 스토리지 작업이 LVM을 만들어 마운트하라입니다. LVM(Logical Volume Manager)은 디스크를 유연하게 묶고 나눠 쓰는 계층 구조입니다.
| 계층 | 약자 | 설명 | 만드는 명령 |
|---|---|---|---|
| Physical Volume | PV | LVM이 쓸 물리 단위(파티션,디스크) | pvcreate |
| Volume Group | VG | PV들을 묶은 저장소 풀 | vgcreate |
| Logical Volume | LV | VG에서 잘라 낸 실제 볼륨 | lvcreate |
흐름은 물리 장치 준비 → PV 생성 → VG 생성 → LV 생성 → 파일 시스템 생성 → fstab 마운트입니다. 파티션 없이 디스크 전체를 PV로 써도 되지만, 시험에서는 보통 파티션 타입을 8e(Linux LVM)로 만든 파티션을 PV로 씁니다. 여기서는 /dev/vdb2를 LVM용 파티션으로 가정하겠습니다.
PV 생성 #
# 파티션을 PV로 초기화한다
pvcreate /dev/vdb2
# PV 목록과 상세를 확인한다
pvs
pvdisplay /dev/vdb2VG 생성 #
PV를 묶어 VG를 만듭니다. VG 이름은 시험 문제에서 지정하는 경우가 많으므로, 문제가 요구한 이름 그대로 만들겠습니다.
# vgdata 라는 VG를 만들고 PV를 넣는다
vgcreate vgdata /dev/vdb2
# VG 목록과 상세를 확인한다(여유 용량 PE 개수 확인)
vgs
vgdisplay vgdatavgcreate 시 PE(Physical Extent) 크기를 -s 옵션으로 지정할 수 있습니다. 문제에서 “extent 크기 16MiB"처럼 요구하면 vgcreate -s 16M vgdata /dev/vdb2로 만듭니다.
LV 생성 #
VG에서 실제 볼륨인 LV를 잘라 냅니다. 크기는 -L로 절대 크기(예: 2G)를, -l로 extent 개수나 비율(예: 100%FREE)을 지정합니다.
# 크기 2GiB, 이름 lvweb 인 LV 생성
lvcreate -L 2G -n lvweb vgdata
# extent 개수로 지정(50개)
lvcreate -l 50 -n lvweb vgdata
# VG의 남은 전체 용량을 모두 사용
lvcreate -l 100%FREE -n lvweb vgdata
# LV 목록과 상세를 확인한다
lvs
lvdisplay /dev/vgdata/lvwebLV의 장치 경로는 /dev/vgdata/lvweb 또는 /dev/mapper/vgdata-lvweb입니다. 이후 명령에서는 이 경로를 디스크처럼 다룹니다.
lvextend 맛보기 #
LVM의 가장 큰 장점은 나중에 용량을 늘릴 수 있다는 점입니다.
# LV에 1GiB를 추가하고 파일 시스템까지 함께 키운다
lvextend -L +1G -r /dev/vgdata/lvweb-r 옵션은 LV 확장과 동시에 그 위의 파일 시스템까지 키워 줍니다. 확장과 축소, LUKS 암호화는 #6 로컬 storage 2에서 깊게 다루겠습니다. 여기서는 “LV는 나중에 늘릴 수 있다"는 점만 기억하고 넘어가겠습니다.
파일 시스템 생성과 영구 마운트 #
LV를 만들었어도 그 위에 파일 시스템이 없으면 쓸 수 없습니다. 포맷(mkfs) → 마운트 위치 생성 → fstab 등록 → 검증 순서로 마무리하겠습니다.
파일 시스템 생성 #
RHEL 9의 기본 파일 시스템은 XFS입니다. 시험에서 특별한 요구가 없으면 XFS를, ext4를 요구하면 ext4를 씁니다.
# XFS 파일 시스템 생성(RHEL 기본)
mkfs.xfs /dev/vgdata/lvweb
# ext4가 필요하면
mkfs.ext4 /dev/vgdata/lvweb마운트 위치 만들고 임시 마운트 #
# 마운트할 위치를 만든다
mkdir -p /mnt/web
# 임시로 마운트해 본다
mount /dev/vgdata/lvweb /mnt/web
# 마운트 상태와 용량을 확인한다
df -h /mnt/web여기까지도 임시입니다. 재부팅하면 풀리므로 fstab에 등록해야 합니다.
fstab에 UUID로 영구 등록 #
마운트도 장치 이름 대신 UUID로 적는 것이 안전합니다. 먼저 UUID를 확인합니다.
# LV의 UUID를 확인한다
blkid /dev/vgdata/lvweb/etc/fstab에 다음 한 줄을 추가합니다.
UUID=여기에-실제-UUID /mnt/web xfs defaults 0 0| 필드 | 마운트 항목 값 | 의미 |
|---|---|---|
| 장치 | UUID=... | 마운트할 장치(UUID로 지정) |
| 마운트 위치 | /mnt/web | 마운트할 디렉터리 |
| 타입 | xfs | 파일 시스템 타입 |
| 옵션 | defaults | 기본 마운트 옵션 |
| dump | 0 | dump 대상 아님 |
| fsck | 0 | XFS는 부팅 검사 안 함(0) |
LVM은 장치 경로(/dev/vgdata/lvweb)가 안정적이라 경로로 적어도 무방하지만, RHCSA 채점은 재부팅 후 마운트 유지만 보므로 UUID든 LV 경로든 정확하면 됩니다. 여기서는 UUID 습관을 유지하겠습니다.
반드시 검증한다 #
fstab을 고쳤으면 재부팅 전에 문법을 검증해야 합니다. fstab에 오류가 있으면 부팅이 emergency mode로 빠져 시험을 크게 망칩니다.
# 임시 마운트를 먼저 풀고
umount /mnt/web
# fstab에 적힌 항목을 모두 마운트한다(검증)
mount -a
# 정상 마운트되었는지 확인한다
df -h /mnt/web
lsblk -fmount -a가 오류 없이 끝나고 df에 /mnt/web이 보이면 fstab이 정상입니다. 시간이 허락하면 실제로 reboot 후 마운트가 유지되는지까지 확인하는 것이 가장 확실합니다.
전체 흐름 한 번에 #
빈 디스크에서 LVM 파일 시스템을 만들어 영구 마운트하는 RHCSA 최빈출 작업을 한 줄씩 모으면 다음과 같습니다.
# 1) 디스크 확인
lsblk
# 2) 파티션 생성(fdisk 안에서 n, t=8e, w)
fdisk /dev/vdb
partprobe /dev/vdb
# 3) LVM 구성
pvcreate /dev/vdb2
vgcreate vgdata /dev/vdb2
lvcreate -L 2G -n lvweb vgdata
# 4) 파일 시스템 생성
mkfs.xfs /dev/vgdata/lvweb
# 5) 마운트 위치 생성과 fstab 등록(UUID)
mkdir -p /mnt/web
blkid /dev/vgdata/lvweb # UUID 확인 후 fstab에 기입
# 6) 검증
mount -a
df -h /mnt/web이 6단계가 손에 붙으면 스토리지 영역의 절반은 끝난 것입니다.
시험 포인트 #
- 빈 디스크 이름을 먼저 확인한다.
lsblk로 작업 대상 디스크를 정확히 짚고, 엉뚱한 디스크(특히 루트 디스크)를 건드리지 않겠습니다. - fdisk는
w로 기록해야 반영된다.q로 나가면 변경이 버려집니다. 변경 후partprobe로 커널에 통지하겠습니다. - swap은 mkswap → swapon → fstab. fstab에
none swap defaults 0 0으로 등록해야 재부팅 후 유지됩니다. - LVM 순서는 pvcreate → vgcreate → lvcreate. VG,LV 이름은 문제가 요구한 이름 그대로 만들겠습니다.
- 크기 지정은
-L(절대),-l(extent,비율). “남은 전부"는-l 100%FREE입니다. - 만들면 끝이 아니라 mkfs와 fstab까지. 포맷,마운트,fstab 등록,
mount -a검증을 한 묶음으로 처리하겠습니다. - 장치 이름 대신 UUID.
blkid로 UUID를 얻어 fstab에 적으면 장치 순서가 바뀌어도 안전합니다. - fstab을 고쳤으면
mount -a로 반드시 검증. 오류가 있으면 다음 부팅이 emergency mode로 빠집니다.
정리 #
이번 글에서 잡은 것:
- 디스크 확인.
lsblk로 전체 그림을,fdisk -l로 파티션 테이블을 본다 - 파티션 생성.
fdisk(대화형) 또는parted(한 줄), 타입은 swap82,LVM8e, 변경 후partprobe - swap.
mkswap→swapon→ fstab(none swap defaults 0 0)로 영구화 - LVM.
pvcreate→vgcreate→lvcreate, 확장은lvextend -r(상세는 #6) - 파일 시스템과 마운트.
mkfs.xfs→mount→ fstab(UUID) →mount -a검증 - 합격을 가르는 함정. 만들기만 하고 fstab에 안 적으면 재부팅 후 설정이 사라진다
스토리지 작업은 RHEL 실무에서도 그대로 쓰입니다. 더 넓은 운영 맥락은 RHEL 중급 트랙에서 함께 보면 감각이 단단해집니다.
다음: 로컬 storage 2 #
이번 글에서 LVM을 만들어 마운트하는 기본기를 잡았습니다. 다음은 그 위에서 용량을 늘리고 데이터를 보호하는 작업입니다.
#6 로컬 storage 2: LVM 확장과 LUKS 암호화에서는 VG에 PV를 추가해 풀을 키우고, lvextend로 LV를 확장하며 XFS,ext4 파일 시스템을 함께 늘리는 법, 그리고 cryptsetup으로 LUKS 암호화 볼륨을 만들어 부팅 시 자동으로 열리도록 설정하는 과정까지 직접 쳐 보며 정리하겠습니다.