Red Hat Certified System Administrator (RHCSA) #6 로컬 storage 2: LVM 확장과 LUKS 암호화
#5 로컬 storage 1에서 파티션과 swap, 그리고 LVM의 기본 구조(PV,VG,LV)를 만들어 보았습니다. 이번 글은 그 위에서 이미 만든 LVM을 키우고 줄이는 작업, 그리고 블록 장치를 LUKS로 암호화해 영구 마운트하는 작업을 다루겠습니다. 두 작업 모두 RHCSA 실기에서 자주 출제되며, 특히 LV 확장은 거의 매 시험에 등장하는 단골입니다.
LVM의 가치는 운영 중에도 무중단으로 용량을 조정할 수 있다는 점에 있습니다. 디스크가 부족해지면 새 디스크를 PV로 추가하고 VG에 합친 뒤 LV를 늘리면 됩니다. 이때 LV만 키우면 끝이 아니라, 그 위에 올라간 파일 시스템까지 같이 늘려야 실제로 공간이 보인다는 점이 핵심입니다.
LVM 계층을 다시 떠올리기 #
확장 작업을 이해하려면 LVM의 세 계층이 어떻게 쌓이는지를 머릿속에 두어야 합니다. 아래에서 위로 갈수록 추상화가 한 단계씩 올라갑니다.
| 계층 | 약자 | 정체 |
|---|---|---|
| Physical Volume | PV | LVM이 사용하는 물리 블록 장치(디스크,파티션) |
| Volume Group | VG | 여러 PV를 묶어 만든 용량 풀 |
| Logical Volume | LV | VG에서 잘라낸 가상 파티션. 여기에 파일 시스템을 올림 |
용량을 늘리는 흐름은 항상 이 계층을 따릅니다. PV를 늘려 VG의 풀을 키우고, 그 풀에서 LV를 더 잘라내고, 마지막으로 LV 위 파일 시스템을 늘립니다. 어느 단계에서 막혔는지 확인하려면 다음 명령으로 각 계층의 현재 상태를 봅니다.
pvs # PV 요약: 디스크별 용량과 소속 VG
vgs # VG 요약: 전체 용량과 남은 여유 공간(VFree)
lvs # LV 요약: 논리 볼륨별 용량과 소속 VG더 자세한 정보는 display 계열로 봅니다.
pvdisplay /dev/vdb1 # PV 상세: PE 크기, 총,할당,여유 PE
vgdisplay vg_data # VG 상세: 총 PE, Free PE / Size
lvdisplay /dev/vg_data/lv_app # LV 상세: LV 경로, 크기, 세그먼트vgs의 VFree 열, vgdisplay의 Free PE / Size 행이 지금 LV를 얼마나 더 키울 수 있는가를 알려 주는 핵심 지표입니다. 이 값이 0이면 먼저 VG부터 키워야 합니다.
VG 확장: 새 디스크를 풀에 합치기 #
VG에 여유 공간이 없을 때는 새 블록 장치를 PV로 만들어 VG에 추가합니다. 시험에서는 보통 새 디스크(/dev/vdc 등) 또는 새로 만든 파티션이 주어집니다.
먼저 추가할 장치를 PV로 초기화합니다.
# 디스크 전체를 PV로 쓰는 경우
pvcreate /dev/vdc
# 또는 파티션 하나를 PV로 쓰는 경우(타입 코드는 LVM으로)
pvcreate /dev/vdc1파티션을 PV로 쓸 때는
fdisk또는parted로 파티션을 만든 뒤 타입을 LVM(8e또는lvm)으로 지정하고,partprobe로 커널에 파티션 테이블 변경을 알립니다. 파티션 생성 절차는 #5에서 다루었습니다.
이제 만든 PV를 기존 VG에 합칩니다.
vgextend vg_data /dev/vdc확장이 반영되었는지 vgs로 확인합니다. VSize가 커지고 VFree에 새 디스크 용량만큼의 여유가 생겼다면 성공입니다.
vgs vg_data
# VG #PV #LV #SN Attr VSize VFree
# vg_data 2 1 0 wz--n- <19.99g 10.00gLV 확장: 논리 볼륨과 파일 시스템 함께 늘리기 #
VG에 여유가 생겼으면 LV를 키웁니다. 여기서 RHCSA의 가장 흔한 실점이 나옵니다. LV만 늘리고 파일 시스템을 늘리지 않으면, lvs에는 용량이 늘어 보여도 df로 본 실제 사용 가능 공간은 그대로입니다.
방법 1: -r 옵션으로 한 번에 (권장) #
lvextend에 -r(--resizefs) 옵션을 주면 LV 확장과 파일 시스템 확장을 한 명령으로 처리합니다. XFS,ext4 모두 자동으로 알맞은 도구를 호출하므로 시험에서 가장 안전합니다.
# LV를 5GB만큼 추가로 늘리고 파일 시스템도 함께 확장
lvextend -r -L +5G /dev/vg_data/lv_app
# VG의 남은 공간을 전부 이 LV에 몰아주고 파일 시스템도 확장
lvextend -r -l +100%FREE /dev/vg_data/lv_app방법 2: LV 확장 후 파일 시스템 별도 확장 #
-r을 쓰지 않거나 단계를 나눠 이해하고 싶다면, LV를 먼저 늘린 뒤 파일 시스템을 따로 늘립니다. 이때 파일 시스템 종류에 따라 도구가 다릅니다.
# 1) LV 먼저 확장
lvextend -L +5G /dev/vg_data/lv_app
# 2-a) XFS 파일 시스템이면 xfs_growfs (마운트 지점을 인자로)
xfs_growfs /mnt/app
# 2-b) ext4 파일 시스템이면 resize2fs (LV 경로를 인자로)
resize2fs /dev/vg_data/lv_appXFS는 마운트된 상태에서만 xfs_growfs로 늘릴 수 있고 인자로 마운트 지점을 받습니다. ext4의 resize2fs는 LV 디바이스 경로를 인자로 받으며 마운트 여부와 무관하게 동작합니다. 어느 파일 시스템인지 헷갈리면 df -T /mnt/app 또는 lsblk -f로 타입을 먼저 확인하겠습니다.
-L과 -l의 차이 #
lvextend의 크기 지정 방식은 두 가지이며, 둘을 혼동하면 의도와 다른 크기가 됩니다.
| 옵션 | 단위 | 의미 |
|---|---|---|
-L 8G | 절대 크기(바이트 단위) | LV를 정확히 8GB로 만든다 |
-L +5G | 절대 크기 증분 | 현재 크기에서 5GB를 더한다 |
-l 200 | PE 개수 | LV를 200개 PE로 만든다 |
-l +50 | PE 개수 증분 | 현재에서 PE 50개를 더한다 |
-l +100%FREE | VG 여유의 비율 | VG에 남은 공간 전부를 더한다 |
대문자 -L은 사람이 읽는 용량(G,M)을, 소문자 -l은 PE 개수나 비율(%FREE,%VG)을 받습니다. “남은 공간을 전부” 요구가 나오면 -l +100%FREE가 정답이며, 이 경우 -L로는 정확히 맞추기 어렵습니다.
LV 축소: ext4만 가능, XFS는 불가 #
확장의 반대 작업인 축소는 파일 시스템 종류가 가능 여부를 가릅니다. 이 차이가 RHCSA 단골 함정입니다.
- ext4: 축소 가능. 단, 반드시 파일 시스템을 먼저 줄이고 그다음 LV를 줄여야 합니다(순서가 확장과 반대).
- XFS: 축소 불가. XFS는 설계상 줄일 수 없습니다. 작게 만들어야 한다면 백업 후 새로 만드는 방법밖에 없습니다.
ext4 축소는 순서가 핵심입니다. 데이터 손상을 막으려면 파일 시스템을 먼저 줄이고 LV를 그 크기에 맞춰 줄입니다.
# ext4 축소 절차 (XFS에는 적용 불가)
umount /mnt/app # 먼저 마운트 해제
e2fsck -f /dev/vg_data/lv_app # 파일 시스템 강제 점검
resize2fs /dev/vg_data/lv_app 6G # 파일 시스템을 6GB로 축소
lvreduce -L 6G /dev/vg_data/lv_app # LV를 6GB로 축소
mount /mnt/app # 다시 마운트
lvreduce에도-r옵션이 있어 파일 시스템 축소와 LV 축소를 한 번에 처리할 수 있습니다. 다만-r로 묶더라도 대상이 XFS이면 축소는 여전히 실패합니다. XFS는 도구가 자동으로 골라지든 수동이든 줄어들지 않는다는 점을 기억하겠습니다.
LUKS 암호화 볼륨 #
LUKS(Linux Unified Key Setup)는 블록 장치 자체를 암호화하는 표준 방식입니다. 암호화된 장치는 올바른 암호(또는 키)로 해제(open)해야 /dev/mapper/에 평문 매핑이 생기고, 그 매핑에 파일 시스템을 만들어 마운트합니다. RHCSA에서는 주어진 디스크나 LV를 LUKS로 암호화하고 부팅 시 암호를 입력해 마운트되도록 영구 설정하는 시나리오가 나옵니다.
도구는 cryptsetup이며, cryptsetup 패키지로 제공됩니다.
1) LUKS 포맷 #
대상 장치를 LUKS로 초기화합니다. 이 작업은 장치의 기존 데이터를 모두 지우므로 대상을 반드시 확인하겠습니다. 확인 절차로 대문자 YES를 직접 입력해야 합니다.
cryptsetup luksFormat /dev/vdb1
# WARNING! ... will overwrite data ... irrevocably.
# Are you sure? (Type 'yes' in capital letters): YES
# Enter passphrase: ...
# Verify passphrase: ...2) LUKS 해제(open) #
암호화 장치를 열어 평문 매핑을 만듭니다. 마지막 인자가 매핑 이름이며, /dev/mapper/<이름>으로 노출됩니다.
cryptsetup luksOpen /dev/vdb1 cryptdata
# Enter passphrase for /dev/vdb1: ...
ls -l /dev/mapper/cryptdata # 평문 매핑 확인3) 파일 시스템 생성과 마운트 #
이제 매핑 장치를 일반 블록 장치처럼 다룹니다. 파일 시스템을 만들고 마운트합니다.
mkfs.xfs /dev/mapper/cryptdata
mkdir /secure
mount /dev/mapper/cryptdata /secure작업이 끝나면 닫을 수도 있습니다. 닫으면 /dev/mapper/의 매핑이 사라지고 다시 열려면 암호가 필요합니다.
umount /secure
cryptsetup luksClose cryptdataLUKS 장치 정보 확인 #
암호화 장치의 상태와 헤더 정보는 다음으로 확인합니다.
cryptsetup luksDump /dev/vdb1 # LUKS 헤더: 버전, 키 슬롯
cryptsetup status cryptdata # 열린 매핑의 상태
blkid /dev/vdb1 # TYPE="crypto_LUKS"와 UUID 확인
lsblk -f # 장치 계층과 매핑 관계blkid로 나오는 LUKS 장치의 UUID는 다음 단계의 crypttab 영구 설정에 그대로 씁니다.
LUKS 영구 마운트: crypttab + fstab #
수동으로 luksOpen하고 mount한 설정은 재부팅하면 사라집니다. 부팅 시 자동으로 해제되고 마운트되도록 두 파일을 함께 설정해야 합니다. 이 영구 설정이 RHCSA 채점의 핵심입니다.
/etc/crypttab: 어떤 장치를 어떤 이름으로 열지 #
/etc/crypttab은 부팅 시 해제할 LUKS 장치를 정의합니다. 형식은 이름 백킹장치 키파일 옵션 순서입니다.
# /etc/crypttab
# 매핑이름 백킹 장치 키파일 옵션
cryptdata UUID=11112222-3333-4444-5555-666677778888 none세 번째 필드의 none은 키 파일이 없다는 뜻이며, 이 경우 부팅 중 암호를 직접 입력하게 됩니다. 백킹 장치는 /dev/vdb1 같은 경로보다 UUID=...로 적는 편이 디스크 순서가 바뀌어도 안전합니다. UUID는 앞 단계의 blkid /dev/vdb1 결과를 씁니다.
/etc/fstab: 매핑 장치를 어디에 마운트할지 #
fstab에는 암호화된 원본 장치가 아니라 crypttab이 만들어 줄 매핑 장치(/dev/mapper/cryptdata)를 적습니다.
# /etc/fstab
/dev/mapper/cryptdata /secure xfs defaults 0 0순서가 중요합니다. crypttab이 먼저 /dev/mapper/cryptdata를 만들고, 그다음 fstab이 그 매핑을 마운트합니다. fstab에 원본 /dev/vdb1을 적으면 암호화된 원시 데이터를 마운트하려다 실패합니다.
키 파일로 암호 입력 생략하기 #
부팅마다 암호를 입력하지 않으려면 키 파일을 등록합니다. 키 파일을 만들어 LUKS에 키 슬롯으로 추가하고 crypttab에 경로를 적습니다.
# 키 파일 생성(루트만 읽도록 권한 제한)
dd if=/dev/urandom of=/root/luks-key bs=512 count=4
chmod 600 /root/luks-key
# 키 파일을 이 LUKS 장치의 키 슬롯에 추가(기존 암호로 인증)
cryptsetup luksAddKey /dev/vdb1 /root/luks-key그다음 crypttab의 키 파일 필드를 none에서 키 파일 경로로 바꿉니다.
# /etc/crypttab (키 파일 사용)
cryptdata UUID=11112222-3333-4444-5555-666677778888 /root/luks-key설정 검증 #
영구 설정을 마쳤으면 재부팅 없이 검증합니다. 매핑을 닫은 뒤 systemd가 crypttab을 처리하게 만들고 fstab을 확인합니다.
umount /secure
cryptsetup luksClose cryptdata
# crypttab을 다시 적용(키 파일이 없으면 여기서 암호 입력)
systemctl daemon-reload
cryptdisks_start cryptdata 2>/dev/null || cryptsetup luksOpen /dev/vdb1 cryptdata
mount -a # fstab 문법,마운트 검증. 오류 없이 끝나야 함
df -h /secure # 마운트 확인가장 확실한 검증은 실제 재부팅입니다. 시험에서는 시간이 허락하면 재부팅 후 /secure가 자동으로 마운트되는지 직접 확인하겠습니다.
시험 포인트 #
이 영역에서 자주 틀리는 지점을 정리하겠습니다.
- XFS는 축소할 수 없습니다. 확장(
xfs_growfs)만 됩니다. “줄여라"가 나오면 그 LV는 ext4여야 하며, XFS라면 백업 후 재생성이 유일한 길입니다. - LV 확장 후 파일 시스템 확장을 빠뜨리면 0점입니다.
lvextend -r로 묶거나, 따로 한다면 XFS는xfs_growfs <마운트지점>, ext4는resize2fs <LV경로>를 잊지 않습니다. - ext4 축소는 순서가 반대입니다. 파일 시스템을 먼저(
resize2fs) 줄이고 LV를 그다음(lvreduce) 줄입니다. 순서를 바꾸면 데이터가 잘립니다. -L과-l을 구분합니다. “남은 공간 전부"는-l +100%FREE입니다.- LUKS는 fstab에 매핑 장치를 적습니다.
/dev/mapper/cryptdata이지/dev/vdb1이 아닙니다. crypttab과 fstab을 모두 설정해야 영구 마운트가 됩니다. - 모든 작업은 재부팅 후 유지되어야 점수가 됩니다.
mount -a로 fstab을 검증하는 습관을 들이겠습니다.
정리 #
이번 글에서 잡은 것:
- VG 확장:
pvcreate로 새 PV를 만들고vgextend로 VG에 합쳐 여유 공간을 확보합니다. - LV 확장:
lvextend -r로 LV와 파일 시스템을 한 번에 늘리거나,lvextend후 XFS는xfs_growfs, ext4는resize2fs로 따로 늘립니다. - LV 축소: ext4만 가능하며 파일 시스템을 먼저 줄입니다. XFS는 축소 불가입니다.
- LVM 정보:
pvs,vgs,lvs로 요약을,pvdisplay,vgdisplay,lvdisplay로 상세를 봅니다. - LUKS 암호화:
cryptsetup luksFormat,luksOpen으로 암호화,해제하고,/etc/crypttab과/etc/fstab을 함께 설정해 부팅 시 자동 해제,마운트되게 합니다.
다음: 파일 시스템 #
스토리지의 블록 계층을 확장과 암호화까지 다루었습니다. 이제 그 위에 올라가는 파일 시스템 자체로 시선을 옮깁니다.
#7 파일 시스템: XFS, ext4, mount/fstab, NFS, AutoFS에서는 XFS와 ext4의 차이, fstab으로 로컬 파일 시스템을 영구 마운트하는 법, 그리고 NFS 공유를 마운트하고 AutoFS로 필요할 때만 자동 마운트하는 설정까지 직접 쳐 보며 정리하겠습니다.