[KVM/libvirt] Oracle Linux VM 디스크 용량 확장하기 — qcow2 백업부터 LVM·XFS 확장까지

가상머신을 운영하다 보면 로그나 데이터가 쌓이면서 처음 할당한 디스크 공간이 부족해질 수 있습니다.
이때 호스트에서 qcow2 파일의 용량만 늘리면 작업이 끝날 것 같지만, VM 내부에서도 추가 작업이 필요합니다.
가상 디스크를 늘리는 것과 운영체제가 실제로 사용할 공간을 늘리는 것은 서로 다른 작업이기 때문입니다.
이 글에서는 Oracle Linux VM의 디스크를 100GiB에서 200GiB로 확장하는 예시를 기준으로, 작업 전 백업부터 확장, 문제 발생 시 복구하는 방법까지 정리합니다.
1. 전체 구조 이해하기
이번 작업은 크게 호스트 작업과 VM 내부 작업으로 나뉩니다.
Oracle Linux에서 LVM을 사용하는 경우 보통 다음과 같은 구조입니다.
호스트의 qcow2 파일
│
▼
VM의 가상 디스크 /dev/vda
│
▼
디스크 파티션 /dev/vda2
│
▼
LVM Physical Volume /dev/vda2
│
▼
LVM Volume Group ol
│
▼
LVM Logical Volume /dev/ol/root
│
▼
XFS 파일시스템 /
즉, 바깥쪽 디스크 공간을 늘린 뒤 내부에서도 순서대로 공간을 확장해야 합니다.
전체 작업 흐름은 다음과 같습니다.
현재 구성 확인
↓
VM 정상 종료
↓
VM 설정 및 qcow2 백업
↓
백업 검사
↓
qcow2 확장
↓
VM 시작
↓
파티션 확장
↓
PV 확장
↓
LV 확장
↓
XFS 확장
↓
최종 확인
2. 예시 환경
이 글에서는 다음 환경을 기준으로 설명합니다.
3. VM 내부에서 현재 디스크 구조 확인
먼저 Oracle Linux VM에 접속하여 현재 구성을 확인합니다.
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT
파일시스템 확인:
df -Th /
LVM 상태 확인:
pvs
vgs
lvs -o lv_path,lv_size,vg_name
예를 들어 다음과 같은 구조라고 가정합니다.
NAME SIZE TYPE FSTYPE MOUNTPOINT
vda 100G disk
├─vda1 1G part xfs /boot
└─vda2 99G part LVM2_member
├─ol-root 90G lvm xfs /
└─ol-swap 9G lvm swap [SWAP]
이 경우 확장 대상은 다음과 같습니다.
/dev/vda
↓
/dev/vda2
↓
/dev/ol/root
↓
/
4. 호스트에서 VM 디스크 확인
이제 Oracle Linux VM이 아니라 libvirt 호스트 서버에서 작업합니다.
VM 목록 확인:
virsh list --all
대상 VM의 디스크 경로 확인:
virsh domblklist oraclelinux --details
예:
Type Device Target Source
--------------------------------------------------------------
file disk vda /var/lib/libvirt/images/oraclelinux.qcow2
여기서 Source가 실제 qcow2 파일 경로입니다.
5. 작업 변수 설정
명령어를 편하게 사용하기 위해 변수를 지정합니다.
VM="oraclelinux"
DISK="/var/lib/libvirt/images/oraclelinux.qcow2"
STAMP="$(date +%Y%m%d_%H%M%S)"
BACKUP_DIR="/backup/libvirt/${VM}_${STAMP}"
mkdir -p -m 700 "$BACKUP_DIR"
생성된 백업 경로 확인:
echo "$BACKUP_DIR"
예:
/backup/libvirt/oraclelinux_20260907_153500
6. 백업 공간 확인
원본 디스크와 백업 위치의 여유 공간을 먼저 확인합니다.
df -h "$(dirname "$DISK")" "$BACKUP_DIR"
qcow2 파일 실제 사용량 확인:
du -h "$DISK"
qcow2는 sparse 파일이므로 ls -lh로 보이는 크기와 실제 디스크 사용량이 다를 수 있습니다.
예:
virtual size : 100G
실제 사용량 : 28G
/backup디렉터리가 원본 qcow2와 같은 물리 디스크에 존재한다면 해당 디스크 자체가 고장났을 경우 원본과 백업을 동시에 잃을 수 있습니다.
중요한 운영 서버라면 별도의 디스크나 NAS 등에 추가 백업하는 것을 권장합니다.
7. VM 정상 종료
VM을 종료합니다.
virsh shutdown "$VM"
상태 확인:
virsh domstate "$VM"
다음과 같이 나와야 합니다.
shut off
또는:
virsh list --all
Id Name State
-----------------------------
- oraclelinux shut off
virsh shutdown명령을 실행했다고 해서 즉시 종료된 것은 아닙니다.반드시
shut off상태를 확인한 후 다음 작업을 진행합니다.
VM이 종료되지 않을 경우 최후의 수단으로:
virsh destroy "$VM"
를 사용할 수 있지만, 이는 강제 전원 종료이므로 가급적 사용하지 않는 것이 좋습니다.
8. qcow2 정보 확인
VM이 완전히 종료된 상태에서 확인합니다.
qemu-img info --backing-chain "$DISK"
예:
image: /var/lib/libvirt/images/oraclelinux.qcow2
file format: qcow2
virtual size: 100 GiB
disk size: 28 GiB
여기서 중요한 값은 다음과 같습니다.
-
virtual size: VM에서 보이는 가상 디스크 크기 -
disk size: 호스트에서 qcow2가 실제 사용하는 공간
만약 backing file이 존재한다면 현재 qcow2 파일만 복사해서는 완전한 백업이 되지 않을 수 있으므로 주의해야 합니다.
9. VM 설정 XML 백업
VM 설정도 같이 백업합니다.
virsh dumpxml --inactive "$VM" > "$BACKUP_DIR/domain.xml"
백업 확인:
ls -lh "$BACKUP_DIR"
10. qcow2 데이터 백업
VM이 종료된 상태에서 qcow2 파일을 복사합니다.
cp -a --sparse=always --reflink=never \
"$DISK" \
"$BACKUP_DIR/disk.qcow2"
옵션 의미:
백업 파일 확인:
ls -lh "$BACKUP_DIR"
실제 사용량:
du -sh "$BACKUP_DIR/disk.qcow2"
11. qcow2 백업 검사
백업 qcow2 구조 검사:
qemu-img check -f qcow2 "$BACKUP_DIR/disk.qcow2"
정상이면 다음과 비슷하게 표시됩니다.
No errors were found on the image.
원본과 백업의 디스크 내용 비교:
qemu-img compare -p -f qcow2 -F qcow2 \
"$DISK" \
"$BACKUP_DIR/disk.qcow2"
정상이면:
Images are identical.
라고 표시됩니다.
qemu-img check는 qcow2 이미지 구조를 검사하는 것이며, Oracle DB나 애플리케이션의 논리적인 데이터 정상 여부까지 보장하는 것은 아닙니다.
12. qcow2 용량 확장
이제 실제 가상 디스크를 확장합니다.
VM이 여전히 꺼져 있는지 다시 확인합니다.
virsh domstate "$VM"
shut off 상태라면 진행합니다.
100GiB에서 200GiB로 변경:
qemu-img resize -f qcow2 "$DISK" 200G
여기서 200G는 최종 용량입니다.
기존 용량에서 100GiB를 추가하려면 다음처럼 사용할 수도 있습니다.
qemu-img resize -f qcow2 "$DISK" +100G
확인:
qemu-img info "$DISK"
예:
virtual size: 200 GiB
이미지 검사:
qemu-img check -f qcow2 "$DISK"
13. VM 시작
호스트에서 VM을 다시 시작합니다.
virsh start "$VM"
상태 확인:
virsh list
14. Oracle Linux에서 디스크 증가 확인
이제 Oracle Linux VM 내부로 다시 접속합니다.
lsblk
예:
NAME SIZE TYPE MOUNTPOINT
vda 200G disk
├─vda1 1G part /boot
└─vda2 99G part
├─ol-root 90G lvm /
└─ol-swap 9G lvm [SWAP]
여기서 중요한 부분은:
vda = 200G
vda2 = 99G
입니다.
즉, qcow2와 가상 디스크는 증가했지만 파티션은 아직 기존 크기입니다.
15. growpart 설치
Oracle Linux 8/9 기준:
dnf install -y cloud-utils-growpart lvm2 xfsprogs
Oracle Linux 7이라면:
yum install -y cloud-utils-growpart lvm2 xfsprogs
설치 확인:
which growpart
16. 파티션 확장
이 예시에서는 LVM 파티션이 /dev/vda2입니다.
먼저 dry-run으로 확인합니다.
growpart -N /dev/vda 2
문제가 없다면 실제 확장합니다.
growpart /dev/vda 2
여기서 의미는:
/dev/vda = 대상 디스크
2 = 두 번째 파티션
입니다.
따라서 다음과 같이 사용하면 안 됩니다.
growpart /dev/vda2
올바른 명령은:
growpart /dev/vda 2
입니다.
확인:
lsblk
예:
vda 200G
├─vda1 1G
└─vda2 199G
17. LVM PV 확장
파티션이 커졌으므로 LVM의 Physical Volume도 확장해야 합니다.
pvresize /dev/vda2
확인:
pvs
vgs
예:
VG #PV #LV #SN Attr VSize VFree
ol 1 2 0 wz--n- <199.00g 100.00g
여기서 VFree가 증가했다면 정상입니다.
기존 PV에는
pvcreate가 아니라pvresize를 사용해야 합니다.
18. Logical Volume 확장
현재 LV 경로 확인:
lvs -o lv_path,lv_size,vg_name
예:
LV Path LV Size
/dev/ol/root 90.00g
/dev/ol/swap 9.00g
VG의 남은 공간을 전부 /에 할당:
lvextend -l +100%FREE /dev/ol/root
확인:
lvs
+100%FREE는 VG에 남아 있는 공간을 전부 해당 LV에 할당한다는 의미입니다.다른 LV에도 공간을 사용할 계획이라면 필요한 크기만 지정해야 합니다.
예를 들어 50GiB만 추가하려면:
lvextend -L +50G /dev/ol/root
19. XFS 파일시스템 확장
Logical Volume을 늘렸다고 실제 파일시스템 크기가 자동으로 늘어나는 것은 아닙니다.
먼저 파일시스템 확인:
df -Th /
예:
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/ol-root xfs 90G 25G 65G 28% /
Type이 xfs이면 다음을 실행합니다.
xfs_growfs /
명령어는
xfs_growfs입니다.아래처럼 입력하면 오타입니다.
xfs_growfx /이 경우:
bash: xfs_growfx: 명령을 찾을 수 없습니다와 같은 메시지가 나옵니다.
만약 xfs_growfs 명령 자체가 없다면:
dnf install -y xfsprogs
설치 후 다시 실행합니다.
xfs_growfs /
20. 최종 확인
마지막으로 전체 구조를 확인합니다.
lsblk
파일시스템 확인:
df -Th /
LVM 확인:
pvs
vgs
lvs
예:
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/ol-root xfs 190G 25G 165G 14% /
이렇게 / 용량이 증가했다면 작업이 완료된 것입니다.
21. 간단한 명령어 요약
호스트
VM="oraclelinux"
DISK="/var/lib/libvirt/images/oraclelinux.qcow2"
STAMP="$(date +%Y%m%d_%H%M%S)"
BACKUP_DIR="/backup/libvirt/${VM}_${STAMP}"
mkdir -p -m 700 "$BACKUP_DIR"
virsh shutdown "$VM"
virsh domstate "$VM"
virsh dumpxml --inactive "$VM" > "$BACKUP_DIR/domain.xml"
cp -a --sparse=always --reflink=never \
"$DISK" \
"$BACKUP_DIR/disk.qcow2"
qemu-img check -f qcow2 "$BACKUP_DIR/disk.qcow2"
qemu-img compare -p -f qcow2 -F qcow2 \
"$DISK" \
"$BACKUP_DIR/disk.qcow2"
qemu-img resize -f qcow2 "$DISK" 200G
qemu-img info "$DISK"
virsh start "$VM"
Oracle Linux VM 내부
dnf install -y cloud-utils-growpart lvm2 xfsprogs
lsblk
growpart -N /dev/vda 2
growpart /dev/vda 2
pvresize /dev/vda2
vgs
lvextend -l +100%FREE /dev/ol/root
xfs_growfs /
df -Th /
22. LV와 XFS를 한 번에 확장하는 방법
lvextend의 -r 옵션을 이용하면 LV와 파일시스템을 함께 확장할 수도 있습니다.
lvextend -r -l +100%FREE /dev/ol/root
따라서 다음처럼 사용할 수 있습니다.
growpart /dev/vda 2
pvresize /dev/vda2
lvextend -r -l +100%FREE /dev/ol/root
마지막 확인:
df -h /
다만 처음 작업하는 경우에는:
파티션
→ PV
→ LV
→ XFS
각 단계가 어떻게 동작하는지 이해하기 위해 개별 명령으로 실행하는 편이 이해하기 쉽습니다.
23. 백업으로 복구하는 방법
용량 확장 과정에서 문제가 생겼다면 작업 전 백업한 qcow2 파일로 복구할 수 있습니다.
백업을 복원하면 VM 디스크 데이터가 백업 당시 시점으로 돌아갑니다.
호스트에서 작업합니다.
변수 설정:
VM="oraclelinux"
DISK="/var/lib/libvirt/images/oraclelinux.qcow2"
BACKUP_DIR="/backup/libvirt/oraclelinux_20260907_153500"
백업 확인:
ls -lh "$BACKUP_DIR/domain.xml" "$BACKUP_DIR/disk.qcow2"
VM 종료:
virsh shutdown "$VM"
상태 확인:
virsh domstate "$VM"
반드시:
shut off
상태인지 확인합니다.
백업 검사:
qemu-img check -f qcow2 "$BACKUP_DIR/disk.qcow2"
현재 디스크를 삭제하지 않고 별도 이름으로 보존합니다.
FAILED_DISK="${DISK}.before_restore_$(date +%Y%m%d_%H%M%S)"
mv "$DISK" "$FAILED_DISK"
백업 복원:
cp -a --sparse=always --reflink=never \
"$BACKUP_DIR/disk.qcow2" \
"$DISK"
기존 파일 기준 소유권과 권한 복구:
chown --reference="$FAILED_DISK" "$DISK"
chmod --reference="$FAILED_DISK" "$DISK"
SELinux를 사용하는 호스트라면:
restorecon -v "$DISK"
확인:
ls -lZ "$DISK"
이미지 검사:
qemu-img check -f qcow2 "$DISK"
VM 시작:
virsh start "$VM"