Red Hat Certified System Administrator (RHCSA) #6 로컬 storage 2: LVM 확장과 LUKS 암호화

10 분 소요

#5 로컬 storage 1에서 파티션과 swap, 그리고 LVM의 기본 구조(PV,VG,LV)를 만들어 보았습니다. 이번 글은 그 위에서 이미 만든 LVM을 키우고 줄이는 작업, 그리고 블록 장치를 LUKS로 암호화해 영구 마운트하는 작업을 다루겠습니다. 두 작업 모두 RHCSA 실기에서 자주 출제되며, 특히 LV 확장은 거의 매 시험에 등장하는 단골입니다.

LVM의 가치는 운영 중에도 무중단으로 용량을 조정할 수 있다는 점에 있습니다. 디스크가 부족해지면 새 디스크를 PV로 추가하고 VG에 합친 뒤 LV를 늘리면 됩니다. 이때 LV만 키우면 끝이 아니라, 그 위에 올라간 파일 시스템까지 같이 늘려야 실제로 공간이 보인다는 점이 핵심입니다.

LVM 계층을 다시 떠올리기 #

확장 작업을 이해하려면 LVM의 세 계층이 어떻게 쌓이는지를 머릿속에 두어야 합니다. 아래에서 위로 갈수록 추상화가 한 단계씩 올라갑니다.

계층약자정체
Physical VolumePVLVM이 사용하는 물리 블록 장치(디스크,파티션)
Volume GroupVG여러 PV를 묶어 만든 용량 풀
Logical VolumeLVVG에서 잘라낸 가상 파티션. 여기에 파일 시스템을 올림

용량을 늘리는 흐름은 항상 이 계층을 따릅니다. 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 경로, 크기, 세그먼트

vgsVFree 열, vgdisplayFree 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.00g

LV 확장: 논리 볼륨과 파일 시스템 함께 늘리기 #

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_app

XFS는 마운트된 상태에서만 xfs_growfs로 늘릴 수 있고 인자로 마운트 지점을 받습니다. ext4의 resize2fs는 LV 디바이스 경로를 인자로 받으며 마운트 여부와 무관하게 동작합니다. 어느 파일 시스템인지 헷갈리면 df -T /mnt/app 또는 lsblk -f로 타입을 먼저 확인하겠습니다.

-L과 -l의 차이 #

lvextend의 크기 지정 방식은 두 가지이며, 둘을 혼동하면 의도와 다른 크기가 됩니다.

옵션단위의미
-L 8G절대 크기(바이트 단위)LV를 정확히 8GB로 만든다
-L +5G절대 크기 증분현재 크기에서 5GB를 더한다
-l 200PE 개수LV를 200개 PE로 만든다
-l +50PE 개수 증분현재에서 PE 50개를 더한다
-l +100%FREEVG 여유의 비율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 cryptdata

LUKS 장치 정보 확인 #

암호화 장치의 상태와 헤더 정보는 다음으로 확인합니다.

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로 필요할 때만 자동 마운트하는 설정까지 직접 쳐 보며 정리하겠습니다.

X