소개
가상 머신 관리는 도메인을 생성하고 시작하는 것만으로 끝나지 않습니다. 운영 환경에서는 기존 VM 을 인계받아 영구 리소스 정의를 변경해야 하는 경우가 많습니다. 메모리를 늘리고, 추가 가상 CPU 를 할당하며, 스토리지를 연결하고, 자동 시작을 활성화한 뒤, 실행 중인 상태가 요청한 구성과 일치하는지 확인해야 합니다.
libvirt 에서 가상 머신은 도메인이라고 부릅니다. 영구 도메인에는 QEMU 프로세스가 실행되고 있지 않은 경우에도 하드웨어 설계도에 해당하는 저장된 정의가 존재합니다. 도메인을 시작하면 이 정의를 바탕으로 실행 중인 인스턴스가 생성되고, 도메인을 중지하면 실행 중인 인스턴스만 제거되며 설계도는 유지됩니다. 영구 구성과 실행 상태를 분리해서 이해하는 것이 이 실습의 핵심입니다.
이 실습에서는 lfcs-config라는 이름의 종료된 libvirt 도메인이 이미 정의되어 있습니다. 이 도메인에는 작은 부팅 디스크, 64 MiB 메모리, vCPU 1 개가 설정되어 있습니다. 먼저 현재 구성을 확인한 다음 virsh 리소스 관리 명령으로 재구성합니다. 이 환경에서는 /dev/kvm을 사용할 수 없으므로 QEMU 가 소프트웨어 에뮬레이션을 사용하며, 디스크에는 게스트 운영 체제가 들어 있지 않습니다. 그러나 관리 절차와 영구 libvirt 구성은 실제 환경과 동일하게 동작합니다.
기존 도메인 구성 확인
이 단계에서는 변경을 적용하기 전에 기존 lfcs-config 도메인의 영구 구성과 실행 상태를 확인합니다.
프로젝트 디렉터리로 이동합니다.
cd /home/labex/project
모든 도메인을 나열합니다. --all 옵션을 사용하면 중지된 도메인도 포함되므로 lfcs-config가 shut off 상태로 표시되어야 합니다.
sudo virsh list --all
--all을 지정하지 않으면 virsh list는 일반적으로 활성 도메인만 표시합니다. 확장된 목록에 중지된 도메인 이름이 표시된다는 것은 VM 이 실행 중인 게스트로서 CPU 시간을 사용하고 있지 않더라도 libvirt 가 해당 영구 정의를 계속 보유하고 있음을 의미합니다.
도메인 요약 정보를 확인합니다.
sudo virsh dominfo lfcs-config
dominfo는 식별 정보, 수명 주기, CPU, 메모리, 영구 설정 및 자동 시작 정보를 한 번에 보여 줍니다. 이 단계에서는 출력 결과를 목표값이 아닌 기준값으로 확인하세요. 이후 출력에서는 의도적으로 변경한 항목만 달라져야 합니다.
다음과 같은 안정적인 구성 항목에 주목하세요.
Name: lfcs-config
State: shut off
CPU(s): 1
Max memory: 65536 KiB
Used memory: 65536 KiB
Persistent: yes
Autostart: disable
여기서 libvirt 는 메모리를 KiB 단위로 표시합니다. 1 MiB 는 1024 KiB 이므로 65536 KiB는 64 MiB 입니다. Persistent: yes는 도메인 정의가 종료 후에도 유지된다는 뜻이며, Autostart: disable은 가상화 서비스가 시작될 때 libvirt 가 이 도메인을 자동으로 시작하지 않는다는 뜻입니다.
연결된 블록 장치를 나열합니다. vda는 준비된 루트 디스크이며, 해당 소스는 기존 qcow2 이미지입니다.
sudo virsh domblklist lfcs-config --details
이 표에서 Target은 게스트에 표시되는 장치 이름이고, Source는 데이터를 저장하는 호스트 경로입니다. vda라는 이름의 virtio 디스크는 VM 에 연결된 가상 드라이브에 해당하며, qcow2 소스 파일은 호스트에 저장된 해당 드라이브의 백업 이미지입니다.
이 기준 구성을 통해 이미 존재하는 항목과 이후 단계에서 변경할 리소스를 구분할 수 있습니다.
영구 메모리와 vCPU 구성
이 단계에서는 도메인이 종료된 상태에서 영구 최대 메모리, 현재 메모리 할당량 및 vCPU 수를 늘립니다.
libvirt 에서는 최대 메모리 한도와 다음 부팅 시 할당할 메모리를 구분합니다. 먼저 영구 최대 메모리를 128 MiB 로 설정합니다. --config 옵션은 임시 실행 값이 아니라 저장된 도메인 정의를 변경합니다.
sudo virsh setmaxmem lfcs-config 128M --config
최대 메모리 한도는 할당된 메모리보다 크거나 같아야 합니다. max memory는 가상 머신이 사용할 수 있는 메모리 용량이고, current memory는 정상적인 사용을 위해 요청되는 메모리 양이라고 생각하면 됩니다. 도메인이 종료된 상태이므로 --config로 변경하면 예측 가능하게 적용되며, 다음에 도메인을 시작할 때 반영됩니다.
다음 시작 시 할당할 메모리를 96 MiB 로 설정합니다.
sudo virsh setmem lfcs-config 96M --config
M 접미사는 virsh가 값을 메비바이트 단위로 해석하도록 합니다. 이후 dominfo 출력에서는 128 MiB 가 131072 KiB, 96 MiB 가 98304 KiB로 표시됩니다. 단위만 다를 뿐 동일한 값입니다.
현재 영구 할당량을 2 개의 CPU 로 설정하려면 먼저 vCPU 최대 개수를 늘려야 합니다.
sudo virsh setvcpus lfcs-config 2 --config --maximum
이 첫 번째 CPU 명령은 저장된 정의의 상한을 변경합니다. 이 명령만으로 실제 사용 가능한 vCPU 2 개가 할당되는 것은 아닙니다. 최대치와 현재 할당량을 분리하면 VM 정의에 향후 확장을 위한 여유 용량을 예약할 수 있습니다.
다음 부팅에 vCPU 2 개를 할당합니다.
sudo virsh setvcpus lfcs-config 2 --config
두 번째 명령은 새로 설정한 상한 내에서 영구 할당량을 지정합니다. 최대치가 여전히 1 인 상태에서 vCPU 2 개를 요청하면 실패하므로 명령 순서가 중요합니다.
업데이트된 영구 정의를 확인합니다.
sudo virsh dominfo lfcs-config
관련 항목은 다음과 같이 표시되어야 합니다.
CPU(s): 2
Max memory: 131072 KiB
Used memory: 98304 KiB
영구 데이터 디스크 생성 및 연결
이 단계에서는 두 번째 qcow2 이미지를 생성하고 vdb라는 영구 virtio 디스크로 연결합니다.
libvirt 이미지 디렉터리에 64 MiB 크기의 희소 qcow2 이미지를 생성합니다.
sudo qemu-img create -f qcow2 /var/lib/libvirt/images/lfcs-config-data.qcow2 64M
이 명령은 파일 시스템이나 마운트된 디렉터리가 아니라 가상 디스크 컨테이너를 생성합니다. -f qcow2는 QEMU 의 기록 중 복사 방식 이미지 형식을 선택하고, 64M은 가상 용량을 설정합니다. 새로 생성된 희소 이미지는 처음에는 가상 크기보다 훨씬 적은 호스트 저장 공간만 사용하며, 게스트에서 데이터가 기록될수록 커집니다.
이 실습 환경에서 QEMU 프로세스가 임시 이미지 파일을 열 수 있도록 권한을 부여합니다.
sudo chmod 666 /var/lib/libvirt/images/lfcs-config-data.qcow2
권한 모드 666은 모든 사용자 유형에 읽기 및 쓰기 권한을 부여합니다. 이렇게 폭넓은 권한을 설정하면 호스트별 QEMU 사용자 및 그룹 설정과 무관하게 이 임시 실습을 진행할 수 있지만, 운영 환경에서는 권장되지 않습니다. 실제 호스트에서는 로컬 libvirt 서비스에 필요한 소유자, 그룹, SELinux 레이블 또는 AppArmor 정책을 적용하는 것이 좋습니다.
파일을 lfcs-config에 연결합니다. --target vdb는 게스트 블록 장치 이름을 지정하고, --subdriver qcow2는 이미지 형식을 기록하며, --config는 다음 시작 시 적용될 영구 정의를 변경합니다.
sudo virsh attach-disk lfcs-config \
/var/lib/libvirt/images/lfcs-config-data.qcow2 \
vdb --targetbus virtio --subdriver qcow2 --config
소스 경로는 호스트에 속하고, vdb는 게스트에서 보게 될 이름입니다. --targetbus virtio는 효율적인 Linux 게스트에서 일반적으로 사용하는 반가상화 디스크 인터페이스를 선택합니다. 도메인이 종료된 상태이고 --config를 사용했으므로 libvirt 는 실시간으로 장치를 연결하려 하지 않고 저장된 설계도에 장치 정보를 기록합니다.
영구 블록 장치 구성을 나열합니다.
sudo virsh domblklist lfcs-config --details
이제 출력에 vda와 vdb가 모두 포함되어야 하며, vdb는 lfcs-config-data.qcow2를 가리켜야 합니다.
이 시점에서 이미지 파일의 존재와 도메인에 연결된 상태는 서로 별개의 사실입니다. qcow2 파일만 생성한다고 VM 에 자동으로 연결되는 것은 아니며, 나중에 디스크 연결을 해제해도 소스 파일이 자동으로 삭제되지는 않습니다.
자동 시작 활성화 및 실행 상태 검증
이 단계에서는 도메인 자동 시작을 활성화하고, 지금 VM 을 시작한 다음, 실행 중인 리소스와 영구 설정을 비교합니다.
가상화 서비스가 시작될 때 libvirt 가 이 도메인을 자동으로 시작하도록 자동 시작을 활성화합니다.
sudo virsh autostart lfcs-config
자동 시작은 저장되는 정책 플래그일 뿐이며, 도메인을 즉시 시작하라는 요청은 아닙니다. 호스트나 libvirt 서비스가 재시작된 후 자동으로 복구되어야 하는 인프라 서비스에 유용합니다.
업데이트된 영구 정의를 사용하여 도메인을 시작합니다.
sudo virsh start lfcs-config
도메인을 시작하면 수정한 저장된 정의를 바탕으로 QEMU 프로세스가 생성됩니다. 여기에는 vCPU 2 개, 새 메모리 제한 및 두 개의 디스크가 포함됩니다. 명령은 도메인이 시작되었다고 보고하며, dominfo와 domblklist를 통해 실제 상태가 의도한 구성과 일치하는지 확인할 수 있습니다.
QEMU 가 실행 상태로 진입할 수 있도록 몇 초간 기다립니다.
sleep 3
도메인 정보를 확인합니다. vCPU 2 개, 최대 메모리 128 MiB, 자동 시작 활성화 상태로 실행 중이어야 합니다.
sudo virsh dominfo lfcs-config
이 소프트웨어 에뮬레이션 도메인에서는 영구 설정의 currentMemory 요청이 96 MiB 이더라도 실행 중인 Used memory 필드는 일반적으로 128 MiB 로 표시됩니다. 게스트 운영 체제나 libvirt 와 협력하여 실행 중인 메모리 할당량을 줄이는 balloon 드라이버가 없기 때문입니다. 비활성 XML 을 확인하여 다음 시작 시 사용할 구성이 여전히 96 MiB 를 기록하고 있는지 검증합니다.
sudo virsh dumpxml lfcs-config --inactive | grep -E '<memory|<currentMemory|<vcpu'
dumpxml --inactive는 실행 중인 QEMU 의 상태가 아니라 저장된 정의를 요청합니다. 파이프를 통해 XML 을 grep에 전달하면 메모리 및 CPU 요소만 표시됩니다. 이렇게 필요한 부분만 비교하면 예상되는 실행 중 상태 차이를 구성 실패로 오해하는 일을 방지할 수 있습니다.
안정적으로 유지되어야 하는 값에는 <memory unit='KiB'>131072</memory>, <currentMemory unit='KiB'>98304</currentMemory>, 그리고 vCPU 값 2가 포함됩니다. 이 비교를 통해 영구 구성과 실행 중 리소스 보고를 별도로 확인해야 하는 이유를 알 수 있습니다.
활성 도메인의 디스크를 나열합니다.
sudo virsh domblklist lfcs-config --details
vda와 vdb가 모두 표시되어야 합니다. 이는 QEMU 가 시작될 때 저장된 구성이 적용되었음을 보여 줍니다.
VM 중지 및 영구 상태 확인
이 단계에서는 구성된 도메인, 스토리지 및 자동 시작 설정을 유지한 채 게스트 프로세스를 중지합니다.
실습용 디스크에는 운영 체제가 들어 있지 않으므로 정상적인 게스트 종료는 완료되지 않습니다. destroy를 사용하여 QEMU 프로세스를 즉시 중지합니다. 이 작업은 실행 상태만 변경하며 영구 도메인 정의를 삭제하지 않습니다.
sudo virsh destroy lfcs-config
이름과 달리 virsh destroy는 VM 삭제보다는 전원을 강제로 차단하는 동작에 가깝습니다. 이 실습에는 게스트 운영 체제나 중요한 데이터가 없으므로 여기에서만 사용합니다. 실제 실행 중인 게스트에서는 virsh shutdown을 사용하여 운영 체제가 데이터를 디스크에 기록하고 정상적으로 종료할 수 있도록 해야 합니다.
도메인이 중지되었는지 확인합니다.
sudo virsh domstate lfcs-config
출력은 다음과 같아야 합니다.
shut off
마지막으로 영구 구성을 확인합니다.
sudo virsh dominfo lfcs-config
예상되는 shut off 상태는 실행 상태만 나타냅니다. CPU, 메모리, 디스크 연결 및 자동 시작 설정은 영구 정의에 그대로 남아 있습니다. 해당 정의를 제거하려면 virsh undefine과 같은 별도의 작업이 필요합니다. 또한 도메인을 정의 해제하더라도 디스크 이미지 파일이 반드시 삭제되는 것은 아닙니다.
모든 도메인과 자동 시작 상태를 나열합니다. 중지된 lfcs-config 도메인이 계속 정의되어 있고 자동 시작 대상으로 표시되어야 합니다.
sudo virsh list --all --autostart
이제 VM 은 중지되어 있지만, 구성한 리소스 설정으로 나중에 다시 시작할 수 있는 상태입니다.
요약
기존 libvirt 도메인을 인계받아 XML 을 다시 작성하지 않고 영구 리소스 구성을 변경했습니다. 최대 메모리와 할당 메모리를 늘리고, vCPU 2 개를 구성했으며, 두 번째 qcow2 디스크를 생성하고 연결했습니다. 또한 자동 시작을 활성화하고 실행 중인 QEMU 도메인에서 구성을 검증한 뒤, 관리 중인 VM 을 유지한 채 프로세스를 중지했습니다. 이는 단순히 VM 수명 주기를 살펴보는 것과, VM 을 요청된 목표 상태에 맞게 구성하는 것의 실질적인 차이입니다.



