Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

가상화 배포 및 관리 가이드

Red Hat Enterprise Linux 7

RHEL 물리적 머신에서 가상 머신 설치, 구성 및 관리

초록

이 가이드에서는 가상화 호스트 시스템으로 작동하도록 Red Hat Enterprise Linux 7 시스템을 구성하는 방법과 KVM 하이퍼바이저를 사용하여 게스트 가상 머신을 설치 및 구성하는 방법에 대해 설명합니다. 다른 주제에는 PCI 장치 구성, SR-IOV, 네트워킹, 스토리지, 장치 및 게스트 가상 머신 관리, 문제 해결, 호환성 및 제한 사항이 있습니다. 게스트 가상 머신에서 실행해야 하는 절차는 명시적으로 표시됩니다.
중요
이 가이드에 설명된 모든 절차는 달리 명시되지 않는 한 AMD64 또는 Intel 64 호스트 시스템에서 수행됩니다. AMD64 및 Intel 64 이외의 아키텍처에서 Red Hat Enterprise Linux 7 가상화를 사용하려면 부록 B. 여러 아키텍처에서 KVM 가상화 사용 에서 참조하십시오.
Red Hat에서 제공하는 가상화 솔루션에 대한 보다 일반적인 내용은 Red Hat Enterprise Linux 7 Virtualization 시작하기 가이드 를 참조하십시오.

I 부. Deployment

이 부분에서는 가상화 호스트 시스템의 역할을 하도록 Red Hat Enterprise Linux 7 시스템을 설치 및 구성하는 방법과 KVM 하이퍼바이저를 사용하여 게스트 가상 머신을 설치 및 구성하는 방법에 대한 지침을 제공합니다.

1장. 시스템 요구 사항

가상화는 Intel 64 및 AMD64 아키텍처의 Red Hat Enterprise Linux 7용 KVM 하이퍼바이저에서 사용할 수 있습니다. 이 장에서는 VM이라고도 하는 가상 시스템 실행에 대한 시스템 요구 사항을 나열합니다.
가상화 패키지 설치에 대한 자세한 내용은 2장. 가상화 패키지 설치 을 참조하십시오.

1.1. 호스트 시스템 요구 사항

최소 호스트 시스템 요구 사항

  • 6GB의 디스크 여유 공간
  • 2GB RAM.
게스트 가상 머신 요구 사항은 7장. KVM을 사용하여 오버 커밋 에서 더 자세히 설명되어 있습니다.

1.2. KVM Hypervisor 요구 사항

KVM 하이퍼바이저에는 다음이 필요합니다.
  • x86 기반 시스템용 Intel VT-x 및 Intel 64 가상화 확장 기능이 있는 Intel 프로세서
  • AMD-V 및 AMD64 가상화 확장 기능이 있는 AMD 프로세서.
완전한 가상화에는 가상화 확장(Intel VT-x 또는 AMD-V)이 필요합니다. 다음 명령을 입력하여 시스템에 하드웨어 가상화 확장 기능이 있는지, 활성화되어 있는지 확인합니다.

절차 1.1. 가상화 확장 확인

  1. CPU 가상화 확장 기능을 사용할 수 있는지 확인

    다음 명령을 입력하여 CPU 가상화 확장 기능을 사용할 수 있는지 확인합니다.
    $ grep -E 'svm|vmx' /proc/cpuinfo
  2. 출력 분석

    • 다음 예제 출력에는 Intel VT-x 확장이 포함된 Intel 프로세서를 나타내는 vmx 항목이 포함되어 있습니다.
      flags   : fpu tsc msr pae mce cx8 vmx apic mtrr mca cmov pat pse36 clflush
      dts acpi mmx fxsr sse sse2 ss ht tm syscall lm constant_tsc pni monitor ds_cpl
      vmx est tm2 cx16 xtpr lahf_lm
      
    • 다음 예제 출력에는 AMD-V 확장이 있는 AMD 프로세서를 나타내는 svm 항목이 포함되어 있습니다.
      flags   :  fpu tsc msr pae mce cx8 apic mtrr mca cmov pat pse36 clflush
      mmx fxsr sse sse2 ht syscall nx mmxext svm fxsr_opt lm 3dnowext 3dnow pni cx16
      lahf_lm cmp_legacy svm cr8legacy ts fid vid ttp tm stc
      
    grep -E 'svm|vmx' /proc/cpuinfo 명령이 출력을 반환하는 경우 프로세서는 하드웨어 가상화 확장 기능이 포함됩니다. 경우에 따라 제조업체가 BIOS에서 가상화 확장을 비활성화합니다. 확장 기능이 나타나지 않거나 전체 가상화가 작동하지 않는 경우 BIOS 구성 유틸리티의 확장 활성화에 대한 지침은 절차 A.3. “BIOS에서 가상화 확장 활성화” 에서 참조하십시오.
  3. KVM 커널 모듈이 로드되었는지 확인

    추가 검사로 다음 명령을 사용하여 kvm 모듈이 커널에 로드되었는지 확인합니다.
    # lsmod | grep kvm
    출력에 kvm_intel 또는 kvm_amd 가 포함된 경우 kvm 하드웨어 가상화 모듈이 로드됩니다.
참고
virsh 유틸리티( libvirt-client 패키지에서 제공)는 다음 명령을 사용하여 시스템의 가상화 기능 전체 목록을 출력할 수 있습니다.
# virsh capabilities

1.3. KVM 게스트 가상 머신 호환성

Red Hat Enterprise Linux 7 서버에는 특정 지원 제한이 있습니다.
다음 URL은 Red Hat Enterprise Linux에 대한 프로세서 및 메모리 용량 제한을 설명합니다.
다음 URL에는 Red Hat Enterprise Linux KVM 호스트에서 실행되도록 인증된 게스트 운영 체제가 나열되어 있습니다.
참고
KVM 하이퍼바이저의 제한 사항 및 지원 제한에 대한 자세한 내용은 부록 C. 가상화 제한 사항 을 참조하십시오.

1.4. 지원되는 게스트 CPU 모델

모든 하이퍼바이저에는 게스트가 기본적으로 표시되는 CPU 기능에 대한 자체 정책이 있습니다. 하이퍼바이저가 게스트에 제공되는 CPU 기능 세트는 게스트 가상 머신 구성에서 선택한 CPU 모델에 따라 다릅니다.

1.4.1. 게스트 CPU 모델 나열

아키텍처 유형에 대해 지원되는 CPU 모델의 전체 목록을 보려면 virsh cpu-models architecture 명령을 실행합니다. 예를 들면 다음과 같습니다.
$ virsh cpu-models x86_64
486
pentium
pentium2
pentium3
pentiumpro
coreduo
n270
core2duo
qemu32
kvm32
cpu64-rhel5
cpu64-rhel6
kvm64
qemu64
Conroe
Penryn
Nehalem
Westmere
SandyBridge
Haswell
athlon
phenom
Opteron_G1
Opteron_G2
Opteron_G3
Opteron_G4
Opteron_G5
$ virsh cpu-models ppc64
POWER7
POWER7_v2.1
POWER7_v2.3
POWER7+_v2.1
POWER8_v1.0
지원되는 CPU 모델 및 기능의 전체 목록은 /usr/share/libvirt/ 에 있는 cpu_map.xml 파일에 포함되어 있습니다.
# cat /usr/share/libvirt/cpu_map.xml
게스트의 CPU 모델 및 기능은 도메인 XML 파일의 <cpu> 섹션에서 변경할 수 있습니다. 자세한 내용은 23.12절. “CPU 모델 및 토폴로지”를 참조하십시오.
호스트 모델은 필요에 따라 지정된 기능 세트를 사용하도록 구성할 수 있습니다. 자세한 내용은 23.12.1절. “지정된 CPU의 기능 세트 변경”의 내용을 참조하십시오.

2장. 가상화 패키지 설치

가상화를 사용하려면 Red Hat Virtualization 패키지를 컴퓨터에 설치해야 합니다. Red Hat Enterprise Linux를 설치할 때 또는 yum 명령 및 Subscription Manager 애플리케이션을 사용하여 설치 후에 가상화 패키지를 설치할 수 있습니다.
KVM 하이퍼바이저는 kvm 커널 모듈과 함께 기본 Red Hat Enterprise Linux 커널을 사용합니다.

2.1. Red Hat Enterprise Linux 설치 중 가상화 패키지 설치

이 섹션에서는 Red Hat Enterprise Linux를 설치하는 동안 가상화 패키지 설치에 대한 정보를 제공합니다.
참고
Red Hat Enterprise Linux 설치에 대한 자세한 내용은 Red Hat Enterprise Linux 7 설치 가이드 를 참조하십시오.
중요
Anaconda 인터페이스는 Red Hat Enterprise Linux Server를 설치하는 동안 Red Hat Virtualization 패키지를 설치하는 옵션만 제공합니다.
Red Hat Enterprise Linux Workstation을 설치할 때 Red Hat 가상화 패키지는 워크스테이션 설치가 완료된 후에만 설치할 수 있습니다. 보기 2.2절. “기존 Red Hat Enterprise Linux 시스템에 가상화 패키지 설치”

절차 2.1. 가상화 패키지 설치

  1. 소프트웨어 선택

    설치 요약 화면이 나타날 때까지 설치 절차를 따르십시오.

    그림 2.1. 설치 요약 화면

    이미지에는 그룹 제목 아래에 구성 가능한 옵션을 나열하는 설치 요약 화면이 표시됩니다. Localization 제목에서 : 날짜 및 시간,언어 지원, keyboard . 소프트웨어 제목에 따라: 설치 소스 및 소프트웨어 선택. 시스템 제목 아래에: 설치 대상 및 네트워크 및 호스트 이름.
    설치 요약 화면에서 소프트웨어 선택 을 클릭합니다. Software Selection 화면이 열립니다.
  2. 서버 유형 및 패키지 그룹 선택

    기본 가상화 패키지만 사용하거나 그래픽 사용자 인터페이스를 통해 게스트를 관리할 수 있는 패키지로 Red Hat Enterprise Linux 7을 설치할 수 있습니다. 다음 중 하나를 수행합니다.
    • 최소한의 가상화 호스트 설치
      Base Environment (기본 환경) 창에서 Virtualization Host (가상화 호스트) 라디오 버튼을 선택하고 Selected Environment(선택된 환경) 창에 대한 애드온의 가상화 플랫폼 확인란을 선택합니다. 이렇게 하면 virsh 또는 네트워크를 통해 원격으로 실행할 수 있는 기본 가상화 환경이 설치됩니다.

      그림 2.2. 소프트웨어 선택 화면에서 선택한 가상화 호스트

      이미지는 두 개의 제목 아래에 옵션을 나열하는 소프트웨어 선택 화면을 보여줍니다. 선택한 환경을 위한 기본 환경 및 애드온. 가상화 호스트 는 기본 환경 아래의 옵션에서 강조 표시되며 선택한 환경의 애드온에 있는 옵션에서 가상화 플랫폼이 강조 표시됩니다.
    • 그래픽 사용자 인터페이스를 사용하여 가상화 호스트 설치
      Base Environment (기본 환경) 창에서 Server with GUI (그래프로 서버) 라디오 버튼을 선택하고 선택한 환경 추가 창의 Virtualization Client,Virtualization Hypervisor, 및 Virtualization Tools (가상화 툴) 확인란을 선택합니다. 이렇게 하면 게스트 가상 머신을 설치 및 관리하기 위한 그래픽 툴과 함께 가상화 환경이 설치됩니다.

      그림 2.3. 소프트웨어 선택 화면에서 GUI가 선택된 서버

      이미지는 두 개의 제목 아래에 옵션을 나열하는 소프트웨어 선택 화면을 보여줍니다. 선택한 환경을 위한 기본 환경 및 애드온. GUI를 사용하는 서버는 Base Environment, Virtualization Client,Virtualization Hypervisor, Virtualization Tools 의 옵션에서 강조 표시됩니다. 선택한 환경의 애드온에 있는 옵션에서 강조 표시됩니다.
  3. 설치 완료

    Done 을 클릭하고 설치를 계속합니다.
중요
가상화 패키지에 대한 업데이트를 받으려면 유효한 Red Hat Enterprise Linux 서브스크립션이 필요합니다.

2.1.1. Kickstart 파일을 사용하여 KVM 패키지 설치

Kickstart 파일을 사용하여 가상화 패키지와 함께 Red Hat Enterprise Linux를 설치하려면 Kickstart 파일의 %packages 섹션에 다음 패키지 그룹을 추가합니다.
@virtualization-hypervisor
@virtualization-client
@virtualization-platform
@virtualization-tools
Kickstart 파일을 사용하여 설치하는 방법에 대한 자세한 내용은 Red Hat Enterprise Linux 7 설치 가이드 를 참조하십시오.

2.2. 기존 Red Hat Enterprise Linux 시스템에 가상화 패키지 설치

이 섹션에서는 기존 Red Hat Enterprise Linux 7 시스템에 KVM 하이퍼바이저를 설치하는 단계를 설명합니다.
패키지를 설치하려면 시스템을 Red Hat 고객 포털에 등록하고 등록해야 합니다. Red Hat Subscription Manager를 사용하여 등록하려면 subscription-manager register 명령을 실행하고 프롬프트를 따릅니다. 또는 데스크탑의 애플리케이션 → 시스템 툴에서 Red Hat Subscription Manager 애플리케이션을 실행하여 등록합니다.
유효한 Red Hat 서브스크립션이 없는 경우 Red Hat 온라인 스토어 를 방문하여 정보를 확인하십시오. Red Hat 고객 포털에 시스템 등록 및 등록에 대한 자세한 내용은 의 내용을 참조하십시오 https://access.redhat.com/solutions/253273.

2.2.1. 수동으로 가상화 패키지 설치

Red Hat Enterprise Linux에서 가상화를 사용하려면 최소한 다음 패키지를 설치해야 합니다.
  • qemu-kvm: 이 패키지는 사용자 수준 KVM 에뮬레이터를 제공하며 호스트와 게스트 가상 머신 간의 통신을 용이하게 합니다.
  • QEMU-img: 이 패키지는 게스트 가상 머신에 대한 디스크 관리를 제공합니다.
    참고
    qemu-img 패키지는 qemu-kvm 패키지의 종속성으로 설치됩니다.
  • libvirt: 이 패키지는 하이퍼바이저 및 호스트 시스템과의 상호 작용을 위한 서버 및 호스트 측 라이브러리와 라이브러리 호출을 처리하고, 가상 시스템을 관리하고, 하이퍼바이저를 제어하는 libvirtd 데몬을 제공합니다.
이러한 패키지를 설치하려면 다음 명령을 입력합니다.
# yum install qemu-kvm libvirt
가상화를 사용할 때 몇 가지 추가 가상화 관리 패키지도 사용할 수 있습니다.
  • virt-install: 이 패키지는 명령줄에서 가상 머신을 생성하기 위한 virt-install 명령을 제공합니다.
  • libvirt-python: 이 패키지에는 Python 프로그래밍 언어로 작성된 애플리케이션이 libvirt API에서 제공하는 인터페이스를 사용하도록 허용하는 모듈이 포함되어 있습니다.
  • virt-manager: 이 패키지는 Virtual Machine Manager 라고도 하는 virt-manager 도구를 제공합니다. 가상 머신을 관리하기 위한 그래픽 도구입니다. libvirt-client 라이브러리를 관리 API로 사용합니다.
  • libvirt-client: 이 패키지는 libvirt 서버에 액세스하기 위한 클라이언트 측 API 및 라이브러리를 제공합니다. libvirt-client 패키지에는 명령줄 또는 특수 가상화 쉘에서 가상 머신 및 하이퍼바이저를 관리하고 제어하는 virsh 명령줄 툴이 포함되어 있습니다.
다음 명령을 사용하여 이러한 권장 가상화 패키지를 모두 설치할 수 있습니다.
# yum install virt-install libvirt-python virt-manager virt-install libvirt-client

2.2.2. 가상화 패키지 그룹 설치

가상화 패키지는 패키지 그룹에서도 설치할 수 있습니다. yum grouplist hidden commad를 실행하여 사용 가능한 그룹 목록을 볼 수 있습니다.
사용 가능한 패키지 그룹 전체 목록의 다음 표에서는 가상화 패키지 그룹과 제공하는 사항에 대해 설명합니다.

표 2.1. 가상화 패키지 그룹

패키지 그룹 설명 필수 패키지 선택적 패키지
가상화 Hypervisor 가능한 가장 작은 가상화 호스트 설치 libvirt, qemu-kvm, qemu-img qemu-kvm-tools
가상화 클라이언트 가상화 인스턴스 설치 및 관리를 위한 클라이언트 gnome-boxes, virt-install, virt-manager, virt-viewer, qemu-img virt-top, libguestfs-tools, libguestfs-tools-c
가상화 플랫폼 가상 머신 및 컨테이너에 액세스 및 제어하는 인터페이스 제공 libvirt, libvirt-client, virt-who, qemu-img fence-virtd-libvirt, fence-virtd-multicast, fence-virtd-serial, libvirt-cim, libvirt-java, libvirt-snmp, perl-Sys-Virt
가상화 툴 오프라인 가상 이미지 관리 툴 libguestfs, qemu-img libguestfs-java, libguestfs-tools, libguestfs-tools-c
패키지 그룹을 설치하려면 yum group install package_group 명령을 실행합니다. 예를 들어 모든 패키지 유형이 포함된 Virtualization Tools 패키지 그룹을 설치하려면 다음을 실행합니다.
# yum group install "Virtualization Tools" --setopt=group_package_types=mandatory,default,optional
패키지 그룹 설치에 대한 자세한 내용은 Red Hat Enterprise Linux에서 yum을 사용하여 패키지 그룹을 설치하는 방법을참조하십시오. 지식 베이스 문서.

3장. 가상 머신 생성

Red Hat Enterprise Linux 7 호스트 시스템에 가상화 패키지를 설치한 후 virt-manager 인터페이스를 사용하여 가상 머신을 생성하고 게스트 운영 체제를 설치할 수 있습니다. 또는 매개변수 목록 또는 스크립트로 virt-install 명령줄 유틸리티를 사용할 수도 있습니다. 두 방법 모두 이 장에 설명되어 있습니다.

3.1. 게스트 가상 머신 배포 고려 사항

게스트 가상 머신을 생성하기 전에 다양한 요소를 고려해야 합니다. 가상 시스템의 역할도 배포 전에 평가되어야 하지만 변수 요인(로드, 클라이언트 양)을 기반으로 정기적으로 모니터링 및 평가해야 합니다. 다음과 같은 요인이 있습니다.
성능
게스트 가상 머신은 의도한 작업을 기반으로 배포 및 구성해야 합니다. 일부 게스트 시스템(예: 데이터베이스 서버를 실행하는 게스트)에는 특별한 성능 고려 사항이 필요할 수 있습니다. 게스트에 역할 및 예상 시스템 로드에 따라 더 할당된 CPU 또는 메모리가 필요할 수 있습니다.
입력/출력 요구 사항 및 입력/출력 유형
일부 게스트 가상 머신에는 특히 높은 I/O 요구 사항이 있거나 I/O 유형(예: 일반적인 디스크 블록 크기 액세스 또는 클라이언트 양)에 따라 추가 고려 사항이나 예측이 필요할 수 있습니다.
스토리지
일부 게스트 가상 머신에는 스토리지 또는 더 빠른 디스크 유형에 대한 우선 순위가 높은 액세스 권한이 필요할 수 있으며 스토리지 영역에 독점적으로 액세스해야 할 수도 있습니다. 또한 게스트가 사용하는 스토리지 용량을 정기적으로 모니터링하고 스토리지를 배포하고 유지 관리할 때 고려해야 합니다. Red Hat Enterprise Linux 7 Virtualization 보안 가이드에 설명된 모든 고려 사항을 확인하십시오. 또한 물리적 스토리지에서 가상 스토리지의 옵션을 제한할 수 있다는 점을 이해하는 것이 중요합니다.
네트워킹 및 네트워크 인프라
환경에 따라 일부 게스트 가상 머신에는 다른 게스트보다 빠른 네트워크 링크가 필요할 수 있습니다. 대역폭 또는 대기 시간은 특히 요구 사항 또는 로드 변경에 따라 게스트를 배포하고 유지 관리할 때 고려해야 하는 경우가 많습니다.
요청 요구사항
다음 예와 같이 virtio 드라이브가 전체 디스크에서 백업되는 경우 virtio 드라이브의 게스트 가상 머신에 SCSI 요청을 실행할 수 있으며, 디스크 장치 매개 변수는 도메인 XML 파일에서 lun 으로 설정됩니다.
<devices>
  <emulator>/usr/libexec/qemu-kvm</emulator>
  <disk type='block' device='lun'>

3.2. virt-install을 사용하여 게스트 생성

virt-install 명령을 사용하여 가상 머신을 생성하고 명령줄에서 해당 가상 머신에 운영 체제를 설치할 수 있습니다. virt-install 은 대화식 또는 스크립트의 일부로 가상 머신 생성을 자동화할 수 있습니다. 대화형 그래픽 설치를 사용하는 경우 virt-install 을 실행하기 전에 virt-viewer 가 설치되어 있어야 합니다. 또한 virt-install 과 kickstart 파일을 사용하여 가상 머신 운영 체제의 자동 설치를 시작할 수 있습니다.
참고
일부 virt-install 명령을 성공적으로 완료하려면 root 권한이 필요할 수 있습니다.
virt-install 유틸리티는 여러 가지 명령줄 옵션을 사용합니다. 그러나 대부분의 virt-install 옵션은 필요하지 않습니다.
가상 게스트 머신 설치에 필요한 주요 옵션은 다음과 같습니다.
--name
가상 머신의 이름입니다.
--memory
게스트에 할당할 메모리(RAM) 양(MiB)입니다.
게스트 스토리지
다음 게스트 스토리지 옵션 중 하나를 사용합니다.
  • --disk
    가상 머신의 스토리지 구성 세부 정보입니다. --disk none 옵션을 사용하면 가상 머신이 디스크 공간 없이 생성됩니다.
  • --filesystem
    가상 머신 게스트의 파일 시스템 경로입니다.
설치 방법
다음 설치 방법 중 하나를 사용합니다.
  • --location
    설치 미디어의 위치입니다.
  • --cdrom
    가상 CD-ROM 장치로 사용되는 파일 또는 장치입니다. ISO 이미지 경로 또는 최소 부팅 ISO 이미지를 가져오거나 액세스할 URL일 수 있습니다. 그러나 물리적 호스트 CD-ROM 또는 DVD-ROM 장치가 될 수 없습니다.
  • --pxe
    PXE 부팅 프로토콜을 사용하여 게스트 설치 프로세스를 시작하기 위해 초기 램디스크 및 커널을 로드합니다.
  • --import
    OS 설치 프로세스를 건너뛰고 기존 디스크 이미지에 대해 게스트를 빌드합니다. 부팅에 사용되는 장치는 디스크 또는 파일 시스템 옵션으로 지정된 첫 번째 장치입니다.
  • --boot
    설치 후 VM 부팅 구성입니다. 이 옵션을 사용하면 부팅 장치 순서를 지정하고 선택적 커널 인수를 사용하여 커널 및 initrd를 영구적으로 부팅하고 BIOS 부팅 메뉴를 활성화할 수 있습니다.
전체 옵션 목록을 보려면 다음 명령을 입력합니다.
# virt-install --help
옵션에 대한 전체 속성 목록을 보려면 다음 명령을 입력합니다.
# virt install --option=?
virt-install man 페이지는 각 명령 옵션, 중요한 변수 및 예제도 문서화합니다.
virt-install 을 실행하기 전에 qemu-img 를 사용하여 스토리지 옵션을 구성해야 할 수도 있습니다. qemu-img 사용에 대한 자세한 내용은 14장. qemu-img 사용 을 참조하십시오.

3.2.1. ISO 이미지에서 가상 머신 설치

다음 예제에서는 ISO 이미지에서 가상 머신을 설치합니다.
# virt-install \ 
  --name guest1-rhel7 \ 
  --memory 2048 \ 
  --vcpus 2 \ 
  --disk size=8 \ 
  --cdrom /path/to/rhel7.iso \ 
  --os-variant rhel7 
--cdrom /path/to/rhel7.iso 옵션은 지정된 위치에 있는 CD 또는 DVD 이미지에서 가상 시스템이 설치되도록 지정합니다.

3.2.2. 가상 머신 이미지 가져오기

다음 예제에서는 가상 디스크 이미지에서 가상 머신을 가져옵니다.
# virt-install \ 
  --name guest1-rhel7 \ 
  --memory 2048 \ 
  --vcpus 2 \ 
  --disk /path/to/imported/disk.qcow \ 
  --import \ 
  --os-variant rhel7 
--import 옵션은 --disk /path/to/imported/disk.qcow 옵션으로 지정된 가상 디스크 이미지에서 가상 머신을 가져오도록 지정합니다.

3.2.3. 네트워크에서 가상 머신 설치

다음 예제에서는 네트워크 위치에서 가상 머신을 설치합니다.
# virt-install \ 
  --name guest1-rhel7 \ 
  --memory 2048 \ 
  --vcpus 2 \ 
  --disk size=8 \ 
  --location http://example.com/path/to/os \ 
  --os-variant rhel7 
--location http://example.com/path/to/os 옵션은 설치 트리가 지정된 네트워크 위치에 있음을 지정합니다.

3.2.4. PXE를 사용하여 가상 머신 설치

PXE 부팅 프로토콜을 사용하여 가상 머신을 설치할 때 bridged 네트워크와 --pxe 옵션을 지정하는 --network 옵션 모두 지정해야 합니다.
다음 예제에서는 PXE를 사용하여 가상 머신을 설치합니다.
# virt-install \ 
  --name guest1-rhel7 \ 
  --memory 2048 \ 
  --vcpus 2 \ 
  --disk size=8 \ 
  --network=bridge:br0 \ 
  --pxe \ 
  --os-variant rhel7 

3.2.5. Kickstart를 사용하여 가상 머신 설치

다음 예제에서는 Kickstart 파일을 사용하여 가상 머신을 설치합니다.
# virt-install \ 
  --name guest1-rhel7 \ 
  --memory 2048 \ 
  --vcpus 2 \ 
  --disk size=8 \ 
  --location http://example.com/path/to/os \ 
  --os-variant rhel7 \
  --initrd-inject /path/to/ks.cfg \ 
  --extra-args="ks=file:/ks.cfg console=tty0 console=ttyS0,115200n8" 
initrd-injectextra-args 옵션은 Kickstarter 파일을 사용하여 가상 머신이 설치되도록 지정합니다.

3.2.6. 게스트 생성 중 게스트 가상 머신 네트워크 구성

게스트 가상 머신을 생성할 때 가상 머신의 네트워크를 지정하고 구성할 수 있습니다. 이 섹션에서는 각 게스트 가상 머신 기본 네트워크 유형에 대한 옵션을 제공합니다.

NAT가 있는 기본 네트워크

기본 네트워크는 libvirtd 의 NAT(네트워크 주소 변환) 가상 네트워크 스위치를 사용합니다. NAT에 대한 자세한 내용은 6.1절. “libvirt를 사용한 NAT(Network Address Translation)” 을 참조하십시오.
NAT를 사용하여 기본 네트워크를 사용하여 게스트 가상 머신을 만들기 전에 libvirt-daemon-config-network 패키지가 설치되어 있는지 확인합니다.
게스트 가상 머신에 대해 NAT 네트워크를 구성하려면 virt-install 에 다음 옵션을 사용하십시오.
--network default
참고
네트워크 옵션이 지정되지 않은 경우 게스트 가상 시스템은 NAT를 사용하는 기본 네트워크로 구성됩니다.

DHCP를 사용한 브리지 네트워크

브리지 네트워킹에 대해 구성된 경우 게스트는 외부 DHCP 서버를 사용합니다. 이 옵션은 호스트에 정적 네트워킹 구성이 있고 게스트에 로컬 영역 네트워크(LAN)를 사용하여 전체 인바운드 및 아웃바운드 연결이 필요한 경우 이 옵션을 사용해야 합니다. 게스트 가상 머신과 함께 실시간 마이그레이션을 수행하는 경우 사용해야 합니다. 게스트 가상 머신의 DHCP를 사용하여 브리지 네트워크를 구성하려면 다음 옵션을 사용합니다.
--network br0
참고
virt-install 을 실행하기 전에 브리지를 별도로 생성해야 합니다. 네트워크 브리지 생성에 대한 자세한 내용은 6.4.1절. “Red Hat Enterprise Linux 7 호스트에서 브리지 네트워킹 구성” 을 참조하십시오.

고정 IP 주소가 있는 브리지 네트워크

브리지된 네트워킹은 고정 IP 주소를 사용하도록 게스트를 구성하는 데도 사용할 수 있습니다. 게스트 가상 머신의 고정 IP 주소를 사용하여 브리지 네트워크를 구성하려면 다음 옵션을 사용합니다.
--network br0 \
--extra-args "ip=192.168.1.2::192.168.1.1:255.255.255.0:test.example.com:eth0:none"
네트워크 부팅 옵션에 대한 자세한 내용은 Red Hat Enterprise Linux 7 설치 가이드 를 참조하십시오.

네트워크 없음

네트워크 인터페이스 없이 게스트 가상 머신을 구성하려면 다음 옵션을 사용합니다.
--network=none

3.3. virt-manager를 사용하여 게스트 생성

virt-manager 라고도 하는 Virtual Machine Manager는 게스트 가상 머신을 생성하고 관리하기 위한 그래픽 도구입니다.
이 섹션에서는 virt-manager 를 사용하여 Red Hat Enterprise Linux 7 호스트에서 Red Hat Enterprise Linux 7 게스트 가상 머신 을 설치하는 방법에 대해 설명합니다.
이 절차에서는 KVM 하이퍼바이저 및 기타 모든 필수 패키지가 설치되어 있고 호스트가 가상화용으로 구성되어 있다고 가정합니다. 가상화 패키지 설치에 대한 자세한 내용은 2장. 가상화 패키지 설치 을 참조하십시오.

3.3.1. virt-manager 설치 개요

New VM 마법사는 가상 머신 생성 프로세스를 5 단계로 나눕니다.
  1. 하이퍼바이저 및 설치 유형 선택
  2. 설치 미디어 위치 찾기 및 구성
  3. 메모리 및 CPU 옵션 구성
  4. 가상 머신의 스토리지 구성
  5. 가상 머신 이름, 네트워킹, 아키텍처 및 기타 하드웨어 설정 구성
virt-manager 가 계속하기 전에 설치 미디어(로컬 또는 네트워크를 통해)에 액세스할 수 있는지 확인합니다.

3.3.2. virt-manager를 사용하여 Red Hat Enterprise Linux 7 게스트 생성

이 절차에서는 로컬에 저장된 설치 DVD 또는 DVD 이미지를 사용하여 Red Hat Enterprise Linux 7 게스트 가상 머신을 생성하는 방법을 설명합니다. Red Hat Enterprise Linux 7 DVD 이미지는 Red Hat 고객 포털에서 사용할 수 있습니다.
참고
SecureBoot가 활성화된 가상 머신을 설치하려면 virt-manager를 사용한 SecureBoot Red Hat Enterprise Linux 7 게스트 생성 을 참조하십시오.

절차 3.1. 로컬 설치 미디어를 사용하여 virt-manager 를 사용하여 Red Hat Enterprise Linux 7 게스트 가상 머신 생성

  1. 선택 사항: 준비

    가상 머신에 대한 스토리지 환경을 준비합니다. 스토리지 준비에 대한 자세한 내용은 13장. 가상 머신용 스토리지 관리 을 참조하십시오.
    중요
    게스트 가상 머신을 저장하는 데 다양한 스토리지 유형을 사용할 수 있습니다. 그러나 가상 머신이 마이그레이션 기능을 사용하려면 네트워크 스토리지에 가상 머신을 생성해야 합니다.
    Red Hat Enterprise Linux 7에는 최소 1GB의 스토리지 공간이 필요합니다. 그러나 Red Hat은 Red Hat Enterprise Linux 7 설치를 위한 최소 5GB의 스토리지 공간 및 이 가이드의 절차에 대해 권장합니다.
  2. virt-manager를 열고 마법사를 시작합니다.

    virt-manager 명령을 root로 실행하거나 애플리케이션시스템 도구가상 머신 관리자를 실행하여 virt-manager를 엽니다.

    그림 3.1. 가상 머신 관리자 창

    가상 머신 관리자 창
    선택적으로 하이퍼바이저를 선택하고 Connect 버튼을 클릭하여 원격 하이퍼바이저를 엽니다.
    을 클릭하여 가상화된 게스트 마법사를 시작합니다.
    New VM 창이 열립니다.
  3. 설치 유형 지정

    설치 유형을 선택합니다.
    로컬 설치 미디어 (ISO 이미지 또는 CDROM)
    이 방법은 설치 디스크의 이미지(예: .iso)를 사용합니다. 그러나 호스트 CD-ROM 또는 DVD-ROM 장치를 사용할 수 없습니다.
    네트워크 설치(HTTP, FTP 또는 NFS)
    이 방법은 미러링된 Red Hat Enterprise Linux 또는 Fedora 설치 트리를 사용하여 게스트를 설치하는 것입니다. 설치 트리는 HTTP, FTP 또는 NFS를 통해 액세스할 수 있어야 합니다.
    Network Install 을 선택한 경우 설치 URL과 필요한 경우 커널 옵션을 제공합니다.
    Network Boot (PXE)
    이 방법은 PXE(Preboot eXecution Environment) 서버를 사용하여 게스트 가상 머신을 설치합니다. PXE 서버 설정은 Red Hat Enterprise Linux 7 설치 가이드에서 다룹니다. 네트워크 부팅을 사용하여 설치하려면 게스트에 라우팅 가능한 IP 주소 또는 공유 네트워크 장치가 있어야 합니다.
    Network Boot 를 선택한 경우 STEP 5로 이동합니다. 모든 단계가 완료되면 DHCP 요청이 전송되고 유효한 PXE 서버가 발견되면 게스트 가상 머신의 설치 프로세스가 시작됩니다.
    기존 디스크 이미지 가져오기
    이 방법을 사용하면 새 게스트 가상 머신을 생성하고 사전 설치된 부팅 가능한 운영 체제가 있는 디스크 이미지를 가져올 수 있습니다.

    그림 3.2. 가상 머신 설치 방법

    가상 머신 설치 방법
    계속하려면 Forward 를 클릭합니다.
  4. 설치 소스 선택

    1. 로컬 설치 미디어(ISO 이미지 또는 CDROM) 를 선택한 경우 원하는 로컬 설치 미디어를 지정합니다.

      그림 3.3. 로컬 ISO 이미지 설치

      로컬 ISO 이미지 설치
      주의
      옵션이 현재 GUI에 있지만 호스트의 물리적 CD-ROM 또는 DVD 장치에서 설치할 수 없습니다. 따라서 Use CDROM 또는 DVD 옵션을 선택하면 VM 설치가 실패합니다. 자세한 내용은 Red Hat 지식 베이스 를 참조하십시오.
      ISO 이미지에서 설치하려면 ISO 이미지 사용을 선택하고 찾아보기... 버튼을 클릭하여 Locate 미디어 볼륨 창을 엽니다.
      사용하려는 설치 이미지를 선택하고 볼륨 선택을 클릭합니다.
      Locate 미디어 볼륨 창에 이미지가 표시되지 않는 경우 로컬 찾아보기 버튼을 클릭하여 설치 디스크가 포함된 호스트 또는 DVD 드라이브의 호스트 시스템을 찾습니다. 설치 디스크가 포함된 설치 이미지 또는 DVD 드라이브를 선택하고 Open; 사용을 위해 볼륨이 선택되고 새 가상 머신 생성 마법사로 돌아갑니다.
      중요
      ISO 이미지 파일 및 게스트 스토리지 이미지의 경우 사용할 권장 위치는 /var/lib/libvirt/images/ 입니다. 기타 모든 위치에는 SELinux의 추가 구성이 필요할 수 있습니다. SELinux 구성에 대한 자세한 내용은 Red Hat Enterprise Linux Virtualization 보안 가이드 또는 Red Hat Enterprise Linux SELinux 사용자 및 관리자 가이드 를 참조하십시오.
    2. Network Install 을 선택한 경우 설치 소스의 URL과 필요한 커널 옵션(있는 경우)을 입력합니다. URL은 설치 트리의 루트 디렉터리를 가리키며 HTTP, FTP 또는 NFS를 통해 액세스할 수 있어야 합니다.
      Kickstart 설치를 수행하려면 ks=부터 커널 옵션에 Kickstart 파일의 URL을 지정합니다.

      그림 3.4. 네트워크 Kickstart 설치

      네트워크 Kickstart 설치
      참고
      커널 옵션의 전체 목록은 Red Hat Enterprise Linux 7 설치 가이드 를 참조하십시오.
    다음으로 OS 유형 및 설치 버전 을 구성합니다. 가상 머신에 적합한 운영 체제 유형을 선택해야 합니다. 이는 수동으로 지정하거나 설치 미디어 확인란을 기반으로 자동 감지 운영 체제를 선택하여 지정할 수 있습니다.
    계속하려면 Forward 를 클릭합니다.
  5. 메모리(RAM) 및 가상 CPU 구성

    가상 머신에 할당할 CPU 수 및 메모리 크기(RAM)를 지정합니다. 마법사는 할당할 수 있는 CPU 수와 메모리 양을 표시합니다. 이러한 값은 호스트 및 게스트 성능에 영향을 미칩니다.
    가상 시스템에는 효율적이고 효과적으로 실행하려면 충분한 실제 메모리(RAM)가 필요합니다. Red Hat은 가상 머신에 대해 최소 512MB의 RAM을 지원합니다. Red Hat은 각 논리 코어에 대해 최소 1024MB의 RAM을 권장합니다.
    가상 머신에 충분한 가상 CPU를 할당합니다. 가상 머신이 다중 스레드 애플리케이션을 실행하는 경우 게스트 가상 시스템을 실행하는 데 필요한 가상 CPU 수를 할당합니다.
    호스트 시스템에서 사용 가능한 물리적 프로세서(또는 하이퍼스레드)보다 많은 가상 CPU를 할당할 수 없습니다. 사용 가능한 가상 CPU 수는 최대 X 사용 가능한 필드에 표시됩니다.

    그림 3.5. 메모리 및 CPU 구성

    메모리 및 CPU 구성
    메모리 및 CPU 설정을 구성한 후 앞으로 를 클릭하여 계속합니다.
    참고
    메모리 및 가상 CPU를 오버 커밋할 수 있습니다. 오버 커밋에 대한 자세한 내용은 7장. KVM을 사용하여 오버 커밋 을 참조하십시오.
  6. 스토리지 구성

    가상 머신 및 필요한 애플리케이션에 충분한 공간을 활성화하고 할당합니다. 데스크탑 설치의 경우 최소 5GB 이상 또는 최소 설치의 경우 1GB 이상을 할당합니다.

    그림 3.6. 가상 스토리지 구성

    가상 스토리지 구성
    참고
    실시간 마이그레이션에서는 공유 네트워크 스토리지에 가상 머신을 설치해야 합니다. 가상 머신의 공유 스토리지 설정에 대한 자세한 내용은 15.4절. “공유 스토리지 예: 간단한 마이그레이션을 위한 NFS” 을 참조하십시오.
    1. 기본 로컬 스토리지

      컴퓨터의 하드 드라이브 라디오 버튼에 디스크 이미지 만들기 버튼을 선택하여 기본 스토리지 풀인 /var/lib/libvirt/images/ 디렉터리에 파일 기반 이미지를 생성합니다. 생성할 디스크 이미지의 크기를 입력합니다. Allocate entire disk now 확인란을 선택하면 지정된 크기의 디스크 이미지가 즉시 생성됩니다. 그렇지 않으면 디스크 이미지가 채워지기 때문에 증가합니다.
      참고
      스토리지 풀은 가상 컨테이너이지만 두 가지 요인으로 제한됩니다. qemu-kvm에서 허용하는 최대 크기와 호스트 물리적 시스템의 디스크 크기입니다. 스토리지 풀은 호스트 물리적 시스템의 디스크 크기를 초과할 수 없습니다. 최대 크기는 다음과 같습니다.
      • virtio-blk = 2^63바이트 또는 8 Exabytes( raw 파일 또는 디스크 사용)
      • Ext4 = ~ 16TB (4KB 블록 크기 사용)
      • XFS = ~8 Exabytes
      • qcow2 및 호스트 파일 시스템은 이미지 크기를 매우 크게 시도할 때 자체 메타데이터와 확장성을 평가/tuned해야 합니다. 원시 디스크를 사용하면 확장성 또는 최대 크기에 영향을 줄 수 있는 계층이 줄어듭니다.
      Forward 를 클릭하여 로컬 하드 드라이브에 디스크 이미지를 만듭니다. 또는 Select managed or other existing storage 를 선택한 다음 찾아보기 를 선택하여 관리 스토리지를 구성합니다.
    2. 스토리지 풀 사용

      스토리지 풀을 사용할 관리형 또는 기타 기존 스토리지 선택을 선택하는 경우 찾아보기 를 클릭하여 Locate 또는 create storage 볼륨 창을 엽니다.

      그림 3.7. 스토리지 볼륨 선택 창

      스토리지 볼륨 선택 창
      1. 스토리지 목록에서 스토리지 풀을 선택합니다.
      2. 선택 사항: 을 클릭하여 새 스토리지 볼륨을 생성합니다. 스토리지 볼륨 추가 화면이 표시됩니다. 새 스토리지 볼륨의 이름을 입력합니다.
        형식 드롭다운 메뉴에서 형식 옵션을 선택합니다.Choose a format option from the Format drop-down menu. 형식 옵션에는 raw, qcow2, 및 qed 가 있습니다. 필요에 따라 다른 필드를 조정합니다. 여기에서 사용되는 qcow2 버전은 버전 3입니다. qcow 버전을 변경하려면 다음을 참조하십시오. 23.19.2절. “대상 요소 설정”

        그림 3.8. 스토리지 볼륨 추가 창

        스토리지 볼륨 추가 창
    새 볼륨을 선택하고 볼륨 선택을 클릭합니다. 그런 다음 Finish 를 클릭하여 New VM 마법사로 돌아갑니다. 계속하려면 Forward 를 클릭합니다.
  7. 이름 및 최종 구성

    가상 머신의 이름을 지정합니다. 가상 머신 이름에는 문자, 숫자 및 다음 문자가 포함될 수 있습니다.밑줄(_), 마침표( . ), 하이픈(-)입니다. 가상 머신 이름은 마이그레이션에 대해 고유해야 하며 숫자만 구성될 수 없습니다.
    기본적으로 가상 머신은 'default'라는 네트워크에 대해 NAT(네트워크 주소 변환)를 사용하여 생성됩니다. 네트워크 선택을 변경하려면 네트워크 선택을 클릭하고 호스트 장치 및 소스 모드를 선택합니다.
    가상 시스템의 설정을 확인하고 충족 시 Finish 를 클릭합니다. 이렇게 하면 지정된 네트워킹 설정, 가상화 유형 및 아키텍처가 있는 가상 시스템이 생성됩니다.

    그림 3.9. 구성 확인

    구성 확인
    또는 가상 머신의 하드웨어를 추가로 구성하려면 설치 전에 구성 사용자 지정 확인란을 선택하여 게스트 스토리지 또는 네트워크 장치를 변경하거나 반가상화(virtio) 드라이버를 사용하거나 장치를 추가로 추가합니다. 그러면 가상 머신의 하드웨어 설정을 추가, 제거 및 구성할 수 있는 다른 마법사가 열립니다.
    참고
    Red Hat Enterprise Linux 4 또는 Red Hat Enterprise Linux 5 게스트 가상 머신은 그래픽 모드를 사용하여 설치할 수 없습니다. 따라서 비디오 카드로 "QXL" 대신 "Cirrus"를 선택해야 합니다.
    가상 머신의 하드웨어를 구성한 후 Apply.virt-manager 를 클릭하면 지정된 하드웨어 설정으로 가상 머신을 생성합니다.
    주의
    Red Hat Enterprise Linux 7 게스트 가상 머신을 원격 매체에서 설치할 때 TCP/IP 연결이 구성되지 않은 경우 설치에 실패합니다. 그러나 이러한 상황에서 Red Hat Enterprise Linux 5 또는 6의 게스트 가상 머신을 설치할 때 설치 프로그램은 "Configure TCP/IP" 인터페이스를 엽니다.
    이 차이점에 대한 자세한 내용은 관련 지식베이스 문서를 참조하십시오.
    Finish 를 클릭하여 Red Hat Enterprise Linux 설치 시퀀스로 이동합니다. Red Hat Enterprise Linux 7 설치에 대한 자세한 내용은 Red Hat Enterprise Linux 7 설치 가이드 를 참조하십시오.
Red Hat Enterprise Linux 7 게스트 가상 머신이 ISO 설치 디스크 이미지에서 생성됩니다.

3.4. virt-install 및 virt-manager 설치 옵션 비교

이 표는 가상 머신을 설치할 때 에 해당하는 virt-installvirt-manager 설치 옵션을 비교하는 빠른 참조를 제공합니다.
대부분의 virt-install 옵션은 필요하지 않습니다. 최소 요구 사항은 --name,--memory, 게스트 스토리지(--disk,--filesystem 또는 --disk none) 및 설치 방법(--location,--cdrom,--pxe,--import )입니다. 이러한 옵션은 인수와 함께 지정됩니다. 명령 옵션 및 관련 인수의 전체 목록을 보려면 다음 명령을 입력합니다.
# virt-install --help
virt-manager 에서는 최소한 이름, 설치 방법, 메모리(RAM), vCPU가 필요합니다.

표 3.1. 게스트 설치를 위한 virt-install 및 virt-manager 구성 비교

가상 머신 구성 virt-install 옵션 virt-manager 설치 마법사 레이블 및 단계 번호
가상 머신 이름 --name, -n 이름 (단계 5)
할당할 RAM(MiB) --ram, -r 메모리(RAM) (단계 3)
스토리지 - 스토리지 미디어 지정 --disk 이 가상 머신의 스토리지 활성화 → 컴퓨터의 하드 드라이브에 디스크 이미지 생성 또는 관리 또는 기타 기존 스토리지 선택(단계 4)
스토리지 - 호스트 디렉터리를 게스트로 내보내기 --filesystem 이 가상 머신의 스토리지 활성화 → 관리형 또는 기타 기존 스토리지 선택(단계 4)
스토리지 - 게스트에 로컬 디스크 스토리지 구성 --nodisks Enable storage for this virtual machine 확인란을 선택 취소 (단계 4)
설치 미디어 위치(로컬 설치) --file 로컬 설치 미디어 → 설치 미디어 찾기 ( ~ 2 단계)
배포 트리를 사용하여 설치(네트워크 설치) --location 네트워크 설치 → URL (단계 ~ 2 단계)
PXE를 사용하여 게스트 설치 --PXE 네트워크 부팅(단계 1)
vCPU 수 --vcpus CPU (단계 3)
호스트 네트워크 --network 고급 옵션 드롭다운 메뉴 (단계 5)
운영 체제 변형/버전 --os-variant 버전 (단계 2)
그래픽 표시 방법 --graphics, --nographics * virt-manager는 GUI 설치만 제공

4장. 가상 머신 복제

게스트 복사본을 생성하는 데 사용되는 게스트 가상 머신 인스턴스에는 다음 두 가지 유형이 있습니다.
  • 복제본은 단일 가상 시스템의 인스턴스입니다. 복제본은 동일한 가상 머신의 네트워크를 설정하는 데 사용할 수 있으며 다른 대상에도 배포할 수 있습니다.
  • 템플릿 은 복제 소스로 사용하도록 설계된 가상 머신의 인스턴스입니다. 템플릿에서 복제를 여러 개 생성하고 각 복제본을 약간 수정할 수 있습니다. 이 기능은 시스템에서 이러한 변경 사항의 영향을 확인하는 데 유용합니다.
복제와 템플릿 모두 가상 머신 인스턴스입니다. 이 둘의 차이점은 사용 방법에 있습니다.
생성된 복제본이 제대로 작동하려면 복제하기 전에 일반적으로 복제 중인 가상 머신과 고유한 정보 및 구성을 제거해야 합니다. 복제를 사용하는 방법에 따라 제거해야 하는 정보는 다릅니다.
제거할 정보 및 구성은 다음 수준에 있을 수 있습니다.
  • 플랫폼 수준 정보 및 구성에는 가상화 솔루션에서 가상 머신에 할당된 모든 항목이 포함됩니다. 예를 들면 NIC(네트워크 인터페이스 카드) 수 및 해당 MAC 주소가 포함됩니다.
  • 게스트 운영 체제 수준 정보 및 구성에는 가상 머신 내에 구성된 모든 항목이 포함됩니다. 예를 들면 SSH 키가 있습니다.
  • 애플리케이션 수준 정보 및 구성에는 가상 시스템에 설치된 애플리케이션에 의해 구성된 모든 항목이 포함됩니다. 예를 들면 활성화 코드 및 등록 정보가 있습니다.
    참고
    정보와 접근 방식은 각 애플리케이션에 고유하기 때문에 애플리케이션 수준 제거에 대한 정보는 포함되지 않습니다.
따라서 일부 정보와 구성은 가상 시스템 내에서 제거해야 하지만 가상화 환경(예: Virtual Machine Manager 또는 VMware)을 사용하여 가상 시스템에서 기타 정보 및 구성을 제거해야 합니다.
참고
스토리지 볼륨 복제에 대한 자세한 내용은 13.3.2.1절. “virsh를 사용하여 스토리지 볼륨 생성” 을 참조하십시오.

4.1. 복제를 위한 가상 머신 준비

가상 머신을 복제하기 전에 디스크 이미지에서 virt-sysprep 유틸리티를 실행하거나 다음 단계를 사용하여 준비해야 합니다.

절차 4.1. 복제를 위한 가상 머신 준비

  1. 가상 머신 설정

    1. 복제 또는 템플릿에 사용할 가상 머신을 빌드합니다.
      • 복제본에 필요한 소프트웨어를 설치합니다.
      • 운영 체제에 대해 고유하지 않은 설정을 구성합니다.
      • 고유하지 않은 애플리케이션 설정을 구성합니다.
  2. 네트워크 구성 제거

    1. 다음 명령을 사용하여 영구 udev 규칙을 제거합니다.
      # rm -f /etc/udev/rules.d/70-persistent-net.rules
      참고
      udev 규칙이 제거되지 않으면 첫 번째 NIC의 이름이 eth0 대신 eth1일 수 있습니다.
    2. /etc/sysconfig/network-scripts/ifcfg-eth[x] 를 다음과 같이 편집하여 ifcfg 스크립트에서 고유한 네트워크 세부 정보를 제거합니다.
      1. HWADDR 및 정적 행 제거
        참고
        HWADDR이 새 게스트의 MAC 주소와 일치하지 않으면 ifcfg가 무시됩니다. 따라서 파일에서 HWADDR을 제거하는 것이 중요합니다.
        DEVICE=eth[x]
        BOOTPROTO=none
        ONBOOT=yes
        #NETWORK=10.0.1.0       <- REMOVE
        #NETMASK=255.255.255.0  <- REMOVE
        #IPADDR=10.0.1.20       <- REMOVE
        #HWADDR=xx:xx:xx:xx:xx  <- REMOVE
        #USERCTL=no             <- REMOVE
        # Remove any other *unique* or non-desired settings, such as UUID.
        
      2. HWADDR 또는 고유한 정보가 포함되지 않은 DHCP 구성이 남아 있는지 확인합니다.
        DEVICE=eth[x]
        BOOTPROTO=dhcp
        ONBOOT=yes
        
      3. 파일에 다음 행이 포함되어 있는지 확인합니다.
        DEVICE=eth[x]
        ONBOOT=yes
        
    3. 다음 파일이 있는 경우 해당 파일에 동일한 콘텐츠가 포함되어 있는지 확인합니다.
      • /etc/sysconfig/networking/devices/ifcfg-eth[x]
      • /etc/sysconfig/networking/profiles/default/ifcfg-eth[x]
      참고
      NetworkManager 또는 특수 설정을 가상 시스템과 함께 사용하는 경우 추가 고유 정보가 ifcfg 스크립트에서 제거되었는지 확인합니다.
  3. 등록 세부 정보 삭제

    1. 다음 중 하나를 사용하여 등록 세부 정보를 삭제합니다.
      • RHN(Red Hat Network) 등록된 게스트 가상 머신의 경우 다음 명령을 사용하십시오.
        # rm /etc/sysconfig/rhn/systemid
      • RHSM(Red Hat Subscription Manager)의 경우 게스트 가상 머신은 다음과 같습니다.
        • 원래 가상 머신을 사용하지 않는 경우 다음 명령을 사용하십시오.
          # subscription-manager unsubscribe --all
          # subscription-manager unregister
          # subscription-manager clean
        • 원래 가상 머신을 사용하는 경우 다음 명령만 실행합니다.
          # subscription-manager clean
          원래 RHSM 프로필은 포털에 남아 있습니다. 복제 후 가상 머신에서 RHSM 등록을 다시 활성화하려면 다음을 수행하십시오.
          1. 고객 ID 코드를 가져옵니다.
            # subscription-manager identity
            subscription-manager identity: 71rd64fx-6216-4409-bf3a-e4b7c7bd8ac9
            
          2. 가져온 ID 코드를 사용하여 가상 머신을 등록합니다.
            # subscription-manager register --consumerid=71rd64fx-6216-4409-bf3a-e4b7c7bd8ac9
  4. 다른 고유한 세부 정보 제거

    1. 다음 명령을 사용하여 sshd 공개/개인 키 쌍을 제거합니다.
      # rm -rf /etc/ssh/ssh_host_*
      참고
      ssh 키를 제거하면 ssh 클라이언트의 문제가 이러한 호스트를 신뢰하지 않습니다.
    2. 여러 시스템에서 실행되는 경우 충돌이 발생할 수 있는 기타 애플리케이션별 식별자 또는 구성을 제거합니다.
  5. 다음 부팅 시 구성 마법사를 실행하도록 가상 머신 구성

    1. 다음에 다음 중 하나를 수행하여 부팅될 때 관련 구성 마법사를 실행하도록 가상 머신을 구성합니다.
      • Red Hat Enterprise Linux 6 이하의 경우 다음 명령을 사용하여 .unconfigured라는 루트 파일 시스템에 빈 파일을 만듭니다.
        # touch /.unconfigured
      • Red Hat Enterprise Linux 7의 경우 다음 명령을 실행하여 첫 번째 부팅 및 초기 설정 마법사를 활성화합니다.
        # sed -ie 's/RUN_FIRSTBOOT=NO/RUN_FIRSTBOOT=YES/' /etc/sysconfig/firstboot
        # systemctl enable firstboot-graphical
        # systemctl enable initial-setup-graphical
      참고
      다음 부팅 시 실행되는 마법사는 가상 머신에서 제거된 구성에 따라 다릅니다. 또한 복제가 처음 부팅되면 호스트 이름을 변경하는 것이 좋습니다.

4.2. 가상 머신 복제

복제를 진행하기 전에 가상 머신을 종료합니다. virt-clone 또는 virt-manager 를 사용하여 가상 머신을 복제할 수 있습니다.

4.2.1. virt-clone을 사용하여 게스트 복제

virt-clone 을 사용하여 명령줄에서 가상 머신을 복제할 수 있습니다.
virt-clone 을 성공적으로 완료하려면 root 권한이 필요합니다.
virt-clone 명령은 명령줄에 전달할 수 있는 여러 옵션을 제공합니다. 여기에는 일반 옵션, 스토리지 구성 옵션, 네트워킹 구성 옵션 및 기타 옵션이 포함됩니다. --original 만 필요합니다. 전체 옵션 목록을 보려면 다음 명령을 입력합니다.
# virt-clone --help
virt-clone 도움말 페이지에는 각 명령 옵션, 중요한 변수 및 예제도 문서화됩니다.
다음 예제에서는 기본 연결에서 "demo"라는 게스트 가상 머신을 복제하여 새 이름과 디스크 복제 경로를 자동으로 생성하는 방법을 보여줍니다.

예 4.1. virt-clone 을 사용하여 게스트 복제

# virt-clone --original demo --auto-clone
다음 예는 여러 디스크를 사용하여 QEMU 게스트 가상 머신 "demo"를 복제하는 방법을 보여줍니다.

예 4.2. virt-clone 을 사용하여 게스트 복제

# virt-clone --connect qemu:///system --original demo --name newdemo --file /var/lib/libvirt/images/newdemo.img --file /var/lib/libvirt/images/newdata.img

4.2.2. virt-manager를 사용하여 게스트 복제

다음 절차에서는 virt-manager 유틸리티를 사용하여 게스트 가상 머신 복제를 설명합니다.

절차 4.2. virt-manager를 사용하여 가상 머신 복제

  1. virt-manager를 엽니다.

    virt-manager 를 시작합니다. Applications (애플리케이션) 메뉴 및 System Tools (시스템 도구) 하위 메뉴에서 Virtual Machine Manager 애플리케이션을 시작합니다. 또는 root로 virt-manager 명령을 실행합니다.
    가상 머신 관리자 의 게스트 가상 머신 목록에서 복제하려는 게스트 가상 머신을 선택합니다.
    복제하려는 게스트 가상 머신을 마우스 오른쪽 버튼으로 클릭하고 Clone 을 선택합니다. Clone Virtual Machine(가상 시스템 복제) 창이 열립니다.

    그림 4.1. 가상 머신 복제 창

    가상 머신 복제 창
  2. 복제 구성

    • 복제본의 이름을 변경하려면 복제본의 새 이름을 입력합니다.
    • 네트워킹 구성을 변경하려면 세부 정보를 클릭합니다.
      복제본의 새 MAC 주소를 입력합니다.
      OK를 클릭합니다.

      그림 4.2. MAC 주소 창 변경

      MAC 주소 창 변경
    • 복제된 게스트 가상 머신의 각 디스크에 대해 다음 옵션 중 하나를 선택합니다.
      • 이 디스크 복제 - 복제된 게스트 가상 머신에 대해 디스크가 복제됨
      • 게스트 가상 머신 이름으로디스크 공유 - 복제할 게스트 가상 머신과 해당 복제본에서 디스크를 공유합니다.
      • 세부 정보 - 디스크의 새 경로를 선택할 수 있는 스토리지 경로 변경 창을 엽니다.

        그림 4.3. 스토리지 경로 창 변경

        스토리지 경로 창 변경
  3. 게스트 가상 머신을 복제합니다.

    Clone 을 클릭합니다.

5장. KVM Paravirtualized (virtio) 드라이버

반가상화 드라이버는 게스트의 성능을 향상시키고 게스트 I/O 대기 시간을 줄이고 베어 메탈 수준의 처리량을 높입니다. I/O-heavy 작업 및 애플리케이션을 실행하는 완전 가상화된 게스트에 반가상화 드라이버를 사용하는 것이 좋습니다.
virtio 드라이버는 KVM의 반가상화 장치 드라이버로, guest 가상 머신에 KVM 호스트에서 실행 가능합니다. 이러한 드라이버는 virtio 패키지에 포함되어 있습니다. virtio 패키지는 블록(스토리지) 장치 및 네트워크 인터페이스 컨트롤러를 지원합니다.
참고
PCI 장치는 가상화된 시스템 아키텍처에 의해 제한됩니다. 할당된 장치를 사용할 때 추가 제한 사항은 16장. 게스트 가상 머신 장치 구성 을 참조하십시오.

5.1. 기존 스토리지 장치에 KVM virtio 드라이버 사용

가상화된 IDE 드라이버 대신 virtio 드라이버를 사용하도록 게스트에 연결된 기존 하드 디스크 장치를 수정할 수 있습니다. 이 섹션에 표시된 예제에서는 libvirt 구성 파일을 편집합니다. 이러한 단계를 수행하기 위해 게스트 가상 머신을 종료할 필요는 없지만 게스트가 완전히 종료되고 재부팅될 때까지 변경 사항이 적용되지 않습니다.

절차 5.1. 기존 장치에 KVM virtio 드라이버 사용

  1. 이 절차를 계속 진행하기 전에 적절한 드라이버(viostor)를 설치했는지 확인하십시오.
  2. virsh edit guestname 명령을 root로 실행하여 장치의 XML 구성 파일을 편집합니다. 예를 들어 virsh는 guest1을 편집합니다. 구성 파일은 /etc/libvirt/qemu/ 디렉터리에 있습니다.
  3. 다음은 가상화된 IDE 드라이버를 사용하는 파일 기반 블록 장치입니다. 이는 virtio 드라이버를 사용하지 않는 가상 머신에 대한 일반적인 항목입니다.
    <disk type='file' device='disk'>
    	 ...
       <source file='/var/lib/libvirt/images/disk1.img'/>
       <target dev='hda' bus='ide'/>
    	 <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </disk>
  4. bus= 항목을 virtio 로 수정하여 virtio 장치를 사용하도록 항목을 변경합니다. 디스크가 이전 IDE인 경우 hda,hdb 또는 hdc 와 유사한 대상이 있습니다. bus=virtio 로 변경할 때 대상을 vda, pxe 또는RuntimeClass변경해야 합니다.
    <disk type='file' device='disk'>
       ...
       <source file='/var/lib/libvirt/images/disk1.img'/>
       <target dev='vda' bus='virtio'/>
    	 <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
    </disk>
  5. 디스크 태그 내에서 address 태그를 제거합니다. 이 절차가 작동하려면 이 작업을 수행해야 합니다. libvirt는 다음에 가상 머신을 시작할 때 주소 태그를 적절하게 다시 생성합니다.
또는 virt-manager,virsh attach-disk 또는 virsh attach-interface 가 virtio 드라이버를 사용하여 새 장치를 추가할 수 있습니다.
Virtio 사용에 대한 자세한 내용은 libvirt 웹 사이트를 참조하십시오. http://www.linux-kvm.org/page/Virtio

5.2. 새 스토리지 장치에 KVM virtio 드라이버 사용

다음 절차에서는 virt-manager 와 함께 KVM virtio 드라이버를 사용하여 새 스토리지 장치를 생성하는 방법을 설명합니다.
또는 virsh attach-disk 또는 virsh attach-interface 명령을 사용하여 virtio 드라이버를 사용하여 장치를 연결할 수 있습니다.
중요
새 장치를 설치하기 전에 드라이버가 게스트에 설치되어 있는지 확인합니다. 드라이버를 사용할 수없는 경우 장치가 인식되지 않고 작동하지 않습니다.

절차 5.2. virtio 스토리지 드라이버를 사용하여 스토리지 장치 추가

  1. virt-manager 에서 게스트 이름을 두 번 클릭하여 게스트 가상 머신을 엽니다.
  2. 을 클릭하여 가상 하드웨어 세부 정보 표시 탭을 엽니다.
  3. Show virtual hardware details 탭에서 하드웨어 추가 버튼을 클릭합니다.
  4. 하드웨어 유형 선택

    Hardware type 으로 Storage 를 선택합니다.

    그림 5.1. 새 가상 하드웨어 추가 마법사

    스토리지를 사용하여 새 가상 하드웨어 추가 마법사를 하드웨어 유형으로 선택합니다.
  5. 스토리지 장치 및 드라이버를 선택합니다.

    새 디스크 이미지를 생성하거나 스토리지 풀 볼륨을 선택합니다.
    virtio 드라이버를 사용하려면 장치 유형을 Disk 장치 및 Bus 유형을 VirtIO 로 설정합니다.

    그림 5.2. 새 가상 하드웨어 추가 마법사

    Add new virtual hardware wizard Storage 창, "Create a disk image on the computer's hard drive" selected.
    완료 를 클릭하여 절차를 완료합니다.

절차 5.3. virtio 네트워크 드라이버를 사용하여 네트워크 장치 추가

  1. virt-manager 에서 게스트 이름을 두 번 클릭하여 게스트 가상 머신을 엽니다.
  2. 을 클릭하여 가상 하드웨어 세부 정보 표시 탭을 엽니다.
  3. Show virtual hardware details 탭에서 하드웨어 추가 버튼을 클릭합니다.
  4. 하드웨어 유형 선택

    Hardware type 으로 Network 를 선택합니다.

    그림 5.3. 새 가상 하드웨어 추가 마법사

    네트워크를 하드웨어 유형으로 선택한 상태에서 새 가상 하드웨어 추가 마법사
  5. 네트워크 장치 및 드라이버를 선택합니다.

    virtio 드라이버를 사용하려면 장치 모델을 virtio 로 설정합니다. 필요한 호스트 장치를 선택합니다.

    그림 5.4. 새 가상 하드웨어 추가 마법사

    장치 모델이 virtio로 설정된 새 가상 하드웨어 마법사 네트워크 추가 창.
    완료 를 클릭하여 절차를 완료합니다.
새 장치가 모두 추가되면 가상 머신을 재부팅합니다. 가상 머신은 게스트가 재부팅될 때까지 장치를 인식하지 못할 수 있습니다.

5.3. 네트워크 인터페이스 장치에 KVM virtio 드라이버 사용

네트워크 인터페이스가 KVM virtio 드라이버를 사용하는 경우 KVM은 처리 오버헤드를 제거하고 게스트 성능을 향상시킬 수 있는 네트워킹 하드웨어를 에뮬레이션하지 않습니다. Red Hat Enterprise Linux 7에서 virtio는 기본 네트워크 인터페이스 유형으로 사용됩니다. 그러나 시스템에서 이 설정이 다르게 구성된 경우 다음 절차를 사용할 수 있습니다.
  • virtio 네트워크 장치를 게스트에 연결하려면 virsh attach-interface 명령을 model --virtio 옵션과 함께 사용하십시오.
    또는 virt-manager 인터페이스에서 게스트의 가상 하드웨어 세부 정보 화면으로 이동하여 하드웨어 추가 를 클릭합니다. 새 가상 하드웨어 추가 화면에서 Network 를 선택하고 Device modelvirtio 로 변경합니다.
  • 기존 인터페이스의 유형을 virtio 로 변경하려면 virsh edit 명령을 사용하여 원하는 게스트의 XML 구성을 편집하고 모델 유형 속성을 virtio 로 변경합니다. 예를 들면 다음과 같습니다.
      <devices>
        <interface type='network'>
          <source network='default'/>
          <target dev='vnet1'/>
          <model type='virtio'/>
          <driver name='vhost' txmode='iothread' ioeventfd='on' event_idx='off'/>
        </interface>
      </devices>
      ...
    
    또는 virt-manager 인터페이스에서 게스트의 가상 하드웨어 세부 정보 화면으로 이동하여 NIC 항목을 선택하고 장치 모델을 virtio 로 변경합니다.
참고
게스트 내부의 네트워크 인터페이스 이름 지정이 재부팅 후에도 일관되지 않은 경우 게스트에 제공되는 모든 인터페이스가 동일한 장치 모델인 virtio-net 이 되도록 하십시오. 자세한 내용은 Red Hat 지식베이스 를 참조하십시오.

6장. 네트워크 설정

이 장에서는 libvirt 기반 게스트 가상 시스템에서 사용하는 일반적인 네트워킹 구성에 대해 설명합니다.
Red Hat Enterprise Linux 7은 가상화를 위해 다음과 같은 네트워킹 설정을 지원합니다.
  • NAT(네트워크 주소 변환)를 사용하는 가상 네트워크
  • PCI 장치 할당을 사용하여 직접 할당된 물리적 장치
  • PCIe SR-IOV를 사용하여 직접 할당된 가상 기능
  • 브리지 네트워크
NAT, 네트워크 브리징을 활성화하거나, 게스트 가상 시스템의 네트워크 서비스에 대한 외부 호스트가 액세스할 수 있도록 PCI 장치를 직접 할당해야 합니다.

6.1. libvirt를 사용한 NAT(Network Address Translation)

네트워크 연결을 공유하는 가장 일반적인 방법 중 하나는 NAT(Network Address Translation) 전달(가상 네트워크라고도 함)을 사용하는 것입니다.

호스트 설정

모든 표준 libvirt 설치는 기본 가상 네트워크로 가상 머신에 NAT 기반 연결을 제공합니다. virsh net-list --all 명령을 사용하여 사용할 수 있는지 확인합니다.

# virsh net-list --all
Name                 State      Autostart
-----------------------------------------
default              active     yes
이 파일이 누락된 경우 게스트의 XML 구성 파일(예: /etc/libvirtd/qemu/myguest.xml)에서 다음을 사용할 수 있습니다.
# ll /etc/libvirt/qemu/
total 12
drwx------. 3 root root 4096 Nov  7 23:02 networks
-rw-------. 1 root root 2205 Nov 20 01:20 r6.4.xml
-rw-------. 1 root root 2208 Nov  8 03:19 r6.xml
기본 네트워크는 /etc/libvirt/qemu/networks/default.xml에서 정의됩니다.
기본 네트워크가 자동으로 시작되도록 표시합니다.
# virsh net-autostart default
Network default marked as autostarted
기본 네트워크를 시작합니다.
# virsh net-start default
Network default started
libvirt 기본 네트워크가 실행되면 분리된 브리지 장치가 표시됩니다. 이 장치에는 물리적 인터페이스가 추가되지 않습니다. 새 장치는 NAT 및 IP 전달을 사용하여 실제 네트워크에 연결합니다. 새 인터페이스를 추가하지 마십시오.
# brctl show
bridge name     bridge id               STP enabled     interfaces
virbr0          8000.000000000000       yes
libvirtINPUT,FORWARD,OUTPUTPOSTROUTING 체인의 virbr0 장치에 연결된 게스트 가상 머신의 트래픽을 허용하는 iptables 규칙을 추가합니다. libvirtip_forward 매개변수를 활성화합니다. 다른 일부 애플리케이션은 ip_forward 를 비활성화할 수 있으므로 가장 좋은 옵션은 /etc/sysctl.conf 에 다음을 추가하는 것입니다.
 net.ipv4.ip_forward = 1

게스트 가상 머신 구성

호스트 구성이 완료되면 이름을 기반으로 게스트 가상 머신을 가상 네트워크에 연결할 수 있습니다. 게스트를 '기본' 가상 네트워크에 연결하려면 XML 구성 파일(예: /etc/libvirtd/qemu/myguest.xml)에서 게스트를 사용할 수 있습니다.

<interface type='network'>
   <source network='default'/>
</interface>
참고
MAC 주소를 정의하는 것은 선택 사항입니다. 하나를 정의하지 않으면 MAC 주소가 자동으로 생성되고 네트워크에서 사용하는 브리지 장치의 MAC 주소로 사용됩니다. MAC 주소를 수동으로 설정하면 환경 전체에서 일관성 또는 간편한 참조를 유지하거나 충돌 가능성을 매우 적게 방지하는 데 유용할 수 있습니다.
<interface type='network'>
  <source network='default'/>
  <mac address='00:16:3e:1a:b3:4a'/>
</interface>

6.2. vhost-net 비활성화

vhost-net 모듈은 virtio 패킷 처리 작업을 사용자 공간( QEMU 프로세스)에서 이동하고 커널(vhost-net 드라이버)으로 이동하여 가상화 오버헤드를 줄이는 virtio 네트워킹의 커널 수준 백엔드입니다. vhost-net은 virtio 네트워크 인터페이스에만 사용할 수 있습니다. vhost-net 커널 모듈이 로드되면 모든 virtio 인터페이스에 대해 기본적으로 활성화되어 있지만 vhost-net이 사용 중일 때 특정 워크로드가 성능이 저하되는 경우 인터페이스 구성에서 기본적으로 활성화될 수 있습니다.
특히 UDP 트래픽이 호스트 시스템에서 해당 호스트의 게스트 가상 시스템으로 전송되면 게스트 가상 머신이 수신되는 데이터를 호스트 시스템이 전송하는 속도로 처리하면 성능 저하가 발생할 수 있습니다. 이 경우 vhost-net 을 사용하면 UDP 소켓의 수신 버퍼가 더 빠르게 오버플로우되어 패킷이 손실됩니다. 따라서 트래픽 속도가 느려지고 전체 성능을 개선하기 위해 vhost-net 을 비활성화하는 것이 좋습니다.
vhost-net 을 비활성화하려면 게스트 가상 머신의 XML 구성 파일에서 <interface> 하위 요소를 편집하고 다음과 같이 네트워크를 정의합니다.
<interface type="network">
   ...
   <model type="virtio"/>
   <driver name="qemu"/>
   ...
</interface>
드라이버 이름을 qemu 로 설정하면 패킷 처리를 QEMU 사용자 공간으로 강제 비활성화하여 해당 인터페이스에 대해 vhost-net을 효과적으로 비활성화합니다.

6.3. vhost-net zero-copy 활성화

Red Hat Enterprise Linux 7에서 vhost-net zero-copy는 기본적으로 비활성화되어 있습니다. 이 작업을 영구적으로 활성화하려면 다음 콘텐츠를 사용하여 새 파일 vhost-net.conf/etc/modprobe.d 에 추가합니다.
options vhost_net  experimental_zcopytx=1
이 값을 다시 비활성화하려면 다음을 실행합니다.
modprobe -r vhost_net
modprobe vhost_net experimental_zcopytx=0
첫 번째 명령은 이전 파일을 제거하고 두 번째 명령은 새 파일을 만들고 0-copy를 비활성화합니다. 이 값을 사용하여 활성화할 수도 있지만 변경 사항은 영구적으로 적용되지 않습니다.
이 효과가 있는지 확인하려면 cat /sys/module/vhost_net/parameters/experimental_zcopytx 의 출력을 확인합니다. 다음과 같이 표시되어야 합니다.
$ cat /sys/module/vhost_net/parameters/experimental_zcopytx
0

6.4. 브리지 네트워킹

브리지된 네트워킹(네트워크 브리징 또는 가상 네트워크 전환이라고도 함)은 가상 시스템 네트워크 인터페이스를 물리적 인터페이스와 동일한 네트워크에 배치하는 데 사용됩니다. 브릿지에는 최소한의 구성이 필요하며 기존 네트워크에 가상 머신이 표시되므로 관리 오버헤드와 네트워크 복잡성이 줄어듭니다. 브리지에는 몇 가지 구성 요소와 구성 변수가 포함되어 있으므로 필요한 경우 이해하기 쉽고 문제를 해결할 수 있는 투명한 설정을 제공합니다.
브리징은 표준 Red Hat Enterprise Linux 툴, virt-manager 또는 libvirt 를 사용하여 가상화된 환경에서 구성할 수 있으며 다음 섹션에 설명되어 있습니다.
그러나 가상화된 환경에서도 호스트 운영 체제의 네트워킹 툴을 사용하여 브리지를 보다 쉽게 생성할 수 있습니다. 이 브릿지 생성 방법에 대한 자세한 내용은 Red Hat Enterprise Linux 7 네트워킹 가이드 를 참조하십시오.

6.4.1. Red Hat Enterprise Linux 7 호스트에서 브리지 네트워킹 구성

가상화 관리 툴과 관계없이 브릿지된 네트워킹은 Red Hat Enterprise Linux 호스트의 가상 시스템에 맞게 구성할 수 있습니다. 이 구성은 가상화 브리지가 호스트의 유일한 네트워크 인터페이스이거나 호스트의 관리 네트워크 인터페이스인 경우 주로 권장됩니다.
가상화 툴을 사용하지 않고 네트워크 브리징을 구성하는 방법은 Red Hat Enterprise Linux 7 네트워킹 가이드 를 참조하십시오.

6.4.2. 가상 머신 관리자를 사용한 브리지 네트워킹

이 섹션에서는 virt-manager 를 사용하여 호스트 시스템의 인터페이스에서 게스트 가상 머신으로의 브릿지를 생성하는 방법을 설명합니다.
참고
환경에 따라 Red Hat Enterprise Linux 7에서 libvirt 도구를 사용한 브릿지를 설정하려면 Network Manager를 비활성화해야 할 수 있습니다. 이는 Red Hat에서 권장하지 않습니다. 또한 libvirt를 사용하여 만든 브리지는 브리지에서 네트워크 연결을 유지하기 위해 libvirtd를 실행해야 합니다.
브릿지 생성 후 가상 머신 인터페이스를 브리지에 추가하는 동안 Red Hat Enterprise Linux 7 네트워킹 가이드에 설명된 대로 물리적 Red Hat Enterprise Linux 호스트에서 브리지 네트워킹을 구성하는 것이 좋습니다.

절차 6.1. virt-manager를 사용하여 브리지 만들기

  1. virt-manager 메인 메뉴에서 Edit octets Connection Details 를 클릭하여 연결 세부 정보 창을 엽니다.
  2. 네트워크 인터페이스 탭을 클릭합니다.
  3. 창 하단에 있는 + 를 클릭하여 새 네트워크 인터페이스를 구성합니다.
  4. 인터페이스 유형 드롭다운 메뉴에서 브리지 를 선택한 다음 앞으로 를 클릭하여 계속합니다.

    그림 6.1. 브리지 추가

    브리지 추가
    1. 이름 필드에 브리지의 이름을 입력합니다(예: br0 ).
    2. 드롭다운 메뉴에서 시작 모드를 선택합니다. 다음 중 하나를 선택합니다.
      • none - 브리지를 비활성화합니다.
      • ONBOOT - 다음 게스트 가상 머신 재부팅 시 브리지를 활성화합니다.
      • 핫플러그 - 게스트 가상 머신이 실행 중인 경우에도 브릿지를 활성화합니다.
    3. 이제 활성화 확인란을 선택하여 브릿지를 즉시 활성화합니다.
    4. IP 설정 또는 브리지 설정을 구성하려면 적절한 Configure (구성) 버튼을 클릭합니다. 필요한 설정을 지정하기 위해 별도의 창이 열립니다. 필요한 사항을 변경하고 완료되면 확인 을 클릭합니다.
    5. 가상 머신에 연결할 실제 인터페이스를 선택합니다. 인터페이스가 현재 다른 게스트 가상 머신에서 사용 중인 경우 경고 메시지가 표시됩니다.
  5. 완료 를 클릭하고 마법사가 닫히고 연결 메뉴로 돌아갑니다.

    그림 6.2. 브리지 추가

    브리지 추가
사용할 브리지를 선택하고 적용을 클릭하여 마법사를 종료합니다.
인터페이스를 중지하려면 중지 인터페이스 키를 클릭합니다. 브리지가 중지되면 인터페이스를 삭제하려면 Delete Interface (인터페이스 삭제) 키를 클릭합니다.

6.4.3. libvirt를 사용한 브리지 네트워킹

환경에 따라 Red Hat Enterprise Linux 7에서 libvirt를 사용한 브릿지를 설정하려면 Network Manager를 비활성화해야 할 수 있습니다. 이는 Red Hat에서 권장하지 않습니다. 또한 브리지가 작동하기 위해 libvirtd를 실행해야 합니다.
Red Hat Enterprise Linux 7 네트워킹 가이드에 설명된 대로 물리적 Red Hat Enterprise Linux 호스트에서 브리지 네트워킹을 구성하는 것이 좋습니다.
중요
libvirt는 새로운 커널 튜닝 가능 매개 변수를 활용하여 호스트 FDB( bridge forwarding 데이터베이스) 항목을 관리하여 여러 가상 머신을 브리징할 때 시스템 네트워크 성능을 향상시킬 수 있습니다. 네트워크 <bridge> 요소의 macTableManager 속성을 호스트의 XML 구성 파일에서 'libvirt' 로 설정합니다.
<bridge name='br0' macTableManager='libvirt'/>
이렇게 하면 모든 브리지 포트에서 학습 모드가 해제되고 libvirt는 필요에 따라 FDB에 항목을 추가하거나 제거합니다. MAC 주소에 대한 적절한 전달 포트를 학습하는 오버헤드를 제거하는 것과 함께 커널은 네트워크에 브리지를 연결하는 물리적 장치에서 무차별 모드를 비활성화하여 오버헤드를 추가로 줄일 수 있습니다.

7장. KVM을 사용하여 오버 커밋

7.1. 소개

KVM 하이퍼바이저는 CPU 및 메모리를 자동으로 오버 커밋합니다. 즉, 시스템에 실제 리소스가 있는 것보다 더 많은 가상화된 CPU와 메모리를 가상 머신에 할당할 수 있습니다. 대부분의 프로세스는 항상 할당된 리소스의 100%에 액세스하지 않기 때문에 가능합니다.
그 결과 활용도가 낮은 가상화 서버 또는 데스크탑을 통해 더 적은 수의 호스트에서 실행할 수 있으므로 서버 하드웨어에 전력, 밸런싱 및 투자가 적은 순으로 시스템 리소스를 절약할 수 있습니다.

7.2. 메모리 과다 할당

KVM 하이퍼바이저에서 실행되는 게스트 가상 머신에는 전용 물리적 RAM 블록이 할당되어 있지 않습니다. 대신 각 게스트 가상 머신은 요청된 경우에만 호스트의 물리적 머신의 Linux 커널이 메모리를 할당하는 Linux 프로세스로 작동합니다. 또한 호스트의 메모리 관리자는 게스트 가상 시스템의 메모리를 자체 실제 메모리와 스왑 공간 간에 이동할 수 있습니다.
오버 커밋을 수행하려면 호스트 물리적 머신에서 모든 게스트 가상 머신을 수용할 수 있을 뿐만 아니라 호스트 물리적 머신의 프로세스를 위한 충분한 메모리가 필요합니다. 기본 규칙으로 호스트 물리적 시스템의 운영 체제에는 최소 4GB의 스왑 공간과 함께 최대 4GB의 메모리가 필요합니다. 스왑 파티션에 적절한 크기를 결정하는 방법에 대한 고급 지침은 Red Hat 지식베이스 를 참조하십시오.
중요
과다 할당은 일반 메모리 문제에 대한 이상적인 솔루션이 아닙니다. 메모리 부족을 처리하는 권장 방법은 게스트당 더 적은 메모리를 할당하고 호스트에 실제 메모리를 추가하거나 스왑 공간을 사용하는 것입니다.
자주 스왑하면 가상 머신이 느리게 실행됩니다. 또한 오버 커밋으로 인해 시스템이 OOM(메모리 부족)이 발생하여 Linux 커널이 중요한 시스템 프로세스를 종료할 수 있습니다. 메모리를 과다 할당하려면 충분한 테스트를 수행해야 합니다. 과다 할당에 대한 도움이 필요하면 Red Hat 지원에 문의하십시오.
오버 커밋은 모든 가상 머신에서 작동하지 않지만 사용량이 가장 적게 사용하거나 KSM을 사용하여 동일한 게스트를 실행하는 데스크탑 가상화 설정에서 작동하는 것으로 확인되었습니다. KSM 및 오버 커밋에 대한 자세한 내용은 Red Hat Enterprise Linux 7 Virtualization 튜닝 및 최적화 가이드 를 참조하십시오.
중요
장치 할당에서는 메모리 과다 할당이 지원되지 않습니다. 이는 장치 할당 이 사용 중인 경우 할당된 장치를 사용하여 직접 메모리 액세스(DMA)를 활성화하려면 모든 가상 머신 메모리를 정적으로 사전 할당해야 하기 때문입니다.

7.3. 가상화된 CPU 과다 할당

KVM 하이퍼바이저는 가상화된 CPU(vCPU) 오버 커밋을 지원합니다. 가상화된 CPU는 게스트 가상 머신의 부하 제한을 허용하는 한 오버 커밋할 수 있습니다. vCPU를 오버 커밋할 때 주의를 기울여서 100%로 로드하면 요청이 떨어지거나 응답 시간을 사용할 수 없게 될 수 있습니다.
Red Hat Enterprise Linux 7에서는 SMP(대칭 멀티 처리) 가상 머신이라는 vCPU를 사용하여 게스트를 과다 할당할 수 있습니다. 그러나 실제 CPU에 있는 것보다 가상 머신에서 더 많은 코어를 실행하는 경우 성능 저하가 발생할 수 있습니다.
예를 들어 4개의 vCPU가 있는 가상 시스템을 듀얼 코어 프로세서가 있는 호스트 시스템에서 실행할 수 있지만 쿼드 코어 호스트에서는 실행할 수 있습니다. 물리적 처리 코어 수를 초과 커밋하면 필요한 것보다 적은 CPU 시간이 단축된 프로그램으로 인해 성능이 저하됩니다. 또한 물리적 프로세서 코어당 총 10개의 vCPU가 할당된 것은 권장되지 않습니다.
databind 게스트를 사용하면 일부 처리 오버헤드가 고유합니다. 게스트에 리소스를 할당하기 위해 시간 복제를 사용하면 게스트 내부의 CPU 간 통신 속도가 느려질 수 있으므로 CPU 오버 커밋을 통해 NetNamespace 오버헤드가 증가할 수 있습니다. vCPU 수 또는 과다 할당 비율이 많은 게스트로 이러한 오버헤드가 증가합니다.
단일 호스트에 여러 개의 게스트가 있는 경우 가상화된 CPU가 가장 적합하며, 각 게스트에는 호스트 CPU 수에 비해 적은 수의 vCPU가 있습니다. KVM은 5개의 vCPU(가상 시스템 5개)에서 단일 호스트당 하나의 물리적 CPU로 100% 미만의 로드를 안전하게 지원하는 게스트를 지원해야 합니다. KVM 하이퍼바이저는 모든 가상 머신 간에 전환하여 부하가 균형을 유지합니다.
최상의 성능을 위해 Red Hat은 각 게스트 내에 있는 프로그램을 실행하는 데 필요한 vCPU 수만큼만 게스트를 할당할 것을 권장합니다.
중요
메모리 100 % 또는 처리 리소스를 사용하는 애플리케이션은 과다 할당 환경에서 불안정해질 수 있습니다. CPU 과다 할당 비율과 FlexVolume의 양은 작업 부하에 따라 다르기 때문에 광범위한 테스트없이 프로덕션 환경에서 메모리 또는 CPU를 과다 할당하지 마십시오.

8장. KVM 게스트 타이밍 관리

가상화는 게스트 가상 머신의 유지 시간에 대한 몇 가지 문제가 발생합니다.
  • 인터럽트는 항상 동시에 그리고 모든 게스트 가상 머신에 즉시 전달될 수 없습니다. 이는 가상 머신의 인터럽트가 실제 인터럽트가 아니기 때문입니다. 대신 호스트 시스템에 의해 게스트 가상 머신에 삽입됩니다.
  • 호스트는 다른 게스트 가상 머신을 실행하거나 다른 프로세스를 실행할 수 있습니다. 따라서 일반적으로 인터럽트에 필요한 정확한 타이밍이 항상 가능한 것은 아닙니다.
정확한 시간 유지 없이 게스트 가상 머신은 세션 유효성, 마이그레이션 및 기타 네트워크 활동에 대한 타임스탬프가 정확하므로 네트워크 애플리케이션 및 프로세스에 문제가 발생할 수 있습니다.
KVM은 게스트 가상 머신에 반가상화 클럭(kvm-clock)을 제공하여 이러한 문제를 방지합니다. 그러나 게스트 마이그레이션과 같은 부정확성을 유지하는 시간에 의해 영향을 받을 수 있는 활동을 시도하기 전에 타이밍을 테스트하는 것은 여전히 중요합니다.
중요
위에 설명된 문제를 방지하려면 호스트와 게스트 가상 시스템에서 NTP(Network Time Protocol)를 구성해야 합니다. Red Hat Enterprise Linux 6 및 이전 버전을 사용하는 게스트의 경우 NTP는 ntpd 서비스에 의해 구현됩니다. 자세한 내용은 Red Hat Enterprise 6 배포 가이드 를 참조하십시오.
Red Hat Enterprise Linux 7을 사용하는 시스템에서는 ntpd 또는 chronyd 서비스에서 NTP 시간 동기화 서비스를 제공할 수 있습니다. Chrony는 가상 머신에는 몇 가지 장점이 있습니다. 자세한 내용은 Red Hat Enterprise Linux 7 시스템 관리자 가이드 의 chrony Suite 를 사용한 NTP 구성 및 NTP 사용 ntpd 섹션을 참조하십시오.

게스트 가상 머신 시간 동기화의 메커니즘

기본적으로 게스트는 다음과 같이 하이퍼바이저와 시간을 동기화합니다.

  • 게스트 시스템이 부팅되면 게스트가 에뮬레이션된 실시간 Clock(RTC)에서 시간을 읽습니다.
  • NTP 프로토콜이 시작되면 게스트 클럭을 자동으로 동기화합니다. 이후 일반 게스트 작동 중에 NTP는 게스트에서 클럭 조정을 수행합니다.
  • 일시 중지 또는 복원 프로세스 후 게스트를 다시 시작하면 게스트 시계를 지정된 값과 동기화하는 명령이 관리 소프트웨어(예: virt-manager)에서 발행해야 합니다. 이 동기화는 QEMU 게스트 에이전트 가 게스트에 설치되어 해당 기능을 지원하는 경우에만 작동합니다. 게스트 클럭이 동기화하는 값은 일반적으로 호스트 클럭 값입니다.

고정 TSC (Time Stamp Boost)

최신 Intel 및 AMD CPU는 고정 TSC(Time Stamp counter)를 제공합니다. CPU 코어 자체 변경 빈도(예: 전력 절감 정책 준수)의 개수 빈도는 다릅니다. TSC가 연속된 TSC가 있는 CPU는 KVM 게스트의 클럭 소스로 사용하기 위해 필요합니다.

constant_tsc 플래그가 있는 경우 CPU에는 고정 TSC가 있습니다. CPU에 constant_tsc 플래그가 있는지 확인하려면 다음 명령을 입력합니다.
$ cat /proc/cpuinfo | grep constant_tsc
출력을 지정하면 CPU에 constant_tsc bit가 있습니다. 출력을 지정하지 않으면 아래 지침을 따릅니다.

Constant TSC를 사용하지 않고 호스트 구성

일정한 TSC 빈도가 없는 시스템은 TSC를 가상 머신의 클럭 소스로 사용할 수 없으며 추가 구성이 필요합니다. 전원 관리 기능은 정확한 시간 유지를 방해하고 게스트 가상 머신이 KVM을 사용하여 시간을 정확하게 유지하려면 비활성화해야 합니다.

중요
이 지침은 AMD 버전 F CPU에만 적용됩니다.
CPU에 constant_tsc 비트가 없는 경우 모든 전원 관리 기능 을 비활성화합니다. 각 시스템에는 시간을 유지하기 위해 사용하는 여러 타이머가 있습니다. TSC는 호스트에서 안정적이지 않으며, cpufreq 변경, 깊이 C 상태 또는 더 빠른 TSC를 사용하는 호스트로의 마이그레이션으로 인해 발생하는 경우가 있습니다. 딥 C 절전 상태는 TSC를 중지할 수 있습니다. 커널이 딥 C 상태를 사용하는 것을 방지하기 위해 커널 부팅에 processor.max_cstate=1 을 추가합니다. 이 변경 사항을 영구적으로 변경하려면 /etc/default/grub파일에서 GRUB_CMDLINE_LINUX 키 값을 편집합니다. 예를 들어 각 부팅마다 긴급 모드를 활성화하려면 다음과 같이 항목을 편집합니다.
GRUB_CMDLINE_LINUX="emergency"
GRUB 2 부팅 메뉴에 매개 변수를 추가하는 것과 유사하게 GRUB_CMDLINE_LINUX 키에 대해 여러 매개변수를 지정할 수 있습니다.
cpufreq 를 비활성화하려면 ( constant_tsc없이 호스트에만 필요) kernel-tools 를 설치하고 cpupower.service (systemctl enable cpupower.service)를 활성화합니다. 게스트 가상 머신이 부팅될 때마다 이 서비스를 비활성화하려면 /etc/sysconfig/cpupower 에서 구성 파일을 변경하고 CPUPOWER_START_OPTS 및 CPUPOWER_STOP_OPTS 를 변경합니다. 유효한 제한은 /sys/devices/system/cpu/cpuid/cpufreq/scaling_available_governors 파일에서 확인할 수 있습니다. 이 패키지 또는 전원 관리 및 관리자에 대한 자세한 내용은 Red Hat Enterprise Linux 7 전원 관리 가이드 를 참조하십시오.

8.1. 호스트 전체 시간 동기화

KVM 게스트의 가상 네트워크 장치는 하드웨어 타임스탬프를 지원하지 않으므로 NTP 또는 PTP와 같은 네트워크 프로토콜을 사용하는 게스트의 클럭을 10초보다 더 나은 정확도로 동기화하기가 어렵습니다.
게스트의 보다 정확한 동기화가 필요한 경우 NTP 또는 PTP를 사용하여 호스트의 클럭을 하드웨어 타임스탬프와 동기화하고 게스트를 호스트에 직접 동기화하는 것이 좋습니다. Red Hat Enterprise Linux 7.5 이상에서는 게스트가 마이크로초 정확도와 호스트를 동기화할 수 있는 가상 PTP 하드웨어 클럭 (PHC)을 제공합니다.
중요
EgressIPC가 제대로 작동하려면 호스트와 게스트 모두 RHEL 7.5 이상을 운영 체제 (OS)로 사용해야 합니다.
EgressIPC 장치를 활성화하려면 게스트 OS에서 다음을 수행하십시오.
  1. 재부팅 후 로드하도록 ptp_kvm 모듈을 설정합니다.
    # echo ptp_kvm > /etc/modules-load.d/ptp_kvm.conf
  2. /dev/ptp0 시계를 chrony 구성에 대한 참조로 추가합니다.
    # echo "refclock PHC /dev/ptp0 poll 2" >> /etc/chrony.conf
  3. chrony 데몬을 다시 시작하십시오.
    # systemctl restart chronyd
  4. 호스트 게스트 시간 동기화가 올바르게 구성되었는지 확인하려면 게스트에서 chronyc sources 명령을 사용합니다. 출력은 다음과 유사해야 합니다.
    # chronyc sources
    210 Number of sources = 1
    MS Name/IP address         Stratum Poll Reach LastRx Last sample
    ===============================================================================
    #* PHC0                          0   2   377     4     -6ns[   -6ns] +/-  726ns
    

8.2. Red Hat Enterprise Linux 게스트에 필요한 시간 관리 매개 변수

특정 Red Hat Enterprise Linux 게스트 가상 시스템의 경우 시스템 시간을 올바르게 동기화하는 데 추가 커널 매개변수가 필요합니다. 이러한 매개변수는 게스트 가상 머신의 /etc/grub2.cfg 파일에서 /kernel 행의 끝에 추가하여 설정할 수 있습니다.
참고
Red Hat Enterprise Linux 5.5 이상, Red Hat Enterprise Linux 6.0 이상 및 Red Hat Enterprise Linux 7은 kvm-clock 을 기본 클럭 소스로 사용합니다. kvm-clock 을 실행하면 추가 커널 매개변수가 필요하지 않으며 Red Hat에서 사용하는 것이 좋습니다.
아래 표에는 Red Hat Enterprise Linux 버전 및 지정된 시스템에 필요한 매개 변수가 나열되어 있습니다.

표 8.1. 커널 매개변수 요구사항

Red Hat Enterprise Linux 버전 추가 게스트 커널 매개변수
kvm-clock이 있는 AMD64 및 Intel 64 시스템에서 7.0 이상 추가 매개변수가 필요하지 않음
kvm-clock이 있는 AMD64 및 Intel 64 시스템에서 6.1 이상 추가 매개변수가 필요하지 않음
kvm-clock이 있는 AMD64 및 Intel 64 시스템의 6.0 추가 매개변수가 필요하지 않음
kvm-clock이 없는 AMD64 및 Intel 64 시스템에서 6.0 notsc lpj=n
참고
lpj 매개 변수에는 게스트 가상 머신이 실행되는 특정 CPU의 jiffy 값에 해당하는 숫자 값이 필요합니다. 이 값을 모르는 경우 lpj 매개변수를 설정하지 마십시오.

8.3. 느슨한 시간 계산

스틸 타임은 호스트에서 제공하지 않는 게스트 가상 머신에 필요한 CPU 시간입니다. 스틸 타임은 호스트가 이러한 리소스를 다른 게스트로 할당할 때 발생합니다.
스틸 타임은 /proc/stat 의 CPU 시간 필드에 보고됩니다. topvmstat 와 같은 유틸리티에 의해 자동으로 보고됩니다. "%st" 또는 "st" 열에 표시됩니다. 해제할 수 없습니다.
많은 양의 스틸 타임은 CPU 경합을 나타내며 이로 인해 게스트 성능이 저하될 수 있습니다. CPU 경합을 완화하려면 게스트의 CPU 우선 순위 또는 CPU 할당량을 늘리거나 호스트에서 더 적은 수의 게스트를 실행합니다.

9장. libvirt를 사용하여 네트워크 부팅

게스트 가상 머신은 PXE가 활성화된 상태에서 부팅할 수 있습니다. PXE를 사용하면 게스트 가상 머신이 네트워크 자체에서 구성을 부팅 및 로드할 수 있습니다. 이 섹션에서는 libvirt를 사용하여 PXE 게스트를 구성하는 몇 가지 기본 설정 단계를 보여줍니다.
이 섹션에서는 부팅 이미지 또는 PXE 서버 생성을 다루지 않습니다. PXE 부팅이 활성화된 게스트 가상 머신을 부팅하기 위해 사설 또는 브리지된 네트워크에서 libvirt를 구성하는 방법을 설명하는 데 사용됩니다.
주의
이러한 절차는 예제로만 제공됩니다. 진행하기 전에 충분한 백업이 있는지 확인하십시오.

9.1. 부팅 서버 준비

이 장의 단계를 수행하려면 다음이 필요합니다.
  • PXE 서버(DHCP 및 TFTP) - libvirt 내부 서버, 수동으로 구성된 dhcpd 및 tftpd, dnsmasq, Co#150r 또는 기타 다른 서버일 수 있습니다.
  • 부팅 이미지 - 예를 들어 수동으로 또는 Co1.8.0r에 의해 구성된 PXELINUX입니다.

9.1.1. 프라이빗 libvirt 네트워크에서 PXE 부팅 서버 설정

이 예에서는 default 네트워크를 사용합니다. 다음 단계를 수행합니다.

절차 9.1. PXE 부팅 서버 구성

  1. PXE 부팅 이미지와 구성을 /var/lib/tftpboot 에 배치합니다.
  2. 다음 명령을 입력합니다.
    # virsh net-destroy default
    # virsh net-edit default
  3. 적절한 주소, 네트워크 마스크, DHCP 주소 범위 및 부팅 파일을 포함하도록 기본 네트워크의 구성 파일의 <ip> 요소를 편집합니다. 여기서 BOOT_FILENAME 은 게스트 가상 머신을 부팅하는 데 사용하는 파일 이름을 나타냅니다.
    <ip address='192.168.122.1' netmask='255.255.255.0'>
       <tftp root='/var/lib/tftpboot' />
       <dhcp>
          <range start='192.168.122.2' end='192.168.122.254' />
          <bootp file='BOOT_FILENAME' />
       </dhcp>
    </ip>
  4. 다음을 실행합니다.
    # virsh net-start default
  5. PXE를 사용하여 게스트를 부팅합니다( 9.2절. “PXE를 사용하여 게스트 부팅”참조).

9.2. PXE를 사용하여 게스트 부팅

이 섹션에서는 PXE를 사용하여 게스트 가상 머신을 부팅하는 방법을 설명합니다.

9.2.1. 브리지 네트워킹 사용

절차 9.2. PXE 및 브리지 네트워킹을 사용하여 게스트 부팅

  1. 네트워크에서 PXE 부팅 서버를 사용할 수 있도록 브리징이 활성화되었는지 확인합니다.
  2. PXE 부팅이 활성화된 게스트 가상 머신을 부팅합니다. virt-install 명령을 사용하여 다음 예제 명령에 표시된 대로 PXE 부팅이 활성화된 새 가상 머신을 생성할 수 있습니다.
    virt-install --pxe --network bridge=breth0 --prompt
    또는 다음 예와 같이 게스트 네트워크가 브리지 네트워크를 사용하도록 구성되어 있고 XML 게스트 구성 파일에 <os> 요소 내에 <boot dev='network'/> 요소가 있는지 확인합니다.
    <os>
       <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
       <boot dev='network'/>
       <boot dev='hd'/>
    </os>
    <interface type='bridge'>
       <mac address='52:54:00:5a:ad:cb'/>
       <source bridge='breth0'/>
       <target dev='vnet0'/>
       <alias name='net0'/>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>

9.2.2. 개인 libvirt 네트워크 사용

절차 9.3. 사설 libvirt 네트워크 사용

  1. 9.1.1절. “프라이빗 libvirt 네트워크에서 PXE 부팅 서버 설정” 에 표시된 대로 libvirt에서 PXE 부팅을 구성합니다.
  2. PXE 부팅이 활성화된 libvirt를 사용하여 게스트 가상 머신을 부팅합니다. virt-install 명령을 사용하여 PXE를 사용하여 새 가상 머신을 생성/설치할 수 있습니다.
    virt-install --pxe --network network=default --prompt
또는 다음 예와 같이 게스트 네트워크가 개인 libvirt 네트워크를 사용하도록 구성되어 있고 XML 게스트 구성 파일에 <os> 요소 내에 <boot dev='network'/> 요소가 있는지 확인합니다.
<os>
   <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
   <boot dev='network'/>
   <boot dev='hd'/>
</os>
또한 게스트 가상 머신이 사설 네트워크에 연결되어 있는지 확인합니다.
<interface type='network'>
   <mac address='52:54:00:66:79:14'/>
   <source network='default'/>
   <target dev='vnet0'/>
   <alias name='net0'/>
   <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>

10장. Hypervisor 및 가상 머신 등록

Red Hat Enterprise Linux 6 및 7은 모든 게스트 가상 시스템이 특정 하이퍼바이저에 매핑되어 모든 게스트가 동일한 수준의 서브스크립션 서비스를 할당해야 합니다. 이렇게 하려면 설치 및 등록된 각 KVM 하이퍼바이저에 모든 게스트 가상 머신(VM)을 자동으로 감지하는 서브스크립션 에이전트를 설치해야 하며 이로 인해 호스트에 있는 매핑 파일이 생성됩니다. 이 매핑 파일을 사용하면 모든 게스트 VM이 다음과 같은 이점을 얻을 수 있습니다.
  • 가상 시스템과 관련된 서브스크립션은 쉽게 사용할 수 있으며 모든 관련 게스트 VM에 적용할 수 있습니다.
  • 하이퍼바이저에서 상속할 수 있는 모든 서브스크립션 이점을 즉시 사용할 수 있으며 모든 게스트 VM에 적용할 수 있습니다.
참고
이 장에 제공된 정보는 Red Hat Enterprise Linux 서브스크립션에만 적용됩니다. Red Hat Virtualization 서브스크립션 또는 Red Hat Satellite 서브스크립션도 있는 경우 해당 서브스크립션을 통해 제공되는 virt-who 정보를 참조하십시오. Red Hat 서브스크립션 관리에 대한 자세한 내용은 고객 포털에 있는 Red Hat 서브스크립션 관리 가이드를 참조하십시오.

10.1. 호스트 물리적 시스템에 virt-who 설치

  1. KVM 하이퍼바이저 등록

    터미널에서 subscription-manager register [options] 명령을 호스트 물리적 시스템에서 root 사용자로 실행하여 KVM Hypervisor를 등록합니다. # subscription-manager register --help 메뉴를 사용하여 더 많은 옵션을 사용할 수 있습니다. 사용자 이름 및 암호를 사용하는 경우 Subscription Manager 애플리케이션에 알려진 자격 증명을 사용합니다. 가입이 처음이고 사용자 계정이 없는 경우 고객 지원에 문의하십시오. 예를 들어 'secret'을 암호로 사용하여 'admin'으로 VM을 등록하는 경우 다음 명령을 보냅니다.
    [root@rhel-server ~]# subscription-manager register --username=admin --password=secret --auto-attach
  2. virt-who 패키지 설치

    호스트 물리적 시스템에서 다음 명령을 실행하여 virt-who 패키지를 설치합니다.
    # yum install virt-who
  3. virt-who 설정 파일 만들기

    각 하이퍼바이저에 대해 /etc/virt-who.d/ 디렉터리에 구성 파일을 추가합니다. 최소한 파일에 다음 스니펫이 포함되어야 합니다.
    [libvirt]
    type=libvirt
    
    virt-who 구성에 대한 자세한 내용은 10.1.1절. “virt-who구성” 을 참조하십시오.
  4. virt-who 서비스 시작

    호스트 물리적 머신에서 다음 명령을 실행하여 virt-who 서비스를 시작합니다.
    # systemctl start virt-who.service
    # systemctl enable virt-who.service
  5. virt-who 서비스가 게스트 정보를 수신하는지 확인

    이 시점에서 virt-who 서비스는 호스트에서 도메인 목록을 수집하기 시작합니다. 호스트 물리적 시스템의 /var/log/rhsm/rhsm.log 파일을 확인하여 파일에 게스트 VM 목록이 포함되어 있는지 확인합니다. 예를 들면 다음과 같습니다.
    2015-05-28 12:33:31,424 DEBUG: Libvirt domains found: [{'guestId': '58d59128-cfbb-4f2c-93de-230307db2ce0', 'attributes': {'active': 0, 'virtWhoType': 'libvirt', 'hypervisorType': 'QEMU'}, 'state': 5}]
    

절차 10.1. 고객 포털에서 서브스크립션 관리

  1. 하이퍼바이저 구독

    가상 머신에서 하이퍼바이저와 동일한 서브스크립션 이점을 받을 예정이므로 하이퍼바이저에 유효한 서브스크립션이 있고 VM을 사용할 수 있는 서브스크립션이 있어야 합니다.
    1. 고객 포털에 로그인합니다.

      Red Hat 고객 포털에서 Red Hat 계정 자격 증명을 제공하여 로그인합니다.
    2. 시스템 링크를 클릭합니다.

      내 서브스크립션 인터페이스의 시스템 섹션으로 이동합니다.
    3. 하이퍼바이저 선택

      시스템 페이지에는 모든 서브스크립션 시스템의 테이블이 있습니다. 하이퍼바이저 이름(예: localhost.localdomain)을 클릭합니다. 열리는 세부 정보 페이지에서 서브스크립션 연결을 클릭하고 나열된 모든 서브스크립션을 선택합니다. Attach Selected 를 클릭합니다. 그러면 게스트가 서브스크립션의 이점을 누릴 수 있도록 호스트의 물리적 서브스크립션이 하이퍼바이저에 연결됩니다.
  2. 게스트 가상 머신 구독 - 처음 사용

    이 단계는 새 서브스크립션이 있고 이전에 게스트 가상 시스템을 서브스크립션하지 않은 사용자를 위한 것입니다. 가상 머신을 추가하는 경우 이 단계를 건너뜁니다. virt-who 서비스를 실행하는 시스템의 하이퍼바이저 프로필에 할당된 서브스크립션을 사용하려면 게스트 가상 머신의 터미널에서 다음 명령을 실행하여 자동으로 등록합니다.
    [root@virt-who ~]# subscription-manager attach --auto
  3. 추가 게스트 가상 머신 구독

    가상 시스템을 처음 서브스크립션한 경우 이 단계를 건너뜁니다. 가상 머신을 추가하는 경우 이 명령을 실행하면 동일한 서브스크립션을 게스트 가상 머신에 다시 연결할 필요가 없습니다. 이는 모든 서브스크립션을 제거하면 자동 연결을 통해 지정된 게스트 가상 시스템에 필요한 항목을 확인할 수 있으므로 이전과 다른 서브스크립션이 사용되기 때문입니다. 시스템에 영향을 미치지 않을 수도 있지만 알아야 할 사항입니다. 아래에 설명되지 않은 가상 머신을 연결하는 데 수동 연결 절차를 사용한 경우 자동 연결이 작동하지 않으므로 해당 가상 머신을 수동으로 다시 연결해야 합니다. 다음 명령을 사용하여 이전 게스트의 서브스크립션을 먼저 제거한 다음 자동 연결을 사용하여 모든 게스트에 서브스크립션을 연결합니다. 게스트 가상 머신에서 다음 명령을 실행합니다.
    [root@virt-who ~]# subscription-manager remove --all
    [root@virt-who ~]# subscription-manager attach --auto
  4. 서브스크립션이 연결되었는지 확인

    게스트 가상 머신에서 다음 명령을 실행하여 서브스크립션이 하이퍼바이저에 연결되어 있는지 확인합니다.
    [root@virt-who ~]# subscription-manager list --consumed
    다음과 유사한 출력이 표시됩니다. 서브스크립션 세부 정보에 주의하십시오. '서브스크립션이 현재 상태'이라고 합니다.
    [root@virt-who ~]# subscription-manager list --consumed
    +-------------------------------------------+
       Consumed Subscriptions
    +-------------------------------------------+
    Subscription Name:	Awesome OS with unlimited virtual guests
    Provides: 		Awesome OS Server Bits
    SKU: 			awesomeos-virt-unlimited
    Contract: 		0
    Account: 		######### Your account number #####
    Serial: 		######### Your serial number ######
    Pool ID: 		XYZ123
    Provides Management: 	No
    Active: 		True
    Quantity Used: 		1
    Service Level:
    Service Type:
    Status Details:		Subscription is current
    Subscription Type:
    Starts: 		01/01/2015
    Ends: 			12/31/2015
    System Type: 		Virtual
    
    ???
    The ID for the subscription to attach to the system is displayed here. You will need this ID if you need to attach the subscription manually.
    ???
    Indicates if your subscription is current. If your subscription is not current, an error message appears. One example is Guest has not been reported on any host and is using a temporary unmapped guest subscription. In this case the guest needs to be subscribed. In other cases, use the information as indicated in 10.5.2절. “서브스크립션 상태 오류가 발생했습니다. 어떻게 해야 합니까?”.
  5. 추가 게스트 등록

    하이퍼바이저에 새 게스트 VM을 설치하는 경우 게스트 가상 머신에서 다음 명령을 실행하여 새 VM을 등록하고 하이퍼바이저에 연결된 서브스크립션을 사용해야 합니다.
    # subscription-manager register
    # subscription-manager attach --auto
    # subscription-manager list --consumed

10.1.1. virt-who구성

virt-who 서비스는 다음 파일을 사용하여 구성됩니다.
  • /etc/virt-who.conf - 연결된 하이퍼바이저의 변경 여부를 확인하는 간격을 포함하여 일반 설정 정보가 포함되어 있습니다.
  • /etc/virt-who.d/hypervisor_name.conf - 특정 하이퍼바이저에 대한 구성 정보가 포함됩니다.
하이퍼바이저 구성 파일과 virt-who.conf 에 필요한 스니펫을 생성하는 웹 기반 마법사가 제공됩니다. 마법사를 실행하려면 고객 포털에서 Red Hat Virtualization Agent(virt-who) 구성 도우미를 찾습니다.
마법사의 두 번째 페이지에서 다음 옵션을 선택합니다.
  • virt-who 보고는 어디에 있습니까?: Subscription Asset Manager
  • 하이퍼바이저 유형:libvirt
마법사를 따라 구성을 완료합니다.Follow the wizard to complete the configuration. 구성이 올바르게 수행되는 경우 virt-who 는 지정된 하이퍼바이저의 기존 및 향후 게스트에 선택한 서브스크립션을 자동으로 제공합니다.
하이퍼바이저 구성 파일에 대한 자세한 내용은 virt-who-config 매뉴얼 페이지를 참조하십시오.

10.2. 새 게스트 가상 머신 등록

이미 등록되어 실행 중인 호스트에서 새 게스트 가상 머신을 생성해야 하는 경우 virt-who 서비스도 실행해야 합니다. 이렇게 하면 virt-who 서비스가 게스트를 하이퍼바이저에 매핑할 수 있으므로 시스템이 가상 시스템으로 올바르게 등록됩니다. 가상 머신을 등록하려면 다음 명령을 입력합니다.
[root@virt-server ~]# subscription-manager register --username=admin --password=secret --auto-attach

10.3. 게스트 가상 머신 제거

게스트 가상 머신이 실행 중인 경우 게스트에서 터미널 창에서 다음 명령을 루트로 실행하여 시스템 등록을 해제합니다.
[root@virt-guest ~]# subscription-manager unregister
그러나 시스템이 삭제되면 가상 서비스에서 서비스가 삭제되거나 일시 중지되었는지 여부를 알 수 없습니다. 이 경우 다음 단계를 사용하여 서버 측에서 시스템을 수동으로 제거해야 합니다.
  1. 서브스크립션 관리자에 로그인

    서브스크립션 관리자는 Red Hat 고객 포털에 있습니다. 화면 상단에 있는 로그인 아이콘을 클릭하여 사용자 이름 및 암호를 사용하여 고객 포털에 로그인합니다.
  2. 서브스크립션 탭을 클릭합니다.

    서브스크립션 탭을 클릭합니다.
  3. 시스템 링크를 클릭합니다.

    페이지를 아래로 스크롤하여 Systems 링크를 클릭합니다.
  4. 시스템 삭제

    시스템 프로필을 삭제하려면 테이블에서 지정된 시스템의 프로필을 찾고 이름 옆에 있는 확인란을 선택하고 삭제를 클릭합니다.

10.4. virt-who 수동 설치

이 섹션에서는 하이퍼바이저에서 제공하는 서브스크립션을 수동으로 연결하는 방법을 설명합니다.

절차 10.2. 서브스크립션을 수동으로 연결하는 방법

  1. 서브스크립션 정보 나열 및 풀 ID 찾기

    먼저 가상 유형의 사용 가능한 서브스크립션을 나열해야 합니다. 다음 명령을 실행합니다.
    [root@server1 ~]# subscription-manager list --avail --match-installed | grep 'Virtual' -B12
    Subscription Name: Red Hat Enterprise Linux ES (Basic for Virtualization)
    Provides:          Red Hat Beta
                       Oracle Java (for RHEL Server)
                       Red Hat Enterprise Linux Server
    SKU:               -------
    Pool ID:           XYZ123
    Available:         40
    Suggested:         1
    Service Level:     Basic
    Service Type:      L1-L3
    Multi-Entitlement: No
    Ends:              01/02/2017
    System Type:       Virtual
    
    표시된 풀 ID를 확인합니다. 다음 단계에서 필요하므로 이 ID를 복사합니다.
  2. 풀 ID로 서브스크립션 연결

    이전 단계에서 복사한 Pool ID를 사용하여 attach 명령을 실행합니다. Pool ID XYZ123 을 검색한 Pool ID로 바꿉니다. 다음 명령을 실행합니다.
    [root@server1 ~]# subscription-manager attach --pool=XYZ123
    
    Successfully attached a subscription for: Red Hat Enterprise Linux ES (Basic for Virtualization)
    

10.5. virt-who 문제 해결

10.5.1. 하이퍼바이저의 상태가 빨간색인 이유는 무엇입니까?

시나리오: 서버 측에서 서브스크립션이 없는 하이퍼바이저에 게스트를 배포합니다. 24시간 후에 하이퍼바이저가 빨간색으로 표시됩니다. 이러한 상황을 해결하기 위해서는 해당 하이퍼바이저에 대한 서브스크립션을 받아야 합니다. 또는 서브스크립션을 사용하여 게스트를 하이퍼바이저로 영구적으로 마이그레이션합니다.

10.5.2. 서브스크립션 상태 오류가 발생했습니다. 어떻게 해야 합니까?

시나리오: 다음 오류 메시지가 표시됩니다.
  • 시스템이 올바르게 서브스크립션되지 않음
  • 상태를 알 수 없음
  • virt-who를 통해 게스트를 하이퍼바이저에 늦은 바인딩(호스트/게스트 매핑)
오류의 이유를 찾으려면 /var/log/rhsm/ 디렉터리에 있는 rhsm.log 라는 virt-who 로그 파일을 엽니다.

11장. QEMU 게스트 에이전트 및 SPICE 에이전트를 사용하여 가상화 개선

QEMU 게스트 에이전트 및 SPICE 에이전트와 같은 Red Hat Enterprise Linux의 에이전트를 배포하여 시스템에서 가상화 툴을 보다 효율적으로 실행할 수 있습니다. 이러한 에이전트는 이 장에 설명되어 있습니다.
참고
호스트 및 게스트 성능을 추가로 최적화하고 튜닝하려면 Red Hat Enterprise Linux 7 Virtualization 튜닝 및 최적화 가이드 를 참조하십시오.

11.1. QEMU 게스트 에이전트

QEMU 게스트 에이전트는 게스트 내에서 실행되며, 호스트 시스템이 libvirt를 사용하여 게스트 운영 체제에 명령을 실행할 수 있어 freezing 및 awing filesystems 와 같은 기능을 사용할 수 있습니다. 그러면 게스트 운영 체제가 이러한 명령에 비동기적으로 응답합니다. QEMU 게스트 에이전트 패키지 qemu-guest-agent 는 기본적으로 Red Hat Enterprise Linux 7에 설치됩니다.
이 섹션에서는 게스트 에이전트에서 사용할 수 있는 libvirt 명령 및 옵션에 대해 설명합니다.
중요
신뢰할 수 있는 게스트에서 실행하는 경우에만 QEMU 게스트 에이전트를 사용하는 것이 안전합니다. 신뢰할 수 없는 게스트는 악의적인 방식으로 게스트 에이전트 프로토콜을 무시하거나 악용할 수 있으며, 호스트에서 서비스 거부 공격을 방지하기 위해 내장 안전 장치가 존재하지만 호스트는 작업을 예상대로 실행하기 위해 게스트 협업이 필요합니다.
QEMU 게스트 에이전트는 게스트가 실행되는 동안 가상 CPU(vCPU)를 활성화 및 비활성화하는 데 사용할 수 있으므로 핫플러그 및 핫플러그 기능을 사용하지 않고 vCPU 수를 조정할 수 있습니다. 자세한 내용은 20.36.6절. “가상 CPU 수 구성”의 내용을 참조하십시오.

11.1.1. QEMU 게스트 에이전트와 호스트 간 통신 설정

호스트 시스템은 호스트와 게스트 머신 간의 VirtIO 직렬 연결을 통해 QEMU 게스트 에이전트와 통신합니다. VirtIO 직렬 채널은 문자 장치 드라이버(일반적으로 Unix 소켓)를 통해 호스트에 연결되고 게스트는 이 직렬 채널에서 수신 대기합니다.
참고
qemu-guest-agent 는 호스트가 VirtIO 직렬 채널을 수신하는지 감지하지 않습니다. 그러나 이 채널의 현재 사용은 host-to-guest 이벤트를 수신하므로 리스너가 없는 채널에 쓰기 때문에 문제가 발생하는 게스트 가상 시스템의 가능성이 매우 낮습니다. 또한 qemu-guest-agent 프로토콜에는 명령을 실행할 때 호스트 물리적 시스템이 다시 동기화되도록 하는 동기화 마커가 포함되어 있으며 libvirt 는 이미 이러한 마커를 사용하므로 게스트 가상 시스템에서 이전 예기치 않은 응답을 안전하게 삭제할 수 있습니다.

11.1.1.1. Linux 게스트에서 QEMU 게스트 에이전트 구성

QEMU 게스트 에이전트는 실행 중이거나 가상 머신을 종료할 수 있습니다. 실행 중인 게스트에 구성된 경우 게스트는 즉시 게스트 에이전트를 사용하기 시작합니다. 게스트가 종료되면 다음 부팅 시 QEMU 게스트 에이전트가 활성화됩니다.
virsh 또는 virt-manager 를 사용하여 게스트와 QEMU 게스트 에이전트 간의 통신을 구성할 수 있습니다. 다음 지침은 Linux 게스트에서 QEMU 게스트 에이전트를 구성하는 방법을 설명합니다.

절차 11.1. Linux 게스트 종료 시 virsh 를 사용하여 게스트 에이전트와 호스트 간 통신 설정

  1. 가상 머신 종료

    QEMU 게스트 에이전트를 구성하기 전에 가상 머신(이 예제의 이름이 rhel7 임)이 종료되었는지 확인합니다.
    # virsh shutdown rhel7 
  2. 게스트 XML 구성에 QEMU 게스트 에이전트 채널 추가

    게스트의 XML 파일을 편집하여 QEMU 게스트 에이전트 세부 정보를 추가합니다.
    # virsh edit rhel7
    게스트의 XML 파일에 다음을 추가하고 변경 사항을 저장합니다.
    <channel type='unix'>
       <target type='virtio' name='org.qemu.guest_agent.0'/>
    </channel>
  3. 가상 머신 시작

    # virsh start rhel7
  4. 게스트에 QEMU 게스트 에이전트 설치

    게스트 가상 머신에 아직 설치되지 않은 경우 QEMU 게스트 에이전트를 설치합니다.
    # yum install qemu-guest-agent
  5. 게스트에서 QEMU 게스트 에이전트 시작

    게스트에서 QEMU 게스트 에이전트 서비스를 시작합니다.
    # systemctl start qemu-guest-agent
또는 다음 단계를 사용하여 실행 중인 게스트에 QEMU 게스트 에이전트를 구성할 수 있습니다.

절차 11.2. 실행 중인 Linux 게스트에서 게스트 에이전트와 호스트 간의 통신 설정

  1. QEMU 게스트 에이전트의 XML 파일 생성

    # cat agent.xml
    <channel type='unix'>
       <target type='virtio' name='org.qemu.guest_agent.0'/>
    </channel>
  2. 가상 머신에 QEMU 게스트 에이전트 연결

    다음 명령을 사용하여 실행 중인 가상 머신(이 예에서는 rhel7 이라는)에 QEMU 게스트 에이전트를 연결합니다.
    # virsh attach-device rhel7 agent.xml
  3. 게스트에 QEMU 게스트 에이전트 설치

    게스트 가상 머신에 아직 설치되지 않은 경우 QEMU 게스트 에이전트를 설치합니다.
    # yum install qemu-guest-agent
  4. 게스트에서 QEMU 게스트 에이전트 시작

    게스트에서 QEMU 게스트 에이전트 서비스를 시작합니다.
    # systemctl start qemu-guest-agent

절차 11.3. virt-manager를 사용하여 QEMU 게스트 에이전트와 호스트 간 통신 설정

  1. 가상 머신 종료

    QEMU 게스트 에이전트를 구성하기 전에 가상 머신이 종료되었는지 확인합니다.
    가상 머신을 종료하려면 Virtual Machine Manager 의 가상 머신 목록에서 선택한 다음 메뉴 표시줄에서 가벼운 스위치 아이콘을 클릭합니다.
  2. 게스트에 QEMU 게스트 에이전트 채널 추가

    게스트 창 상단에 있는 Lightbulb 아이콘을 클릭하여 가상 머신의 하드웨어 세부 정보를 엽니다.
    하드웨어 추가 버튼을 클릭하여 새 가상 하드웨어 추가 창을 열고 채널을 선택합니다.
    이름 드롭다운 목록에서 QEMU 게스트 에이전트를 선택하고 Finish:를 클릭합니다.

    그림 11.1. QEMU 게스트 에이전트 채널 장치 선택

    QEMU 게스트 에이전트 채널 장치 선택
  3. 가상 머신 시작

    가상 머신을 시작하려면 가상 머신 관리자 의 가상 머신 목록에서 선택한 다음 메뉴 표시줄에서 을 클릭합니다.
  4. 게스트에 QEMU 게스트 에이전트 설치

    virt-manager 로 게스트를 열고 게스트 가상 머신에 아직 설치되지 않은 경우 QEMU 게스트 에이전트를 설치합니다.
    # yum install qemu-guest-agent
  5. 게스트에서 QEMU 게스트 에이전트 시작

    게스트에서 QEMU 게스트 에이전트 서비스를 시작합니다.
    # systemctl start qemu-guest-agent
QEMU 게스트 에이전트가 rhel7 가상 머신에 구성되어 있습니다.

11.2. libvirt를 사용하여 QEMU 게스트 에이전트 사용

QEMU 게스트 에이전트를 설치하면 다양한 libvirt 명령이 더 강력해집니다. 게스트 에이전트는 다음 virsh 명령을 향상시킵니다.
  • virsh shutdown --mode=agent - QEMU 게스트 에이전트와 함께 사용되는 virsh shutdown --mode=acpi 이므로 virsh shutdown --mode=acpi 보다 안정성이 높습니다. 에이전트가 존재하지 않는 경우 libvirt는 ACPI 종료 이벤트를 삽입해야 하지만 일부 게스트는 해당 이벤트를 무시하므로 종료하지 않습니다.
    virsh reboot 에 대해 동일한 구문으로 사용할 수 있습니다.
  • virsh snapshot-create --quiesce - 스냅샷이 생성되기 전에 게스트가 I/O를 stable 상태로 플러싱할 수 있으므로 fsck를 수행하거나 부분 데이터베이스 트랜잭션을 손실하지 않고도 스냅샷을 사용할 수 있습니다. 게스트 에이전트에서는 게스트의 작동을 통해 높은 수준의 디스크 콘텐츠 안정성을 확보할 수 있습니다.
  • virsh domfsfreezevirsh domfsthaw - 게스트 파일 시스템을 분리합니다.
  • virsh domfstrim - 게스트에서 파일 시스템을 트리밍합니다.
  • virsh domtime - 게스트의 클럭을 설정하거나 쿼리합니다.
  • virsh setvcpus --guest - 게스트에서 CPU를 오프라인으로 전환합니다.
  • virsh domifaddr --source 에이전트 - 게스트 에이전트를 통해 게스트 운영 체제의 IP 주소를 조회합니다.
  • virsh domfsinfo - 실행 중인 게스트 내에 마운트된 파일 시스템 목록을 표시합니다.
  • virsh set-user-password - 게스트에서 사용자 계정의 암호를 설정합니다.

11.2.1. 게스트 디스크 백업 생성

libvirtqemu-guest-agent 와 통신하여 게스트 가상 시스템 파일 시스템의 스냅샷이 내부적으로 일관성을 유지하고 필요에 따라 사용할 준비가 되었는지 확인할 수 있습니다. 게스트 시스템 관리자는 애플리케이션별 freeze/thaw 후크 스크립트를 작성하고 설치할 수 있습니다. 파일 시스템을 해제하기 전에 qemu-guest-agent 는 기본 후크 스크립트( qemu-guest-agent 패키지에 포함되어 있음)를 호출합니다. 해제 프로세스는 모든 게스트 가상 머신 애플리케이션을 일시적으로 비활성화합니다.
스냅샷 프로세스는 다음 단계로 구성됩니다.
  • 파일 시스템 애플리케이션/데이터베이스가 가상 디스크에 작업 버퍼를 플러시하고 클라이언트 연결 수락 중지
  • 애플리케이션에서 데이터 파일을 일관된 상태로 가져옵니다.
  • 기본 후크 스크립트 반환
  • QEMU-guest-agent 는 파일 시스템을 정지하고 관리 스택에서 스냅샷을 만듭니다.
  • 스냅샷이 확인됨
  • 파일 시스템 기능 재개
이 기능은 다음과 같은 순서로 수행됩니다.
게스트 파일 시스템의 스냅샷을 생성하려면 virsh snapshot-create --quiesce --disk-only 명령(이론적으로 virsh snapshot-create-create-as guest_name --quiesce --disk-only )을 실행합니다. 20.39.2절. “현재 게스트 가상 머신의 스냅샷 생성”에 자세히 설명되어 있습니다.
참고
애플리케이션별 후크 스크립트에는 스크립트가 데이터베이스와 통신하기 위해 소켓에 연결해야 하는 경우와 같이 올바르게 실행되기 위해 다양한 SELinux 권한이 필요할 수 있습니다. 일반적으로 이러한 목적으로 로컬 SELinux 정책을 개발하고 설치해야 합니다. 파일 시스템 노드에 액세스하면 /etc/qemu-ga/fsfreeze-hook.d/ 에서 레이블이 지정된 표 행에서 표 11.1. “QEMU 게스트 에이전트 패키지 콘텐츠” 에 나열된 restorecon -FvvR 명령을 실행하면 됩니다.
qemu-guest-agent 바이너리 RPM에는 다음 파일이 포함되어 있습니다.

표 11.1. QEMU 게스트 에이전트 패키지 콘텐츠

파일 이름 설명
/usr/lib/systemd/system/qemu-guest-agent.service QEMU 게스트 에이전트의 서비스 제어 스크립트(시작/중지)입니다.
/etc/sysconfig/qemu-ga /usr/lib/systemd/system/qemu-guest-agent.service 제어 스크립트에서 읽어오는 QEMU 게스트 에이전트의 구성 파일입니다. 설정은 쉘 스크립트 주석이 있는 파일에 설명되어 있습니다.
/usr/bin/qemu-ga QEMU 게스트 에이전트 바이너리 파일.
/etc/qemu-ga 후크 스크립트용 루트 디렉터리입니다.
/etc/qemu-ga/fsfreeze-hook 기본 후크 스크립트입니다. 여기에 어떤 수정도 필요하지 않습니다.
/etc/qemu-ga/fsfreeze-hook.d 개별 애플리케이션별 후크 스크립트의 디렉터리입니다. 게스트 시스템 관리자는 후크 스크립트를 이 디렉터리에 수동으로 복사하여 해당 디렉터리에 적합한 파일 모드 비트를 확인한 다음 이 디렉터리에서 restorecon -FvvR 을 실행해야 합니다.
/usr/share/qemu-kvm/qemu-ga/ 샘플 스크립트가 있는 디렉터리(예: 전용) 여기에 포함된 스크립트는 실행되지 않습니다.
기본 후크 스크립트 /etc/qemu-ga/fsfreeze-hook 는 애플리케이션별 스크립트의 표준 출력 및 오류 메시지, /var/log/qemu-ga/fsfreeze-hook.log.log를 기록합니다. 자세한 내용은 libvirt 업스트림 웹 사이트를 참조하십시오.

11.3. SPICE 에이전트

SPICE 에이전트를 사용하면 게스트 운영 체제를 SPICE 클라이언트와 통합할 수 있어 virt-manager 와 같은 그래픽 애플리케이션을 보다 원활하게 실행할 수 있습니다.
예를 들어 virt-manager 에서 창을 변경할 때 SPICE 에이전트를 통해 클라이언트 해상도에 대한 자동 X 세션 해상도를 조정할 수 있습니다. SPICE 에이전트는 호스트와 게스트 간의 복사 및 붙여넣기를 지원하며 마우스 커서 지연을 방지합니다.
SPICE 에이전트 기능에 대한 시스템 관련 정보는 spice-vdagent 패키지의 README 파일을 참조하십시오.

11.3.1. SPICE 에이전트와 호스트 간 통신 설정

SPICE 에이전트는 실행 중이거나 가상 머신을 종료할 때 구성할 수 있습니다. 실행 중인 게스트에 구성된 경우 게스트는 즉시 게스트 에이전트를 사용하기 시작합니다. 게스트가 종료되면 다음 부팅 시 SPICE 에이전트가 활성화됩니다.
virsh 또는 virt-manager 를 사용하여 게스트와 SPICE 에이전트 간의 통신을 구성할 수 있습니다. 다음 지침은 Linux 게스트에서 SPICE 에이전트를 구성하는 방법을 설명합니다.

절차 11.4.  Linux 게스트에서 virsh 를 사용하여 게스트 에이전트와 호스트 간 통신 설정

  1. 가상 머신 종료

    SPICE 에이전트를 구성하기 전에 가상 시스템(이 예제의 이름이 rhel7 임)이 종료되었는지 확인합니다.
    # virsh shutdown rhel7 
  2. 게스트 XML 구성에 SPICE 에이전트 채널 추가

    게스트의 XML 파일을 편집하여 SPICE 에이전트 세부 정보를 추가합니다.
    # virsh edit rhel7
    게스트의 XML 파일에 다음을 추가하고 변경 사항을 저장합니다.
    <channel type='spicevmc'>
       <target type='virtio' name='com.redhat.spice.0'/>
    </channel>
  3. 가상 머신 시작

    # virsh start rhel7
  4. 게스트에 SPICE 에이전트 설치

    게스트 가상 머신에 아직 설치되지 않은 경우 SPICE 에이전트를 설치합니다.
    # yum install spice-vdagent
  5. 게스트에서 SPICE 에이전트 시작

    게스트에서 SPICE 에이전트 서비스를 시작합니다.
    # systemctl start spice-vdagent
또는 다음 단계를 통해 실행 중인 게스트에서 SPICE 에이전트를 구성할 수 있습니다.

절차 11.5. 실행 중인 Linux 게스트에서 SPICE 에이전트와 호스트 간 통신 설정

  1. SPICE 에이전트를 위한 XML 파일 생성

    # cat agent.xml
    <channel type='spicevmc'>
       <target type='virtio' name='com.redhat.spice.0'/>
    </channel>
  2. 가상 머신에 SPICE 에이전트 연결

    다음 명령을 사용하여 실행 중인 가상 머신(이 예에서 rhel7 이라는)에 SPICE 에이전트를 연결합니다.
    # virsh attach-device rhel7 agent.xml
  3. 게스트에 SPICE 에이전트 설치

    게스트 가상 머신에 아직 설치되지 않은 경우 SPICE 에이전트를 설치합니다.
    # yum install spice-vdagent
  4. 게스트에서 SPICE 에이전트 시작

    게스트에서 SPICE 에이전트 서비스를 시작합니다.
    # systemctl start spice-vdagent

절차 11.6. virt-manager를 사용하여 SPICE 에이전트와 호스트 간 통신 설정

  1. 가상 머신 종료

    SPICE 에이전트를 구성하기 전에 가상 머신이 종료되었는지 확인합니다.
    가상 머신을 종료하려면 Virtual Machine Manager 의 가상 머신 목록에서 선택한 다음 메뉴 표시줄에서 가벼운 스위치 아이콘을 클릭합니다.
  2. 게스트에 SPICE 에이전트 채널 추가

    게스트 창 상단에 있는 Lightbulb 아이콘을 클릭하여 가상 머신의 하드웨어 세부 정보를 엽니다.
    하드웨어 추가 버튼을 클릭하여 새 가상 하드웨어 추가 창을 열고 채널을 선택합니다.
    이름 드롭다운 목록에서 SPICE 에이전트를 선택하고 채널 주소를 편집한 후 완료 를 클릭합니다.

    그림 11.2. SPICE 에이전트 채널 장치 선택

    SPICE 에이전트 채널 장치 선택
  3. 가상 머신 시작

    가상 머신을 시작하려면 가상 머신 관리자 의 가상 머신 목록에서 선택한 다음 메뉴 표시줄에서 을 클릭합니다.
  4. 게스트에 SPICE 에이전트 설치

    virt-manager 로 게스트를 열고 게스트 가상 머신에 아직 설치되지 않은 경우 SPICE 에이전트를 설치합니다.
    # yum install spice-vdagent
  5. 게스트에서 SPICE 에이전트 시작

    게스트에서 SPICE 에이전트 서비스를 시작합니다.
    # systemctl start spice-vdagent
이제 SPICE 에이전트가 rhel7 가상 시스템에 구성되어 있습니다.

12장. 중첩된 가상화

12.1. 개요

Red Hat Enterprise Linux 7.5부터 중첩된 가상화 는 KVM 게스트 가상 머신의 기술 프리뷰 로 제공됩니다. 이 기능을 사용하면 물리적 호스트( 레벨0 또는 L0)에서 실행되는 게스트 가상 시스템(레벨 1 또는 L1이라고도 함)이 하이퍼바이저 역할을 하고 자체 게스트 가상 시스템(L2)을 생성할 수 있습니다.
중첩된 가상화는 제한된 환경에서 하이퍼바이저를 디버깅하고 제한된 양의 물리적 리소스에서 대규모 가상 배포를 테스트하는 등 다양한 시나리오에서 유용합니다. 그러나 중첩된 가상화는 프로덕션 사용자 환경에서 지원되거나 권장되지 않으며 주로 개발 및 테스트용으로 설계되었습니다.
중첩된 가상화는 호스트 가상화 확장 기능을 사용하기 때문에 Red Hat Enterprise Linux에서 지원되지 않는 QEMU Tiny Code 생성기(TCG) 에뮬레이션을 사용하여 가상 환경에서 실행 중인 게스트와 혼동해서는 안 됩니다.

12.2. 설정

다음 단계에 따라 중첩된 가상화 사용을 활성화, 구성 및 시작합니다.
  1. 활성화: 이 기능은 기본적으로 비활성화되어 있습니다. 이를 활성화하려면 L0 호스트 물리적 시스템에서 다음 절차를 사용하십시오.
    Intel의 경우:
    1. 호스트 시스템에서 중첩된 가상화를 사용할 수 있는지 확인합니다.
      $ cat /sys/module/kvm_intel/parameters/nested
      이 명령에서 Y 또는 1 을 반환하면 기능이 활성화됩니다.
      명령이 0 또는 N 을 반환하는 경우 단계 iiiii 을 사용하십시오.
    2. kvm_intel 모듈을 언로드합니다.
      # modprobe -r kvm_intel
    3. 중첩 기능을 활성화합니다.
      # modprobe kvm_intel nested=1
    4. 이제 L0 호스트를 다음에 재부팅할 때까지만 중첩 기능이 활성화됩니다. 영구적으로 활성화하려면 /etc/modprobe.d/kvm.conf 파일에 다음 행을 추가합니다.
      options kvm_intel nested=1
    AMD의 경우:
    1. 시스템에서 중첩된 가상화를 사용할 수 있는지 확인합니다.
      $ cat /sys/module/kvm_amd/parameters/nested
      이 명령에서 Y 또는 1 을 반환하면 기능이 활성화됩니다.
      명령이 0 또는 N 을 반환하는 경우 단계 iiiii 을 사용하십시오.
    2. kvm_amd 모듈 언로드
      # modprobe -r kvm_amd
    3. 중첩 기능 활성화
      # modprobe kvm_amd nested=1
    4. 이제 L0 호스트를 다음에 재부팅할 때까지만 중첩 기능이 활성화됩니다. 영구적으로 활성화하려면 /etc/modprobe.d/kvm.conf 파일에 다음 행을 추가합니다.
      options kvm_amd nested=1
  2. 다음 방법 중 하나를 사용하여 중첩된 가상화의 L1 가상 머신을 구성합니다.
    virt-manager
    1. 원하는 게스트의 GUI를 열고 가상 하드웨어 세부 정보 표시 아이콘을 클릭합니다.
    2. Processor 메뉴를 선택하고 Configuration (구성) 섹션에서 Model 필드에 host-passthrough 를 입력하고 (드롭다운 선택을 사용하지 않음)을 클릭합니다.
    도메인 XML
    게스트의 도메인 XML 파일에 다음 행을 추가합니다.
    <cpu mode='host-passthrough'/>
    게스트의 XML 구성 파일에 <cpu> 요소가 이미 포함된 경우 다시 작성합니다.
  3. 중첩된 가상화 사용을 시작하려면 L1 게스트 내에 L2 게스트를 설치합니다. 이 작업을 수행하려면 L1 게스트를 설치할 때와 동일한 절차를 따르십시오. 자세한 내용은 3장. 가상 머신 생성 을 참조하십시오.

12.3. 제한 및 제한 사항

  • L0 호스트 및 L1 게스트에서 Red Hat Enterprise Linux 7.2 이상을 실행하는 것이 좋습니다. L2 게스트에는 Red Hat에서 지원하는 게스트 시스템이 포함될 수 있습니다.
  • L1 또는 L2 게스트 마이그레이션은 지원되지 않습니다.
  • L2 게스트를 하이퍼바이저로 사용하고 L3 게스트 생성은 지원되지 않습니다.
  • 호스트에서 사용 가능한 모든 기능을 L1 하이퍼바이저에서 사용할 수 있는 것은 아닙니다. 예를 들어 L1 하이퍼바이저에서 IOMMU/VT-d 또는 APICv를 사용할 수 없습니다.
  • 중첩된 가상화를 사용하려면 호스트 CPU에 필요한 기능 플래그가 있어야 합니다. L0 및 L1 하이퍼바이저가 올바르게 설정되었는지 확인하려면 L0 및 L1 모두에 cat /proc/cpuinfo 명령을 사용하고 두 하이퍼바이저의 각 CPU에 대해 다음 플래그가 나열되어 있는지 확인합니다.
    • Intel - vmx (Hardware Virtualization) 및 ept (Extended Page Tables)
    • AMD - svm (equivalent to vmx) 및 npt (equivalent to ept)

II 부. 관리

이 부분에서는 가상 머신 관리와 관련된 주제를 설명하고 가상 네트워킹, 스토리지, PCI 할당 작업과 같은 가상화 기능을 설명합니다. 또한 이 부분에서는 qemu-img,virt-manager, virsh 도구를 사용하여 장치 및 게스트 가상 머신 관리에 대한 지침을 제공합니다.

13장. 가상 머신용 스토리지 관리

이 장에서는 가상 시스템의 스토리지에 대해 설명합니다. 가상 스토리지는 가상 머신 연결에 할당된 물리적 스토리지에서 추상화됩니다. 스토리지는 반가상화 또는 에뮬레이션된 블록 장치 드라이버를 사용하여 가상 시스템에 연결됩니다.

13.1. 스토리지 개념

스토리지 풀 은 게스트 가상 머신에서 사용할 스토리지 수입니다. 스토리지 풀은 스토리지 볼륨 으로 나뉩니다. 각 스토리지 볼륨은 게스트 가상 머신에 게스트 버스의 블록 장치로 할당됩니다.
스토리지 풀 및 볼륨은 libvirt 를 사용하여 관리합니다. libvirt 의 원격 프로토콜을 사용하면 게스트 가상 시스템의 라이프 사이클의 모든 측면과 게스트 가상 머신에 필요한 리소스의 구성을 관리할 수 있습니다. 이러한 작업은 원격 호스트에서 수행할 수 있습니다. 결과적으로 libvirt 를 사용하여 Virtual Machine Manager 와 같은 관리 애플리케이션을 사용하면 사용자가 게스트 가상 시스템의 호스트 물리적 시스템을 구성하는 데 필요한 모든 작업을 수행할 수 있습니다. 여기에는 리소스 할당, 게스트 가상 머신 실행, 종료, 리소스 할당 취소, 쉘 액세스 또는 기타 제어 채널 없이도 리소스 할당이 포함됩니다.
libvirt API를 사용하여 스토리지 풀의 볼륨 목록을 쿼리하거나 스토리지 풀에서 용량, 할당, 사용 가능한 스토리지에 대한 정보를 가져올 수 있습니다. 스파스 볼륨에 따라 할당 및 용량과 같은 정보를 가져오기 위해 스토리지 풀의 스토리지 볼륨을 쿼리할 수 있습니다.
참고
스파스 볼륨에 대한 자세한 내용은 가상화 시작하기 가이드 를 참조하십시오.
이를 지원하는 스토리지 풀의 경우 libvirt API를 사용하여 스토리지 볼륨을 생성, 복제, 크기 조정 및 삭제할 수 있습니다. API는 데이터를 스토리지 볼륨에 업로드하거나, 스토리지 볼륨에서 데이터를 다운로드하거나, 스토리지 볼륨에서 데이터를 지우거나, 스토리지 볼륨에서 데이터를 제거하는 데도 사용할 수 있습니다.
스토리지 풀을 시작하면 도메인 XML의 볼륨 경로 대신 스토리지 풀 이름 및 스토리지 볼륨 이름을 사용하여 스토리지 볼륨을 게스트에 할당할 수 있습니다.
참고
도메인 XML에 대한 자세한 내용은 23장. 도메인 XML 조작 을 참조하십시오.
스토리지 풀은 중지(고정)할 수 있습니다. 이렇게 하면 데이터의 추상화가 제거되지만 데이터가 그대로 유지됩니다.
예를 들어 mount -t nfs.example.com:/path/to/share /path/to/data 를 사용하는 NFS 서버가 있습니다. 내보낸 서버 경로와 클라이언트 대상 경로를 설명하기 위해 가상화 호스트에서 NFS 스토리지 풀을 정의하는 스토리지 관리자는 다음을 수행할 수 있습니다. 이렇게 하면 libvirt 가 libvirt를 시작할 때 또는 libvirt 가 실행되는 동안 필요에 따라 자동으로 마운트를 수행할 수 있습니다. NFS Server 내보낸 디렉터리가 있는 파일은 NFS 스토리지 풀 내에서 스토리지 볼륨으로 나열됩니다.
게스트에 스토리지 볼륨이 추가되면 관리자는 대상 경로를 볼륨에 추가할 필요가 없습니다. 이름별로 스토리지 풀과 스토리지 볼륨을 추가해야 합니다. 따라서 대상 클라이언트 경로가 변경되면 가상 머신에는 영향을 미치지 않습니다.
스토리지 풀이 시작되면 libvirt 는 시스템 관리자가 nfs.example.com:/path/to/share /vmdata 에 로그인하고 실행한 것처럼 지정된 디렉터리에 공유를 마운트합니다. 스토리지 풀이 자동 시작을 위해 구성된 경우 libvirtlibvirt 를 시작할 때 지정된 디렉터리에 NFS 공유 디스크가 마운트되도록 합니다.
스토리지 풀이 시작되면 NFS 공유 디스크의 파일이 스토리지 볼륨으로 보고되고 libvirt API를 사용하여 스토리지 볼륨 경로를 쿼리할 수 있습니다. 그런 다음 스토리지 볼륨 경로를 게스트 가상 시스템의 블록 장치에 대한 소스 스토리지를 설명하는 게스트 가상 머신의 XML 정의 섹션으로 복사할 수 있습니다. NFS의 경우 libvirt API를 사용하는 애플리케이션은 스토리지 풀(NFS 공유의 파일)에서 스토리지 볼륨(공유 용량)까지 스토리지 볼륨을 생성하고 삭제할 수 있습니다.
일부 스토리지 풀 유형에서 볼륨 생성 및 삭제를 지원하는 것은 아닙니다. 스토리지 풀(pool-destroy)을 중지하면 시작 작업이 취소되며 이 경우 NFS 공유를 마운트 해제합니다. 명령 이름이 제안한 경우에도 공유의 데이터는 destroy 작업에 의해 수정되지 않습니다. 자세한 내용은 man virsh 를 참조하십시오.

절차 13.1. 스토리지 생성 및 할당

이 절차에서는 가상 머신 게스트에 대한 스토리지를 생성하고 할당하는 데 필요한 단계를 자세히 설명합니다.
  1. 스토리지 풀 생성

    사용 가능한 스토리지 미디어에서 하나 이상의 스토리지 풀을 생성합니다. 자세한 내용은 13.2절. “스토리지 풀 사용”의 내용을 참조하십시오.
  2. 스토리지 볼륨 생성

    사용 가능한 스토리지 풀에서 하나 이상의 스토리지 볼륨을 생성합니다. 자세한 내용은 13.3절. “스토리지 볼륨 사용”의 내용을 참조하십시오.
  3. 가상 머신에 스토리지 장치를 할당합니다.

    스토리지 볼륨에서 게스트 가상 머신에 추상화된 하나 이상의 스토리지 장치를 할당합니다. 자세한 내용은 13.3.6절. “게스트에 스토리지 장치 추가”의 내용을 참조하십시오.

13.2. 스토리지 풀 사용

이 섹션에서는 가상 머신에서 스토리지 풀 사용에 대한 정보를 제공합니다. virsh 명령과 Virtual Machine Manager 를 사용하여 스토리지 풀 생성 , 구성, 삭제 에 대한 자세한 정보와 개념적 정보를 제공합니다.

13.2.1. 스토리지 풀 개념

스토리지 풀은 가상 머신에 스토리지를 제공하기 위해 libvirt 에서 관리하는 파일, 디렉터리 또는 스토리지 장치입니다. 스토리지 풀은 가상 머신 이미지를 저장하거나 추가 스토리지로 가상 머신에 연결된 스토리지 볼륨으로 나뉩니다. 여러 게스트가 동일한 스토리지 풀을 공유하여 스토리지 리소스를 보다 효과적으로 할당할 수 있습니다.
스토리지 풀은 로컬 또는 네트워크 기반(공유)일 수 있습니다.
로컬 스토리지 풀
로컬 스토리지 풀은 호스트 서버에 직접 연결됩니다. 여기에는 로컬 디렉터리, 직접 연결된 디스크, 물리 파티션, 로컬 장치의 LVM(Logical Volume Management) 볼륨 그룹이 포함됩니다. 로컬 스토리지 풀은 마이그레이션 또는 다수의 가상 시스템이 필요하지 않은 개발, 테스트 및 소규모 배포에 유용합니다. 로컬 스토리지 풀은 실시간 마이그레이션에 사용할 수 없기 때문에 많은 프로덕션 환경에 적합하지 않을 수 있습니다.
네트워크화된(공유) 스토리지 풀
네트워크 스토리지 풀에는 표준 프로토콜을 사용하여 네트워크를 통해 공유하는 스토리지 장치가 포함됩니다. virt-manager 를 사용하여 호스트 간에 가상 머신을 마이그레이션할 때는 네트워크 스토리지가 필요하지만 virsh 로 마이그레이션할 때는 선택 사항입니다.
가상 머신 마이그레이션에 대한 자세한 내용은 15장. KVM 마이그레이션 을 참조하십시오.
다음은 Red Hat Enterprise Linux에서 지원하는 스토리지 풀 목록입니다.
  • 디렉터리 기반 스토리지 풀
  • 디스크 기반 스토리지 풀
  • 파티션 기반 스토리지 풀
  • GlusterFS 스토리지 풀
  • iSCSI 기반 스토리지 풀
  • LVM 기반 스토리지 풀
  • NFS 기반 스토리지 풀
  • SCSI 장치가 있는 vHBA 기반 스토리지 풀
다음은 Red Hat Enterprise Linux에서 지원하지 않는 libvirt 스토리지 풀 유형 목록입니다.
  • 다중 경로 기반 스토리지 풀
  • RBD 기반 스토리지 풀
  • NovaCronepdog 기반 스토리지 풀
  • Vstorage 기반 스토리지 풀
  • RuntimeClass 기반 스토리지 풀
참고
지원되지 않는 스토리지 풀 유형 중 일부는 Virtual Machine Manager 인터페이스에 나타납니다. 그러나 사용해서는 안 됩니다.

13.2.2. 스토리지 풀 생성

이 섹션에서는 virshVirtual Machine Manager 를 사용하여 스토리지 풀을 생성하는 일반적인 지침을 제공합니다. virsh 를 사용하면 모든 매개변수를 지정할 수 있지만 Virtual Machine Manager 를 사용하면 더 간단한 스토리지 풀을 생성할 수 있는 그래픽 방법을 제공합니다.

13.2.2.1. virsh를 사용하여 스토리지 풀 생성

참고
이 섹션에서는 파티션 기반 스토리지 풀 생성을 예로 보여줍니다.

절차 13.2. virsh를 사용하여 스토리지 풀 생성

  1. 권장 사항을 읽고 모든 사전 요구 사항이 충족되는지 확인합니다.

    일부 스토리지 풀의 경우 이 가이드에서는 특정 사례를 따르는 것이 좋습니다. 또한 일부 유형의 스토리지 풀에는 사전 요구 사항이 있습니다. 권장 사항 및 사전 요구 사항을 보려면 13.2.3절. “스토리지 풀별” 를 참조하십시오.
  2. 스토리지 풀 정의

    스토리지 풀은 영구 또는 일시적일 수 있습니다. 호스트 시스템을 시스템을 다시 시작해도 영구 스토리지 풀입니다. 임시 스토리지 풀은 호스트가 재부팅될 때까지만 존재합니다.
    다음 중 하나를 수행합니다.
    • XML 파일을 사용하여 스토리지 풀을 정의합니다.
      a. 새 장치에 필요한 스토리지 풀 정보가 포함된 임시 XML 파일을 만듭니다.
      XML 파일에는 스토리지 풀 유형에 따라 특정 필드가 포함되어야 합니다. 자세한 내용은 13.2.3절. “스토리지 풀별”의 내용을 참조하십시오.
      다음은 스토리지 풀 정의 XML 파일의 예를 보여줍니다. 이 예에서는 파일이 ~/guest_images.xml에 저장됩니다.
      <pool type='fs'>
        <name>guest_images_fs</name>
        <source>
          <device path='/dev/sdc1'/>
        </source>
        <target>
          <path>/guest_images</path>
        </target>
      </pool>
      b. virsh pool-define 명령을 사용하여 영구 스토리지 풀 또는 virsh pool-create 명령을 생성하여 일시적인 스토리지 풀을 생성하고 시작합니다.
      # virsh pool-define ~/guest_images.xml
      Pool defined from guest_images_fs
      
      또는
      # virsh pool-create ~/guest_images.xml
      Pool created from guest_images_fs
      c. 단계에서 만든 XML 파일을 삭제합니다.
    • virsh pool-define-as 명령을 사용하여 영구 스토리지 풀 또는 virsh pool-create-as 명령을 사용하여 임시 스토리지 풀을 생성합니다.
      다음 예제에서는 영구적으로 생성된 다음 /guest_images 디렉터리의 /dev/sdc1 에 매핑된 임시 파일 시스템 기반 스토리지 풀을 생성합니다.
      # virsh pool-define-as guest_images_fs fs - - /dev/sdc1 - "/guest_images"
      Pool guest_images_fs defined
      또는
      # virsh pool-create-as guest_images_fs fs - - /dev/sdc1 - "/guest_images"
      Pool guest_images_fs created
      참고
      virsh 인터페이스를 사용하는 경우 명령의 옵션 이름은 선택 사항입니다. 옵션 이름을 사용하지 않는 경우 지정할 필요가 없는 필드에 대시를 사용합니다.
  3. 풀이 생성되었는지 확인합니다.

    virsh pool-list --all 을 사용하여 기존 스토리지 풀을 모두 나열합니다.
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images_fs      inactive   no
    
  4. 스토리지 풀 대상 경로 정의

    virsh pool-build 명령을 사용하여 사전 포맷된 파일 시스템 스토리지 풀에 대한 스토리지 풀 대상 경로를 생성하고, 스토리지 소스 장치를 초기화하고, 데이터 형식을 정의합니다. 그런 다음 virsh pool-list 명령을 사용하여 스토리지 풀이 나열되는지 확인합니다.
    # virsh pool-build guest_images_fs
    Pool guest_images_fs built
    # ls -la /guest_images
    total 8
    drwx------.  2 root root 4096 May 31 19:38 .
    dr-xr-xr-x. 25 root root 4096 May 31 19:38 ..
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images_fs      inactive   no
    
    참고
    대상 경로를 빌드하려면 디스크 기반 파일 시스템 기반 및 논리 스토리지 풀에만 필요합니다. libvirt 가 선택한 스토리지 풀 유형과 다른 소스 스토리지 장치의 데이터 포맷을 탐지하면 overwrite 옵션을 지정하지 않는 한 빌드가 실패합니다.
  5. 스토리지 풀 시작

    virsh pool-start 명령을 사용하여 사용할 소스 장치를 준비합니다.
    수행되는 작업은 스토리지 풀 유형에 따라 다릅니다. 예를 들어 파일 시스템 기반 스토리지 풀의 경우 virsh pool-start 명령은 파일 시스템을 마운트합니다. LVM 기반 스토리지 풀의 경우 virsh pool-start 명령은 pxe change 명령을 사용하여 볼륨 그룹을 활성화합니다.
    그런 다음 virsh pool-list 명령을 사용하여 스토리지 풀이 활성 상태인지 확인합니다.
    # virsh pool-start guest_images_fs
    Pool guest_images_fs started
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images_fs      active     no
    
    참고
    virsh pool-start 명령은 영구 스토리지 풀에만 필요합니다. 임시 스토리지 풀은 생성될 때 자동으로 시작됩니다.
  6. 자동 시작 켜기 (선택 사항)

    기본적으로 virsh 로 정의된 스토리지 풀은 libvirtd 가 시작될 때마다 자동으로 시작하도록 설정되지 않습니다. virsh pool-autostart 명령을 사용하여 자동으로 시작하도록 스토리지 풀을 구성할 수 있습니다.
    # virsh pool-autostart guest_images_fs
    Pool guest_images_fs marked as autostarted
    
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images_fs      active     yes
    
    libvirtd 가 시작될 때마다 스토리지 풀이 자동으로 시작됩니다.
  7. 스토리지 풀 확인

    스토리지 풀이 올바르게 생성되었으며 보고된 크기가 예상대로, 상태가 실행 중 으로 보고되는지 확인합니다. 장치가 마운트되었음을 나타내는 파일 시스템의 대상 경로에 "lost+found" 디렉터리가 있는지 확인합니다.
    # virsh pool-info guest_images_fs
    Name:           guest_images_fs
    UUID:           c7466869-e82a-a66c-2187-dc9d6f0877d0
    State:          running
    Persistent:     yes
    Autostart:      yes
    Capacity:       458.39 GB
    Allocation:     197.91 MB
    Available:      458.20 GB
    # mount | grep /guest_images
    /dev/sdc1 on /guest_images type ext4 (rw)
    # ls -la /guest_images
    total 24
    drwxr-xr-x.  3 root root  4096 May 31 19:47 .
    dr-xr-xr-x. 25 root root  4096 May 31 19:38 ..
    drwx------.  2 root root 16384 May 31 14:18 lost+found
    

13.2.2.2. 가상 머신 관리자를 사용하여 스토리지 풀 생성

참고
이 섹션에서는 디스크 기반 스토리지 풀 생성을 예로 보여줍니다.

절차 13.3. 가상 머신 관리자를 사용하여 스토리지 풀 생성

  1. 스토리지 풀을 생성할 매체를 준비합니다.

    이는 스토리지 풀 유형에 따라 다릅니다. 자세한 내용은 13.2.3절. “스토리지 풀별”의 내용을 참조하십시오.
    이 예제에서는 GUID 파티션 테이블 을 사용하여 디스크의 레이블을 다시 지정해야 할 수 있습니다.
  2. 스토리지 설정을 엽니다.

    1. Virtual Machine Manager 에서 구성할 호스트 연결을 선택합니다.
      편집 메뉴를 열고 연결 세부 정보를 선택합니다.
    2. 연결 세부 정보 창에서 스토리지 탭을 클릭합니다.

      그림 13.1. 스토리지 탭

      스토리지 탭
  3. 새 스토리지 풀 생성

    참고
    Virtual Machine Manager 를 사용하면 영구 스토리지 풀만 생성할 수 있습니다. 임시 스토리지 풀은 virsh 를 통해서만 만들 수 있습니다.
    1. 새 스토리지 풀(파트 1) 추가

      창 하단에 있는 버튼을 클릭합니다. 새 스토리지 풀 추가 마법사가 표시됩니다.
      스토리지 풀의 이름을 입력합니다. 이 예에서는 이름이 guest_images_fs 를 사용합니다.
      유형 드롭다운 목록에서 생성할 스토리지 풀 유형을 선택합니다. 이 예에서는 fs를 사용합니다. 사전 포맷된 블록 장치.

      그림 13.2. 스토리지 풀 이름 및 유형

      스토리지 풀 이름 및 유형
      계속하려면 Forward 버튼을 클릭합니다.
    2. 새 풀 추가 (part 2)

      그림 13.3. 스토리지 풀 경로

      스토리지 풀 경로
      관련 매개 변수를 사용하여 스토리지 풀을 구성합니다. 각 스토리지 풀 유형의 매개변수에 대한 자세한 내용은 13.2.3절. “스토리지 풀별” 을 참조하십시오.
      일부 유형의 스토리지 풀의 경우 빌드 풀 확인란이 대화 상자에 나타납니다. 스토리지에서 스토리지 풀을 빌드하려면 Build Pool 확인란을 선택합니다.
      세부 정보를 확인하고 Finish (완료) 버튼을 클릭하여 스토리지 풀을 생성합니다.

13.2.3. 스토리지 풀별

이 섹션에서는 사전 요구 사항, 매개 변수 및 추가 정보를 포함하여 각 스토리지 풀 유형에 고유한 정보를 제공합니다. 여기에는 다음 항목이 포함됩니다.

13.2.3.1. 디렉터리 기반 스토리지 풀

매개 변수
다음 표에서는 디렉터리 기반 스토리지 풀을 생성하기 위해 XML 파일, virsh pool-define-as 명령 및 Virtual Machine Manager 애플리케이션에 필요한 매개 변수 목록을 제공합니다.

표 13.1. 디렉터리 기반 스토리지 풀 매개변수

설명XMLpool-define-as가상 머신 관리자
스토리지 풀의 유형입니다. <pool type='dir'> [type] 디렉토리 dir: 파일 시스템 디렉터리
스토리지 풀의 이름 <name>name</name> [name] 이름 이름
대상을 지정하는 경로입니다. 이는 스토리지 풀에 사용되는 경로입니다.

<target>
  <path>target_path</path>
</target>

target path_to_pool 대상 경로
virsh 를 사용하여 스토리지 풀을 생성하는 경우 풀이 생성되었는지 확인합니다.
다음은 /guest_images 디렉터리를 기반으로 하는 스토리지 풀의 XML 파일의 예입니다.
<pool type='dir'>
  <name>dirpool</name>
  <target>
    <path>/guest_images</path>
  </target>
</pool>
다음은 /guest_images 디렉터리를 기반으로 스토리지 풀을 생성하는 명령의 예입니다.
# virsh pool-define-as dirpool dir --target "/guest_images"
Pool FS_directory defined
다음 이미지는 /guest_images 디렉토리를 기반으로 스토리지 풀을 생성하기 위한 새 스토리지 풀 추가 대화 상자의 가상 머신 관리자 추가 대화 상자의 예를 보여줍니다.

그림 13.4. 새 디렉터리 기반 스토리지 풀 예 추가

새 디렉터리 기반 스토리지 풀 예 추가

13.2.3.2. 디스크 기반 스토리지 풀

권장 사항
디스크 기반 스토리지 풀을 생성하기 전에 다음 사항에 유의하십시오.
  • 사용 중인 libvirt 버전에 따라 디스크를 스토리지 풀에 고정하면 현재 디스크 장치에 저장된 모든 데이터를 다시 포맷하고 지울 수 있습니다. 스토리지 풀을 생성하기 전에 스토리지 장치의 데이터를 백업하는 것이 좋습니다.
  • 게스트는 전체 디스크 또는 블록 장치(예: /dev/sdb)에 대한 쓰기 액세스 권한을 부여해서는 안 됩니다. 파티션(예: /dev/sdb1) 또는 LVM 볼륨을 사용합니다.
    전체 블록 장치를 게스트에 전달하면 게스트가 파티션을 지정하거나 자체 LVM 그룹을 만들 수 있습니다. 이로 인해 호스트 물리적 시스템에서 이러한 파티션 또는 LVM 그룹을 감지하고 오류가 발생할 수 있습니다.
사전 요구 사항
참고
이 섹션의 단계는 virsh pool-build 명령을 실행하지 않는 경우에만 필요합니다.
호스트 디스크에서 디스크 기반 스토리지 풀을 생성하려면 먼저 디스크의 레이블을 GUID 파티션 테이블 (GPT)으로 다시 지정해야 합니다. GPT 디스크 레이블을 사용하면 각 장치에 최대 128개의 파티션을 만들 수 있습니다.
# parted /dev/sdb
GNU Parted 2.1
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel
New disk label type? gpt
(parted) quit
Information: You may need to update /etc/fstab.
#
디스크 레이블을 다시 지정한 후 스토리지 풀을 정의하여 스토리지 풀을 계속 생성합니다.
매개 변수
다음 표에서는 디스크 기반 스토리지 풀을 생성하기 위한 XML 파일, virsh pool-define-as 명령 및 Virtual Machine Manager 애플리케이션에 필요한 매개 변수 목록을 제공합니다.

표 13.2. 디스크 기반 스토리지 풀 매개변수

설명XMLpool-define-as가상 머신 관리자
스토리지 풀의 유형입니다. <pool type='disk'> [type] 디스크 디스크: 물리 디스크 장치
스토리지 풀의 이름 <name>name</name> [name] 이름 이름
스토리지 장치를 지정하는 경로입니다. 예: /dev/sdb

<source>
  <device path=/dev/sdb/>
<source>

source-dev path_to_disk 소스 경로
대상을 지정하는 경로입니다. 이는 스토리지 풀에 사용되는 경로입니다.

<target>
  <path>/path_to_pool</path>
</target>

target path_to_pool 대상 경로
virsh 를 사용하여 스토리지 풀을 생성하는 경우 스토리지 풀을 계속 정의합니다.
다음은 디스크 기반 스토리지 풀의 XML 파일의 예입니다.
<pool type='disk'>
  <name>phy_disk</name>
  <source>
    <device path='/dev/sdb'/>
    <format type='gpt'/>
  </source>
  <target>
    <path>/dev</path>
  </target>
</pool>
다음은 디스크 기반 스토리지 풀을 생성하는 명령의 예입니다.
# virsh pool-define-as phy_disk disk --source-format=gpt --source-dev=/dev/sdb --target /dev
Pool phy_disk defined
다음 이미지는 가상 머신 XML 구성 가상 머신 관리자Virtual Machine Manager Add a New Storage Pool 대화 상자의 예를 보여줍니다.

그림 13.5. 새 디스크 기반 스토리지 풀 예 추가

새 디스크 기반 스토리지 풀 예 추가

13.2.3.3. 파일 시스템 기반 스토리지 풀

권장 사항
이 섹션의 절차를 사용하여 전체 디스크를 스토리지 풀(예: /dev/sdb)으로 할당하지 마십시오. 게스트에 전체 디스크 또는 블록 장치에 대한 쓰기 액세스 권한을 부여해서는 안 됩니다. 이 방법은 파티션(예: /dev/sdb1)을 스토리지 풀에 할당하는 데만 사용해야 합니다.
사전 요구 사항
참고
virsh pool-build 명령을 실행하지 않는 경우에만 필요합니다.
파티션에서 스토리지 풀을 생성하려면 파일 시스템을 ext4로 포맷합니다.
# mkfs.ext4 /dev/sdc1
파일 시스템을 포맷한 후 스토리지 풀을 정의 하여 스토리지 풀을 계속 생성합니다.
매개 변수
다음 표에서는 파티션에서 파일 시스템 기반 스토리지 풀을 생성하기 위한 XML 파일, virsh pool-define-as 명령 및 Virtual Machine Manager 애플리케이션에 필요한 매개 변수 목록을 제공합니다.

표 13.3. 파일 시스템 기반 스토리지 풀 매개변수

설명XMLpool-define-as가상 머신 관리자
스토리지 풀의 유형입니다. <pool type='fs'> [type] fs fs: 사전 포맷된 블록 장치
스토리지 풀의 이름 <name>name</name> [name] 이름 이름
파티션을 지정하는 경로입니다. 예: /dev/sdc1

<source>
  <device path='source_path' />

[source] path_to_partition 소스 경로
파일 시스템 유형(예: ext4)

  <format type='fs_type' />
</source>

[source format] FS-format 해당 없음
대상을 지정하는 경로입니다. 이는 스토리지 풀에 사용되는 경로입니다.

<target>
  <path>/path_to_pool</path>
</target>

[target] path_to_pool 대상 경로
virsh 를 사용하여 스토리지 풀을 생성하는 경우 스토리지 풀이 생성되었는지 계속 확인합니다.
다음은 파일 시스템 기반 스토리지 풀에 대한 XML 파일의 예입니다.
<pool type='fs'>
  <name>guest_images_fs</name>
  <source>
    <device path='/dev/sdc1'/>
    <format type='auto'/>
  </source>
  <target>
    <path>/guest_images</path>
  </target>
</pool>
다음은 파티션 기반 스토리지 풀을 생성하는 명령의 예입니다.
# virsh pool-define-as guest_images_fs fs --source-dev /dev/sdc1 --target /guest_images
Pool guest_images_fs defined
다음 이미지는 가상 머신 XML 구성 가상 머신 관리자Virtual Machine Manager Add a New Storage Pool 대화 상자에서 파일 시스템 기반 스토리지 풀을 생성하는 방법을 보여줍니다.

그림 13.6. 파일 시스템 기반 스토리지 풀 예 추가

파일 시스템 기반 스토리지 풀 예 추가

13.2.3.4. GlusterFS 기반 스토리지 풀

권장 사항
GlusterFS는 FUSE(사용자 공간)에서 파일 시스템을 사용하는 사용자 공간 파일 시스템입니다.
사전 요구 사항
호스트에서 GlusterFS 기반 스토리지 풀을 생성하려면 Gluster 서버를 준비해야 합니다.

절차 13.4. Gluster 서버 준비

  1. 다음 명령을 사용하여 상태를 나열하여 Gluster 서버의 IP 주소를 가져옵니다.
    # gluster volume status
    Status of volume: gluster-vol1
    Gluster process						Port	Online	Pid
    ------------------------------------------------------------------------------
    Brick 222.111.222.111:/gluster-vol1 			49155	Y	18634
    
    Task Status of Volume gluster-vol1
    ------------------------------------------------------------------------------
    There are no active volume tasks
    
  2. 설치되지 않은 경우 glusterfs-adapter 패키지를 설치합니다.
  3. 활성화되지 않은 경우 virt_use_adapterfs 부울을 활성화합니다. 활성화되어 있는지 확인합니다.
    # setsebool virt_use_fusefs on
    # getsebool virt_use_fusefs
    virt_use_fusefs --> on
    
필요한 패키지가 설치되고 활성화되도록 확인한 후 스토리지 풀을 계속 생성하면 스토리지 풀을 계속 생성합니다.
매개 변수
다음 표에서는 GlusterFS 기반 스토리지 풀을 생성하기 위한 XML 파일, virsh pool-define-as 명령 및 Virtual Machine Manager 애플리케이션에 필요한 매개 변수 목록을 제공합니다.

표 13.4. GlusterFS 기반 스토리지 풀 매개변수

설명XMLpool-define-as가상 머신 관리자
스토리지 풀의 유형입니다. <pool type='gluster'> [type] gluster Gluster: Gluster Filesystem
스토리지 풀의 이름 <name>name</name> [name] 이름 이름
Gluster 서버의 호스트 이름 또는 IP 주소

<source>
  <hostname='hostname' />

source-host hostname 호스트 이름
Gluster 서버의 이름   <name='Gluster-name' /> source-name Gluster-name 소스 이름
스토리지 풀에 사용되는 Gluster 서버의 경로입니다.

  <dir path='Gluster-path' />
</source>

source-path Gluster-path 소스 경로
virsh 를 사용하여 스토리지 풀을 생성하는 경우 스토리지 풀이 생성되었는지 계속 확인합니다.
다음은 GlusterFS 기반 스토리지 풀에 대한 XML 파일의 예입니다.
<pool type='gluster'>
  <name>Gluster_pool</name>
  <source>
    <host name='111.222.111.222'/>
    <dir path='/'/>
    <name>gluster-vol1</name>
  </source>
</pool>
다음은 GlusterFS 기반 스토리지 풀을 생성하는 명령의 예입니다.
# pool-define-as --name Gluster_pool --type gluster --source-host 111.222.111.222 --source-name gluster-vol1 --source-path /
Pool Gluster_pool defined
다음 이미지는 가상 머신 XML 구성 가상 머신 관리자Virtual Machine Manager Add a New Storage Pool 대화 상자에서 GlusterFS 기반 스토리지 풀을 생성하는 방법을 보여줍니다.

그림 13.7. 새로운 GlusterFS 기반 스토리지 풀 예 추가

새로운 GlusterFS 기반 스토리지 풀 예 추가

13.2.3.5. iSCSI 기반 스토리지 풀

권장 사항
iSCSI(Internet Small Computer System Interface)는 스토리지 장치 공유를 위한 네트워크 프로토콜입니다. iSCSI는 IP 계층을 통해 SCSI 명령을 사용하여 이니시에이터(스토리지 클라이언트)를 대상(스토리지 서버)에 연결합니다.
iSCSI 기반 장치를 사용하여 게스트 가상 시스템을 저장하면 iSCSI를 블록 스토리지 장치로 사용하는 등 보다 유연한 스토리지 옵션을 사용할 수 있습니다. iSCSI 장치는 Linux-IO(Linux-IO) 대상을 사용합니다. 이는 Linux의 멀티프로토콜 SCSI 대상입니다. iSCSI 외에도 LIO는 FCoE(Fibre Channel over Ethernet)를 지원합니다.
사전 요구 사항
iSCSI 기반 스토리지 풀을 생성하기 전에 iSCSI 대상을 만들어야 합니다. iSCSI 대상은 소프트웨어 지원 iSCSI 대상을 생성하기 위한 명령 집합을 제공하는 RuntimeClass 패키지로 생성됩니다.

절차 13.5. iSCSI 대상 생성

  1. RuntimeClass 패키지 설치

    # yum install targetcli
  2. rootfs 명령 세트를 시작합니다.

    # targetcli
  3. 스토리지 오브젝트 생성

    스토리지 풀을 사용하여 스토리지 오브젝트 3개를 생성합니다.
    1. 블록 스토리지 오브젝트 생성
      1. /backstores/block 디렉터리로 이동합니다.
      2. create 명령을 실행합니다.
        # create [block-name][filepath]
        예를 들면 다음과 같습니다.
        # create block1 dev=/dev/sdb1
    2. fileio 오브젝트 생성
      1. /fileio 디렉토리로 이동합니다.
      2. create 명령을 실행합니다.
        # create [fileio-name][image-name] [image-size]
        예를 들면 다음과 같습니다.
        # create fileio1 /foo.img 50M
    3. ramdisk 오브젝트 생성
      1. /ramdisk 디렉터리로 이동합니다.
      2. create 명령을 실행합니다.
        # create [ramdisk-name] [ramdisk-size]
        예를 들면 다음과 같습니다.
        # create ramdisk1 1M
    4. 이 단계에서 생성된 디스크의 이름을 기록해 둡니다. 나중에 사용하게 될 것입니다.
  4. iSCSI 대상 만들기

    1. /iscsi 디렉터리로 이동합니다.
    2. 다음 두 가지 방법 중 하나로 대상을 생성합니다.
      • 매개 변수 없이 create 명령을 실행합니다.
        iSCSI 정규화된 이름 (IQN)이 자동으로 생성됩니다.
      • IQN과 서버를 지정하는 create 명령을 실행합니다. 예를 들면 다음과 같습니다.
        # create iqn.2010-05.com.example.server1:iscsirhel7guest
  5. 포털 IP 주소 정의

    iSCSI를 통해 블록 스토리지를 내보내려면 포털, LUN, 액세스 제어 목록 ACL을 먼저 구성해야 합니다.
    포털에는 대상이 모니터링하는 IP 주소 및 TCP와 연결할 이니시에이터가 포함됩니다. iSCSI는 포트 3260을 사용합니다. 이 포트는 기본적으로 구성됩니다.
    포트 3260에 연결하려면 다음을 수행합니다.
    1. /tpg 디렉토리로 이동합니다.
    2. 다음을 실행합니다.
      # portals/ create
      이 명령을 수행하면 포트 3260에서 사용 가능한 모든 IP 주소를 수신 대기합니다.
      포트 3260을 수신할 단일 IP 주소만 사용하려면 명령 끝에 IP 주소를 추가합니다. 예를 들면 다음과 같습니다.
      # portals/ create 143.22.16.33
  6. LUN을 구성하고 스토리지 오브젝트를 패브릭에 할당

    이 단계에서는 스토리지 오브젝트를 생성할 때 생성된 스토리지 오브젝트 를 사용합니다.
    1. 포털 IP 주소 정의 에서 생성된 TPG의 luns 디렉토리로 이동합니다. 예를 들면 다음과 같습니다.
      # iscsi>iqn.iqn.2010-05.com.example.server1:iscsirhel7guest
    2. 램디스크에 첫 번째 LUN을 할당합니다. 예를 들면 다음과 같습니다.
      # create /backstores/ramdisk/ramdisk1
    3. 두 번째 LUN을 블록 디스크에 할당합니다. 예를 들면 다음과 같습니다.
      # create /backstores/block/block1
    4. fileio 디스크에 세 번째 LUN을 할당합니다. 예를 들면 다음과 같습니다.
      # create /backstores/fileio/fileio1
    5. 결과 LUN을 나열합니다.
      /iscsi/iqn.20...csirhel7guest ls
      
      o- tgp1 ............................................................[enabled, auth]
        o- acls...................................................................[0 ACL]
        o- luns..................................................................[3 LUNs]
        | o- lun0......................................................[ramdisk/ramdisk1]
        | o- lun1...............................................[block/block1 (dev/vdb1)]
        | o- lun2................................................[fileio/file1 (foo.img)]
        o- portals.............................................................[1 Portal]
          o- IP-ADDRESS:3260.........................................................[OK]
      
  7. 각 이니시에이터에 대한 ACL 생성

    이니시에이터가 연결할 때 인증을 활성화합니다. 지정된 LUN을 사용하여 지정된 인티터를 지정할 수도 있습니다. 대상 및 이니시에이터에는 고유한 이름이 있습니다. iSCSI 이니시에이터는 IQN을 사용합니다.
    1. 이니시에이터 이름을 사용하여 iSCSI 이니시에이터의 IQN을 찾습니다. 예를 들면 다음과 같습니다.
      # cat /etc/iscsi/initiator2.iscsi
      InitiatorName=create iqn.2010-05.com.example.server1:iscsirhel7guest
      이 IQN은 ACL을 생성하는 데 사용됩니다.
    2. acls 디렉터리로 이동합니다.
    3. 다음 중 하나를 수행하여 ACL을 생성합니다.
      • 매개 변수 없이 create 명령을 실행하여 모든 LUN 및 이니시에이터에 대해 ACLS를 생성합니다.
        # create
      • 특정 LUN 및 이니시에이터에 대한 ACL을 생성하고, iSCSI intiator의 IQN을 지정하는 create 명령을 실행합니다. 예를 들면 다음과 같습니다.
        # create iqn.2010-05.com.example.server1:888
      • 모든 이니시에이터에 단일 사용자 ID와 암호를 사용하도록 커널 대상을 구성합니다.
        # set auth userid=user_ID
        # set auth password=password
        # set attribute authentication=1
        # set attribute generate_node_acls=1
    이 절차를 완료한 후 스토리지 풀을 보호하십시오.
  8. 설정을 저장합니다.

    이전 부팅 설정을 덮어 쓰기하여 구성을 영구적으로 설정합니다.
    # saveconfig
  9. 서비스 활성화

    다음 부팅 시 저장된 설정을 적용하려면 서비스를 활성화합니다.
    # systemctl enable target.service
선택적 절차
iSCSI 기반 스토리지 풀을 생성하기 전에 iSCSI 타겟으로 수행할 수 있는 몇 가지 선택적 프로시저가 있습니다.

절차 13.6. RAID 배열의 논리 볼륨 구성

  1. RAID5 어레이 생성

    RAID5 어레이 생성에 대한 자세한 내용은 Red Hat Enterprise Linux 7 스토리지 관리 가이드 를 참조하십시오.
  2. RAID5 배열에 LVM 논리 볼륨 생성

    RAID5 배열에 LVM 논리 볼륨 생성에 대한 자세한 내용은 Red Hat Enterprise Linux 7 Logical Volume Manager 관리 가이드 를 참조하십시오.

절차 13.7. 검색 기능 테스트

  • 새 iSCSI 장치를 검색할 수 있는지 확인합니다.

    # iscsiadm --mode discovery --type sendtargets --portal server1.example.com
    143.22.16.33:3260,1 iqn.2010-05.com.example.server1:iscsirhel7guest

절차 13.8. 장치 연결 테스트

  1. 새 iSCSI 장치 연결

    새 장치(Waitn.2010-05.com.example.server1:iscsirhel7guest)를 연결하여 장치를 연결할 수 있는지 확인합니다.
    # iscsiadm -d2 -m node --login
    scsiadm: Max file limits 1024 1024
    
    Logging in to [iface: default, target: iqn.2010-05.com.example.server1:iscsirhel7guest, portal: 143.22.16.33,3260]
    Login to [iface: default, target: iqn.2010-05.com.example.server1:iscsirhel7guest, portal: 143.22.16.33,3260] successful.
    
  2. 장치 분리

    # iscsiadm -d2 -m node --logout
    scsiadm: Max file limits 1024 1024
    
    Logging out of session [sid: 2, target: iqn.2010-05.com.example.server1:iscsirhel7guest, portal: 143.22.16.33,3260
    Logout of [sid: 2, target: iqn.2010-05.com.example.server1:iscsirhel7guest, portal: 143.22.16.33,3260] successful.

절차 13.9. iSCSI 스토리지 풀에 libvirt 보안 사용

참고
이 절차는 iSCSI 대상을 생성할user_ID암호를 정의한 경우 필요합니다.
iSCSI 스토리지 풀을 보호하도록 virsh 를 사용하여 사용자 이름 및 암호 매개 변수를 구성할 수 있습니다. 이 설정은 풀을 정의하기 전이나 후에 구성할 수 있지만 인증 설정을 적용하려면 풀을 시작해야 합니다.
  1. libvirt 보안 파일 만들기

    challenge-handshake 인증 프로토콜(CHAP) 사용자 이름을 사용하여 libvirt 시크릿 파일을 만듭니다. 예를 들면 다음과 같습니다.
    <secret ephemeral='no' private='yes'>
        <description>Passphrase for the iSCSI example.com server</description>
        <usage type='iscsi'>
            <target>iscsirhel7secret</target>
        </usage>
    </secret>
  2. 보안 정의

    # virsh secret-define secret.xml
  3. UUID 확인

    # virsh secret-list
    UUID                                  Usage
    --------------------------------------------------------------------------------
    2d7891af-20be-4e5e-af83-190e8a922360  iscsi iscsirhel7secret
  4. UID에 시크릿 할당

    다음 명령을 사용하여 이전 단계의 출력에서 UUID에 시크릿을 할당합니다. 이렇게 하면 CHAP 사용자 이름과 암호가 libvirt 제어된 시크릿 목록에 있습니다.
    # MYSECRET=`printf %s "password123" | base64`
    # virsh secret-set-value 2d7891af-20be-4e5e-af83-190e8a922360 $MYSECRET
  5. 스토리지 풀에 인증 항목 추가

    virsh edit 를 사용하여 스토리지 풀의 XML 파일에서 <source> 항목을 수정하고, 인증 유형,사용자 이름 및 시크릿 사용량 을 지정하여 <auth> 요소를 추가합니다.
    예를 들면 다음과 같습니다.
    <pool type='iscsi'>
      <name>iscsirhel7pool</name>
        <source>
           <host name='192.168.122.1'/>
           <device path='iqn.2010-05.com.example.server1:iscsirhel7guest'/>
           <auth type='chap' username='redhat'>
              <secret usage='iscsirhel7secret'/>
           </auth>
        </source>
      <target>
        <path>/dev/disk/by-path</path>
      </target>
    </pool>
    참고
    <auth> 하위 요소는 게스트 XML의 <pool><disk> 요소 내의 다른 위치에 있습니다. <pool> 의 경우 인증은 일부 풀 소스(iSCSI 및 RBD)의 속성이므로 풀 소스를 찾을 위치를 설명하므로 <source> 요소 내에 <auth> 가 지정됩니다. 도메인의 하위 요소인 <disk> 의 경우 iSCSI 또는 RBD 디스크에 대한 인증은 디스크의 속성입니다.
    또한 디스크의 <auth> 하위 요소는 스토리지 풀과 다릅니다.
    <auth username='redhat'>
      <secret type='iscsi' usage='iscsirhel7secret'/>
    </auth>
  6. 변경 사항 활성화

    이러한 변경 사항을 활성화하려면 스토리지 풀을 시작해야 합니다.
    • 스토리지 풀이 아직 시작되지 않은 경우 virsh로 스토리지 풀 생성 단계를 수행하여 스토리지 풀을 정의하고 시작합니다.
    • 풀이 이미 시작된 경우 다음 명령을 입력하여 스토리지 풀을 중지하고 다시 시작합니다.
      # virsh pool-destroy iscsirhel7pool
      # virsh pool-start iscsirhel7pool
매개 변수
다음 표에서는 iSCSI 기반 스토리지 풀을 생성하기 위한 XML 파일, virsh pool-define-as 명령 및 Virtual Machine Manager 애플리케이션에 필요한 매개 변수 목록을 제공합니다.

표 13.5. iSCSI 기반 스토리지 풀 매개변수

설명XMLpool-define-as가상 머신 관리자
스토리지 풀의 유형입니다. <pool type='iscsi'> [type] iscsi iSCSI: iSCSI 대상
스토리지 풀의 이름 <name>name</name> [name] 이름 이름
호스트의 이름입니다.

<source>
  <host name='hostname' />

source-host hostname 호스트 이름
iSCSI IQN.

  device path="iSCSI_IQN" />
</source>

source-dev iSCSI_IQN 소스 IQN
대상을 지정하는 경로입니다. 이는 스토리지 풀에 사용되는 경로입니다.

<target>
  <path>/dev/disk/by-path</path>
</target>

target path_to_pool 대상 경로
(선택 사항) iSCSI 이니시에이터의 IQN입니다. ACL이 특정 이니시에이터로 LUN을 제한하는 경우에만 필요합니다.

<initiator>
  <iqn name='initiator0' />
</initiator>

아래 노트를 참조하십시오. 이니시에이터 IQN
참고
iSCSI 이니시에이터의 IQN은 virsh find-storage-pool-sources-as iscsi 명령을 사용하여 확인할 수 있습니다.
virsh 를 사용하여 스토리지 풀을 생성하는 경우 스토리지 풀이 생성되었는지 계속 확인합니다.
다음은 iSCSI 기반 스토리지 풀의 XML 파일의 예입니다.
<pool type='iscsi'>
  <name>iSCSI_pool</name>
  <source>
    <host name='server1.example.com'/>
    <device path='iqn.2010-05.com.example.server1:iscsirhel7guest'/>
  </source>
  <target>
    <path>/dev/disk/by-path</path>
  </target>
</pool>

다음은 iSCSI 기반 스토리지 풀을 생성하는 명령의 예입니다.
# virsh pool-define-as --name iSCSI_pool --type iscsi --source-host server1.example.com --source-dev iqn.2010-05.com.example.server1:iscsirhel7guest --target /dev/disk/by-path
Pool iSCSI_pool defined
다음 이미지는 가상 머신 XML 구성 가상 머신 관리자Virtual Machine Manager Add a New Storage Pool 대화 상자의 예를 보여줍니다.

그림 13.8. 새 iSCSI 기반 스토리지 풀 예 추가

새 iSCSI 기반 스토리지 풀 예 추가

13.2.3.6. LVM 기반 스토리지 풀

권장 사항
LVM 기반 스토리지 풀을 생성하기 전에 다음 사항에 유의하십시오.
  • LVM 기반 스토리지 풀은 LVM의 모든 유연성을 제공하지 않습니다.
  • libvirt 는 씬 논리 볼륨을 지원하지만 씬 스토리지 풀의 기능은 제공하지 않습니다.
  • LVM 기반 스토리지 풀은 볼륨 그룹입니다. Logical Volume Manager 명령 또는 virsh 명령을 사용하여 볼륨 그룹을 만들 수 있습니다. virsh 인터페이스를 사용하여 볼륨 그룹을 관리하려면 virsh 명령을 사용하여 볼륨 그룹을 만듭니다.
    볼륨 그룹에 대한 자세한 내용은 Red Hat Enterprise Linux Logical Volume Manager 관리 가이드 를 참조하십시오.
  • LVM 기반 스토리지 풀에는 전체 디스크 파티션이 필요합니다. 이러한 절차를 통해 새 파티션이나 장치를 활성화하면 파티션이 포맷되고 모든 데이터가 지워집니다. 호스트의 기존 볼륨 그룹(VG)을 사용하는 경우 아무것도 삭제되지 않습니다. 다음 절차를 시작하기 전에 스토리지 장치를 백업하는 것이 좋습니다.
    LVM 볼륨 그룹 생성에 대한 자세한 내용은 Red Hat Enterprise Linux Logical Volume Manager 관리 가이드 를 참조하십시오.
  • 기존 VG에서 LVM 기반 스토리지 풀을 생성하는 경우 pool-build 명령을 실행하지 않아야 합니다.
VG가 준비되었는지 확인한 후 스토리지 풀을 정의하여 계속 스토리지 풀을 생성합니다.
매개 변수
다음 표에서는 LVM 기반 스토리지 풀을 생성하기 위해 XML 파일, virsh pool-define-as 명령 및 Virtual Machine Manager 애플리케이션에 필요한 매개 변수 목록을 제공합니다.

표 13.6. LVM 기반 스토리지 풀 매개변수

설명XMLpool-define-as가상 머신 관리자
스토리지 풀의 유형입니다. <pool type='logical'> [type] 논리 logical: LVM 볼륨 그룹
스토리지 풀의 이름 <name>name</name> [name] 이름 이름
스토리지 풀의 장치 경로입니다.

<source>
  <device path='device_path' />

source-dev device_path 소스 경로
볼륨 그룹의 이름   <name='VG-name' /> source-name VG-name 소스 경로
가상 그룹 형식

  <format type='lvm2' />
</source>

source-format lvm2 해당 없음
대상 경로입니다.

<target>
  <path='target-path' />
</target>

대상 target-path 대상 경로
참고
논리 볼륨 그룹이 여러 디스크 파티션으로 구성된 경우 여러 소스 장치가 나열될 수 있습니다. 예를 들면 다음과 같습니다.
<source>
  <device path='/dev/sda1'/>
  <device path='/dev/sdb3'/>
  <device path='/dev/sdc2'/>
  ...
  </source>
virsh 를 사용하여 스토리지 풀을 생성하는 경우 스토리지 풀이 생성되었는지 계속 확인합니다.
다음은 LVM 기반 스토리지 풀의 XML 파일의 예입니다.
<pool type='logical'>
  <name>guest_images_lvm</name>
  <source>
    <device path='/dev/sdc'/>
    <name>libvirt_lvm</name>
    <format type='lvm2'/>
  </source>
  <target>
    <path>/dev/libvirt_lvm</path>
  </target>
</pool>
다음은 LVM 기반 스토리지 풀을 생성하는 명령의 예입니다.
# virsh pool-define-as guest_images_lvm logical --source-dev=/dev/sdc --source-name libvirt_lvm --target /dev/libvirt_lvm
Pool guest_images_lvm defined
다음 이미지는 가상 머신 XML 구성 가상 머신 관리자Virtual Machine Manager Add a New Storage Pool 대화 상자의 예를 보여줍니다.

그림 13.9. 새 LVM 기반 스토리지 풀 예 추가

새 LVM 기반 스토리지 풀 예 추가

13.2.3.7. NFS 기반 스토리지 풀

사전 요구 사항
NFS(네트워크 파일 시스템) 기반 스토리지 풀을 생성하려면 호스트 시스템에서 사용할 NFS 서버를 이미 구성해야 합니다. NFS에 대한 자세한 내용은 Red Hat Enterprise Linux Storage 관리 가이드 를 참조하십시오.
NFS 서버가 올바르게 구성되었는지 확인한 후 스토리지 풀을 정의 하여 계속 생성합니다.
매개 변수
다음 표에서는 NFS 기반 스토리지 풀을 생성하기 위해 XML 파일, virsh pool-define-as 명령 및 Virtual Machine Manager 애플리케이션에 필요한 매개 변수 목록을 제공합니다.

표 13.7. NFS 기반 스토리지 풀 매개변수

설명XMLpool-define-as가상 머신 관리자
스토리지 풀의 유형입니다. <pool type='netfs'> [type] netfs netfs: 네트워크 내보내기 디렉터리
스토리지 풀의 이름 <name>name</name> [name] 이름 이름
마운트 지점이 있는 NFS 서버의 호스트 이름입니다. 호스트 이름 또는 IP 주소일 수 있습니다.

<source>
  <host name='host_name' />

source-host host_name 호스트 이름
NFS 서버에서 사용되는 디렉터리

  <dir path='source_path' />
</source>

source-path source_path 소스 경로
대상을 지정하는 경로입니다. 이는 스토리지 풀에 사용되는 경로입니다.

<target>
  <path>/target_path</path>
</target>

target target_path 대상 경로
virsh 를 사용하여 스토리지 풀을 생성하는 경우 스토리지 풀이 생성되었는지 계속 확인합니다.
다음은 NFS 기반 스토리지 풀의 XML 파일의 예입니다.
<pool type='netfs'>
  <name>nfspool</name>
  <source>
    <host name='localhost'/>
    <dir path='/home/net_mount'/>
  </source>
  <target>
    <path>/var/lib/libvirt/images/nfspool</path>
  </target>
</pool>
다음은 NFS 기반 스토리지 풀을 생성하는 명령의 예입니다.
# virsh pool-define-as nfspool netfs --source-host localhost --source-path /home/net_mount --target /var/lib/libvirt/images/nfspool
Pool nfspool defined
다음 이미지는 가상 머신 XML 구성 가상 머신 관리자Virtual Machine Manager Add a New Storage Pool 대화 상자의 예를 보여줍니다.

그림 13.10. 새 NFS 기반 스토리지 풀 예 추가

새 NFS 기반 스토리지 풀 예 추가

13.2.3.8. SCSI 장치를 사용하는 vHBA 기반 스토리지 풀

참고
가상 머신 관리자를 사용하여 SCSI 장치를 사용하여 vHBA 기반 스토리지 풀을 생성할 수 없습니다.
권장 사항
NPIV(N_Port ID Virtualization)는 단일 물리 파이버 채널 버스 어댑터(HBA)를 공유할 수 있는 소프트웨어 기술입니다. 이를 통해 여러 게스트가 여러 물리적 호스트의 동일한 스토리지를 볼 수 있으므로 스토리지에 대한 마이그레이션 경로가 쉬워집니다. 따라서 올바른 스토리지 경로가 지정된 경우 스토리지를 생성하거나 복사하기 위해 마이그레이션이 필요하지 않습니다.
가상화에서 가상 호스트 버스 어댑터 또는 vHBA 는 가상 시스템의 논리 단위 번호(LUN)를 제어합니다. 호스트에서 여러 KVM 게스트 간에 하나의 파이버 채널 장치 경로를 공유하려면 각 가상 머신에 대해 vHBA를 생성해야 합니다. 여러 KVM 게스트에서 단일 vHBA를 사용해서는 안 됩니다.
NPIV의 각 vHBA는 부모 HBA와 WWNN (WWNN) 및 WWNN(WWNN) 및 WWPN(W Wide Port Name)에 의해 식별됩니다. 스토리지 경로는 WWNN 및 WWPN 값에 따라 결정됩니다. 상위 HBA는 scsi_host# 또는 WWNN/WWPN 쌍으로 정의할 수 있습니다.
참고
상위 HBA가 scsi_host# 으로 정의되고 하드웨어가 호스트 시스템에 추가되면 scsi_host# 할당이 변경될 수 있습니다. 따라서 WWNN/WWPN 쌍을 사용하여 상위 HBA를 정의하는 것이 좋습니다.
vHBA 구성을 유지하므로 vHBA를 기반으로 libvirt 스토리지 풀을 정의하는 것이 좋습니다.
libvirt 스토리지 풀을 사용하면 다음과 같은 두 가지 주요 이점이 있습니다.
  • libvirt 코드는 virsh 명령 출력을 사용하여 LUN의 경로를 쉽게 찾을 수 있습니다.
  • 가상 머신 마이그레이션은 대상 머신에서 동일한 vHBA 이름으로 스토리지 풀을 정의하고 시작해야 합니다. 이렇게 하려면 가상 머신의 XML 구성에 vHBA LUN, libvirt 스토리지 풀 및 볼륨 이름을 지정해야 합니다. 예를 들어 13.2.3.8절. “SCSI 장치를 사용하는 vHBA 기반 스토리지 풀” 을 참조하십시오.
참고
vHBA를 만들기 전에 호스트 LUN에서 SAN(Storage array) 측 zoning을 구성하여 게스트 간에 격리를 제공하고 데이터 손상 가능성을 방지하는 것이 좋습니다.
영구 vHBA 구성을 만들려면 먼저 아래 형식을 사용하여 libvirt 'scsi' 스토리지 풀 XML 파일을 만듭니다. 동일한 물리적 HBA에서 스토리지 풀을 사용하는 단일 vHBA를 생성할 때는 시스템의 /dev/disk/by-{path|id|uuid} 위치 중 하나와 같은 <path> 값에 안정적인 위치를 사용하는 것이 좋습니다.
동일한 물리 HBA에서 스토리지 풀을 사용하는 여러 vHBA를 생성하는 경우 <path> 필드의 값은 /dev/ 여야 합니다. 그렇지 않으면 스토리지 풀 볼륨은 vHBA 중 하나에만 표시되고 호스트의 장치는 NPIV 구성을 사용하여 여러 게스트에 노출할 수 없습니다.
<path><target> 의 요소에 대한 자세한 내용은 업스트림 libvirt 문서를 참조하십시오.
사전 요구 사항
SCSI 장치로 vHBA 기반 스토리지 풀을 생성하기 전에 vHBA를 생성합니다.

절차 13.10. vHBA 생성

  1. 호스트 시스템에서 HBA 검색

    호스트 시스템에서 HBA를 찾으려면 virsh nodedev-list --cap vports 명령을 사용합니다.
    다음 예제에서는 vHBA를 지원하는 두 개의 HBA가 있는 호스트를 보여줍니다.
    # virsh nodedev-list --cap vports
    scsi_host3
    scsi_host4
    
  2. HBA의 세부 정보 확인

    virsh nodedev-dumpxml HBA_device 명령을 사용하여 HBA의 세부 정보를 확인합니다.
    # virsh nodedev-dumpxml scsi_host3
    명령의 출력에는 vHBA를 생성하는 데 사용되는 <name>, <wwnn><wwpn> 필드가 나열됩니다. <max_vports> 에는 지원되는 최대 vHBA 수가 표시됩니다. 예를 들면 다음과 같습니다.
    <device>
      <name>scsi_host3</name>
      <path>/sys/devices/pci0000:00/0000:00:04.0/0000:10:00.0/host3</path>
      <parent>pci_0000_10_00_0</parent>
      <capability type='scsi_host'>
        <host>3</host>
        <unique_id>0</unique_id>
        <capability type='fc_host'>
          <wwnn>20000000c9848140</wwnn>
          <wwpn>10000000c9848140</wwpn>
          <fabric_wwn>2002000573de9a81</fabric_wwn>
        </capability>
        <capability type='vport_ops'>
          <max_vports>127</max_vports>
          <vports>0</vports>
        </capability>
      </capability>
    </device>
    이 예에서 <max_vports> 값은 HBA 구성에서 사용할 수 있는 총 127개의 가상 포트가 있음을 보여줍니다. <vports> 값은 현재 사용 중인 가상 포트 수를 표시합니다. 이 값은 vHBA를 생성한 후 업데이트됩니다.
  3. vHBA 호스트 장치 만들기

    vHBA 호스트에 대해 다음 중 하나와 유사한 XML 파일을 만듭니다. 이 예에서 파일 이름은 vhba_host3.xml 입니다.
    이 예에서는 scsi_host3 을 사용하여 상위 vHBA를 설명합니다.
    # cat vhba_host3.xml
    <device>
      <parent>scsi_host3</parent>
      <capability type='scsi_host'>
        <capability type='fc_host'>
        </capability>
      </capability>
    </device>
    이 예에서는 WWNN/WWPN 쌍을 사용하여 상위 vHBA를 설명합니다.
    # cat vhba_host3.xml
    <device>
      <name>vhba</name>
      <parent wwnn='20000000c9848140' wwpn='10000000c9848140'/>
      <capability type='scsi_host'>
        <capability type='fc_host'>
        </capability>
      </capability>
    </device>
    참고
    WWNN 및 WWPN 값은 절차 13.10. “vHBA 생성” 에 표시된 HBA 세부 정보에 있는 값과 일치해야 합니다.
    <parent> 필드는 이 vHBA 장치와 연결할 HBA 장치를 지정합니다. <device> 태그의 세부 정보는 다음 단계에서 호스트에 대한 새 vHBA 장치를 만드는 데 사용됩니다. nodedev XML 형식에 대한 자세한 내용은 libvirt 업스트림 페이지를 참조하십시오.
  4. vHBA 호스트 장치에서 새 vHBA 생성

    vhba_host3 을 기반으로 vHBA를 생성하려면 virsh nodedev-create 명령을 사용합니다.
    # virsh nodedev-create vhba_host3.xml
    Node device scsi_host5 created from vhba_host3.xml
  5. vHBA 확인

    virsh nodedev-dumpxml 명령을 사용하여 새 vHBA의 세부 정보(scsi_host5)를 확인합니다.
    # virsh nodedev-dumpxml scsi_host5
    <device>
      <name>scsi_host5</name>
      <path>/sys/devices/pci0000:00/0000:00:04.0/0000:10:00.0/host3/vport-3:0-0/host5</path>
      <parent>scsi_host3</parent>
      <capability type='scsi_host'>
        <host>5</host>
        <unique_id>2</unique_id>
        <capability type='fc_host'>
          <wwnn>5001a4a93526d0a1</wwnn>
          <wwpn>5001a4ace3ee047d</wwpn>
          <fabric_wwn>2002000573de9a81</fabric_wwn>
        </capability>
      </capability>
    </device>
vHBA를 확인한 후 스토리지 풀을 정의 하여 스토리지 풀을 계속 생성합니다.
매개 변수
다음 표에서는 vHBA 기반 스토리지 풀을 생성하기 위한 XML 파일, virsh pool-define-as 명령 및 Virtual Machine Manager 애플리케이션에 필요한 매개 변수 목록을 제공합니다.

표 13.8. vHBA 기반 스토리지 풀 매개변수

설명XMLpool-define-as
스토리지 풀의 유형입니다. <pool type='scsi'> scsi
스토리지 풀의 이름 <name>name</name> --adapter-name name
vHBA의 식별자입니다. 상위 속성은 선택 사항입니다.

<source>
  <adapter type='fc_host'
  [parent=parent_scsi_device]
  wwnn='WWNN'
  wwpn='WWPN' />
</source>

[--adapter-parent parent]
--adapter-wwnn wwnn
--adapter-wpnn wwpn

대상을 지정하는 경로입니다. 이는 스토리지 풀에 사용되는 경로입니다.

<target>
  <path>target_path</path>
</target>

target path_to_pool
중요
<path> 필드가 /dev/ 이면 libvirt 는 볼륨 장치 경로에 고유한 짧은 장치 경로를 생성합니다. 예: /dev/sdc. 그렇지 않으면 물리적 호스트 경로가 사용됩니다. 예: /dev/disk/by-path/pci-0000:10:00.0-fc-0x500x5006016044602198-lun-0. 고유한 짧은 장치 경로를 사용하면 여러 스토리지 풀에서 동일한 볼륨을 여러 게스트에 나열할 수 있습니다. 여러 게스트에서 물리적 호스트 경로를 사용하는 경우 중복 장치 유형 경고가 발생할 수 있습니다.
참고
<adapter> 필드에서 parent 속성을 사용하여 다양한 경로에 따라 NPIV LUN을 사용할 수 있는 물리적 HBA 부모를 식별할 수 있습니다. 이 필드 scsi_hostNvportsmax_vports 속성과 결합하여 상위 ID를 완료합니다. parent, parent_wwnn, parent_wwpn 또는 parent_fabric_wwn 속성은 호스트가 동일한 HBA를 재부팅한 후 다양한 보장을 제공합니다.
  • parent 을 지정하지 않으면 libvirt 에서 NPIV를 지원하는 첫 번째 scsi_hostN 어댑터를 사용합니다.
  • parent 만 지정하면 구성에 추가 SCSI 호스트 어댑터가 추가되는 경우 문제가 발생할 수 있습니다.
  • parent_wwnn 또는 parent_wwpn 을 지정하면 호스트가 동일한 HBA를 재부팅한 후 사용됩니다.
  • parent_fabric_wwn 을 사용하는 경우, 호스트가 scsi_hostN 사용된 와 관계없이 동일한 패브릭의 HBA를 재부팅한 후 선택합니다.
virsh 를 사용하여 스토리지 풀을 생성하는 경우 스토리지 풀이 생성되었는지 계속 확인합니다.
다음은 vHBA 기반 스토리지 풀의 XML 파일의 예입니다. 첫 번째 예는 HBA의 유일한 스토리지 풀인 스토리지 풀의 예입니다. 두 번째 예는 단일 vHBA를 사용하고 상위 속성을 사용하여 SCSI 호스트 장치를 식별하는 여러 스토리지 풀 중 하나인 스토리지 풀에 대한 예입니다.
<pool type='scsi'>
  <name>vhbapool_host3</name>
  <source>
    <adapter type='fc_host' wwnn='5001a4a93526d0a1' wwpn='5001a4ace3ee047d'/>
  </source>
  <target>
    <path>/dev/disk/by-path</path>
  </target>
</pool>
<pool type='scsi'>
  <name>vhbapool_host3</name>
  <source>
    <adapter type='fc_host' parent='scsi_host3' wwnn='5001a4a93526d0a1' wwpn='5001a4ace3ee047d'/>
  </source>
  <target>
    <path>/dev/disk/by-path</path>
  </target>
</pool>
다음은 vHBA 기반 스토리지 풀을 생성하는 명령의 예입니다.
# virsh pool-define-as vhbapool_host3 scsi --adapter-parent scsi_host3 --adapter-wwnn 5001a4a93526d0a1 --adapter-wwpn 5001a4ace3ee047d --target /dev/disk/by-path
Pool vhbapool_host3 defined
참고
virsh 명령은 parent_wwnn, parent_wwpn 또는 parent_fabric_wwn 속성을 정의하는 방법을 제공하지 않습니다.
vHBA LUN을 사용하도록 가상 머신 구성
vHBA에 대한 스토리지 풀을 생성한 후 vHBA LUN을 가상 머신 구성에 추가해야 합니다.
  1. 가상 머신의 XML에 있는 가상 머신에 디스크 볼륨을 생성합니다.
  2. <source> 매개변수에 storage poolstorage volume 을 지정합니다.
다음은 예를 보여줍니다.
<disk type='volume' device='disk'>
  <driver name='qemu' type='raw'/>
  <source pool='vhbapool_host3' volume='unit:0:4:0'/>
  <target dev='hda' bus='ide'/>
</disk>
lun 대신 disk 장치를 지정하려면 다음 예제를 참조하십시오.
<disk type='volume' device='lun' sgio='unfiltered'>
  <driver name='qemu' type='raw'/>
  <source pool='vhbapool_host3' volume='unit:0:4:0' mode='host'/>
  <target dev='sda' bus='scsi'/>
  <shareable />
</disk>
게스트에 SCSI LUN 기반 스토리지를 추가하는 XML 구성 예제는 13.3.6.3절. “게스트에 SCSI LUN 기반 스토리지 추가” 을 참조하십시오.
하드웨어 오류가 발생할 경우 LUN을 성공적으로 다시 연결하도록 하려면 fast_io_fail_tmodev_loss_tmo 옵션을 편집하는 것이 좋습니다. 자세한 내용은 하드웨어 오류 발생 후 노출된 LUN에 대한 연결을 참조하십시오.

13.2.4. 스토리지 풀 삭제

virsh 또는 Virtual Machine Manager 를 사용하여 스토리지 풀을 삭제할 수 있습니다.

13.2.4.1. 스토리지 풀 삭제 사전 요구 사항

삭제하려는 스토리지 풀을 사용하는 다른 게스트 가상 머신에 부정적인 영향을 미치지 않으려면 스토리지 풀을 중지하고 사용하는 리소스를 해제하는 것이 좋습니다.

13.2.4.2. virsh를 사용하여 스토리지 풀 삭제

  1. 정의된 스토리지 풀을 나열합니다.
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    guest_images_pool    active     yes
    
  2. 삭제할 스토리지 풀을 중지합니다.
    # virsh pool-destroy guest_images_disk
  3. (선택 사항) 일부 유형의 스토리지 풀의 경우 스토리지 풀이 상주하는 디렉터리를 선택적으로 제거할 수 있습니다.
    # virsh pool-delete guest_images_disk
  4. 스토리지 풀의 정의를 제거합니다.
    # virsh pool-undefine guest_images_disk
  5. 풀이 정의되지 않음을 확인합니다.
    # virsh pool-list --all
    Name                 State      Autostart
    -----------------------------------------
    default              active     yes
    
    

13.2.4.3. 가상 머신 관리자를 사용하여 스토리지 풀 삭제

  1. 연결 세부 정보 창의 스토리지 탭에서 스토리지 풀 목록에서 삭제할 스토리지 풀을 선택합니다.
  2. 스토리지 창 하단에 있는 를 클릭합니다. 이렇게 하면 스토리지 풀이 중지되고 사용 중인 모든 리소스가 해제됩니다.
  3. 을 클릭합니다.
    참고
    아이콘은 스토리지 풀이 중지된 경우에만 활성화됩니다.
    스토리지 풀이 삭제됩니다.

13.3. 스토리지 볼륨 사용

이 섹션에서는 스토리지 볼륨 사용에 대한 정보를 제공합니다. virsh 명령과 Virtual Machine Manager 를 사용하여 스토리지 볼륨을 생성, 구성 및 삭제하는 방법에 대한 자세한 정보와 개념적 정보를 제공합니다.

13.3.1. 스토리지 볼륨 개념

스토리지 풀은 스토리지 볼륨 으로 나뉩니다. 스토리지 볼륨은 물리 파티션, LVM 논리 볼륨, 파일 기반 디스크 이미지 및 libvirt에서 처리하는 기타 스토리지 유형의 추상화입니다. 스토리지 볼륨은 기본 하드웨어에 관계없이 게스트 가상 머신에 로컬 스토리지 장치로 제공됩니다.
참고
아래 섹션에는 virsh가 스토리지 볼륨 관리에 제공하는 모든 명령과 인수가 포함되어 있지 않습니다. 자세한 내용은 20.30절. “스토리지 볼륨 명령” 을 참조하십시오.
호스트 시스템에서 스토리지 볼륨은 해당 이름과 이 이름이 파생된 스토리지 풀의 식별자로 참조됩니다. virsh 명령줄에서 --pool storage_pool volume_name.
예를 들어 guest_images 풀에 firstimage 라는 볼륨이 있습니다.
# virsh vol-info --pool guest_images firstimage
  Name:           firstimage
  Type:           block
  Capacity:       20.00 GB
  Allocation:     20.00 GB
추가 매개변수 및 인수는 20.34절. “볼륨 정보 나열” 에서 참조하십시오.

13.3.2. 스토리지 볼륨 생성

이 섹션에서는 virshVirtual Machine Manager 를 사용하여 스토리지 풀에서 스토리지 볼륨을 생성하는 일반적인 지침을 제공합니다. 스토리지 볼륨을 생성한 후 게스트에 스토리지 장치를 추가할 수 있습니다.

13.3.2.1. virsh를 사용하여 스토리지 볼륨 생성

다음 중 하나를 수행합니다.
  • XML 파일을 사용하여 스토리지 볼륨을 정의합니다.
    a. 새 장치에 필요한 스토리지 볼륨 정보가 포함된 임시 XML 파일을 만듭니다.
    XML 파일에는 다음을 포함한 특정 필드가 포함되어야 합니다.
    • name - 스토리지 볼륨의 이름입니다.
    • 할당 - 스토리지 볼륨의 총 스토리지 할당
    • 용량 - 스토리지 볼륨의 논리 용량입니다. 볼륨이 스파스인 경우 이 값은 할당 값과 다를 수 있습니다.
    • target - 호스트 시스템의 스토리지 볼륨 경로 및 선택 옵션으로 권한 및 레이블입니다.
    다음은 스토리지 볼륨 정의 XML 파일의 예를 보여줍니다. 이 예에서는 파일이 ~/guest_volume.xml에 저장됩니다.
      <volume>
        <name>volume1</name>
        <allocation>0</allocation>
        <capacity>20G</capacity>
        <target>
          <path>/var/lib/virt/images/sparse.img</path>
        </target>
      </volume>
    
    b. virsh vol-create 명령을 사용하여 XML 파일을 기반으로 스토리지 볼륨을 생성합니다.
    # virsh vol-create guest_images_dir ~/guest_volume.xml
      Vol volume1 created
    
    c. 단계에서 만든 XML 파일을 삭제합니다.
  • virsh vol-create-as 명령을 사용하여 스토리지 볼륨을 만듭니다.
    # virsh vol-create-as guest_images_dir volume1 20GB --allocation 0
  • virsh vol-clone 명령을 사용하여 기존 스토리지 볼륨을 복제합니다. virsh vol-clone 명령은 복제할 스토리지 볼륨과 새로 생성된 스토리지 볼륨의 이름을 포함하는 스토리지 풀을 지정해야 합니다.
    # virsh vol-clone --pool guest_images_dir volume1 clone1

13.3.2.2. 가상 머신 관리자를 사용하여 스토리지 볼륨 생성

절차 13.11. 가상 머신 관리자를 사용하여 스토리지 볼륨 생성

  1. 스토리지 설정을 엽니다.

    1. 가상 머신 관리자에서 편집 메뉴를 열고 연결 세부 정보를 선택합니다.
    2. 연결 세부 정보 창에서 스토리지 탭을 클릭합니다.

      그림 13.11. 스토리지 탭

      스토리지 탭
      연결 세부 정보 창 왼쪽에 있는 창에는 스토리지 풀 목록이 표시됩니다.
  2. 스토리지 볼륨을 생성할 스토리지 풀을 선택합니다.

    스토리지 풀 목록에서 스토리지 볼륨을 생성할 스토리지 풀을 클릭합니다.
    선택한 스토리지 풀에 구성된 스토리지 볼륨이 창 하단에 있는 Volumes (볼륨) 창에 표시됩니다.
  3. 새 스토리지 볼륨 추가

    Volumes (볼륨) 목록 위에 있는 버튼을 클릭합니다. 스토리지 볼륨 추가 대화 상자가 나타납니다.

    그림 13.12. 스토리지 볼륨 생성

    스토리지 볼륨 생성
  4. 스토리지 볼륨 구성

    다음 매개 변수를 사용하여 스토리지 볼륨을 구성합니다.
    • 이름 필드에 스토리지 풀의 이름을 입력합니다.
    • 형식 목록에서 스토리지 볼륨의 형식 을 선택합니다.
    • Max Capacity (최대 용량) 필드에 스토리지 볼륨의 최대 크기를 입력합니다.
  5. 생성 완료

    완료를 클릭합니다. 스토리지 볼륨 추가 대화 상자가 닫히고 볼륨 목록에 스토리지 볼륨이 표시됩니다.

13.3.3. 스토리지 볼륨 보기

스토리지 풀에서 여러 스토리지 볼륨을 생성할 수 있습니다. virsh vol-list 명령을 사용하여 스토리지 풀의 스토리지 볼륨을 나열할 수도 있습니다. 다음 예에서 guest_images_disk 에는 세 개의 볼륨이 포함되어 있습니다.
virsh vol-create-as guest_images_disk volume1 8G
Vol volume1 created

# virsh vol-create-as guest_images_disk volume2 8G
Vol volume2 created

# virsh vol-create-as guest_images_disk volume3 8G
Vol volume3 created

# virsh vol-list guest_images_disk
Name                 Path
-----------------------------------------
volume1              /home/VirtualMachines/guest_images_dir/volume1
volume2              /home/VirtualMachines/guest_images_dir/volume2
volume3              /home/VirtualMachines/guest_images_dir/volume3

13.3.4. 데이터 관리

이 섹션에서는 스토리지 볼륨의 데이터 관리에 대한 정보를 제공합니다.
참고
일부 유형의 스토리지 볼륨은 모든 데이터 관리 명령을 지원하지 않습니다. 자세한 내용은 아래 섹션을 참조하십시오.

13.3.4.1. 스토리지 볼륨 삭제

스토리지 볼륨에 있는 데이터에 액세스할 수 없도록 virsh vol-wipe 명령을 사용하여 스토리지 볼륨을 제거할 수 있습니다.
virsh vol-wipe 명령을 사용하여 스토리지 볼륨 제거:
# virsh vol-wipe new-vol vdisk
기본적으로 데이터는 0으로 덮어씁니다. 그러나 스토리지 볼륨 삭제에 대해 지정할 수 있는 다양한 방법이 있습니다. virsh vol-wipe 명령에 대한 모든 옵션에 대한 자세한 내용은 20.32절. “스토리지 볼륨의 콘텐츠 삭제” 를 참조하십시오.

13.3.4.2. 스토리지 볼륨에 데이터 업로드

virsh vol-upload 명령을 사용하여 지정된 로컬 파일의 데이터를 스토리지 볼륨에 업로드할 수 있습니다.
# virsh vol-upload --pool pool-or-uuid --offset bytes --length bytes vol-name-or-key-or-path local-file
다음은 주요 virsh vol-upload 옵션입니다.
  • --pool pool-or-uuid - 볼륨이 있는 스토리지 풀의 이름 또는 UUID입니다.
  • gr-name-or-key-or-path - 업로드할 볼륨의 이름 또는 키 또는 경로입니다.
  • --offset 바이트: 데이터 쓰기를 시작할 스토리지 볼륨의 위치입니다.
  • --length length - 업로드할 데이터 양에 대한 상한입니다.
    참고
    local-file 이 지정된 --length 보다 크면 오류가 발생합니다.

예 13.1. 스토리지 볼륨에 데이터 업로드

# virsh vol-upload sde1 /tmp/data500m.empty disk-pool
이 예에서 sde1disk-pool 스토리지 풀의 볼륨입니다. /tmp/data500m.empty 의 데이터는 sde1 로 복사됩니다.

13.3.4.3. 스토리지 볼륨으로 데이터 다운로드

virsh vol-download 명령을 사용하여 스토리지 볼륨에서 지정된 로컬 파일로 데이터를 다운로드할 수 있습니다.
# vol-download --pool pool-or-uuid --offset bytes --length bytes vol-name-or-key-or-path local-file
다음은 주요 virsh vol-download 옵션입니다.
  • --pool pool-or-uuid - 볼륨이 있는 스토리지 풀의 이름 또는 UUID입니다.
  • gr-name-or-key-or-path - 다운로드할 볼륨의 이름, 키 또는 경로입니다.
  • --offset - 데이터 읽기를 시작할 스토리지 볼륨의 위치입니다.
  • --length length - 다운로드할 데이터 양에 대한 상한입니다.

예 13.2. 스토리지 볼륨에서 데이터 다운로드

# virsh vol-download sde1 /tmp/data-sde1.tmp disk-pool
이 예에서 sde1disk-pool 스토리지 풀의 볼륨입니다. sde1 의 데이터는 /tmp/data-sde1.tmp 로 다운로드됩니다.

13.3.4.4. 스토리지 볼륨 크기 조정

vol-resize 명령을 사용하여 지정된 스토리지 볼륨의 용량 크기를 조정할 수 있습니다.
# virsh vol-resize --pool pool-or-uuid vol-name-or-path pool-or-uuid capacity --allocate --delta --shrink
용량 은 바이트로 표시됩니다. 명령에는 볼륨이 있는 스토리지 풀의 이름 또는 UUID인 --pool pool-or-uuid 가 필요합니다. 또한 이 명령에는 크기를 조정할 볼륨의 이름, 키 또는 경로 , vol-name-or-key-or-path 가 필요합니다.
--allocate 을 지정하지 않으면 새 용량이 스파스일 수 있습니다. 일반적으로 용량은 새 크기이지만 --delta 가 있는 경우 기존 크기에 추가됩니다. --shrink 가 없으면 볼륨을 축소하려고 하면 실패합니다.
용량--shrink 가 제공되지 않고 음수가 필요하지 않습니다. 용량 은 접미사가 없는 경우 바이트로 기본 설정된 스케일링된 정수입니다. 또한 이 명령은 활성 게스트에서 사용하지 않는 스토리지 볼륨에 대해서만 안전합니다. 실시간 크기 조정은 20.13.3절. “게스트 가상 머신의 블록 장치의 크기 변경” 을 참조하십시오.

예 13.3. 스토리지 볼륨 크기 조정

예를 들어 50M 스토리지 볼륨을 생성한 경우 다음 명령을 사용하여 100M로 크기를 조정할 수 있습니다.
# virsh vol-resize --pool disk-pool sde1 100M

13.3.5. 스토리지 볼륨 삭제

virsh 또는 Virtual Machine Manager 를 사용하여 스토리지 볼륨을 삭제할 수 있습니다.
참고
삭제하려는 스토리지 볼륨을 사용하는 게스트 가상 머신에 부정적인 영향을 미치지 않으려면 이를 사용하여 리소스를 해제하는 것이 좋습니다.

13.3.5.1. virsh를 사용하여 스토리지 볼륨 삭제

virsh vol-delete 명령을 사용하여 스토리지 볼륨을 삭제합니다. 명령에서 스토리지 볼륨의 이름 또는 경로와 스토리지 볼륨이 요약된 스토리지 풀을 지정해야 합니다.
다음 예제는 guest_images_dir 스토리지 풀에서 volume_name 스토리지 볼륨을 삭제합니다.
# virsh vol-delete volume_name --pool guest_images_dir
  vol volume_name deleted

13.3.5.2. 가상 머신 관리자를 사용하여 스토리지 볼륨 삭제

절차 13.12. 가상 머신 관리자를 사용하여 스토리지 볼륨 삭제

  1. 스토리지 설정을 엽니다.

    1. 가상 머신 관리자에서 편집 메뉴를 열고 연결 세부 정보를 선택합니다.
    2. 연결 세부 정보 창에서 스토리지 탭을 클릭합니다.

      그림 13.13. 스토리지 탭

      스토리지 탭
      연결 세부 정보 창 왼쪽에 있는 창에는 스토리지 풀 목록이 표시됩니다.
  2. 삭제할 스토리지 볼륨을 선택합니다.

    1. 스토리지 풀 목록에서 스토리지 볼륨이 요약되는 스토리지 풀을 클릭합니다.
      선택한 스토리지 풀에 구성된 스토리지 볼륨 목록이 창 하단에 Volumes (볼륨) 창에 표시됩니다.
    2. 삭제할 스토리지 볼륨을 선택합니다.
  3. 스토리지 볼륨 삭제

    1. 버튼을 클릭합니다( 볼륨 목록 검토). 확인 대화 상자가 나타납니다.
    2. Yes 를 클릭합니다. 선택한 스토리지 볼륨이 삭제됩니다.

13.3.6. 게스트에 스토리지 장치 추가

virsh 또는 Virtual Machine Manager 를 사용하여 게스트 가상 머신에 스토리지 장치를 추가할 수 있습니다.

13.3.6.1. virsh를 사용하여 게스트에 스토리지 장치 추가

게스트 가상 머신에 스토리지 장치를 추가하려면 attach-disk 명령을 사용합니다. 추가할 디스크에 대한 정보가 포함된 인수는 XML 파일 또는 명령줄에 지정할 수 있습니다.
다음은 스토리지 정의가 있는 샘플 XML 파일입니다.
<disk type='file' device='disk>'>
  <driver name='qemu' type='raw' cache='none'/>
  <source file='/var/lib/libvirt/images/FileName.img'/>
  <target dev='vdb' bus='virtio'/>
</disk>
다음 명령은 NewStorage.xml 이라는 XML 파일을 사용하여 게스트1 에 디스크를 연결합니다.
# virsh attach-disk --config Guest1 ~/NewStorage.xml
다음 명령은 xml 파일을 사용하지 않고 게스트1 에 디스크를 연결합니다.
# virsh attach-disk --config Guest1 --source /var/lib/libvirt/images/FileName.img --target vdb

13.3.6.2. 가상 머신 관리자를 사용하여 게스트에 스토리지 장치 추가

게스트 가상 머신에 스토리지 볼륨을 추가하거나 게스트 가상 머신에 기본 스토리지 장치를 생성하고 추가할 수 있습니다.
13.3.6.2.1. 게스트에 스토리지 볼륨 추가
게스트 가상 머신에 스토리지 볼륨을 추가하려면 다음을 수행합니다.
  1. 가상 머신 하드웨어 세부 정보 창에 가상 머신 관리자를 엽니다.

    virt-manager 명령을 root로 실행하거나 애플리케이션시스템 도구가상 머신 관리자를 실행하여 virt-manager를 엽니다.

    그림 13.14. 가상 머신 관리자 창

    가상 머신 관리자 창
    스토리지 볼륨을 추가할 게스트 가상 머신을 선택합니다.
    열기를 클릭합니다. 가상 머신 창이 열립니다.
    을 클릭합니다. 하드웨어 세부 정보 창이 표시됩니다.

    그림 13.15. 하드웨어 세부 정보 창

    하드웨어 세부 정보 창
  2. 새 가상 하드웨어 추가 창을 엽니다.

    하드웨어 추가를 클릭합니다. Add New Virtual Hardware 창이 표시됩니다.
    하드웨어 유형 창에서 Storage 가 선택되었는지 확인합니다.

    그림 13.16. 새 가상 하드웨어 추가 창

    새 가상 하드웨어 추가 창
  3. 스토리지 볼륨 목록 보기

    Select or create custom storage 옵션 버튼을 선택합니다.
    관리를 클릭합니다. 스토리지 볼륨 선택 대화 상자가 나타납니다.

    그림 13.17. 스토리지 볼륨 선택 창

    스토리지 볼륨 선택 창
  4. 스토리지 볼륨 선택

    Select Storage Volume(스토리지 볼륨 선택) 창 왼쪽에 있는 목록에서 스토리지 풀을 선택합니다. 선택한 스토리지 풀의 스토리지 볼륨 목록이 Volumes 목록에 표시됩니다.
    참고
    스토리지 볼륨 선택 창에서 스토리지 풀을 생성할 수 있습니다. 자세한 내용은 13.2.2.2절. “가상 머신 관리자를 사용하여 스토리지 풀 생성”의 내용을 참조하십시오.
    Volumes (볼륨) 목록에서 스토리지 볼륨을 선택합니다.
    참고
    스토리지 볼륨 선택 창에서 스토리지 볼륨을 생성할 수 있습니다. 자세한 내용은 13.3.2.2절. “가상 머신 관리자를 사용하여 스토리지 볼륨 생성”의 내용을 참조하십시오.
    볼륨 선택을 클릭합니다. 스토리지 볼륨 선택 창은 닫힙니다.
  5. 스토리지 볼륨 구성

    장치 유형 목록에서 장치 유형을 선택합니다. 사용 가능한 유형은 다음과 같습니다. 디스크 장치, Floppy 장치 및 LUN 통과.
    버스 유형 목록에서 버스 유형을 선택합니다. 사용 가능한 버스 유형은 선택한 장치 유형에 따라 다릅니다.
    캐시 모드 목록에서 캐시 모드를 선택합니다. 사용 가능한 캐시 모드는 다음과 같습니다. 하이퍼바이저 기본, none, writethrough, writeback, directsync, unsafe
    완료를 클릭합니다. 새 가상 하드웨어 추가 창이 닫힙니다.
13.3.6.2.2. 게스트에 기본 스토리지 추가
기본 스토리지 풀은 /var/lib/libvirt/images/ 디렉터리의 파일 기반 이미지입니다.
게스트 가상 머신에 기본 스토리지를 추가하려면 다음을 수행합니다.
  1. 가상 머신 하드웨어 세부 정보 창에 가상 머신 관리자를 엽니다.

    virt-manager 명령을 root로 실행하거나 애플리케이션시스템 도구가상 머신 관리자를 실행하여 virt-manager를 엽니다.

    그림 13.18. 가상 머신 관리자 창

    가상 머신 관리자 창
    스토리지 볼륨을 추가할 게스트 가상 머신을 선택합니다.
    열기를 클릭합니다. 가상 머신 창이 열립니다.
    을 클릭합니다. 하드웨어 세부 정보 창이 표시됩니다.

    그림 13.19. 하드웨어 세부 정보 창

    하드웨어 세부 정보 창
  2. 새 가상 하드웨어 추가 창을 엽니다.

    하드웨어 추가를 클릭합니다. Add New Virtual Hardware 창이 표시됩니다.
    하드웨어 유형 창에서 Storage 가 선택되었는지 확인합니다.

    그림 13.20. 새 가상 하드웨어 추가 창

    새 가상 하드웨어 추가 창
  3. 게스트용 디스크 만들기

    가상 머신의 디스크 이미지 생성 옵션을 확인합니다.
    가상 머신의 디스크 이미지 만들기 버튼 아래에 텍스트 상자에 생성할 디스크 크기를 입력합니다.
    완료를 클릭합니다. 새 가상 하드웨어 추가 창이 닫힙니다.

13.3.6.3. 게스트에 SCSI LUN 기반 스토리지 추가

호스트 SCSI LUN을 전체적으로 게스트에 노출하는 방법은 여러 가지가 있습니다. SCSI LUN을 게스트에 노출하면 게스트의 LUN에 SCSI 명령을 직접 실행할 수 있습니다. 이는 게스트 간에 LUN을 공유하고 호스트 간에 파이버 채널 스토리지를 공유하는 수단으로 유용합니다.
SCSI LUN 기반 스토리지에 대한 자세한 내용은 SCSI 장치를 사용하는 vHBA 기반 스토리지 풀을 참조하십시오.
중요
선택 사항인 sgio 속성은 device='lun' 디스크에 대해 권한이 없는 SCSI 일반 I/O(SG_IO) 명령이 필터링되는지 여부를 제어합니다. sgio 특성은 'filtered' 또는 'filtered' 로 지정할 수 있지만 영구 예약 의 게스트를 통해 SG_IO ioctl 명령을 전달할 수 있도록 '필터되지 않음 '으로 설정해야 합니다.
sgio='unfiltered' 를 설정하는 것 외에도 게스트 간에 LUN을 공유하도록 <shareable> 요소를 설정해야 합니다. 지정되지 않은 경우 sgio 속성은 기본적으로 'filtered' 로 설정됩니다.
<disk> XML 특성 device='lun' 은 다음 게스트 디스크 구성에 유효합니다.
  • type='block' for <source dev='/dev/disk/by-{path|id|uuid|label}'/>
    <disk type='block' device='lun' sgio='unfiltered'>
      <driver name='qemu' type='raw'/>
      <source dev='/dev/disk/by-path/pci-0000\:04\:00.1-fc-0x203400a0b85ad1d7-lun-0'/>
      <target dev='sda' bus='scsi'/>
      <shareable/>
    </disk>
    참고
    <source> 장치 이름의 콜론 앞에 백슬래시가 필요합니다.
  • type='network' for <source protocol='iscsi'... />
    <disk type='network' device='lun' sgio='unfiltered'>
      <driver name='qemu' type='raw'/>
      <source protocol='iscsi' name='iqn.2013-07.com.example:iscsi-net-pool/1'>
        <host name='example.com' port='3260'/>
        <auth username='myuser'>
          <secret type='iscsi' usage='libvirtiscsi'/>
        </auth>
      </source>
      <target dev='sda' bus='scsi'/>
      <shareable/>
    </disk>
  • iSCSI 또는 NPIV/vHBA 소스 풀을 SCSI 소스 풀로 사용하는 경우 type='volume' 입니다.
    다음 예제 XML에서는 iSCSI 소스 풀(예: iscsi-net-pool)을 SCSI 소스 풀로 사용하는 게스트를 보여줍니다.
    <disk type='volume' device='lun' sgio='unfiltered'>
      <driver name='qemu' type='raw'/>
      <source pool='iscsi-net-pool' volume='unit:0:0:1' mode='host'/>
      <target dev='sda' bus='scsi'/>
      <shareable/>
    </disk>
    참고
    <source> 태그 내의 mode= 옵션은 선택 사항이지만, 사용하는 경우 'host'가 'direct' 가 아닌 'host' 로 설정해야 합니다. 'host' 로 설정하면 libvirt에서 로컬 호스트에서 장치 경로를 찾습니다. 'direct' 로 설정하면 libvirt에서 소스 풀의 소스 호스트 데이터를 사용하여 장치 경로를 생성합니다.
    위 예제의 iSCSI 풀(iscsi-net-pool)에는 다음과 유사한 구성이 있습니다.
    # virsh pool-dumpxml iscsi-net-pool
    <pool type='iscsi'>
      <name>iscsi-net-pool</name>
      <capacity unit='bytes'>11274289152</capacity>
      <allocation unit='bytes'>11274289152</allocation>
      <available unit='bytes'>0</available>
      <source>
        <host name='192.168.122.1' port='3260'/>
        <device path='iqn.2013-12.com.example:iscsi-chap-netpool'/>
        <auth type='chap' username='redhat'>
          <secret usage='libvirtiscsi'/>
        </auth>
      </source>
      <target>
        <path>/dev/disk/by-path</path>
        <permissions>
          <mode>0755</mode>
        </permissions>
      </target>
    </pool>
    iSCSI 소스 풀에서 사용 가능한 LUN의 세부 정보를 확인하려면 다음 명령을 입력합니다.
    # virsh vol-list iscsi-net-pool
    Name                 Path
    ------------------------------------------------------------------------------
    unit:0:0:1           /dev/disk/by-path/ip-192.168.122.1:3260-iscsi-iqn.2013-12.com.example:iscsi-chap-netpool-lun-1
    unit:0:0:2           /dev/disk/by-path/ip-192.168.122.1:3260-iscsi-iqn.2013-12.com.example:iscsi-chap-netpool-lun-2
  • NPIV/vHBA 소스 풀을 SCSI 소스 풀로 사용하는 경우 type='volume' 입니다.
    다음 예제 XML에서는 NPIV/vHBA 소스 풀(이름 vhbapool_host3)을 SCSI 소스 풀로 사용하는 게스트를 보여줍니다.
    <disk type='volume' device='lun' sgio='unfiltered'>
      <driver name='qemu' type='raw'/>
      <source pool='vhbapool_host3' volume='unit:0:1:0'/>
      <target dev='sda' bus='scsi'/>
      <shareable/>
    </disk>
    위 예제의 NPIV/vHBA 풀(vhbapool_host3)에는 다음과 유사한 구성이 있습니다.
    # virsh pool-dumpxml vhbapool_host3
    <pool type='scsi'>
      <name>vhbapool_host3</name>
      <capacity unit='bytes'>0</capacity>
      <allocation unit='bytes'>0</allocation>
      <available unit='bytes'>0</available>
      <source>
        <adapter type='fc_host' parent='scsi_host3' managed='yes' wwnn='5001a4a93526d0a1' wwpn='5001a4ace3ee045d'/>
      </source>
      <target>
        <path>/dev/disk/by-path</path>
        <permissions>
          <mode>0700</mode>
          <owner>0</owner>
          <group>0</group>
        </permissions>
      </target>
    </pool>
    vHBA에서 사용 가능한 LUN의 세부 정보를 확인하려면 다음 명령을 입력합니다.
    # virsh vol-list vhbapool_host3
    Name                 Path
    ------------------------------------------------------------------------------
    unit:0:0:0           /dev/disk/by-path/pci-0000:10:00.0-fc-0x5006016044602198-lun-0
    unit:0:1:0           /dev/disk/by-path/pci-0000:10:00.0-fc-0x5006016844602198-lun-0
    SCSI 장치에서 NPIV vHBA를 사용하는 방법에 대한 자세한 내용은 13.2.3.8절. “SCSI 장치를 사용하는 vHBA 기반 스토리지 풀” 을 참조하십시오.
다음 절차에서는 SCSI LUN 기반 스토리지 장치를 게스트에 추가하는 방법을 보여줍니다. 위의 <disk device='lun'> 게스트 디스크 구성 중 하나를 이 방법으로 연결할 수 있습니다. 환경에 따라 구성을 대체합니다.

절차 13.13. 게스트에 SCSI LUN 기반 스토리지 연결

  1. 새 파일에 <disk> 요소를 작성하여 장치 파일을 생성하고 XML 확장자(이 예에서는 sda.xml)를 사용하여 이 파일을 저장합니다.
    # cat sda.xml
    <disk type='volume' device='lun' sgio='unfiltered'>
      <driver name='qemu' type='raw'/>
      <source pool='vhbapool_host3' volume='unit:0:1:0'/>
      <target dev='sda' bus='scsi'/>
      <shareable/>
    </disk>
  2. sda.xml 에서 생성된 장치를 게스트 가상 시스템과 연결합니다(예:Guest1 ).
    # virsh attach-device --config Guest1 ~/sda.xml
    참고
    --config 옵션을 사용하여 virsh attach-device 명령을 실행하려면 게스트를 다시 부팅하여 게스트에 영구적으로 장치를 추가해야 합니다. 또는 게스트에 장치를 핫플러그하는 데 사용할 수도 있는 --config 대신 --persistent 옵션을 사용할 수 있습니다.
또는 virt-manager 를 사용하여 게스트에서 SCSI LUN 기반 스토리지를 연결하거나 구성할 수 있습니다. virt-manager 를 사용하여 이를 구성하려면 하드웨어 추가 버튼을 클릭하고 필수 매개 변수가 있는 가상 디스크를 추가하거나 이 창에서 기존 SCSI LUN 장치의 설정을 변경합니다. Red Hat Enterprise Linux 7.2 이상에서는 virt-manager 에서 SGIO 값을 구성할 수도 있습니다.

그림 13.21. virt-manager를 사용하여 SCSI LUN 스토리지 구성

virt-manager를 사용하여 SCSI LUN 스토리지 구성

하드웨어 장애 후 노출된 LUN에 다시 연결

하드웨어(예: 호스트 버스 어댑터) 오류가 발생하여 노출된 파이버 채널(FC) LUN에 대한 연결이 손실된 경우 게스트의 노출된 LUN은 하드웨어 오류가 수정된 후에도 계속 실패할 수 있습니다. 이를 방지하려면 dev_loss_tmofast_io_fail_tmo 커널 옵션을 편집합니다.
  • dev_loss_tmo 는 SCSI 장치가 실패하는 후 실패한 것으로 표시하기 전에 SCSI 계층을 대기하는 시간을 제어합니다. 시간 제한을 방지하려면 옵션을 2147483647 인 최대 값으로 설정하는 것이 좋습니다.
  • fast_io_fail_tmo 는 I/O로 실패하기 전에 SCSI 장치가 실패한 후 SCSI 계층을 대기하는 시간을 제어합니다. 커널에서 dev_loss_tmo 를 무시하지 않도록 하려면 이 옵션의 값을 dev_loss_tmo 값보다 낮은 수로 설정합니다.
dev_loss_tmofast_io_fail 값을 수정하려면 다음 중 하나를 수행합니다.
  • /etc/multipath.conf 파일을 편집하고 defaults 섹션에 값을 설정합니다.
    defaults {
    ...
    fast_io_fail_tmo     20
    dev_loss_tmo    infinity
    }
    
  • 다음과 같이 FC 호스트 또는 원격 포트 수준에서 dev_loss_tmofast_io_fail 를 설정합니다.
    # echo 20 > /sys/devices/pci0000:00/0000:00:06.0/0000:13:00.0/host1/rport-1:0-0/fc_remote_ports/rport-1:0-0/fast_io_fail_tmo
    # echo 2147483647 > /sys/devices/pci0000:00/0000:00:06.0/0000:13:00.0/host1/rport-1:0-0/fc_remote_ports/rport-1:0-0/dev_loss_tmo
dev_loss_tmofast_io_fail 의 새 값이 활성화되었는지 확인하려면 다음 명령을 사용합니다.
# find /sys -name dev_loss_tmo -print -exec cat {} \;
매개변수가 올바르게 설정된 경우 출력은 pci0000:00/0000:00:06.0/0000:13:00.0/host1/rport-1:0-0/fc_remote_port-1:0-0:0-0:0-0/fc_remote_port-1:0-0: 대신 적절한 장치 또는 장치를 사용하여 이 값과 유사합니다.
# find /sys -name dev_loss_tmo -print -exec cat {} \;
...
/sys/devices/pci0000:00/0000:00:06.0/0000:13:00.0/host1/rport-1:0-0/fc_remote_ports/rport-1:0-0/dev_loss_tmo
2147483647
...

13.3.6.4. 게스트 가상 머신에서 스토리지 컨트롤러 관리

virtio 디스크와 달리 SCSI 장치에는 게스트 가상 시스템에 컨트롤러가 있어야 합니다. 이 섹션에서는 가상 SCSI 컨트롤러(호스트 버스 어댑터라고도 함)를 생성하고 게스트 가상 머신에 SCSI 스토리지를 추가하는 데 필요한 단계를 자세히 설명합니다.

절차 13.14. 가상 SCSI 컨트롤러 생성

  1. 게스트 가상 머신(Guest1)의 구성을 표시하고 기존 SCSI 컨트롤러를 찾습니다.
    virsh dumpxml Guest1 | grep controller.*scsi
    장치 컨트롤러가 있는 경우 명령은 다음과 유사한 하나 이상의 행을 출력합니다.
    <controller type='scsi' model='virtio-scsi' index='0'/>
    
  2. 이전 단계에서 장치 컨트롤러가 표시되지 않은 경우 다음 단계를 사용하여 새 파일에 하나에 대한 설명을 생성하여 가상 머신에 추가합니다.
    1. 새 파일에 <controller> 요소를 작성하여 장치 컨트롤러를 생성하고 XML 확장자를 사용하여 이 파일을 저장합니다. 예를 들어 virtio-scsi-controller.xml.
      <controller type='scsi' model='virtio-scsi'/>
      
    2. virtio-scsi-controller.xml 에서 생성한 장치 컨트롤러를 게스트 가상 머신(예: Guest1,)과 연결합니다.
      virsh attach-device --config Guest1 ~/virtio-scsi-controller.xml
      이 예에서 --config 옵션은 디스크에 대해 수행하는 것과 동일하게 작동합니다. 자세한 내용은 13.3.6절. “게스트에 스토리지 장치 추가”를 참조하십시오.
  3. 새 SCSI 디스크 또는 CD-ROM을 추가합니다. 새 디스크는 13.3.6절. “게스트에 스토리지 장치 추가” 의 방법을 사용하여 추가할 수 있습니다. SCSI 디스크를 생성하려면 sd 로 시작하는 대상 장치 이름을 지정합니다.
    참고
    각 컨트롤러에 대해 지원되는 제한은 1024 virtio-scsi 디스크이지만 호스트에서 사용 가능한 다른 리소스(예: 파일 설명자)가 디스크가 더 소모될 수 있습니다.
    자세한 내용은 다음 Red Hat Enterprise Linux 6 백서를 참조하십시오. Red Hat Enterprise Linux Kernel Virtual Machine용 차세대 스토리지 인터페이스: virtio-scsi.
    virsh attach-disk Guest1 /var/lib/libvirt/images/FileName.img sdb --cache none
    게스트 가상 머신의 드라이버 버전에 따라 실행 중인 게스트 가상 머신에서 새 디스크를 즉시 탐지하지 못할 수 있습니다. Red Hat Enterprise Linux Storage 관리 가이드 의 단계를 따르십시오.

13.3.7. 게스트에서 스토리지 장치 제거

virsh 또는 Virtual Machine Manager 를 사용하여 가상 게스트 시스템에서 스토리지 장치를 제거할 수 있습니다.

13.3.7.1. virsh를 사용하여 가상 머신에서 스토리지 제거

다음 예제에서는 Guest1 가상 시스템에서 pxe 스토리지 볼륨을 제거합니다.
# virsh detach-disk Guest1 vdb

13.3.7.2. 가상 머신 관리자를 사용하여 가상 머신에서 스토리지 제거

절차 13.15. 가상 머신 관리자를 사용하여 가상 머신에서 스토리지 제거

가상 머신 관리자를 사용하여 게스트 가상 머신에서 스토리지를 제거하려면 다음을 수행합니다.
  1. 가상 머신 하드웨어 세부 정보 창에 가상 머신 관리자를 엽니다.

    virt-manager 명령을 root로 실행하거나 애플리케이션시스템 도구가상 머신 관리자를 실행하여 virt-manager를 엽니다.
    스토리지 장치를 제거할 게스트 가상 머신을 선택합니다.
    열기를 클릭합니다. 가상 머신 창이 열립니다.
    을 클릭합니다. 하드웨어 세부 정보 창이 표시됩니다.
  2. 게스트 가상 머신에서 스토리지 제거

    하드웨어 세부 정보 창 왼쪽에 있는 하드웨어 목록에서 스토리지 장치를 선택합니다.
    제거를 클릭합니다. 확인 대화 상자가 나타납니다.
    Yes 를 클릭합니다. 게스트 가상 머신에서 스토리지가 제거되었습니다.

14장. qemu-img 사용

qemu-img 명령줄 도구는 KVM. qemu-img 옵션 및 사용법에서 사용하는 다양한 파일 시스템을 포맷, 수정 및 확인하는 데 사용됩니다. 다음 섹션에는 이 옵션이 강조 표시됩니다.
주의
qemu-img 를 사용하여 실행 중인 가상 머신 또는 기타 프로세스에서 사용 중인 이미지를 수정하지 마십시오. 이미지를 삭제할 수 있습니다. 또한 다른 프로세스에서 수정 중인 이미지를 쿼리하는 경우 일관되지 않은 상태가 발생할 수 있습니다.

14.1. 디스크 이미지 확인

파일 이름이 imgname 인 디스크 이미지에서 일관성 검사를 수행하려면 다음을 수행합니다.
# qemu-img check [-f format] imgname
참고
선택한 형식의 그룹만 일관성 검사를 지원합니다. 여기에는 qcow2,vdi,vhdx,vmdk, qed 가 포함됩니다.

14.2. 이미지에 변경 사항 커밋

지정된 이미지 파일(imgname)에 기록된 모든 변경 사항을 qemu-img 커밋 명령으로 파일의 기본 이미지에 커밋합니다. 선택적으로 파일의 형식 유형(fmt)을 지정합니다.
 # qemu-img commit [-f fmt] [-t cache] imgname

14.3. 이미지 비교

지정된 두 개의 이미지 파일(imgname1imgname2)의 콘텐츠를 qemu-img compare 명령과 비교합니다. 선택적으로 파일의 형식 유형(fmt)을 지정합니다. 이미지에는 다른 형식 및 설정이 있을 수 있습니다.
기본적으로 크기가 다른 이미지는 다른 이미지가 종료된 후 해당 영역에 할당되지 않은 섹터 또는 제로된 섹터만 포함하는 경우 동일하게 간주됩니다. 또한 하나의 이미지에 섹터가 할당되지 않고 다른 이미지에서 0바이트만 포함된 경우 동일한 값으로 평가됩니다. -s 옵션을 지정하면 이미지 크기가 다르거나 한 이미지에 섹터가 할당되어 두 번째 이미지에 할당되지 않은 경우 이미지가 동일하게 간주되지 않습니다.
 # qemu-img compare [-f fmt] [-F fmt] [-p] [-s] [-q] imgname1 imgname2
qemu-img compare 명령은 다음 종료 코드 중 하나로 종료됩니다.
  • 0 - 이미지가 동일
  • 1 - 이미지가 다릅니다.
  • 2 - 이미지 중 하나를 여는 동안 오류가 발생했습니다.
  • 3 - 섹터 할당을 확인하는 동안 오류가 발생했습니다.
  • 4 - 데이터를 읽는 동안 오류가 발생했습니다.

14.4. 이미지 매핑

qemu-img map 명령을 사용하여 지정된 이미지 파일(imgname) 및 해당 백업 파일 체인의 메타데이터를 덤프할 수 있습니다. 덤프는 (imgname) 백업 파일 체인에서 이를 할당하는 가장 높은 파일의 모든 섹터의 할당 상태를 표시합니다. 선택적으로 파일의 형식 유형(fmt)을 지정합니다.
 # qemu-img map [-f fmt] [--output=fmt] imgname
human 형식 및 json 형식에는 다음 두 가지 출력 형식이 있습니다.

14.4.1. <인명 형식 >

기본 형식(human)은 0이 아닌 파일 부분만 덤프합니다. 출력은 데이터를 읽을 수 있는 위치와 파일의 오프셋을 식별합니다. 각 행에는 네 개의 필드가 있습니다. 다음은 출력의 예입니다.
Offset          Length          Mapped to       File
0               0x20000         0x50000         /tmp/overlay.qcow2
0x100000        0x10000         0x95380000      /tmp/backing.qcow2
첫 번째 줄은 이미지 오프셋 0에서 시작되는 0x20000 (131072) 바이트가 오프셋 0x50000 (327680)에서 시작되는 tmp /overlay.qcow2( raw format)에서 사용 가능함을 의미합니다. 원시 형식에서 압축, 암호화 또는 사용할 수 없는 데이터는 사람이 지정되는 경우 오류가 발생합니다.
참고
파일 이름은 줄 바꿈 문자를 포함할 수 있습니다. 따라서 스크립트의 사람이 형식으로 출력을 구문 분석하는 것은 안전하지 않습니다.

14.4.2. json 형식

json 옵션이 지정되면 출력은 JSON 형식으로 사전 배열을 반환합니다. human 옵션에 제공된 정보 외에도 출력에는 다음 정보가 포함됩니다.
  • Data - 섹터에 데이터를 포함할지 여부를 표시하는 부울 필드입니다.
  • 0 - 데이터가 0으로 읽히도록 알려진지 여부를 표시하는 부울 필드입니다.
  • depth - 파일 이름의 백업 파일의 깊이
참고
json 옵션을 지정하면 offset 필드가 선택 사항입니다.
qemu-img map 명령 및 추가 옵션에 대한 자세한 내용은 관련 도움말 페이지를 참조하십시오.

14.5. 이미지 수정

이미지 파일의 이미지 형식별 옵션을 수정합니다. 선택적으로 파일의 형식 유형(fmt)을 지정합니다.
# qemu-img amend [-p] [-f fmt] [-t cache] -o options filename
참고
이 작업은 qcow2 파일 형식에 대해서만 지원됩니다.

14.6. 기존 이미지를 다른 형식으로 변환

변환 옵션은 인식되는 하나의 이미지 형식을 다른 이미지 형식으로 변환하는 데 사용됩니다. 허용되는 형식 목록은 14.12절. “지원되는 qemu-img 형식” 을 참조하십시오.
# qemu-img convert [-c] [-p] [-f fmt] [-t cache] [-O output_fmt] [-o options] [-S sparse_size] filename output_filename
p 매개 변수는 명령의 진행률(선택 사항)을 표시하고 -S 플래그를 사용하면 디스크 이미지에 포함된 스파스 파일을 만들 수 있습니다. 스파스 파일은 0만 포함된 물리 블록(즉, 아무것도 없음)을 제외하고 모든 용도의 표준 파일처럼 작동합니다. 운영 체제가 이 파일을 볼 때 실제로는 아무 것도 사용하지 않는 경우에도 존재하는 것으로 취급하고 실제 디스크 공간을 차지합니다. 게스트 가상 머신에 대한 디스크를 생성할 때 특히 유용합니다. 이렇게 하면 디스크가 훨씬 많은 디스크 공간을 차지할 수 있습니다. 예를 들어 10Gb의 디스크 이미지에서 -S를 50Gb로 설정하면 10Gb 만 사용되더라도 10Gb의 디스크 공간 크기는 60Gb로 표시됩니다.
output_format 형식 사용하여 디스크 이미지 파일 이름을 디스크 이미지 output_filename 으로 변환합니다. 디스크 이미지는 선택적으로 -c 옵션으로 압축하거나 -o 옵션으로 암호화할 수 있습니다. -o encryption -o 매개 변수와 함께 사용할 수 있는 옵션은 선택한 형식과 다릅니다.
qcow2qcow2 형식만 암호화 또는 압축을 지원합니다. qcow2 암호화는 보안 128비트 키가 있는 AES 형식을 사용합니다. qcow2 압축은 qcow2 형식에서 변환되는 경우 압축되지 않은 데이터로 새 형식으로 작성됩니다.
이미지 변환은 qcow 또는 와 같이 증가할 수 있는 형식을 사용할 때 작은 이미지를 가져오는 데도 유용합니다. 빈 섹터가 감지되어 대상 이미지에서 억제됩니다.

14.7. 새 이미지 또는 장치 생성 및 포맷

크기 및 형식 형식새 디스크 이미지 파일 이름을 만듭니다.
# qemu-img create [-f format] [-o options] filename [size]
기본 이미지가 -o backing_file=filename 로 지정되면 이미지는 자체와 기본 이미지 간의 차이점만 기록합니다. commit 명령을 사용하지 않는 한 백업 파일은 수정되지 않습니다. 이 경우 크기를 지정할 필요가 없습니다.

14.8. 이미지 정보 표시

info 매개 변수는 디스크 이미지 파일 이름에 대한 정보를 표시합니다. info 옵션의 형식은 다음과 같습니다.
# qemu-img info [-f format] filename
이 명령은 종종 표시된 크기와 다를 수 있는 디스크에 예약된 크기를 검색하는 데 사용됩니다. 스냅샷이 디스크 이미지에 저장된 경우 해당 스냅샷도 표시됩니다. 예를 들어 이 명령은 블록 장치의 qcow2 이미지에 의해 수행되는 공간 크기를 보여줍니다. 이 작업은 qemu-img 를 실행하여 수행합니다. 사용 중인 이미지가 qemu-img info 명령 출력과 일치하는 이미지이며 qemu-img check 명령과 함께 확인할 수 있습니다.
# qemu-img info /dev/vg-90.100-sluo/lv-90-100-sluo
image: /dev/vg-90.100-sluo/lv-90-100-sluo
file format: qcow2
virtual size: 20G (21474836480 bytes)
disk size: 0
cluster_size: 65536

14.9. 이미지 백업 파일 복원

qemu-img 가 이미지의 백업 파일을 변경합니다.
# qemu-img rebase [-f fmt] [-t cache] [-p] [-u] -b backing_file [-F backing_fmt] filename
백업 파일이 backing_file 로 변경되고 ( 파일 이름에서 기능을 지원하는 경우) 백업 파일 형식이 backing_format 로 변경됩니다.
참고
qcow2 형식만 백업 파일 변경을 지원합니다(base).
리베이스 가 작동 할 수있는 두 가지 모드가 있습니다 : 안전안전하지 않은.
안전 모드는 기본적으로 사용되며 실제 업데이트 작업을 수행합니다. 새로운 백업 파일은 이전 버전과 다를 수 있으며 qemu-img rebase 명령은 게스트 가상 머신으로 표시되는 파일 이름의 콘텐츠를 변경되지 않은 상태로 유지합니다. 이를 위해 백업 파일을 변경하기 전에 backing_file 과 이전 파일 이름의 이전 백업 파일이 파일 이름으로 병합됩니다.
안전 모드는 비용이 많이 드는 작업이며 이미지를 변환하는 것과 유사합니다. 성공적으로 완료하려면 이전 백업 파일이 필요합니다.
-u 옵션이 qemu-img 재베이스 에 전달되는 경우 unsafe 모드가 사용됩니다. 이 모드에서는 파일 콘텐츠에 대한 검사를 수행하지 않고 백업 파일 이름 및 파일 이름의 형식만 변경됩니다. 새 백업 파일이 올바르게 지정되었거나 이미지의 게스트 표시 콘텐츠가 손상되는지 확인합니다.
이 모드는 백업 파일의 이름을 변경하거나 이동하는 데 유용합니다. 액세스 가능한 이전 백업 파일 없이 사용할 수 있습니다. 예를 들어 백업 파일이 이미 이동되었거나 이름이 변경된 이미지를 수정하는 데 사용할 수 있습니다.

14.10. 디스크 이미지 다시 크기 조정

크기가 지정된 것처럼 디스크 이미지 파일 이름을 변경합니다. raw 형식의 이미지만 방향 모두에서 크기를 조정할 수 있지만 qcow2 이미지를 늘릴 수는 있지만 축소할 수는 없습니다.
다음을 사용하여 디스크 이미지 파일 이름의 크기를 크기 바이트로 설정합니다.
# qemu-img resize filename size
디스크 이미지의 현재 크기에 따라 크기를 조정할 수도 있습니다. 현재 크기를 기준으로 크기를 지정하려면 바이트 수를 + 로 접두사로 지정하거나 디스크 이미지의 크기를 해당 바이트 수로 줄입니다. 단위 접미사를 추가하면 이미지 크기를 킬로바이트(K), 메가바이트(M), 기가바이트(G) 또는 테라바이트(T)로 설정할 수 있습니다.
# qemu-img resize filename [+|-]size[K|M|G|T]
주의
이 명령을 사용하여 디스크 이미지를 축소하기 전에 할당된 파일 시스템 및 파티션 크기를 적절하게 줄이기 위해 VM 자체 내에서 파일 시스템 및 파티셔닝 툴을 사용해야 합니다. 이렇게 하지 않으면 데이터 손실이 발생합니다.
이 명령을 사용하여 디스크 이미지를 확장한 후 VM 내부의 파일 시스템과 파티셔닝 툴을 사용하여 실제로 장치의 새 공간을 사용해야 합니다.

14.11. 스냅샷 나열, 생성, 적용 및 삭제

qemu-img 스냅샷 명령의 다른 매개변수를 사용하여 지정된 이미지(파일 이름)의 기존스냅샷(스냅샷 )을 나열, 적용, 생성 또는 삭제할 수 있습니다.
# qemu-img snapshot [ -l | -a snapshot | -c snapshot | -d snapshot ] filename
허용되는 인수는 다음과 같습니다.
  • - L은 지정된 디스크 이미지와 연결된 모든 스냅샷을 나열합니다.
  • apply 옵션 -a, 디스크 이미지(파일 이름)를 이전에 저장된 스냅샷 의 상태로 되돌립니다.
  • - C는 이미지의스냅샷(스냅샷)을 생성합니다(파일 이름).
  • - D는 지정된 스냅샷을 삭제합니다.

14.12. 지원되는 qemu-img 형식

형식이 qemu-img 명령에 지정되는 경우 다음 형식 유형이 사용될 수 있습니다.
  • Raw - Raw 디스크 이미지 형식(기본값). 가장 빠른 파일 기반 형식일 수 있습니다. 파일 시스템이 홀을 지원하는 경우(예: ext2 또는 ext3 에서는) 기록된 섹터만 공간을 예약합니다. qemu-img info 를 사용하여 Unix/Linux에서 이미지 또는 ls -ls 에서 사용하는 실제 크기를 가져옵니다. 원시 이미지는 최적의 성능을 제공하지만 원시 이미지에서 매우 기본적인 기능만 사용할 수 있습니다. 예를 들어 사용 가능한 스냅샷이 없습니다.
  • qcow2 - QEMU 이미지 형식, 최상의 기능 세트가 있는 가장 다양한 형식입니다. 이 파일을 사용하여 선택적 AES 암호화, zlib 기반 압축, 여러 VM 스냅샷 지원, 작은 이미지를 사용합니다. 이 이미지는 파일 시스템 에서 유용합니다. 이 확장 기능 세트는 성능 비용으로 제공됩니다.
    위의 형식만 게스트 가상 머신 또는 호스트 물리적 시스템에서 실행할 수 있지만 qemu-img원시 또는 qcow2 형식으로 변환하기 위해 다음 형식도 인식하고 지원합니다. 일반적으로 이미지 형식이 자동으로 감지됩니다. 이러한 형식을 raw 또는 qcow2 로 변환하는 것 외에도 raw 또는 qcow2 에서 원래 형식으로 다시 변환할 수 있습니다. Red Hat Enterprise Linux 7에 제공되는 qcow2 버전은 1.1입니다. 이전 버전의 Red Hat Enterprise Linux와 함께 제공되는 형식은 0.10입니다. qcow2의 이전 버전으로 이미지 파일을 되돌릴 수 있습니다. 사용 중인 버전을 확인하려면 qemu-img info qcow2 [imagefilename.img] 명령을 실행합니다. qcow 버전을 변경하려면 23.19.2절. “대상 요소 설정” 를 참조하십시오.
  • Bochs - 디스크 이미지 형식입니다.
  • cloop - Linux Compressed 루프 이미지, 예를 들어 Knoppix CD-ROM에 있는 직접 압축된 CD-ROM 이미지를 재사용하는 데 유용합니다.
  • 포드 - 사용자 모드 Linux Copy On Write 이미지 형식입니다. 소소 형식은 이전 버전과의 호환성을 위해서만 포함되어 있습니다.
  • DMG - Mac 디스크 이미지 형식입니다.
  • NB D - 네트워크 블록 장치.
  • 병렬 - 병렬 가상화 디스크 이미지 형식입니다.
  • QCOW - Old QEMU 이미지 형식입니다. 이전 버전과의 호환성을 위해서만 포함됩니다.
  • QED - Old QEMU 이미지 형식입니다. 이전 버전과의 호환성을 위해서만 포함됩니다.
  • VDI - Oracle VMoctets 하드 디스크 이미지 형식입니다.
  • VHDX - Microsoft Hyper-V 가상 디스크 이미지 형식입니다.
  • VMDK - VMware 3 및 4 호환 이미지 형식입니다.
  • vvfat - Virtual VFAT 디스크 이미지 형식입니다.

15장. KVM 마이그레이션

이 장에서는 KVM 하이퍼바이저를 다른 호스트로 실행하는 하나의 호스트 물리적 머신의 마이그레이션 게스트 가상 머신에 대해 설명합니다. 가상 머신이 하드웨어에서 직접 실행되는 대신 가상화된 환경에서 실행되므로 게스트 마이그레이션이 가능합니다.

15.1. 마이그레이션 정의 및 이점

마이그레이션은 게스트 가상 머신의 메모리 및 모든 가상화된 장치를 대상 호스트 물리적 시스템으로 전송하여 작동합니다. 마이그레이션할 게스트의 이미지를 저장하기 위해 공유 네트워크 스토리지를 사용하는 것이 좋습니다. 또한 가상 머신을 마이그레이션할 때 공유 스토리지에 libvirt 관리 스토리지 풀을 사용하는 것이 좋습니다.
실시간 (실행 중) 및 비실시간 게스트로 마이그레이션을 수행할 수 있습니다.
실시간 마이그레이션 에서는 게스트의 메모리 페이지가 대상 호스트 시스템으로 전송되는 동안 게스트 가상 머신이 소스 호스트 시스템에서 계속 실행됩니다. 마이그레이션 중에 KVM은 소스에서 이미 전송된 페이지의 변경 사항을 모니터링하고 모든 초기 페이지가 전송되면 이러한 변경 사항을 전송하기 시작합니다. 또한 KVM은 마이그레이션 중에 전송 속도를 추정하므로 전송 속도가 설정 가능한 특정 시간 (10ms)에 도달하면 KVM은 원래 게스트 가상 머신을 중단하고 나머지 데이터를 전송하고, 대상 호스트 물리적 머신에서 동일한 게스트 가상 머신을 다시 시작합니다.
반면 실시간 마이그레이션(오프라인 마이그레이션 )은 게스트 가상 머신을 일시 중지한 다음 게스트의 메모리를 대상 호스트 시스템에 복사합니다. 그런 다음 대상 호스트 시스템에서 게스트가 다시 시작되고 소스 호스트 시스템에서 사용된 게스트가 해제됩니다. 이러한 마이그레이션을 완료하는 데 걸리는 시간은 네트워크 대역폭 및 대기 시간에 따라 다릅니다. 네트워크에 사용량이 크거나 낮은 대역폭이 있는 경우 마이그레이션에 시간이 오래 걸립니다. 원래 게스트 가상 시스템이 KVM이 대상 호스트 물리적 시스템으로 전송할 수 있는 페이지보다 빠르게 페이지를 수정하는 경우 실시간 마이그레이션이 완료되지 않으므로 오프라인 마이그레이션을 사용해야 합니다.
마이그레이션은 다음에 유용합니다.
로드 밸런싱
호스트 시스템이 과부하되는 경우 또는 다른 호스트 시스템이 활용도가 낮은 경우 게스트 가상 머신을 호스트 물리적 시스템으로 이동할 수 있습니다.
하드웨어 독립성
호스트 물리적 시스템에서 하드웨어 장치를 업그레이드, 추가 또는 제거해야 하는 경우 게스트 가상 시스템을 다른 호스트 물리적 시스템에 안전하게 재배치할 수 있습니다. 즉, 게스트 가상 머신에서 하드웨어 개선 시 다운타임이 발생하지 않습니다.
더 많은 비용 절감
가상 머신은 다른 호스트 물리적 머신에 재배포할 수 있으며 로드되지 않은 호스트 시스템의 전원을 꺼 비용을 절감할 수 있습니다.
지리적 마이그레이션
대기 시간이 낮거나 다른 이유로 필요한 경우 가상 머신을 다른 위치로 이동할 수 있습니다.

15.2. 마이그레이션 요구 사항 및 제한 사항

KVM 마이그레이션을 사용하기 전에 시스템이 마이그레이션의 요구 사항을 충족하고 해당 제한 사항을 알고 있는지 확인하십시오.

마이그레이션 요구사항

  • 다음 프로토콜 중 하나를 사용하여 공유 스토리지에 설치된 게스트 가상 머신:
    • 파이버 채널 기반 LUN
    • iSCSI
    • NFS
    • GFS2
    • SCSI RDMA 프로토콜 (SCSI RCP): Infiniband 및 10GbE iWARP 어댑터에서 사용되는 블록 내보내기 프로토콜
  • libvirtd 서비스가 활성화되어 실행되고 있는지 확인합니다.
    # systemctl enable libvirtd.service
    # systemctl restart libvirtd.service
  • 효과적으로 마이그레이션하는 기능은 /etc/libvirt/libvirtd.conf 파일의 매개 변수 설정에 따라 달라집니다. 이 파일을 편집하려면 다음 절차를 사용하십시오.

    절차 15.1. libvirtd.conf 구성

    1. libvirtd.conf 를 실행하려면 root로 명령을 실행해야 합니다.
      # vim /etc/libvirt/libvirtd.conf
    2. 필요에 따라 매개변수를 변경하고 파일을 저장합니다.
    3. libvirtd 서비스를 다시 시작합니다.
      # systemctl restart libvirtd
  • 마이그레이션 플랫폼 및 버전을 확인해야 합니다. 표 15.1. “실시간 마이그레이션 호환성”
  • 공유 스토리지 매체를 내보내는 별도의 시스템을 사용합니다. 스토리지는 마이그레이션에 사용되는 두 개의 호스트 물리적 시스템 중 하나에 상주해서는 안 됩니다.
  • 공유 스토리지는 소스 및 대상 시스템의 동일한 위치에 마운트해야 합니다. 마운트된 디렉터리 이름은 동일해야 합니다. 이미지를 다른 경로를 사용하여 유지할 수는 있지만 권장되지 않습니다. virt-manager 를 사용하여 마이그레이션을 수행하려면 경로 이름이 동일해야 합니다. virsh 를 사용하여 마이그레이션을 수행하려면 --xml 옵션 또는 pre-hooks 의 도움말과 함께 다른 네트워크 구성 및 마운트 디렉토리를 사용할 수 있습니다. pre-hooks에 대한 자세한 내용은 libvirt 업스트림 문서 를 참조하십시오. XML 옵션에 대한 자세한 내용은 23장. 도메인 XML 조작 을 참조하십시오.
  • 공용 bridge+tap 네트워크의 기존 게스트 가상 시스템에서 마이그레이션을 시도할 때 소스 및 대상 호스트 시스템이 동일한 네트워크에 있어야 합니다. 그렇지 않으면 마이그레이션 후 guest 가상 머신 네트워크가 작동하지 않습니다.

마이그레이션 제한

  • 게스트 가상 머신 마이그레이션은 KVM을 기반으로 하는 가상화 기술과 함께 Red Hat Enterprise Linux에서 사용할 때 다음과 같은 제한 사항이 있습니다.
    • 포인트 마이그레이션 지점 - 원래 하이퍼바이저에서 대상 하이퍼바이저를 지정하려면 수동으로 수행해야 합니다.
    • 사용 가능한 검증 또는 롤백이 없음
    • 대상에 대한 결정은 수동으로만 수행할 수 있습니다.
    • 스토리지 마이그레이션은 Red Hat Enterprise Linux 7™ 에서 실시간 수행할 수 없지만 게스트 가상 머신의 전원이 꺼진 상태에서 스토리지를 마이그레이션할 수 있습니다. 실시간 스토리지 마이그레이션은 Red Hat Virtualization™ 에서 사용할 수 있습니다. 자세한 내용은 서비스 담당자에게 문의하십시오.
참고
virtio 장치가 있는 게스트 머신을 마이그레이션하는 경우 플랫폼의 virtio 장치에 벡터 수를 32 이하로 설정해야 합니다. 자세한 내용은 23.17절. “devices” 에서 참조하십시오.

15.3. 실시간 마이그레이션 및 Red Hat Enterprise Linux 버전 호환성

실시간 마이그레이션은 표 15.1. “실시간 마이그레이션 호환성” 에 표시된 대로 지원됩니다.

표 15.1. 실시간 마이그레이션 호환성

Migration Method 릴리스 유형 예제 실시간 마이그레이션 지원 참고
forward 주요 릴리스 6.5+ → 7.x 모두 지원됨 모든 문제는 보고되어야 합니다.
Backward 주요 릴리스 7.x → 6.y 지원되지 않음
forward마이너 릴리스7.x → 7.y (7.0 → 7.1)모두 지원됨모든 문제는 보고되어야 합니다.
Backward마이너 릴리스7.Y → 7.x (7.1 → 7.0)모두 지원됨모든 문제는 보고되어야 합니다.

마이그레이션으로 문제 해결

  • 마이그레이션 프로토콜 관련 문제 - 이전 마이그레이션이 "알 수 없음 오류"로 종료되면 마이그레이션 프로세스를 반복하여 일시적인 오류일 수 있으므로 마이그레이션 프로세스를 반복할 수 있습니다. 그렇지 않은 경우 문제를 보고합니다.
  • 오디오 장치 관련 문제 - Red Hat Enterprise Linux 6.x에서 Red Hat Enterprise Linux 7.y로 마이그레이션할 때 es1370 오디오 카드가 더 이상 지원되지 않습니다. 대신 ac97 오디오 카드를 사용하십시오.
  • 네트워크 카드 관련 문제 - Red Hat Enterprise Linux 6.x에서 Red Hat Enterprise Linux 7.y로 마이그레이션할 때 PCnet 및 ne2k_pci 네트워크 카드가 더 이상 지원되지 않습니다. 대신 virtio-net 네트워크 장치를 사용합니다.

네트워크 스토리지 구성

공유 스토리지를 구성하고 공유 스토리지에 게스트 가상 머신을 설치합니다.

15.4. 공유 스토리지 예: 간단한 마이그레이션을 위한 NFS

중요
이 예에서는 NFS를 사용하여 게스트 가상 머신 이미지를 다른 KVM 호스트 물리적 시스템과 공유합니다. 대규모 설치에는 실용적이지 않지만 마이그레이션 기술만 보여주는 것이 표시됩니다. 몇 개 이상의 게스트 가상 머신을 마이그레이션하거나 실행하는 데 이 예제를 사용하지 마십시오. 또한 synch 매개 변수가 활성화되어 있어야 합니다. 이는 NFS 스토리지를 올바르게 내보내는 데 필요합니다.
대규모 배포 시 iSCSI 스토리지를 선택하는 것이 좋습니다. 자세한 내용은 13.2.3.5절. “iSCSI 기반 스토리지 풀” 에서 참조하십시오.
NFS 구성, IP 테이블 열기 및 방화벽 설정에 대한 자세한 내용은 Red Hat Linux Storage 관리 가이드 를 참조하십시오.
KVM에서 지원되지 않으므로 NFS 파일 잠금이 사용되지 않는지 확인합니다.
  1. libvirt 이미지 디렉토리를 내보냅니다.

    마이그레이션을 수행하려면 마이그레이션 대상 시스템으로 별도의 시스템에 스토리지가 있어야 합니다. 이 별도의 시스템에서 기본 이미지 디렉터리를 /etc/exports 파일에 추가하여 스토리지를 내보냅니다.
    /var/lib/libvirt/images *.example.com(rw,no_root_squash,sync)
    환경에 필요한 hostname 매개변수를 변경합니다.
  2. NFS 시작

    1. 아직 설치되지 않은 경우 NFS 패키지를 설치합니다.
      # yum install nfs-utils
    2. iptables 의 NFS 포트(예: 2049)가 열려 있는지 확인하고 /etc/hosts.allow 파일에 NFS를 추가합니다.
    3. NFS 서비스를 시작합니다.
      # systemctl start nfs-server
  3. 소스 및 대상에 공유 스토리지 마운트

    마이그레이션 소스 및 대상 시스템에서 /var/lib/libvirt/images 디렉터리를 마운트합니다.
    # mount storage_host:/var/lib/libvirt/images /var/lib/libvirt/images
    주의
    소스 호스트 물리적 시스템에 대해 선택한 디렉터리는 대상 호스트 물리적 시스템에서 정확히 동일해야 합니다. 이는 모든 유형의 공유 스토리지에 적용됩니다. 디렉터리가 동일해야 합니다. 그렇지 않으면 virt-manager를 사용한 마이그레이션이 실패합니다.

15.5. virsh를 사용한 실시간 KVM 마이그레이션

virsh 명령을 사용하여 게스트 가상 시스템을 다른 호스트 물리적 시스템으로 마이그레이션할 수 있습니다. migrate 명령은 다음 형식으로 매개변수를 허용합니다.
# virsh migrate --live GuestName DestinationURL
실시간 마이그레이션이 필요하지 않은 경우 --live 옵션이 제거될 수 있습니다. 추가 옵션은 15.5.2절. “virsh migrate 명령의 추가 옵션” 에 기재되어 있습니다.
GuestName 매개변수는 마이그레이션하려는 게스트 가상 머신의 이름을 나타냅니다.
DestinationURL 매개변수는 대상 호스트 물리적 시스템의 연결 URL입니다. 대상 시스템은 동일한 하이퍼바이저를 사용하고 libvirt 를 실행해야 합니다.
참고
일반 마이그레이션 및 peer2peer 마이그레이션의 DestinationURL 매개 변수는 다음과 같은 의미 체계가 다릅니다.
  • 일반 마이그레이션: DestinationURL 은 소스 게스트 가상 머신에 표시된 대로 대상 호스트 물리적 시스템의 URL입니다.
  • peer2peer 마이그레이션: DestinationURL 은 소스 호스트 물리적 시스템에 표시되는 것처럼 대상 호스트 물리적 시스템의 URL입니다.
명령이 입력되면 대상 시스템의 루트 암호를 입력하라는 메시지가 표시됩니다.
중요
마이그레이션이 성공하려면 양쪽(소스 및 대상)에서 이름 확인이 작동해야 합니다. 각 측은 다른 쪽을 찾을 수 있어야합니다. 한 쪽을 다른 쪽으로 ping하여 이름 확인이 작동하는지 확인하십시오.

예: virsh를 사용한 실시간 마이그레이션

이 예제에서는 host1.example.com 에서 host2.example.com 으로 마이그레이션합니다. 해당 환경의 호스트 물리적 시스템 이름을 변경합니다. 이 예에서는 guest1-rhel6-64 라는 가상 머신을 마이그레이션합니다.

이 예에서는 공유 스토리지를 완전히 구성하고 모든 사전 요구 사항을 충족한다고 가정합니다(여기서: 마이그레이션 요구사항).
  1. 게스트 가상 머신이 실행 중인지 확인

    소스 시스템에서 host1.example.com 에서 guest1-rhel6-64 가 실행 중인지 확인합니다.
    [root@host1 ~]# virsh list
    Id Name                 State
    ----------------------------------
     10 guest1-rhel6-64     running
    
  2. 게스트 가상 머신 마이그레이션

    다음 명령을 실행하여 게스트 가상 머신을 대상 host2.example.com 으로 실시간 마이그레이션합니다. 대상 URL 끝에 /system 을 추가하여 libvirt에 전체 액세스 권한이 필요하다는 것을 알립니다.
    # virsh migrate --live guest1-rhel7-64 qemu+ssh://host2.example.com/system
    명령이 입력되면 대상 시스템의 루트 암호를 입력하라는 메시지가 표시됩니다.
  3. wait

    마이그레이션은 게스트 가상 시스템의 부하 및 크기에 따라 다소 시간이 걸릴 수 있습니다. virsh 는 오류만 보고합니다. 게스트 가상 시스템은 완전히 마이그레이션될 때까지 소스 호스트 물리적 시스템에서 계속 실행됩니다.
  4. 게스트 가상 머신이 대상 호스트에 도착했는지 확인합니다.

    대상 시스템에서 host2.example.com 에서 guest1-rhel7-64 가 실행 중인지 확인합니다.
    [root@host2 ~]# virsh list
    Id Name                 State
    ----------------------------------
     10 guest1-rhel7-64     running
    
이제 실시간 마이그레이션이 완료되었습니다.
참고
libvirt는 TLS/SSL, UNIX 소켓, SSH 및 암호화되지 않은 TCP를 비롯한 다양한 네트워킹 방법을 지원합니다. 다른 방법 사용에 대한 자세한 내용은 18장. 게스트의 원격 관리 을 참조하십시오.
참고
다음 명령을 사용하여 실행 중인 게스트 가상 머신을 마이그레이션할 수 있습니다.
# virsh migrate --offline --persistent 

15.5.1. virsh를 사용하여 마이그레이션을 위한 추가 팁

각 마이그레이션이 별도의 명령 쉘에서 실행되는 동시에 여러 실시간 마이그레이션을 수행할 수 있습니다. 그러나 이 작업을 신중하게 수행해야 하며 각 마이그레이션 인스턴스에서 각 사이드(소스 및 대상)에서 하나의 MAX_CLIENT를 사용하므로 신중하게 계산해야 합니다. 기본 설정은 20이므로 설정을 변경하지 않고 10개의 인스턴스를 실행하기에 충분합니다. 설정을 변경해야 하는 경우 절차를 참조하십시오. 절차 15.1. “libvirtd.conf 구성”
  1. 절차 15.1. “libvirtd.conf 구성” 에 설명된 대로 libvirtd.conf 파일을 엽니다.
  2. Processing controls 섹션을 찾습니다.
    #################################################################
    #
    # Processing controls
    #
    
    # The maximum number of concurrent client connections to allow
    # over all sockets combined.
    #max_clients = 5000
    
    # The maximum length of queue of connections waiting to be
    # accepted by the daemon. Note, that some protocols supporting
    # retransmission may obey this so that a later reattempt at
    # connection succeeds.
    #max_queued_clients = 1000
    
    # The minimum limit sets the number of workers to start up
    # initially. If the number of active clients exceeds this,
    # then more threads are spawned, upto max_workers limit.
    # Typically you'd want max_workers to equal maximum number
    # of clients allowed
    #min_workers = 5
    #max_workers = 20
    
    
    # The number of priority workers. If all workers from above
    # pool will stuck, some calls marked as high priority
    # (notably domainDestroy) can be executed in this pool.
    #prio_workers = 5
    
    # Total global limit on concurrent RPC calls. Should be
    # at least as large as max_workers. Beyond this, RPC requests
    # will be read into memory and queued. This directly impact
    # memory usage, currently each request requires 256 KB of
    # memory. So by default upto 5 MB of memory is used
    #
    # XXX this isn't actually enforced yet, only the per-client
    # limit is used so far
    #max_requests = 20
    
    # Limit on concurrent requests from a single client
    # connection. To avoid one client monopolizing the server
    # this should be a small fraction of the global max_requests
    # and max_workers parameter
    #max_client_requests = 5
    
    #################################################################
    
  3. max_clientsmax_workers 매개변수 설정을 변경합니다. 두 매개변수 모두에서 번호가 동일해야 하는 것이 좋습니다. max_clients 는 마이그레이션당 2개의 클라이언트를 사용하며 max_workers 는 완료 단계에서 대상에서 1개의 작업자와 대상에서 1개의 작업자를 사용합니다.
    중요
    max_clientsmax_workers 매개변수 설정은 libvirtd 서비스에 대한 모든 게스트 가상 시스템 연결의 영향을 받습니다. 즉, 동일한 게스트 가상 머신을 사용하고 동시에 마이그레이션을 수행하는 모든 사용자는 max_clientsmax_workers 매개변수 설정에 설정된 제한도 따릅니다. 따라서 동시 실시간 마이그레이션을 수행하기 전에 최대값을 신중하게 고려해야 합니다.
    중요
    max_clients 매개변수는 libvirt에 연결할 수 있는 클라이언트 수를 제어합니다. 다수의 컨테이너가 한 번에 시작되면 이 제한에 쉽게 도달하고 초과할 수 있습니다. 이를 방지하기 위해 max_clients 매개변수의 값이 증가할 수 있지만 이렇게 하면 인스턴스에 대한 DoS(서비스 거부) 공격에 시스템이 더 취약해질 수 있습니다. 이 문제를 완화하기 위해 Red Hat Enterprise Linux 7.0에 새로운 max_anonymous_clients 설정이 도입되어 있지만 아직 인증되지 않은 연결 수를 지정합니다. max_clientsmax_anonymous_clients 조합을 구현하여 워크로드에 맞게 구성할 수 있습니다.
  4. 파일을 저장하고 서비스를 다시 시작합니다.
    참고
    시작된 ssh 세션이 많지만 아직 인증되지 않았기 때문에 마이그레이션 연결이 중단된 경우가 있을 수 있습니다. 기본적으로 sshd 에서는 언제든지 10개의 세션만 "사전 인증 상태"에 있을 수 있습니다. 이 설정은 sshd 구성 파일의 MaxStartups 매개변수에 의해 제어됩니다(여기서는 /etc/ssh/sshd_config) 일부 조정이 필요할 수 있습니다. DoS 공격(및 일반적으로 리소스 초과 사용)을 방지하기 위해 제한 사항이 적용되므로 이 매개 변수를 조정해야 합니다. 이 값을 너무 높게 설정하면 그 용도가 무효화됩니다. 이 매개변수를 변경하려면 /etc/ssh/sshd_config 파일을 편집하고, MaxStartups 행의 시작 부분에서 # 을 제거하고 10 (기본값)을 더 높은 숫자로 변경합니다. 파일을 저장하고 sshd 서비스를 다시 시작하십시오. 자세한 내용은 sshd_config 매뉴얼 페이지를 참조하십시오.

15.5.2. virsh migrate 명령의 추가 옵션

virsh migrate는 --live 외에 다음 옵션을 허용합니다.
  • --direct - 직접 마이그레이션에 사용
  • --p2p - 피어 투 피어 마이그레이션에 사용
  • --tunneled - 터널링된 마이그레이션에 사용
  • --offline - 대상에서 도메인을 시작하지 않고 소스 호스트에서 중지하지 않고 도메인 정의를 마이그레이션합니다. 오프라인 마이그레이션은 비활성 도메인과 함께 사용할 수 있으며 --persistent 옵션과 함께 사용해야 합니다.
  • --persistent - 대상 호스트 물리적 시스템에서 도메인을 영구 상태로 둡니다.
  • --undefinesource - 소스 호스트 물리적 시스템에서 도메인을 분리합니다.
  • --suspend - 대상 호스트 물리적 시스템에서 도메인이 일시 중지됨
  • --change-protection - 마이그레이션이 진행되는 동안 도메인에 호환되지 않는 구성 변경을 시행합니다. 이 플래그는 하이퍼바이저에서 지원하는 경우 암시적으로 활성화되지만 하이퍼바이저의 변경으로 인해 마이그레이션을 명시적으로 거부할 수 있습니다.
  • --unsafe - 모든 안전 절차를 무시하고 마이그레이션을 강제 적용합니다.
  • --verbose - 마이그레이션 진행 상황을 표시합니다.
  • --compressed - 실시간 마이그레이션 중에 반복적으로 전송되어야 하는 메모리 페이지의 압축을 활성화합니다.
  • --abort-on-error - 마이그레이션 중에 소프트 오류(예: I/O 오류)가 발생하면 마이그레이션을 취소합니다.
  • --domain [name] - 도메인 이름, id 또는 uuid를 설정합니다.
  • --desturi [URI] - 클라이언트(일반 마이그레이션) 또는 소스(p2p 마이그레이션)에서 볼 수 있는 대상 호스트의 연결 URI입니다.
  • --migrateuri [URI] - 일반적으로 생략할 수 있는 마이그레이션 URI입니다.
  • --graphicsuri [URI] - 원활한 그래픽 마이그레이션에 사용할 그래픽 URI입니다.
  • --listen-address [address] - 수신 마이그레이션을 위해 하이퍼바이저가 바인딩해야 하는 수신 주소를 설정합니다.
  • --timeout [seconds] - 실시간 마이그레이션 카운터가 N초를 초과하면 게스트 가상 머신이 일시 중지되도록 합니다. 실시간 마이그레이션에서만 사용할 수 있습니다. 시간 초과가 시작되면 중지된 게스트 가상 시스템에서 마이그레이션이 계속됩니다.
  • --DNAME [newname] - 마이그레이션 중에 도메인 이름을 변경하는 데 사용되며 일반적으로 생략할 수도 있습니다.
  • --XML [filename] - 표시된 파일 이름은 대상에서 사용할 대체 XML 파일을 제공하여 도메인 XML의 호스트별 부분에 더 많은 변경 사항을 제공할 수 있습니다(예: 기본 스토리지에 액세스하는 소스 및 대상 간의 이름 지정 차이점 고려). 이 옵션은 일반적으로 생략됩니다.
  • --migrate-disks [disk_identifiers] - 이 옵션을 사용하여 마이그레이션 중에 복사되는 디스크를 선택할 수 있습니다. 이를 통해 특정 디스크가 대상에 이미 존재하는 경우와 같이 특정 디스크를 복사하는 것이 바람직하지 않거나 더 이상 쓸 수 없는 경우와 같이 실시간 마이그레이션을 수행할 수 있습니다. [disk_identifiers] 는 마이그레이션할 디스크의 쉼표로 구분되며, 마이그레이션된 <target dev= /> 줄에 있는 인수로 식별되어야 합니다.
다음 명령도 도움이 될 수 있습니다.
  • virsh migrate-setmaxdowntime [domain] [downtime] - 다른 호스트로 실시간 마이그레이션 중인 도메인에 대해 최대 허용 가능한 다운타임을 설정합니다. 지정된 다운 타임은 밀리초 단위입니다. 지정된 도메인은 마이그레이션 중인 도메인과 동일해야 합니다.
  • virsh migrate-compcache [domain] --size -는 실시간 마이그레이션 중에 반복적으로 전송된 메모리 페이지를 압축하는 데 사용되는 캐시 크기를 바이트 단위로 설정하고 가져옵니다. --size 를 사용하지 않으면 명령은 현재 압축 캐시 크기를 표시합니다. --size 를 사용하고 바이트로 지정하면 현재 크기가 표시된 뒤에 표시된 크기와 일치하도록 하이퍼바이저에 압축을 변경해야 합니다. 도메인은 마이그레이션 진행 상황에 대한 대응과 domjobinfo 에서 얻은 압축 캐시 누락 수를 늘리는 동안 --size 인수를 사용해야 합니다.
  • virsh migrate-setspeed [domain] [bandwidth] - 다른 호스트로 마이그레이션 중인 지정된 도메인에 대해 Mib/sec의 마이그레이션 대역폭을 설정합니다.
  • virsh migrate-getspeed [domain] - 지정된 도메인의 Mib/sec에서 사용 가능한 최대 마이그레이션 대역폭을 가져옵니다.
자세한 내용은 마이그레이션 제한 또는 virsh man 페이지를 참조하십시오.

15.6. virt-manager로 마이그레이션

이 섹션에서는 virt-manager 를 사용하여 하나의 호스트 물리적 시스템에서 다른 호스트로 KVM 게스트 가상 머신을 마이그레이션하는 방법에 대해 설명합니다.
  1. 대상 호스트 물리적 시스템에 연결

    virt-manager 인터페이스 에서 파일 메뉴를 선택하여 대상 호스트 물리적 시스템에 연결한 다음 연결 추가 를 클릭합니다.
  2. 연결 추가

    연결 추가 창이 나타납니다.

    그림 15.1. 대상 호스트 물리적 시스템에 연결 추가

    대상 호스트 물리적 시스템에 연결 추가
    다음 세부 정보를 입력합니다.
    • 하이퍼바이저: QEMU/KVM 을 선택합니다.
    • 방법: 연결 방법을 선택합니다.
    • 사용자 이름: 원격 호스트 물리적 시스템의 사용자 이름을 입력합니다.
    • 호스트 이름: 원격 호스트 물리적 시스템의 호스트 이름을 입력합니다.
    참고
    연결 옵션에 대한 자세한 내용은 19.5절. “원격 연결 추가” 을 참조하십시오.
    연결을 클릭합니다. 이 예에서는 SSH 연결이 사용되므로 다음 단계에 지정된 사용자의 암호를 입력해야 합니다.

    그림 15.2. 암호 입력

    암호 입력
  3. 공유 스토리지 구성

    소스 및 대상 호스트 모두 스토리지(예: NFS 사용 )를 공유하는지 확인합니다.
  4. 게스트 가상 머신 마이그레이션

    마이그레이션할 게스트를 마우스 오른쪽 버튼으로 클릭하고 마이그레이션을 클릭합니다.
    New Host (새 호스트) 필드에서 드롭다운 목록을 사용하여 게스트 가상 시스템을 마이그레이션할 호스트 물리적 시스템을 선택한 후 마이그레이션을 클릭합니다.

    그림 15.3. 대상 호스트 물리적 시스템 선택 및 마이그레이션 프로세스 시작

    대상 호스트 물리적 시스템 선택 및 마이그레이션 프로세스 시작
    진행률 창이 나타납니다.

    그림 15.4. 진행률 창

    진행률 창
    문제가 없이 마이그레이션이 완료되면 virt-manager 에 대상 호스트에서 실행 중인 새로 마이그레이션된 게스트 가상 시스템이 표시됩니다.

    그림 15.5. 대상 호스트 물리적 시스템에서 실행 중인 게스트 가상 머신 마이그레이션

    대상 호스트 물리적 시스템에서 실행 중인 게스트 가상 머신 마이그레이션

16장. 게스트 가상 머신 장치 구성

Red Hat Enterprise Linux 7은 게스트 가상 머신을 위한 세 가지 유형의 장치를 지원합니다.
  • 에뮬레이션된 장치는 실제 하드웨어를 모방하는 순수하게 가상 장치이므로 수정되지 않은 게스트 운영 체제가 표준 인 박스 드라이버를 사용하여 작업할 수 있습니다.
  • virtio 장치 (또는 반가상화라고도 함)는 가상 머신에서 최적으로 작동하도록 설계된 가상 장치입니다. virtio 장치는 에뮬레이션된 장치와 유사하지만 Linux 이외의 가상 시스템에는 기본적으로 필요한 드라이버가 포함되어 있지 않습니다. Virtual Machine Manager(virt-manager)와 같은 가상화 관리 소프트웨어 및 Red Hat Virtualization Hypervisor는 지원되는 비 Linux 게스트 운영 체제에 대해 이러한 드라이버를 자동으로 설치합니다. Red Hat Enterprise Linux 7은 최대 216개의 virtio 장치를 지원합니다. 자세한 내용은 5장. KVM Paravirtualized (virtio) 드라이버 의 내용을 참조하십시오.
  • 할당된 장치는 가상 머신에 노출되는 물리적 장치입니다. 이 방법을 passthrough 라고도 합니다. 장치 할당을 통해 가상 머신은 다양한 작업에 대해 PCI 장치에 독점적으로 액세스할 수 있으며 PCI 장치가 게스트 운영 체제에 물리적으로 연결된 것처럼 표시되고 동작할 수 있습니다. Red Hat Enterprise Linux 7은 가상 머신당 최대 32개의 할당된 장치를 지원합니다.
    장치 할당은 일부 그래픽 장치를 포함하여 PCIe 장치에서 지원됩니다. 병렬 PCI 장치는 할당된 장치로 지원될 수 있지만 보안 및 시스템 구성 충돌로 인해 심각한 제한 사항이 있습니다.
Red Hat Enterprise Linux 7은 가상 머신에 단일 기능 슬롯으로 노출되는 PCI 핫 플러그를 지원합니다. 다기능 호스트 장치 및 다중 기능 호스트 장치의 개별 기능은 이를 활성화하도록 구성할 수 있습니다. 가상 머신에 다중 기능 PCI 슬롯으로 장치를 노출하는 구성은 비 핫 플러그 애플리케이션에만 권장됩니다.
특정 장치 및 관련 제한에 대한 자세한 내용은 23.17절. “devices” 을 참조하십시오.
참고
호스트에서 할당된 장치를 사용하여 게스트를 완전히 격리하려면 인터럽트 재 매핑에 대한 플랫폼 지원이 필요합니다. 이러한 지원이 없으면 호스트는 악의적인 게스트의 삽입 공격을 중단하는 데 취약할 수 있습니다. 게스트가 신뢰하는 환경에서 관리자는 allow_unsafe_interrupts 옵션을 vfio_iommu_type1 모듈에 사용하여 PCI 장치 할당을 계속 허용할 수 있습니다. 다음 내용이 포함된 /etc/modprobe.d 에 .conf 파일(예: local.conf)을 추가하여 이 작업을 영구적으로 수행할 수 있습니다.
options vfio_iommu_type1 allow_unsafe_interrupts=1
또는 sysfs 항목을 사용하여 동일한 작업을 수행하는 것이 좋습니다.
# echo 1 > /sys/module/vfio_iommu_type1/parameters/allow_unsafe_interrupts

16.1. PCI 장치

PCI 장치 할당은 Intel VT-d 또는 AMD IOMMU를 지원하는 하드웨어 플랫폼에서만 사용할 수 있습니다. 호스트 BIOS에서 PCI 장치 할당이 작동하려면 이러한 Intel VT-d 또는 AMD IOMMU 사양을 활성화해야 합니다.

절차 16.1. PCI 장치 할당을 위한 Intel 시스템 준비

  1. Intel VT-d 사양 활성화

    Intel VT-d 사양은 가상 머신에 물리적 장치를 직접 할당하는 하드웨어 지원을 제공합니다. Red Hat Enterprise Linux에서 PCI 장치 할당을 사용하려면 이러한 사양이 필요합니다.
    BIOS에서 Intel VT-d 사양을 활성화해야 합니다. 일부 시스템 제조업체에서는 기본적으로 이러한 사양을 비활성화합니다. 이러한 사양을 확인하는 데 사용되는 용어는 제조업체마다 다를 수 있습니다. 시스템 제조업체의 설명서를 참조하십시오.
  2. 커널에서 Intel VT-d 활성화

    /etc/sysconfig/grub 파일에 있는 따옴표 내에서 intel_iommu=oniommu=pt 매개 변수를 추가하여 커널에서 Intel VT-d를 활성화합니다.
    다음은 Intel VT-d가 활성화된 수정된 grub 파일입니다.
    GRUB_CMDLINE_LINUX="rd.lvm.lv=vg_VolGroup00/LogVol01
    vconsole.font=latarcyrheb-sun16 rd.lvm.lv=vg_VolGroup_1/root
    vconsole.keymap=us $([ -x /usr/sbin/rhcrashkernel-param ] && /usr/sbin/
    rhcrashkernel-param || :) rhgb quiet intel_iommu=on iommu=pt"
  3. 구성 파일 재생성

    다음을 실행하여 /etc/grub2.cfg를 다시 생성합니다.
    grub2-mkconfig -o /etc/grub2.cfg
    UEFI 기반 호스트를 사용하는 경우 대상 파일은 /etc/grub2-efi.cfg 여야 합니다.
  4. 사용 준비

    시스템을 재부팅하여 변경 사항을 활성화합니다. 이제 PCI 장치 할당이 가능합니다.

절차 16.2. PCI 장치 할당을 위한 AMD 시스템 준비

  1. AMD IOMMU 사양 활성화

    Red Hat Enterprise Linux에서 PCI 장치 할당을 사용하려면 AMD IOMMU 사양이 필요합니다. 이 사양은 BIOS에서 활성화해야합니다. 일부 시스템 제조업체에서는 기본적으로 이러한 사양을 비활성화합니다.
  2. IOMMU 커널 지원 활성화

    /etc/sysconfig/grub 의 따옴표 내에 GRUB_CMDLINX_LINUX 행의 끝에 iommu=pt 를 추가하여 AMD IOMMU 사양이 부팅 시 활성화되도록 합니다.
  3. 구성 파일 재생성

    다음을 실행하여 /etc/grub2.cfg를 다시 생성합니다.
    grub2-mkconfig -o /etc/grub2.cfg
    UEFI 기반 호스트를 사용하는 경우 대상 파일은 /etc/grub2-efi.cfg 여야 합니다.
  4. 사용 준비

    시스템을 재부팅하여 변경 사항을 활성화합니다. 이제 PCI 장치 할당이 가능합니다.
참고
IOMMU에 대한 자세한 내용은 부록 E. IOMMU 그룹 작업 을 참조하십시오.

16.1.1. virsh를 사용하여 PCI 장치 할당

이러한 단계는 KVM 하이퍼바이저의 가상 머신에 PCI 장치를 할당하는 단계를 포함합니다.
이 예에서는 PCI 식별자 코드 pci_0000 644300_0guest1-rhel7-64 라는 완전히 가상화된 게스트 시스템과 함께 PCIe 네트워크 컨트롤러를 사용합니다.

절차 16.3. virsh를 사용하여 게스트 가상 머신에 PCI 장치 할당

  1. 장치 식별

    먼저 가상 머신에 대한 장치 할당용으로 지정된 PCI 장치를 식별합니다. lspci 명령을 사용하여 사용 가능한 PCI 장치를 나열합니다. grep 을 사용하여 lspci 출력을 구체화할 수 있습니다.
    이 예에서는 다음 출력에 강조 표시된 이더넷 컨트롤러를 사용합니다.
    # lspci | grep Ethernet
    00:19.0 Ethernet controller: Intel Corporation 82567LM-2 Gigabit Network Connection
    01:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    01:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    이 이더넷 컨트롤러는 짧은 식별자 00:19.0 과 함께 표시됩니다. 이 PCI 장치를 가상 머신에 할당하려면 virsh 에서 사용하는 전체 식별자를 찾아야 합니다.
    이렇게 하려면 virsh nodedev-list 명령을 사용하여 호스트 시스템에 연결된 특정 유형(pci)의 모든 장치를 나열합니다. 그런 다음 사용하려는 장치의 짧은 식별자에 매핑되는 문자열의 출력을 확인합니다.
    이 예에서는 짧은 식별자 00:19.0 을 사용하여 이더넷 컨트롤러에 매핑되는 문자열을 보여줍니다. 및 . 문자 전체 식별자에서 밑줄로 교체됩니다.
    # virsh nodedev-list --cap pci
    pci_0000_00_00_0
    pci_0000_00_01_0
    pci_0000_00_03_0
    pci_0000_00_07_0
    pci_0000_00_10_0
    pci_0000_00_10_1
    pci_0000_00_14_0
    pci_0000_00_14_1
    pci_0000_00_14_2
    pci_0000_00_14_3
    pci_0000_00_19_0
    pci_0000_00_1a_0
    pci_0000_00_1a_1
    pci_0000_00_1a_2
    pci_0000_00_1a_7
    pci_0000_00_1b_0
    pci_0000_00_1c_0
    pci_0000_00_1c_1
    pci_0000_00_1c_4
    pci_0000_00_1d_0
    pci_0000_00_1d_1
    pci_0000_00_1d_2
    pci_0000_00_1d_7
    pci_0000_00_1e_0
    pci_0000_00_1f_0
    pci_0000_00_1f_2
    pci_0000_00_1f_3
    pci_0000_01_00_0
    pci_0000_01_00_1
    pci_0000_02_00_0
    pci_0000_02_00_1
    pci_0000_06_00_0
    pci_0000_07_02_0
    pci_0000_07_03_0
    사용할 장치에 매핑되는 PCI 장치 번호를 기록합니다. 다른 단계에서 필요합니다.
  2. 장치 정보 검토

    domain, bus 및 function에 대한 정보는 virsh nodedev-dumpxml 명령의 출력에서 확인할 수 있습니다.

    그림 16.1. 덤프 내용

    
    # virsh nodedev-dumpxml pci_0000_00_19_0
    <device>
      <name>pci_0000_00_19_0</name>
      <parent>computer</parent>
      <driver>
        <name>e1000e</name>
      </driver>
      <capability type='pci'>
        <domain>0</domain>
        <bus>0</bus>
        <slot>25</slot>
        <function>0</function>
        <product id='0x1502'>82579LM Gigabit Network Connection</product>
        <vendor id='0x8086'>Intel Corporation</vendor>
        <iommuGroup number='7'>
          <address domain='0x0000' bus='0x00' slot='0x19' function='0x0'/>
        </iommuGroup>
      </capability>
    </device>
    
    
    참고
    IOMMU 그룹은 IOMMU의 관점에서 장치의 가시성과 격리를 기반으로 결정됩니다. 각 IOMMU 그룹은 하나 이상의 장치를 포함할 수 있습니다. 여러 장치가 있는 경우 IOMMU 그룹 내의 모든 끝점을 게스트에 할당할 그룹 내 모든 장치에 대해 요청해야 합니다. 이 작업은 게스트에 추가 엔드포인트를 할당하거나 virsh nodedev-detach 를 사용하여 호스트 드라이버에서 분리하여 수행할 수 있습니다. 단일 그룹에 포함된 장치는 여러 게스트 간에 분할되거나 호스트와 게스트 간에 분할되지 않을 수 있습니다. PCIe 루트 포트, 스위치 포트, 브리지와 같은 비 엔드 포인트 장치는 호스트 드라이버에서 분리해서는 안 되며 끝점 할당을 방해하지 않습니다.
    IOMMU 그룹 내의 장치는 virsh nodedev-dumpxml 출력의 iommuGroup 섹션을 사용하여 확인할 수 있습니다. 그룹의 각 멤버는 별도의 "address" 필드에 제공됩니다. 이 정보는 다음을 사용하여 sysfs에서 찾을 수도 있습니다.
    $ ls /sys/bus/pci/devices/0000:01:00.0/iommu_group/devices/
    이 예제의 예는 다음과 같습니다.
    0000:01:00.0  0000:01:00.1
    0000.01.00.0만 게스트에 할당하려면 게스트를 시작하기 전에 사용되지 않은 엔드 포인트를 호스트에서 분리해야 합니다.
    $ virsh nodedev-detach pci_0000_01_00_1
  3. 필요한 구성 세부 정보 확인

    구성 파일에 필요한 값은 virsh nodedev-dumpxml pci_0000_00_19_0 명령의 출력을 참조하십시오.
    예제 장치에는 bus = 0, 슬롯 = 25 및 function = 0의 값이 있습니다. 10진수 구성은 다음 세 가지 값을 사용합니다.
    bus='0'
    slot='25'
    function='0'
  4. 설정 세부 정보 추가

    virsh edit 를 실행하여 가상 머신 이름을 지정하고 <devices> 섹션에 장치 항목을 추가하여 PCI 장치를 게스트 가상 머신에 할당합니다. 예를 들면 다음과 같습니다.
    # virsh edit guest1-rhel7-64

    그림 16.2. PCI 장치 추가

    
    <devices>
    	[...]
     <hostdev mode='subsystem' type='pci' managed='yes'>
       <source>
          <address domain='0' bus='0' slot='25' function='0'/>
       </source>
     </hostdev>
     [...]
    </devices>
    
    또는 virsh attach-device 를 실행하여 가상 머신 이름과 게스트의 XML 파일을 지정합니다.
    virsh attach-device guest1-rhel7-64 file.xml
    참고
    PCI 장치는 장치에 대한 장치 펌웨어 또는 사전 부팅 드라이버 (예: PXE)를 제공하기 위한 옵션 2.0.0 또는 확장 Makefile(예: PXE)이라고도 하는 선택적 읽기 전용 메모리(ROM) 모듈을 포함할 수 있습니다. 일반적으로 이러한 옵션은 PCI 장치 할당을 사용하여 물리적 PCI 장치를 VM에 연결할 때 가상화된 환경에서도 작동합니다.
    그러나 경우에 따라 옵션 RAM이 불필요하여 VM을 더 느리게 부팅하거나 장치에서 제공하는 사전 부팅 드라이버가 가상화와 호환되지 않을 수 있으므로 게스트 OS 부팅이 실패할 수 있습니다. 이러한 경우 Red Hat은 VM에서 옵션 Rom을 마스킹하는 것을 권장합니다. 이렇게 하려면 다음을 수행합니다.
    1. 호스트에서 할당할 장치에 확장 Makefile 베이스 주소 레지스터(BAR)가 있는지 확인합니다. 이렇게 하려면 장치에 lspci -v 명령을 사용하고 다음이 포함된 행의 출력을 확인합니다.
      Expansion ROM at
    2. <rom bar='off'/> 요소를 게스트의 XML 구성에서 <hostdev> 요소의 자식으로 추가합니다.
      <hostdev mode='subsystem' type='pci' managed='yes'>
        <source>
           <address domain='0' bus='0' slot='25' function='0'/>
        </source>
        <rom bar='off'/>
      </hostdev>
      
  5. 가상 머신 시작

    # virsh start guest1-rhel7-64
이제 PCI 장치를 가상 머신에 할당하고 게스트 운영 체제에 액세스할 수 있어야 합니다.

16.1.2. virt-manager로 PCI 장치 할당

그래픽 virt-manager 도구를 사용하여 PCI 장치를 게스트 가상 머신에 추가할 수 있습니다. 다음 절차에서는 게스트 가상 머신에 Gigabit 이더넷 컨트롤러를 추가합니다.

절차 16.4. virt-manager를 사용하여 게스트 가상 머신에 PCI 장치 할당

  1. 하드웨어 설정 열기

    게스트 가상 머신을 열고 하드웨어 추가 버튼 을 클릭하여 가상 시스템에 새 장치를 추가합니다.

    그림 16.3. 가상 머신 하드웨어 정보 창

    상단 작업 표시줄에서 선택한 Information(정보) 버튼이 있는 가상 머신 하드웨어 창과 왼쪽 메뉴 창에서 선택한 개요입니다.
  2. PCI 장치 선택

    왼쪽의 하드웨어 목록에서 PCI 호스트 장치를 선택합니다.
    사용되지 않는 PCI 장치를 선택합니다. 현재 다른 게스트에서 사용 중인 PCI 장치를 선택하면 오류가 발생합니다. 이 예제에서는 예비 오디오 컨트롤러가 사용됩니다. 완료 를 클릭하여 설정을 완료합니다.

    그림 16.4. 새 가상 하드웨어 추가 마법사

    왼쪽 메뉴 창에서 PCI Host Device를 선택한 상태에서 새 가상 하드웨어 추가 마법사를 사용하여 오른쪽 메뉴 창에서 선택할 호스트 장치 목록을 표시합니다.
  3. 새 장치 추가

    설정이 완료되고 게스트 가상 머신에서 PCI 장치에 직접 액세스할 수 있습니다.

    그림 16.5. 가상 머신 하드웨어 정보 창

    왼쪽 메뉴 창에서 새로 추가된 PCI 장치 목록에 새로 추가된 PCI 장치 목록에 Information(정보) 버튼을 선택한 Information(정보) 버튼을 사용하는 가상 머신 하드웨어 창은 왼쪽 메뉴 창에 새로 추가된 PCI 장치를 표시합니다.
참고
장치 할당에 실패하면 동일한 IOMMU 그룹에 여전히 연결된 다른 끝점이 있을 수 있습니다. virt-manager를 사용하여 그룹 정보를 검색할 수 있는 방법은 없지만 virsh 명령을 사용하여 IOMMU 그룹의 경계를 분석하고 필요한 경우 sequester 장치를 분석할 수 있습니다.
IOMMU 그룹 및 virsh를 사용하여 엔드포인트 장치를 분리하는 방법에 대한 자세한 내용은 16.1.1절. “virsh를 사용하여 PCI 장치 할당”참고 를 참조하십시오.

16.1.3. virt-install을 사용한 PCI 장치 할당

virt-install 명령을 사용하여 게스트를 설치할 때 PCI 장치를 할당할 수 있습니다. 이 작업을 수행하려면 --host-device 매개 변수를 사용합니다.

절차 16.5. virt-install을 사용하여 가상 머신에 PCI 장치 할당

  1. 장치 식별

    게스트 가상 머신에 대한 장치 할당용으로 지정된 PCI 장치를 식별합니다.
    # lspci | grep Ethernet
    00:19.0 Ethernet controller: Intel Corporation 82567LM-2 Gigabit Network Connection
    01:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    01:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    virsh nodedev-list 명령은 시스템에 연결된 모든 장치를 나열하고 각 PCI 장치를 문자열로 식별합니다. 출력을 PCI 장치로만 제한하려면 다음 명령을 입력합니다.
    # virsh nodedev-list --cap pci
    pci_0000_00_00_0
    pci_0000_00_01_0
    pci_0000_00_03_0
    pci_0000_00_07_0
    pci_0000_00_10_0
    pci_0000_00_10_1
    pci_0000_00_14_0
    pci_0000_00_14_1
    pci_0000_00_14_2
    pci_0000_00_14_3
    pci_0000_00_19_0
    pci_0000_00_1a_0
    pci_0000_00_1a_1
    pci_0000_00_1a_2
    pci_0000_00_1a_7
    pci_0000_00_1b_0
    pci_0000_00_1c_0
    pci_0000_00_1c_1
    pci_0000_00_1c_4
    pci_0000_00_1d_0
    pci_0000_00_1d_1
    pci_0000_00_1d_2
    pci_0000_00_1d_7
    pci_0000_00_1e_0
    pci_0000_00_1f_0
    pci_0000_00_1f_2
    pci_0000_00_1f_3
    pci_0000_01_00_0
    pci_0000_01_00_1
    pci_0000_02_00_0
    pci_0000_02_00_1
    pci_0000_06_00_0
    pci_0000_07_02_0
    pci_0000_07_03_0
    PCI 장치 번호를 기록합니다. 다른 단계에서 번호가 필요합니다.
    도메인, 버스 및 기능에 대한 정보는 virsh nodedev-dumpxml 명령의 출력에서 확인할 수 있습니다.
    # virsh nodedev-dumpxml pci_0000_01_00_0

    그림 16.6. PCI 장치 파일 콘텐츠

    
    <device>
      <name>pci_0000_01_00_0</name>
      <parent>pci_0000_00_01_0</parent>
      <driver>
        <name>igb</name>
      </driver>
      <capability type='pci'>
        <domain>0</domain>
        <bus>1</bus>
        <slot>0</slot>
        <function>0</function>
        <product id='0x10c9'>82576 Gigabit Network Connection</product>
        <vendor id='0x8086'>Intel Corporation</vendor>
        <iommuGroup number='7'>
          <address domain='0x0000' bus='0x00' slot='0x19' function='0x0'/>
        </iommuGroup>
      </capability>
    </device>
    
    참고
    IOMMU 그룹에 끝점이 여러 개 있고 모두 게스트에 할당되지 않은 경우 게스트를 시작하기 전에 다음 명령을 실행하여 호스트에서 다른 끝점을 수동으로 분리해야 합니다.
    $ virsh nodedev-detach pci_0000_00_19_1
    IOMMU 그룹에 대한 자세한 내용은 16.1.1절. “virsh를 사용하여 PCI 장치 할당”참고 를 참조하십시오.
  2. 장치 추가

    virsh nodedev 명령의 PCI 식별자 출력을 --host-device 매개 변수의 값으로 사용합니다.
    virt-install \
    --name=guest1-rhel7-64 \
    --disk path=/var/lib/libvirt/images/guest1-rhel7-64.img,size=8 \
    --vcpus=2 --ram=2048 \
    --location=http://example1.com/installation_tree/RHEL7.0-Server-x86_64/os \
    --nonetworks \
    --os-type=linux \
    --os-variant=rhel7
    --host-device=pci_0000_01_00_0
  3. 설치 완료

    게스트 설치를 완료합니다. PCI 장치를 게스트에 연결해야 합니다.

16.1.4. 할당된 PCI 장치 분리

호스트 PCI 장치가 게스트 시스템에 할당되면 호스트는 더 이상 장치를 사용할 수 없습니다. PCI 장치가 도메인 XML 파일에서 managed ='yes' 매개 변수를 사용하여 구성된 경우 게스트 시스템에 연결하고 게스트 시스템에서 분리한 후 필요에 따라 호스트 시스템에 다시 연결합니다. PCI 장치가 관리 모드가 아닌 경우 게스트 시스템에서 PCI 장치를 분리하고 virsh 또는 virt-manager 를 사용하여 다시 연결할 수 있습니다.

절차 16.6. virsh를 사용하여 게스트에서 PCI 장치 분리

  1. 장치 분리

    다음 명령을 사용하여 게스트의 XML 파일에서 해당 장치를 제거하여 게스트에서 PCI 장치를 분리합니다.
    # virsh detach-device name_of_guest file.xml
  2. 장치를 호스트에 다시 연결(선택 사항)

    장치가 관리 모드에 있는 경우 이 단계를 건너뜁니다. 장치가 호스트에 자동으로 반환됩니다.
    장치가 관리 모드를 사용하지 않는 경우 다음 명령을 사용하여 PCI 장치를 호스트 머신에 다시 연결합니다.
    # virsh nodedev-reattach device
    예를 들어 pci_0000 644300_0 장치를 호스트에 다시 연결하려면 다음을 수행합니다.
    # virsh nodedev-reattach pci_0000_01_00_0
    이제 호스트를 사용할 수 있는 장치를 사용할 수 있습니다.

절차 16.7. virt-manager를 사용하여 게스트에서 PCI 장치 분리

  1. 가상 하드웨어 세부 정보 화면 열기

    virt-manager 에서 장치가 포함된 가상 머신을 두 번 클릭합니다. 가상 하드웨어 세부 정보 표시 버튼을 선택하여 가상 하드웨어 목록을 표시합니다.

    그림 16.7. 가상 하드웨어 세부 정보 버튼

    가상 하드웨어 세부 정보 표시 버튼.
  2. 장치 선택 및 제거

    왼쪽 패널에 있는 가상 장치 목록에서 분리할 PCI 장치를 선택합니다.

    그림 16.8. 분리할 PCI 장치 선택

    PCI 장치 세부 정보 및 제거 버튼
    Remove (제거) 버튼을 클릭하여 확인합니다. 이제 호스트를 사용할 수 있는 장치를 사용할 수 있습니다.

16.1.5. PCI 브리지

주변 구성 요소 상호 연결 (PCI) 브리지는 네트워크 카드, 모뎀 및 음향 카드와 같은 장치에 연결하는 데 사용됩니다. 물리적 대응과 마찬가지로 가상 장치를 PCI 브릿지에 연결할 수도 있습니다. 이전에는 게스트 가상 머신에 31개의 PCI 장치만 추가할 수 있었습니다. 이제 31st PCI 장치가 추가되면 PCI 브리지가 31st 슬롯에 자동으로 배치되어 추가 PCI 장치를 PCI 브리지로 이동합니다. 각 PCI 브릿지에는 31개의 추가 장치에 대한 31개의 슬롯이 있으며, 모두 브리지가 될 수 있습니다. 이러한 방식으로 게스트 가상 시스템에서 900개 이상의 장치를 사용할 수 있습니다.
PCI 브릿지에 대한 XML 구성 예는 PCI 브리지의 도메인 XML 예를 참조하십시오. 이 구성은 자동으로 설정되며 수동으로 조정하는 것은 권장되지 않습니다.

16.1.6. PCI 장치 할당 제한

PCI 장치 할당(가상 머신에 PCI 장치 연결)을 사용하려면 호스트 시스템에 PCIe 장치의 장치 할당을 활성화하기 위해 AMD IOMMU 또는 Intel VT-d 지원이 필요합니다.
Red Hat Enterprise Linux 7은 게스트 장치 드라이버에 의해 제한된 PCI 구성 공간 액세스를 제공합니다. 이 제한은 확장된 PCI 구성 공간에 있는 장치 기능 또는 기능에 종속된 드라이버를 유발하여 구성이 실패할 수 있습니다.
Red Hat Enterprise Linux 7 가상 시스템당 총 32개의 장치를 할당할 수 있습니다. 이는 가상 머신에 있는 PCI 브릿지 수 또는 이러한 기능을 결합하여 멀티 기능 슬롯을 생성하는 방법에 관계없이 32개의 총 PCI 함수로 변환됩니다.
호스트에서 할당된 장치를 사용하여 게스트를 완전히 격리하려면 인터럽트 재 매핑에 대한 플랫폼 지원이 필요합니다. 이러한 지원이 없으면 호스트는 악의적인 게스트의 삽입 공격을 중단하는 데 취약할 수 있습니다. 게스트가 신뢰하는 환경에서 관리자는 allow_unsafe_interrupts 옵션을 vfio_iommu_type1 모듈에 사용하여 PCI 장치 할당을 계속 허용할 수 있습니다. 다음 내용이 포함된 /etc/modprobe.d 에 .conf 파일(예: local.conf)을 추가하여 이 작업을 영구적으로 수행할 수 있습니다.
options vfio_iommu_type1 allow_unsafe_interrupts=1
또는 sysfs 항목을 사용하여 동일한 작업을 수행하는 것이 좋습니다.
# echo 1 > /sys/module/vfio_iommu_type1/parameters/allow_unsafe_interrupts

16.2. SR-IOV 장치를 사용한 PCI 장치 할당

PCI 네트워크 장치( <소스> 요소에 의해 도메인 XML에 지정)는 직접 장치 할당( passthrough 라고도 함)을 사용하여 게스트에 직접 연결할 수 있습니다. 표준 단일 포트 PCI 이더넷 카드 드라이버 설계의 제한으로 인해 SR-IOV( Single Root I/O Virtualization ) VF 장치만 이러한 방식으로 할당할 수 있습니다. 표준 단일 포트 PCI 또는 PCIe 이더넷 카드를 게스트에 할당하려면 기존 <hostdev> 장치 정의를 사용합니다.

그림 16.9. PCI 장치 할당의 XML 예


     <devices>
    <interface type='hostdev'>
      <driver name='vfio'/>
      <source>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
      </source>
      <mac address='52:54:00:6d:90:02'>
      <virtualport type='802.1Qbh'>
        <parameters profileid='finance'/>
      </virtualport>
    </interface>
  </devices>
PCI-SIG (PCI Special Interest Group) 사양에서 개발한 SR-IOV(Single Root I/O Virtualization) 사양은 단일 장치를 여러 가상 머신에 공유할 수 있는 PCI 장치 할당 유형의 표준입니다. SR-IOV는 가상 머신의 장치 성능을 향상시킵니다.

그림 16.10. SR-IOV 작동 방식

SR-IOV 작동 방식
SR-IOV를 사용하면 단일 루트 기능(예: 단일 이더넷 포트)이 여러 개의 개별 물리 장치로 표시될 수 있습니다. SR-IOV 기능이 있는 물리적 장치는 PCI 구성 공간에 여러 기능으로 표시되도록 구성할 수 있습니다. 각 장치에는 Base Address Register(BAR)로 완료된 자체 구성 공간이 있습니다.
SR-IOV는 두 개의 PCI 기능을 사용합니다.
  • 물리적 기능(PF)은 SR-IOV 기능을 포함하는 전체 PCIe 장치입니다. 물리 기능은 일반 PCI 장치로 검색, 관리 및 구성됩니다. 물리 기능은 가상 함수를 할당하여 SR-IOV 기능을 구성하고 관리합니다.
  • VF(가상 기능)는 I/O만 처리하는 간단한 PCIe 기능입니다. 각 가상 기능은 물리 함수에서 파생됩니다. 장치에서 가질 수 있는 Virtual Functions의 수는 장치 하드웨어에 의해 제한됩니다. 물리 장치인 단일 이더넷 포트는 가상 머신에 공유할 수 있는 많은 가상 기능에 매핑될 수 있습니다.
하이퍼바이저는 가상 머신에 하나 이상의 가상 함수를 할당할 수 있습니다. 그런 다음 가상 기능의 구성 공간이 게스트에 제공되는 구성 공간에 할당됩니다.
Virtual Functions에는 실제 하드웨어 리소스가 필요하므로 각 가상 기능은 한 번에 하나의 게스트에만 할당할 수 있습니다. 가상 머신에는 여러 개의 가상 함수가 있을 수 있습니다. 가상 기능은 일반 네트워크 카드와 동일한 방식으로 네트워크 카드로 표시됩니다.
SR-IOV 드라이버는 커널에 구현됩니다. 코어 구현은 PCI 하위 시스템에 포함되어 있지만 물리 기능(PF) 및 VF(Virtual Function) 장치 모두에 대한 드라이버 지원도 있어야 합니다. SR-IOV 가능 장치는 PF에서 VF를 할당할 수 있습니다. VF는 큐 및 레지스터 세트와 같은 리소스를 통해 물리적 PCI 장치에서 지원되는 PCI 장치로 표시됩니다.

16.2.1. SR-IOV의 이점

SR-IOV 장치는 단일 물리적 포트를 여러 가상 머신과 공유할 수 있습니다.
SR-IOV VF가 가상 머신에 할당되면 (가상 머신과 이전)으로 구성할 수 있습니다. 모든 네트워크 트래픽을 특정 VLAN에 남겨 두는 모든 네트워크 트래픽을 특정 VLAN에 배치합니다. 가상 머신은 해당 트래픽이 VLAN에 태그되고 있음을 감지할 수 없으며 이 태그를 변경하거나 제거할 수 없습니다.
가상 함수는 거의 네이티브 성능을 가지며 반가상화 드라이버 및 에뮬레이션된 액세스보다 더 나은 성능을 제공합니다. 가상 기능은 데이터가 하드웨어에 의해 관리 및 제어되는 것과 동일한 물리 서버의 가상 머신 간의 데이터 보호 기능을 제공합니다.
이러한 기능을 통해 데이터 센터 내의 호스트에서 가상 시스템 밀도를 높일 수 있습니다.
SR-IOV는 여러 게스트가 있는 장치의 대역폭을 더 잘 활용할 수 있습니다.

16.2.2. SR-IOV 사용

이 섹션에서는 PCI 패스스루를 사용하여 SR-IOV 가능 멀티포트 네트워크 카드의 가상 기능을 네트워크 장치로 할당하는 방법을 설명합니다.
SR-IOV VF(가상 기능)는 virsh edit 또는 virsh attach-device 명령을 사용하여 <hostdev> 에 장치 항목을 추가하여 가상 머신에 할당할 수 있습니다. 그러나 일반 네트워크 장치와 달리 SR-IOV VF 네트워크 장치에는 고유한 영구 MAC 주소가 없으므로 호스트가 재부팅될 때마다 새 MAC 주소가 할당되기 때문에 문제가 발생할 수 있습니다. 이로 인해 호스트를 재부팅한 후 게스트에 동일한 VF가 할당되더라도 게스트가 새 MAC 주소를 갖는 네트워크 어댑터를 결정합니다. 결과적으로 게스트는 매번 새로운 하드웨어가 연결되었다고 생각하며 일반적으로 게스트의 네트워크 설정을 재구성해야 합니다.
libvirt 에는 <interface type='hostdev'> 인터페이스 장치가 포함되어 있습니다. 이 인터페이스 장치를 사용하여 libvirt 는 먼저 표시된 네트워크별 하드웨어/switch 초기화를 수행합니다(예: MAC 주소, VLAN 태그 또는 802.1Qbh 가상 포트 매개 변수 설정 등) 게스트에 PCI 장치 할당을 수행합니다.
<interface type='hostdev'> 인터페이스 장치를 사용하려면 다음을 수행해야 합니다.
  • SR-IOV 가능 네트워크 카드
  • Intel VT-d 또는 AMD IOMMU 확장 기능을 지원하는 호스트 하드웨어
  • 할당할 VF의 PCI 주소입니다.
중요
SR-IOV 장치를 가상 머신에 할당하려면 호스트 하드웨어에서 Intel VT-d 또는 AMD IOMMU 사양을 지원해야 합니다.
Intel 또는 AMD 시스템에 SR-IOV 네트워크 장치를 연결하려면 다음 절차를 따르십시오.

절차 16.8. Intel 또는 AMD 시스템에 SR-IOV 네트워크 장치 연결

  1. BIOS 및 커널에서 Intel VT-d 또는 AMD IOMMU 사양 활성화

    Intel 시스템에서 BIOS에서 아직 활성화되지 않은 경우 Intel VT-d를 활성화합니다. BIOS 및 커널에서 Intel VT-d를 활성화하는 방법에 대한 도움말은 절차 16.1. “PCI 장치 할당을 위한 Intel 시스템 준비” 을 참조하십시오.
    Intel VT-d가 이미 활성화되어 있고 작동하는 경우 이 단계를 건너뜁니다.
    AMD 시스템에서 BIOS에서 AMD IOMMU 사양이 아직 활성화되지 않은 경우 이를 활성화합니다. BIOS에서 IOMMU 활성화에 대한 도움말은 절차 16.2. “PCI 장치 할당을 위한 AMD 시스템 준비” 을 참조하십시오.
  2. 지원 확인

    SR-IOV 기능이 있는 PCI 장치가 탐지되었는지 확인합니다. 이 예에서는 SR-IOV를 지원하는 Intel 82576 네트워크 인터페이스 카드를 나열합니다. lspci 명령을 사용하여 장치가 감지되었는지 확인합니다.
    # lspci
    03:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    03:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    다른 모든 장치를 제거하도록 출력이 수정되었습니다.
  3. 가상 함수 활성화

    다음 명령을 실행합니다.
    # echo ${num_vfs} > /sys/class/net/enp14s0f0/device/sriov_numvfs
  4. 가상 함수를 영구적으로 설정

    재부팅할 때 Virtual Functions를 영구적으로 유지하려면 선택한 편집기를 사용하여 다음과 유사한 udev 규칙을 만듭니다. 여기서 원하는 VF 수(이 예에서는 2), 네트워크 인터페이스 카드에서 지원되는 한도까지 지정합니다. 다음 예에서 enp14s0f0 을 PF 네트워크 장치 이름으로 바꾸고 사용 중인 드라이버와 일치하도록 ENV{ID_NET_DRIVER} 값을 조정합니다.
    # vim /etc/udev/rules.d/enp14s0f0.rules
    ACTION=="add", SUBSYSTEM=="net", ENV{ID_NET_DRIVER}=="ixgbe",
    ATTR{device/sriov_numvfs}="2"
    
    이렇게 하면 부팅 시 기능이 활성화됩니다.
  5. 새 가상 함수 검사

    lspci 명령을 사용하여 Intel 82576 네트워크 장치에 연결된 새로 추가된 가상 기능을 나열합니다. (참고로 grep 을 사용하여 Virtual Functions를 지원하는 장치를 검색하려면 grep을 사용하여 가상 함수 를 검색합니다.)
    # lspci | grep 82576
    0b:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    0b:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
    0b:10.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.3 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.4 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.5 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.6 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:10.7 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.3 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.4 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    0b:11.5 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
    PCI 장치의 식별자는 lspci 명령의 -n 매개 변수를 사용하여 확인할 수 있습니다. 물리 함수는 0b:00.00b:00.1 에 해당합니다. 모든 가상 함수에는 설명에 가상 기능이 있습니다.
  6. virsh를 사용하여 장치 확인

    libvirt 서비스는 가상 머신에 장치를 추가하기 전에 장치를 인식해야 합니다. libvirtlspci 출력과 유사한 표기법을 사용합니다. 모든 구두점 문자 :.. lspci 출력에서는 밑줄(_)으로 변경됩니다.
    virsh nodedev-list 명령과 grep 명령을 사용하여 사용 가능한 호스트 장치 목록에서 Intel 82576 네트워크 장치를 필터링합니다. 0B 는 이 예제에서 Intel 82576 네트워크 장치의 필터입니다. 시스템에 따라 다를 수 있으며 추가 장치가 발생할 수 있습니다.
    # virsh nodedev-list | grep 0b
    pci_0000_0b_00_0
    pci_0000_0b_00_1
    pci_0000_0b_10_0
    pci_0000_0b_10_1
    pci_0000_0b_10_2
    pci_0000_0b_10_3
    pci_0000_0b_10_4
    pci_0000_0b_10_5
    pci_0000_0b_10_6
    pci_0000_0b_11_7
    pci_0000_0b_11_1
    pci_0000_0b_11_2
    pci_0000_0b_11_3
    pci_0000_0b_11_4
    pci_0000_0b_11_5
    가상 기능 및 물리 함수의 PCI 주소는 목록에 있어야 합니다.
  7. virsh를 사용하여 장치 세부 정보 가져오기

    pci_0000_0b_00_0 은 물리 함수 중 하나이며, pci_0000_0b_10_0 은 해당 물리 함수의 첫 번째 해당 가상 기능입니다. virsh nodedev-dumpxml 명령을 사용하여 두 장치에 대한 장치 세부 정보를 가져옵니다.
    # virsh nodedev-dumpxml pci_0000_03_00_0
    <device>
      <name>pci_0000_03_00_0</name>
      <path>/sys/devices/pci0000:00/0000:00:01.0/0000:03:00.0</path>
      <parent>pci_0000_00_01_0</parent>
      <driver>
        <name>igb</name>
      </driver>
      <capability type='pci'>
        <domain>0</domain>
        <bus>3</bus>
        <slot>0</slot>
        <function>0</function>
        <product id='0x10c9'>82576 Gigabit Network Connection</product>
        <vendor id='0x8086'>Intel Corporation</vendor>
        <capability type='virt_functions'>
          <address domain='0x0000' bus='0x03' slot='0x10' function='0x0'/>
          <address domain='0x0000' bus='0x03' slot='0x10' function='0x2'/>
          <address domain='0x0000' bus='0x03' slot='0x10' function='0x4'/>
          <address domain='0x0000' bus='0x03' slot='0x10' function='0x6'/>
          <address domain='0x0000' bus='0x03' slot='0x11' function='0x0'/>
          <address domain='0x0000' bus='0x03' slot='0x11' function='0x2'/>
          <address domain='0x0000' bus='0x03' slot='0x11' function='0x4'/>
        </capability>
        <iommuGroup number='14'>
          <address domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
          <address domain='0x0000' bus='0x03' slot='0x00' function='0x1'/>
        </iommuGroup>
      </capability>
    </device>
    # virsh nodedev-dumpxml pci_0000_03_11_5
    <device>
      <name>pci_0000_03_11_5</name>
      <path>/sys/devices/pci0000:00/0000:00:01.0/0000:03:11.5</path>
      <parent>pci_0000_00_01_0</parent>
      <driver>
        <name>igbvf</name>
      </driver>
      <capability type='pci'>
        <domain>0</domain>
        <bus>3</bus>
        <slot>17</slot>
        <function>5</function>
        <product id='0x10ca'>82576 Virtual Function</product>
        <vendor id='0x8086'>Intel Corporation</vendor>
        <capability type='phys_function'>
          <address domain='0x0000' bus='0x03' slot='0x00' function='0x1'/>
        </capability>
        <iommuGroup number='35'>
          <address domain='0x0000' bus='0x03' slot='0x11' function='0x5'/>
        </iommuGroup>
      </capability>
    </device>
    이 예에서는 8단계의 가상 머신에 Virtual Function pci_0000_03_10_2 를 추가합니다. 가상 함수의 버스,슬롯 및 함수 매개 변수는 장치를 추가하는 데 필요합니다.
    예를 들어 이러한 매개변수를 임시 XML 파일(예: /tmp/new-interface.xml )에 복사합니다.
       <interface type='hostdev' managed='yes'>
         <source>
           <address type='pci' domain='0x0000' bus='0x03' slot='0x10' function='0x2'/>
         </source>
       </interface>
    참고
    가상 머신이 시작되면 MAC 주소가 구성된 물리적 어댑터에서 제공하는 유형의 네트워크 장치가 표시됩니다. 이 MAC 주소는 호스트 및 게스트 재부팅 시 변경되지 않습니다.
    다음 <interface> 예제에서는 선택적 <mac address>, <virtualport>, <vlan> 요소의 구문을 보여줍니다. 실제로 예제와 같이 둘 다 동시에 사용할 수 없는 <vlan> 또는 <virtualport> 요소를 사용합니다.
    ...
     <devices>
       ...
       <interface type='hostdev' managed='yes'>
         <source>
           <address type='pci' domain='0' bus='11' slot='16' function='0'/>
         </source>
         <mac address='52:54:00:6d:90:02'>
         <vlan>
            <tag id='42'/>
         </vlan>
         <virtualport type='802.1Qbh'>
           <parameters profileid='finance'/>
         </virtualport>
       </interface>
       ...
     </devices>
    MAC 주소를 지정하지 않으면 자동으로 생성됩니다. <virtualport> 요소는 pxeQbh 하드웨어 스위치에 연결할 때만 사용됩니다. <vlan> 요소는 게스트의 장치를 VLAN 태그 42 에 투명하게 배치합니다.
  8. 가상 머신에 가상 기능 추가

    이전 단계에서 만든 임시 파일과 함께 다음 명령을 사용하여 가상 머신에 가상 기능을 추가합니다. 이는 새 장치를 즉시 연결하고 후속 게스트를 다시 시작하기 위해 저장합니다.
    virsh attach-device MyGuest /tmp/new-interface.xml --live --config
    
    virsh attach-device--live 옵션을 지정하면 새 장치가 실행 중인 게스트에 연결됩니다. --config 옵션을 사용하면 향후 게스트가 다시 시작된 후 새 장치를 사용할 수 있습니다.
    참고
    --live 옵션은 게스트가 실행 중인 경우에만 허용됩니다. virsh 는 실행 중인 게스트에서 --live 옵션이 사용되는 경우 오류를 반환합니다.
가상 머신이 새 네트워크 인터페이스 카드를 감지합니다. 이 새 카드는 SR-IOV 장치의 가상 기능입니다.

16.2.3. SR-IOV 장치를 사용하여 PCI 할당 구성

SR-IOV 네트워크 카드는 PCI 장치 할당을 사용하여 각각 게스트 가상 머신에 개별적으로 할당할 수 있는 여러 VF를 제공합니다. 할당되면 각 작업은 전체 물리적 네트워크 장치 역할을 합니다. 이를 통해 많은 게스트 가상 머신에서 직접 PCI 장치 할당의 성능을 활용하는 동시에 호스트 물리적 머신에서 단일 슬롯만 사용할 수 있습니다.
이러한 VF는 <hostdev> 요소를 사용하여 기존 방식으로 게스트 가상 머신에 할당할 수 있습니다. 그러나 SR-IOV VF 네트워크 장치에는 영구적인 MAC 주소가 없으므로 호스트 물리적 머신이 재부팅될 때마다 게스트 가상 머신의 네트워크 설정을 다시 구성해야 하는 문제가 발생합니다. 이 문제를 해결하려면 게스트 가상 머신을 부팅할 때마다 VF를 호스트 물리적 머신에 할당하기 전에 MAC 주소를 설정해야 합니다. 이 MAC 주소 및 기타 옵션을 할당하려면 다음 절차를 참조하십시오.

절차 16.9. SR-IOV에서 PCI 장치를 할당하는 MAC 주소, vLAN, 가상 포트 구성

<mac>,<vlan>, <virtualport> 요소는 < <hostdev> > 의 유효한 하위 항목이 아니기 때문에 MAC 주소 할당, vLAN 태그 ID 할당 또는 가상 포트 할당과 같은 함수별 항목에 사용할 수 없습니다. 대신, 이러한 요소는 hostdev 인터페이스 유형: <interface type='hostdev'> 와 함께 사용할 수 있습니다. 이 장치 유형은 <인터페이스><hostdev> 의 하이브리드 역할을 합니다. 따라서 게스트 가상 머신에 PCI 장치를 할당하기 전에 libvirt 는 표시된 네트워크별 하드웨어/switch를 초기화합니다(예: MAC 주소 설정, vLAN 태그 설정 또는 게스트 가상 시스템의 XML 구성 파일에서 802.1Qbh 스위치와 연결) vLAN 태그 설정에 대한 자세한 내용은 17.16절. “vLAN 태그 설정” 을 참조하십시오.
  1. 정보 수집

    <인터페이스 type='hostdev'> 를 사용하려면 SR-IOV 가능 네트워크 카드, Intel VT-d 또는 AMD IOMMU 확장 기능을 지원하는 실제 머신 하드웨어가 있고 할당하려는 VF의 PCI 주소를 알아야 합니다.
  2. 게스트 가상 머신 종료

    virsh shutdown 명령을 사용하여 guest 가상 머신을 종료 합니다(여기서는 guestVM).
    # virsh shutdown guestVM
  3. 편집할 XML 파일을 엽니다.

    # virsh edit guestVM.xml
    선택 사항: virsh save 명령으로 생성된 XML 구성 파일의 경우 다음을 실행합니다.
    # virsh save-image-edit guestVM.xml --running 
    설정 파일(이 예에서는 guestVM.xml )이 기본 편집기에서 열립니다. 자세한 내용은 참조하십시오. 20.7.5절. “게스트 가상 머신 구성 편집”
  4. XML 파일 편집

    다음과 유사한 <장치> 항목이 있도록 구성 파일(guestVM.xml)을 업데이트합니다.

    그림 16.11. hostdev 인터페이스 유형의 도메인 XML 샘플

    
     <devices>
       ...
       <interface type='hostdev' managed='yes'>
         <source>
           <address type='pci' domain='0x0' bus='0x00' slot='0x07' function='0x0'/> <!--these values can be decimal as well-->
         </source>
         <mac address='52:54:00:6d:90:02'/>                                         <!--sets the mac address-->
         <virtualport type='802.1Qbh'>                                              <!--sets the virtual port for the 802.1Qbh switch-->
           <parameters profileid='finance'/>
         </virtualport>
         <vlan>                                                                     <!--sets the vlan tag-->
          <tag id='42'/>
         </vlan>
       </interface>
       ...
     </devices>
    
    
    참고
    MAC 주소를 제공하지 않으면 다른 유형의 인터페이스 장치와 마찬가지로 MAC 주소가 자동으로 생성됩니다. 또한 <virtualport> 요소는 pxeQgh 하드웨어 스위치에 연결하는 경우에만 사용됩니다. accessibilityQbg (VEPA") 스위치는 현재 지원되지 않습니다.
  5. 게스트 가상 머신 재시작

    virsh start 명령을 실행하여 2단계에서 종료한 게스트 가상 머신을 재시작합니다. 자세한 내용은 20.6절. “가상 머신 시작, 다시 시작 및 복원”를 참조하십시오.
     # virsh start guestVM 
    게스트 가상 머신이 시작되면 MAC 주소가 구성된 물리적 호스트 시스템의 어댑터에서 제공하는 네트워크 장치가 표시됩니다. 이 MAC 주소는 게스트 가상 머신과 호스트 물리적 시스템 재부팅 간에 변경되지 않고 유지됩니다.

16.2.4. SR-IOV 가상 함수 풀에서 PCI 장치 할당 설정

게스트 구성에 특정 VF(Virtual Functions)의 PCI 주소를 하드 코딩하면 두 가지 중요한 제한 사항이 있습니다.
  • 게스트 가상 머신이 시작될 때마다 지정된 VF를 사용할 수 있어야 합니다. 따라서 관리자는 각 VF를 단일 게스트 가상 머신에 영구적으로 할당해야 합니다(또는 게스트 가상 머신이 시작될 때마다 현재 사용되지 않는 VF의 PCI 주소를 지정하도록 모든 게스트 가상 머신의 구성 파일을 수정해야 합니다.
  • 게스트 가상 머신을 다른 호스트 물리적 시스템으로 이동하는 경우 해당 호스트 물리적 시스템의 하드웨어는 PCI 버스의 동일한 위치에 있어야 합니다(또는 시작하기 전에 게스트 가상 머신 구성을 수정해야 합니다).
SR-IOV 장치의 모든 VF가 포함된 장치 풀을 사용하여 libvirt 네트워크를 생성하여 이러한 문제를 해결할 수 있습니다. 이 작업이 완료되면 이 네트워크를 참조하도록 guest 가상 머신을 구성합니다. 게스트가 시작될 때마다 풀에서 단일 VF가 할당되고 게스트 가상 머신에 할당됩니다. 게스트 가상 머신이 중지되면 다른 게스트 가상 머신에서 사용할 수 있도록 VF가 풀로 반환됩니다.

절차 16.10. 장치 풀 생성

  1. 게스트 가상 머신 종료

    virsh shutdown 명령을 사용하여 guest 가상 머신을 종료 합니다. 여기서 guestVM.
    # virsh shutdown guestVM
  2. 구성 파일 생성

    선택한 편집기를 사용하여 /tmp 디렉터리에 XML 파일(예: passthrough.xml )을 만듭니다. pf dev='eth3 을 고유한 SR-IOV 장치 물리 기능 (PF)의 netdev 이름으로 교체해야 합니다.
    다음은 호스트 물리적 머신의 "eth3'에 PF에서 SR-IOV 어댑터의 모든 VF 풀을 사용할 수 있도록 하는 네트워크 정의의 예입니다.

    그림 16.12. 네트워크 정의 도메인 XML 샘플

          
    <network>
       <name>passthrough</name> <!-- This is the name of the file you created -->
       <forward mode='hostdev' managed='yes'>
         <pf dev='myNetDevName'/>  <!-- Use the netdev name of your SR-IOV devices PF here -->
       </forward>
    </network>
          
    
    
  3. 새 XML 파일을 로드합니다.

    다음 명령을 입력하고 /tmp/passthrough.xml 을 이전 단계에서 생성한 XML 파일의 이름 및 위치로 바꿉니다.
    # virsh net-define /tmp/passthrough.xml
  4. 게스트 다시 시작

    passthrough.xml 을 이전 단계에서 생성한 XML 파일 이름으로 교체하여 다음을 실행합니다.
     # virsh net-autostart passthrough # virsh net-start passthrough 
  5. 게스트 가상 머신 다시 시작

    virsh start 명령을 실행하여 첫 번째 단계에서 종료한 게스트 가상 시스템을 다시 시작합니다(예: guestVM을 게스트 가상 시스템의 도메인 이름으로 사용). 자세한 내용은 20.6절. “가상 머신 시작, 다시 시작 및 복원”를 참조하십시오.
     # virsh start guestVM 
  6. 장치에 대한 패스스루 시작

    단일 장치만 표시되더라도 libvirt는 게스트 가상 머신이 다음과 같은 도메인 XML의 인터페이스 정의로 처음 시작될 때 해당 PF와 연결된 모든 VF 목록을 자동으로 파생합니다.

    그림 16.13. 인터페이스 네트워크 정의를 위한 도메인 XML 샘플

             
    <interface type='network'>
       <source network='passthrough'>
    </interface>
          
    
    
  7. 검증

    네트워크를 사용하는 첫 번째 게스트를 시작한 후 virsh net-dumpxml passthrough 명령을 실행하여 이를 확인할 수 있습니다. 다음과 유사한 출력이 표시됩니다.

    그림 16.14. XML 덤프 파일 패스스루 컨텐츠

          
    <network connections='1'>
       <name>passthrough</name>
       <uuid>a6b49429-d353-d7ad-3185-4451cc786437</uuid>
       <forward mode='hostdev' managed='yes'>
         <pf dev='eth3'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x1'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x3'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x5'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x10' function='0x7'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x1'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x3'/>
         <address type='pci' domain='0x0000' bus='0x02' slot='0x11' function='0x5'/>
       </forward>
    </network>
          
    
    

16.2.5. SR-IOV 제한

SR-IOV는 다음 장치에서만 철저하게 테스트됩니다.
  • Intel® 82576NS 기가비트 이더넷 컨트롤러 (igb 드라이버)
  • Intel® 82576EB 기가비트 이더넷 컨트롤러(igb 드라이버)
  • Intel® 82599ES 10 Gigabit Ethernet Controller (ixgbe 드라이버)
  • Intel® 82599EB 10 기가비트 이더넷 컨트롤러(ixgbe 드라이버)
다른 SR-IOV 장치가 작동할 수 있지만 릴리스 시점에는 테스트되지 않았습니다.

16.3. USB 장치

이 섹션에서는 USB 장치를 처리하는 데 필요한 명령을 제공합니다.

16.3.1. 게스트 가상 머신에 USB 장치 할당

웹 카메라, 카드 리더, 디스크 드라이브, 키보드와 같은 대부분의 장치는 USB 포트 및 케이블을 사용하여 컴퓨터에 연결되어 있습니다. 이러한 장치를 게스트 가상 머신에 전달하는 방법은 다음 두 가지가 있습니다.
  • USB 패스스루 사용 - 게스트 가상 머신을 호스팅하는 호스트 물리적 머신에 장치를 물리적으로 연결해야 합니다. 이 경우에는 SPICE가 필요하지 않습니다. 호스트의 USB 장치를 명령줄 또는 virt-manager 로 게스트로 전달할 수 있습니다. virt 관리자 지침은 19.3.2절. “게스트 가상 머신에 USB 장치 연결” 을 참조하십시오. virt-manager 명령은 핫 플러그 또는 핫플러그 장치에 적합하지 않습니다. USB 장치를 핫 플러그/연결 해제하려면 절차 20.4. “게스트 가상 머신에서 사용할 USB 장치 핫 플러그” 를 참조하십시오.
  • USB 리디렉션 사용 - USB 리디렉션은 데이터 센터에서 실행되는 호스트 물리적 시스템이 있는 경우 가장 적합합니다. 사용자가 로컬 시스템 또는 씬 클라이언트의 게스트 가상 머신에 연결합니다. 로컬 시스템에 SPICE 클라이언트가 있습니다. 사용자는 모든 USB 장치를 씬 클라이언트에 연결할 수 있으며 SPICE 클라이언트는 데이터 센터의 호스트 물리적 시스템으로 장치를 리디렉션하므로 씬 클라이언트에서 실행 중인 게스트 가상 시스템에서 사용할 수 있습니다. virt-manager 를 통한 자세한 내용은 19.3.3절. “USB Redirection” 를 참조하십시오.

16.3.2. USB 장치 재시작 시 제한 설정

리디렉션에서 특정 장치를 필터링하려면 filter 속성을 -device usb-redir 로 전달합니다. filter 속성은 필터 규칙으로 구성된 문자열을 사용하며 규칙 형식은 다음과 같습니다.
<class>:<vendor>:<product>:<version>:<allow>
-1 을 사용하여 특정 필드에 대한 값을 수락하도록 지정합니다. |를 사용하여 동일한 명령줄에서 여러 규칙을 구분 기호로 사용할 수 있습니다. 장치가 통과된 규칙 중 하나와 일치하지 않는 경우 이를 리디렉션할 수 없습니다.

예 16.1. 게스트 가상 머신을 사용하여 리디렉션 제한의 예

  1. 게스트 가상 머신을 준비합니다.
  2. 게스트 가상 머신의 도메인 XML 파일에 다음 코드 발췌를 추가합니다.
        <redirdev bus='usb' type='spicevmc'>
          <alias name='redir0'/>
          <address type='usb' bus='0' port='3'/>
        </redirdev>
        <redirfilter>
          <usbdev class='0x08' vendor='0x1234' product='0xBEEF' version='2.0' allow='yes'/>
          <usbdev class='-1' vendor='-1' product='-1' version='-1' allow='no'/>
        </redirfilter>
    
  3. 게스트 가상 머신을 시작하고 다음을 실행하여 설정 변경 사항을 확인합니다.
    #ps -ef | grep $guest_name
    -device usb-redir,chardev=charredir0,id=redir0,/
    filter=0x08:0x1234:0xBEEF:0x0200:1|-1:-1:-1:-1:0,bus=usb.0,port=3
  4. USB 장치를 호스트 물리적 머신에 연결하고 virt-manager 를 사용하여 게스트 가상 머신에 연결합니다.
  5. 메뉴에서 USB 장치 선택을 클릭하면 다음 메시지가 생성됩니다. "일부 USB 장치는 호스트 정책에 의해 차단됩니다. 확인 을 클릭하여 확인하고 계속합니다.
    필터가 적용됩니다.
  6. 필터가 USB 장치 공급업체와 제품을 올바르게 캡처하는지 확인하려면 USB 리디렉션을 허용하도록 호스트 물리적 시스템의 도메인 XML에서 다음과 같이 변경하십시오.
       <redirfilter>
          <usbdev class='0x08' vendor='0x0951' product='0x1625' version='2.0' allow='yes'/>
          <usbdev allow='no'/>
        </redirfilter>
    
  7. 게스트 가상 머신을 재시작한 다음 virt-viewer 를 사용하여 게스트 가상 시스템에 연결합니다. 이제 USB 장치가 트래픽을 게스트 가상 머신으로 리디렉션합니다.

16.4. 장치 컨트롤러 구성

게스트 가상 머신 아키텍처에 따라 일부 장치 버스는 가상 컨트롤러에 연결된 가상 장치 그룹과 함께 두 번 이상 나타날 수 있습니다. 일반적으로 libvirt는 명시적 XML 태그 없이 이러한 컨트롤러를 자동으로 유추할 수 있지만 경우에 따라 가상 컨트롤러 요소를 명시적으로 설정하는 것이 좋습니다.

그림 16.15. 가상 컨트롤러의 도메인 XML 예


  ...
  <devices>
    <controller type='ide' index='0'/>
    <controller type='virtio-serial' index='0' ports='16' vectors='4'/>
    <controller type='virtio-serial' index='1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
    </controller>
    ...
  </devices>
  ...
각 컨트롤러에는 다음 중 하나여야 하는 필수 특성 <컨트롤러 유형> 이 있습니다.
  • IDE
  • fdc
  • scsi
  • SATA
  • usb
  • CCID
  • virtio-serial
  • pci
<컨트롤러> 요소에는 버스 <컨트롤러가 발생하는 순서대로 설명하는 10진수 정수인 필수 특성 컨트롤러 인덱스> 가 있습니다( <Address> 요소의 컨트롤러 특성에 사용하기 위해). <컨트롤러 유형 ='virtio-serial'인 경우 컨트롤러를> 통해 연결할 수 있는 장치 수를 제어하는 두 가지 추가 선택적 속성( 포트벡터)이 있습니다.
<컨트롤러 유형 ='scsi'> 인 경우 선택적 특성 모델 모델이 있으며 이는 다음 값을 가질 수 있습니다.
  • auto
  • buslogic
  • ibmvscsi
  • lsilogic
  • lsisas1068
  • lsisas1078
  • virtio-scsi
  • vmpvscsi
<컨트롤러 유형 ='usb'> 인 경우 선택적 특성 모델 모델이 있으며 이는 다음 값을 가질 수 있습니다.
  • piix3-uhci
  • piix4-uhci
  • EHCI
  • ich9-ehci1
  • ich9-uhci1
  • ich9-uhci2
  • ich9-uhci3
  • vt82c686b-uhci
  • pci-ohci
  • NEC-xhci
게스트 가상 머신에 USB 버스를 명시적으로 비활성화해야 하는 경우 <model='none'> 을 사용할 수 있습니다.
PCI 또는 USB 버스에 있는 컨트롤러의 경우 선택적 하위 element <주소는> 16.5절. “장치용 주소 설정” 에 표시된 대로 의미 체계와 함께 마스터 버스에 컨트롤러의 정확한 관계를 지정할 수 있습니다.
선택적 하위 요소 <드라이버는 드라이버> 별 옵션을 지정할 수 있습니다. 현재 컨트롤러의 큐 수를 지정하는 특성 대기열만 지원합니다. 최적의 성능을 위해 vCPU 수와 일치하는 값을 지정하는 것이 좋습니다.
USB companion 컨트롤러에는 <마스터> 컨트롤러와의 파트너의 정확한 관계를 지정하는 선택적 하위 요소 마스터가 있습니다. 동반 컨트롤러는 마스터와 동일한 버스에 있으므로 그에 동반되는 인덱스 값이 동일해야 합니다.
사용할 수 있는 XML 예는 다음과 같습니다.

그림 16.16. USB 컨트롤러의 도메인 XML 예

   
     ...
  <devices>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0' bus='0' slot='4' function='7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0' bus='0' slot='4' function='0' multifunction='on'/>
    </controller>
    ...
  </devices>
  ...
   

PCI 컨트롤러에는 다음과 같은 가능한 값이 있는 선택적 모델 속성이 있습니다.
  • pci-root
  • pcie-root
  • pci-bridge
  • dmi-to-pci-bridge
암시적 PCI 버스를 제공하는 머신 유형의 경우 index='0 이 있는 pci-root 컨트롤러가 자동으로 추가되며 PCI 장치를 사용하는 데 필요합니다. pci-root에는 주소가 없습니다. PCI 브리지는 model='pci-root' 에서 제공하는 하나의 버스에 너무 많은 장치가 없거나 0보다 큰 PCI 버스 번호가 지정된 경우 자동으로 추가됩니다. PCI 브리지는 수동으로 지정할 수도 있지만, 해당 주소에는 이미 지정된 PCI 컨트롤러에서 제공하는 PCI 버스만 확인해야 합니다. PCI 컨트롤러 인덱스에서 간격을 남겨 두면 잘못된 구성이 발생할 수 있습니다. 다음 XML 예제를 <devices> 섹션에 추가할 수 있습니다.

그림 16.17. PCI 브릿지의 도메인 XML 예


  ...
  <devices>
    <controller type='pci' index='0' model='pci-root'/>
    <controller type='pci' index='1' model='pci-bridge'>
      <address type='pci' domain='0' bus='0' slot='5' function='0' multifunction='off'/>
    </controller>
  </devices>
  ...
암시적 PCI Express(PCIe) 버스(예: Q35 칩셋 기반 시스템 유형)의 경우 index='0의 auto-added는 도메인 구성에 자동으로 추가됩니다. profileie-root에는 주소가 없지만 31개의 슬롯 (numbered 1-31)만 사용할 수 있습니다. PCie-root 컨트롤러가 있는 시스템에서 표준 PCI 장치를 연결하기 위해 model='dmi-to-pci-bridge' 가 있는 pci 컨트롤러가 자동으로 추가됩니다. dmi-to-pci-bridge 컨트롤러는 PCIe 슬롯에 연결되며 (PCie-root에서 제공하는 경우) 31개의 표준 PCI 슬롯(사용할 수 없음)을 제공합니다. 게스트 시스템에 핫 플러그형 PCI 슬롯을 사용하기 위해 pci-bridge 컨트롤러도 자동으로 생성되고 자동 생성된 dmi-to-pci-bridge 컨트롤러의 슬롯 중 하나에 연결됩니다. libvirt 에 의해 자동 결정된 PCI 주소가 있는 모든 게스트 장치는 이 pci-bridge 장치에 배치됩니다.

그림 16.18. PCIe(PCI 표현)의 도메인 XML 예

   
     ...
  <devices>
    <controller type='pci' index='0' model='pcie-root'/>
    <controller type='pci' index='1' model='dmi-to-pci-bridge'>
      <address type='pci' domain='0' bus='0' slot='0xe' function='0'/>
    </controller>
    <controller type='pci' index='2' model='pci-bridge'>
      <address type='pci' domain='0' bus='1' slot='1' function='0'/>
    </controller>
  </devices>
  ...
   

다음 XML 구성은 USB 3.0 / xHCI 에뮬레이션에 사용됩니다.

그림 16.19. USB3/xHCI 장치의 도메인 XML 예

   
     ...
  <devices>
    <controller type='usb' index='3' model='nec-xhci'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x0f' function='0x0'/>
    </controller>
  </devices>
    ...

16.5. 장치용 주소 설정

많은 장치에는 게스트 가상 머신에 표시되는 가상 버스에 장치가 배치되는 위치를 설명하는 데 사용되는 선택적 <주소> 하위 요소가 있습니다. 입력 시 주소(또는 주소 내의 선택적 속성)가 생략된 경우 libvirt 는 적절한 주소를 생성하지만 레이아웃을 추가로 제어해야 하는 경우 명시적 주소가 필요합니다. <address> 요소를 포함하는 도메인 XML 장치 예제는 그림 16.9. “PCI 장치 할당의 XML 예” 을 참조하십시오.
모든 주소에는 장치가 있는 버스를 설명하는 필수 속성 유형이 있습니다. 지정된 장치에 사용할 주소를 선택하는 것은 장치 및 게스트 가상 머신의 아키텍처로 제한됩니다. 예를 들어 <디스크> 장치는 type=' drive' 를 사용하지만 <콘솔> 장치는 i686 또는 x86_64 게스트 가상 머신 아키텍처 에서 type='pci' 를 사용합니다. 각 주소 유형에는 버스가 표에 설명된 대로 배치될 위치를 제어하는 추가 선택적 속성이 있습니다.

표 16.1. 지원되는 장치 주소 유형

주소 유형 설명
type='pci' PCI 주소에는 다음과 같은 추가 속성이 있습니다.
  • domain( qemu에서 현재 사용하지 않는 2바이트 16진수 정수)
  • 버스 (포함 0에서 0xff 사이의 16진수 값 포함)
  • 슬롯 (0x0과 0x1f 사이의 16진수 값 포함)
  • 함수 (0에서 7 포함) 사이의 값
  • Multifunction 컨트롤은 PCI 제어 레지스터의 특정 슬롯/기능에 대해 멀티 함수 비트를 켜는 컨트롤은 기본적으로 'off'로 설정되지만 여러 함수가 사용되는 슬롯의 함수 0에 대해 'on'으로 설정해야 합니다.
type='drive' 드라이브 주소에는 다음과 같은 추가 속성이 있습니다.
  • 컨트롤러 (두 자리 컨트롤러 번호)
  • 버스 (두 자리 버스 번호)
  • 대상(두 자리 버스 번호)
  • 단위 (버스의 2자리 단위 번호)
type='virtio-serial' 각 virtio-serial 주소에는 다음과 같은 추가 속성이 있습니다.
  • 컨트롤러 (두 자리 컨트롤러 번호)
  • 버스 (두 자리 버스 번호)
  • 슬롯 (버스 내 2자리 슬롯)
type='ccid' 스마트 카드용 CCID 주소는 다음과 같은 추가 속성을 갖습니다.
  • 버스 (두 자리 버스 번호)
  • 슬롯 속성 (버스 내 2자리 슬롯)
type='usb' USB 주소에는 다음과 같은 추가 속성이 있습니다.
  • 버스 (포함 0에서 0xfff 사이의 16 진수 값 포함)
  • 포트( 1.2 또는 2.1.3.1과 같은 최대 4개의 8개의 8개의 8개의 8개)의 점선 표기법입니다.
type='isa' RuntimeClass 주소에는 다음과 같은 추가 속성이 있습니다.
  • iobase
  • irq

16.6. 임의 번호 생성기 장치

운영 체제 보안에 난수 생성기가 매우 중요합니다. Red Hat Enterprise Linux 7에는 가상 운영 체제의 보안을 위해 게스트에 요청에 대한 새로운 엔트로피를 제공할 수 있는 가상 하드웨어 난수 생성기 장치인 virtio-rng 가 포함되어 있습니다.
호스트 물리적 시스템에서 하드웨어 RNG 인터페이스는 /dev/hwrng 에 chardev를 생성한 다음, 호스트 물리적 머신에서 엔트로피를 가져오도록 읽을 수 있습니다. rngd 데몬과 함께 작동하면 호스트 물리적 시스템의 엔트로피를 게스트 가상 시스템의 /dev/random 로 라우팅할 수 있습니다.
임의의 숫자 생성기를 사용하는 것은 키보드, 마우스 및 기타 입력과 같은 장치가 게스트 가상 머신에서 충분한 엔트로피를 생성하는 데 충분하지 않은 경우 특히 유용합니다. 가상 난수 생성기 장치를 사용하면 호스트 물리적 머신이 게스트 가상 머신 운영 체제에 엔트로피를 통과할 수 있습니다. 이 절차는 명령줄 또는 virt-manager 인터페이스를 사용하여 수행할 수 있습니다. 자세한 내용은 아래를 참조하십시오. virtio-rng 에 대한 자세한 내용은 Red Hat Enterprise Linux Virtual Machines를 참조하십시오. Random Numbers made easy 에 액세스할 수 있습니다.

절차 16.11. 가상 머신 관리자를 사용하여 virtio-rng 구현

  1. 게스트 가상 머신을 종료합니다.
  2. 게스트 가상 머신을 선택하고 편집 메뉴에서 가상 머신 세부 정보를 선택하여 지정된 게스트 가상 머신의 세부 정보 창을 엽니다.
  3. 하드웨어 추가 버튼을 클릭합니다.
  4. 새 가상 하드웨어 추가 창에서 RNG 를 선택하여 Random Number Generator 창을 엽니다.

    그림 16.20. 난수 생성기 창

    난수 생성기 창
    원하는 매개 변수를 입력하고 완료되면 Finish 를 클릭합니다. 매개변수는 virtio-rng 요소 에 설명되어 있습니다.

절차 16.12. 명령줄 툴을 사용하여 virtio-rng 구현

  1. 게스트 가상 머신을 종료합니다.
  2. virsh edit domain-name 명령을 사용하여 원하는 게스트 가상 시스템의 XML 파일을 엽니다.
  3. 다음을 포함하도록 <devices> 요소를 편집합니다.

    그림 16.21. 난수 생성기 장치

    
      ...
      <devices>
        <rng model='virtio'>
          <rate period='2000' bytes='1234'/>
          <backend model='random'>/dev/random</backend>
          <!-- OR -->
          <backend model='egd' type='udp'>
            <source mode='bind' service='1234'/>
            <source mode='connect' host='1.2.3.4' service='1234'/>
          </backend>
        </rng>
      </devices>
      ...
    난수 생성기 장치는 다음과 같은 XML 속성 및 요소를 허용합니다.

    virtio-rng 요소

    • <모델> - 필수 모델 속성은 RNG 장치의 유형을 지정합니다.
    • <백엔드 모델> - <backend> 요소는 게스트에 사용할 엔트로피의 소스를 지정합니다. 소스 모델은 model 특성을 사용하여 구성됩니다. 지원되는 소스 모델에는 'random''egd' 이 있습니다.
      • <백엔드 model='random'> - 이 <백엔드> 유형은 블록 이외의 문자 장치를 입력으로 예상합니다. 이러한 장치의 예는 /dev/random/dev/urandom 입니다. 파일 이름은 <backend> 요소의 콘텐츠로 지정됩니다. 파일 이름이 지정되지 않은 경우 하이퍼바이저 기본값은 사용됩니다.
      • <백엔드 model='egd'> - 이 백엔드는 EGD 프로토콜을 사용하여 소스에 연결됩니다. 소스는 문자 장치로 지정됩니다. 자세한 내용은 문자 장치 호스트 물리적 시스템 인터페이스를 참조하십시오.

16.7. GPU 장치 할당

게스트에 GPU를 할당하려면 다음 방법 중 하나를 사용합니다.
  • GPU PCI 장치 할당 - 이 방법을 사용하면 호스트에서 GPU 장치를 제거하고 단일 게스트에 할당할 수 있습니다.
  • NVIDIA vGPU Assignment - 이 방법을 사용하면 물리적 GPU에서 여러 개의 중재 장치를 생성하고 이러한 장치를 여러 게스트에 가상 GPU로 할당할 수 있습니다. 이는 선택한 NVIDIA GPU에서만 지원되며, 하나의 중재 장치만 게스트에 할당할 수 있습니다.

16.7.1. GPU PCI 장치 할당

Red Hat Enterprise Linux 7은 비VGA 그래픽 장치로 다음 PCIe 기반 GPU 장치의 PCI 장치 할당을 지원합니다.
  • NVIDIA Quadro K-Series, M-Series, P-Series 및 이후 아키텍처 (모델 2000 시리즈 이상)
  • NVIDIA StatefulSet K-Series, M-Series 및 이후 아키텍처
참고
VM에 연결할 수 있는 GPU 수는 RHEL 7에서 현재 32개인 할당된 PCI 장치의 최대 수로 제한됩니다. 그러나 여러 GPU를 가상 머신에 연결하면 게스트에서 메모리 매핑된 I/O(MMIO)에 문제가 발생할 수 있으므로 VM에서 GPU를 사용할 수 없습니다.
이러한 문제를 해결하려면 더 큰 64비트 MMIO 공간을 설정하고 64비트 MMIO 공간을 확장할 수 있도록 vCPU 물리적 주소 비트를 구성합니다.
게스트 가상 머신에 GPU를 할당하려면 호스트 머신에서 I/O Memory Management Unit(IOMMU)을 활성화하고 lspci 명령을 사용하여 GPU 장치를 식별하고, 호스트에서 장치를 분리하고, 게스트에 연결한 다음, 게스트에서 Xorg를 구성해야 합니다.

절차 16.13. 호스트 머신 커널에서 IOMMU 지원 활성화

  1. 커널 명령행 편집

    Intel VT-d 시스템의 경우 IOMMU는 intel_iommu=oniommu=pt 매개변수를 커널 명령 줄에 추가하여 활성화됩니다. AMD-Vi 시스템의 경우 필요한 옵션은 iommu=pt 입니다. 이 옵션을 활성화하려면 다음과 같이 GRUB_CMDLINX_LINUX 행을 /etc/sysconfig/grub 설정 파일에 편집하거나 추가합니다.
    GRUB_CMDLINE_LINUX="rd.lvm.lv=vg_VolGroup00/LogVol01
    vconsole.font=latarcyrheb-sun16 rd.lvm.lv=vg_VolGroup_1/root
    vconsole.keymap=us $([ -x /usr/sbin/rhcrashkernel-param ]  &&
    /usr/sbin/rhcrashkernel-param || :) rhgb quiet intel_iommu=on iommu=pt"
    
    참고
    IOMMU에 대한 자세한 내용은 부록 E. IOMMU 그룹 작업 을 참조하십시오.
  2. 부트 로더 구성 다시 생성

    적용할 커널 명령줄 변경 사항의 경우 grub2-mkconfig 명령을 사용하여 부트 로더 구성을 다시 생성합니다.
    # grub2-mkconfig -o /etc/grub2.cfg
    UEFI 기반 호스트를 사용하는 경우 대상 파일은 /etc/grub2-efi.cfg 여야 합니다.
  3. 호스트 재부팅

    변경 사항을 적용하려면 호스트 시스템을 재부팅합니다.
    # reboot

절차 16.14. 호스트 물리적 머신 드라이버에 바인딩에서 GPU 장치 제외

GPU 할당의 경우 이러한 드라이버에서 장치의 동적 unbinding을 지원하지 않으므로 장치를 호스트 드라이버에 바인딩하는 것을 제외하는 것이 좋습니다.
  1. PCI 버스 주소 식별

    장치의 PCI 버스 주소와 ID를 식별하려면 다음 lspci 명령을 실행합니다. 이 예에서는 NVIDIA Quadro 또는 GRID 카드와 같은 VGA 컨트롤러가 사용됩니다.
    # lspci -Dnn | grep VGA
    0000:02:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK106GL [Quadro K4000] [10de:11fa] (rev a1)
    
    그 결과 검색 결과에서는 이 장치의 PCI 버스 주소가 0000:02:00.0이고 장치의 PCI ID는 10de:11fa입니다.
  2. 네이티브 호스트 머신 드라이버가 GPU 장치를 사용하지 못하도록 방지

    네이티브 호스트 머신 드라이버가 GPU 장치를 사용하지 못하도록 하려면 pci-stub 드라이버와 함께 PCI ID를 사용할 수 있습니다. 이렇게 하려면 PCI ID를 값으로 사용하여 pci-stub.ids 옵션을 /etc/sysconfig/grub 구성 파일에 있는 GRUB_CMDLINX_LINUX 줄에 추가하십시오. 예를 들면 다음과 같습니다.
    GRUB_CMDLINE_LINUX="rd.lvm.lv=vg_VolGroup00/LogVol01
    vconsole.font=latarcyrheb-sun16 rd.lvm.lv=vg_VolGroup_1/root
    vconsole.keymap=us $([ -x /usr/sbin/rhcrashkernel-param ]  &&
    /usr/sbin/rhcrashkernel-param || :) rhgb quiet intel_iommu=on iommu=pt pci-stub.ids=10de:11fa"
    
    pci-stub에 대한 PCI ID를 추가하려면 쉼표로 구분합니다.
  3. 부트 로더 구성 다시 생성

    이 옵션을 포함하도록 grub2-mkconfig 를 사용하여 부트 로더 구성을 다시 생성합니다.
    # grub2-mkconfig -o /etc/grub2.cfg
    UEFI 기반 호스트를 사용하는 경우 대상 파일은 /etc/grub2-efi.cfg 여야 합니다.
  4. 호스트 시스템 재부팅

    변경 사항을 적용하려면 호스트 시스템을 재부팅합니다.
    # reboot

절차 16.15. 선택 사항: GPU IOMMU 구성 편집

GPU 장치를 연결하기 전에 GPU가 게스트에서 제대로 작동하려면 IOMMU 구성을 편집해야 할 수 있습니다.
  1. GPU의 XML 정보 표시

    먼저 GPU를 XML 형식으로 표시하려면 먼저 pci_ 를 추가하고 구분 기호를 밑줄로 변환하여 PCI 버스 주소를 libvirt 호환 형식으로 변환해야 합니다. 이 예에서 0000:02:00.0 버스 주소로 식별된 GPU PCI 장치는 이전 절차에서얻은 대로 pci_0000_02_00_0 이 됩니다. virsh nodedev-dumpxml 과 함께 장치의 libvirt 주소를 사용하여 XML 구성을 표시합니다.
    # virsh nodedev-dumpxml pci_0000_02_00_0
    
    <device>
     <name>pci_0000_02_00_0</name>
     <path>/sys/devices/pci0000:00/0000:00:03.0/0000:02:00.0</path>
     <parent>pci_0000_00_03_0</parent>
     <driver>
      <name>pci-stub</name>
     </driver>
     <capability type='pci'>
      <domain>0</domain>
      <bus>2</bus>
      <slot>0</slot>
      <function>0</function>
      <product id='0x11fa'>GK106GL [Quadro K4000]</product>
      <vendor id='0x10de'>NVIDIA Corporation</vendor>
         <!-- pay attention to the following lines -->
      <iommuGroup number='13'>
       <address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
       <address domain='0x0000' bus='0x02' slot='0x00' function='0x1'/>
      </iommuGroup>
      <pci-express>
       <link validity='cap' port='0' speed='8' width='16'/>
       <link validity='sta' speed='2.5' width='16'/>
      </pci-express>
     </capability>
    </device>
    
    XML의 <iommuGroup> 요소를 확인합니다. iommuGroup은 IOMMU 기능 및 PCI 버스 토폴로지로 인해 다른 장치와 분리된 것으로 간주되는 장치 집합을 나타냅니다. 게스트에 할당하려면 iommuGroup 내의 모든 끝점 장치(즉, PCIe 루트 포트, 브리지 또는 스위치 포트가 아닌 장치)는 기본 호스트 드라이버에서 바인딩 해제해야 합니다. 위의 예에서 그룹은 GPU 장치(0000:02:00.0)와 보조 오디오 장치(0000:02:00.1)로 구성됩니다. 자세한 내용은 부록 E. IOMMU 그룹 작업의 내용을 참조하십시오.
  2. IOMMU 설정 조정

    이 예에서는 레거시 인터럽트 지원의 하드웨어 문제로 인해 NVIDIA 오디오 기능의 할당이 지원되지 않습니다. 또한 GPU 오디오 기능은 일반적으로 GPU 자체 없이는 유용하지 않습니다. 따라서 게스트에 GPU를 할당하려면 먼저 기본 호스트 드라이버에서 오디오 기능을 분리해야 합니다. 이 작업은 다음 중 하나를 사용하여 수행할 수 있습니다.

절차 16.16. GPU 연결

다음 방법 중 하나를 사용하여 GPU를 게스트에 연결할 수 있습니다.
  1. 가상 머신 관리자 인터페이스 사용. 자세한 내용은 16.1.2절. “virt-manager로 PCI 장치 할당”의 내용을 참조하십시오.
  2. GPU에 대한 XML 구성 조각을 만들고 virsh attach-device 에 연결합니다.
    1. 다음과 유사한 장치에 대한 XML을 만듭니다.
      
      <hostdev mode='subsystem' type='pci' managed='yes'>
       <driver name='vfio'/>
       <source>
        <address domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
       </source>
      </hostdev>
      
    2. 이 파일을 파일에 저장하고 virsh attach-device [domain] --persistent 를 실행하여 게스트 구성에 XML을 포함합니다. 할당된 GPU가 게스트 시스템의 기존 에뮬레이션 그래픽 장치 외에 추가됩니다. 할당된 GPU는 가상 머신에서 보조 그래픽 장치로 처리됩니다. 기본 그래픽 장치로 할당이 지원되지 않으며 게스트의 XML에서 에뮬레이션된 그래픽 장치는 제거되지 않아야 합니다.
  3. virsh edit 명령을 사용하여 게스트 XML 구성을 편집하고 적절한 XML 세그먼트를 수동으로 추가합니다.

절차 16.17. 게스트에서 Xorg 설정 확인

게스트의 GPU 버스 주소는 호스트와 다릅니다. 호스트가 GPU를 적절하게 사용할 수 있도록 하려면 할당된 GPU 주소를 사용하도록 게스트의 Xorg 디스플레이 서버를 구성합니다.
  1. 게스트에서 lspci 명령을 사용하여 GPU의 PCI 버스 주소를 확인합니다.
    # lspci | grep VGA
    00:02.0 VGA compatible controller: Device 1234:111
    00:09.0 VGA compatible controller: NVIDIA Corporation GK106GL [Quadro K4000] (rev a1)
    
    이 예에서 버스 주소는 00:09.0입니다.
  2. 게스트의 /etc/X11/xorg.conf 파일에서 탐지된 주소를 사용하여 BusID 옵션을 다음과 같이 추가합니다.
    		Section "Device"
    		    Identifier     "Device0"
    		    Driver         "nvidia"
    		    VendorName     "NVIDIA Corporation"
    		    BusID          "PCI:0:9:0"
    		EndSection
    
    중요
    1단계에서 감지된 버스 주소가 16진수인 경우 구분 기호 간 값을 10진수 시스템으로 변환해야 합니다. 예를 들어 00:0a.0을 PCI:0:10:0으로 변환해야 합니다.
참고
게스트에 할당된 NVIDIA GPU를 사용하는 경우 NVIDIA 드라이버만 지원됩니다. 다른 드라이버가 작동하지 않을 수 있으며 오류를 생성할 수 있습니다. Red Hat Enterprise Linux 7 게스트의 경우 설치 중에 커널 명령행에 modprobe.blacklist=nouveau 옵션을 사용하여 nouveau 드라이버를 블랙리스트로 지정할 수 있습니다. 다른 게스트 가상 머신에 대한 자세한 내용은 운영 체제의 특정 설명서를 참조하십시오.
NVIDIA 드라이버가 로드된 게스트 운영 체제에 따라 게스트는 에뮬레이션된 그래픽과 할당된 그래픽 모두를 동시에 사용하거나 에뮬레이션된 그래픽을 비활성화할 수 있습니다. 할당된 그래픽 프레임버에 대한 액세스는 virt-manager 와 같은 애플리케이션에서 제공되지 않습니다. 할당된 GPU가 물리적 디스플레이에 연결되지 않은 경우 GPU 데스크탑에 액세스하려면 게스트 기반 리모팅 솔루션이 필요할 수 있습니다. 모든 PCI 장치 할당과 마찬가지로 GPU가 할당된 게스트의 마이그레이션이 지원되지 않으며 각 GPU는 단일 게스트에서만 소유됩니다. 게스트 운영 체제에 따라 GPU의 핫 플러그 지원을 사용할 수 있습니다.

16.7.2. NVIDIA vGPU Assignment

NVIDIA vGPU 기능을 사용하면 물리적 GPU 장치를 중재 장치라고 하는 여러 가상 장치로 나눌 수 있습니다. 그런 다음 이러한 중재 장치를 가상 GPU로 여러 게스트에 할당할 수 있습니다. 결과적으로 이러한 게스트는 단일 물리 GPU의 성능을 공유합니다.
중요
이 기능은 제한된 NVIDIA GPU 세트에서만 사용할 수 있습니다. 이러한 장치의 최신 목록은 NVIDIA GPU 소프트웨어 설명서 를 참조하십시오.

16.7.2.1. NVIDIA vGPU 설정

vGPU 기능을 설정하려면 먼저 GPU 장치에 대한 NVIDIA vGPU 드라이버를 가져온 다음 중재 장치를 생성하고 원하는 게스트 머신에 할당해야 합니다.
  1. NVIDIA vGPU 드라이버를 가져와서 시스템에 설치합니다. 자세한 내용은 NVIDIA 문서를 참조하십시오.
  2. NVIDIA 소프트웨어 설치 프로그램이 /etc/modprobe.d/nvidia-installer-disable-nouveau .conf 파일을 생성하지 않은 경우 /etc/modprobe.d/ 디렉터리에 .conf 파일(이름 중)을 생성합니다. 파일에 다음 행을 추가합니다.
    blacklist nouveau
    options nouveau modeset=0
    
    
  3. 현재 커널의 초기 램디스크를 다시 생성한 다음 재부팅합니다.
    # dracut --force
    # reboot
    중재 장치가 있는 이전에 지원되는 커널 버전을 사용해야 하는 경우 설치된 모든 커널 버전에 대해 초기 램디스크를 다시 생성합니다.
    # dracut --regenerate-all --force
    # reboot
  4. nvidia_vgpu_vfio 모듈이 커널에 의해 로드되었으며 nvidia-vgpu-mgr.service 서비스가 실행 중인지 확인합니다.
    # lsmod | grep nvidia_vgpu_vfio
    nvidia_vgpu_vfio 45011 0
    nvidia 14333621 10 nvidia_vgpu_vfio
    mdev 20414 2 vfio_mdev,nvidia_vgpu_vfio
    vfio 32695 3 vfio_mdev,nvidia_vgpu_vfio,vfio_iommu_type1
    # systemctl status nvidia-vgpu-mgr.service
    nvidia-vgpu-mgr.service - NVIDIA vGPU Manager Daemon
       Loaded: loaded (/usr/lib/systemd/system/nvidia-vgpu-mgr.service; enabled; vendor preset: disabled)
       Active: active (running) since Fri 2018-03-16 10:17:36 CET; 5h 8min ago
     Main PID: 1553 (nvidia-vgpu-mgr)
     [...]
    
  5. /sys/class/mdev_bus/pci_dev/mdev_supported_types/type-id/create 에 장치 UUID를 작성합니다. 여기서 pci_dev 는 호스트 GPU의 PCI 주소이고 type-id 는 호스트 GPU 유형의 ID입니다.
    다음 예제에서는 NVIDIA InstallPlan P4 카드에 nvidia-63 vGPU 유형의 중재 장치를 생성하는 방법을 보여줍니다.
    # uuidgen
    30820a6f-b1a5-4503-91ca-0c10ba58692a
    # echo "30820a6f-b1a5-4503-91ca-0c10ba58692a" > /sys/class/mdev_bus/0000:01:00.0/mdev_supported_types/nvidia-63/create
    특정 장치에 대한 type-id 값은 section 1.3.1을 참조하십시오. 가상 GPU 유형 가상 GPU 소프트웨어 설명서. GRID P4-2Q 와 같은 Q-series NVIDIA vGPU만 Linux 게스트에서 중재 장치 GPU 유형으로 지원됩니다.
  6. vGPU 리소스를 공유하려는 게스트의 XML 구성의 <devices/> 섹션에 다음 행을 추가합니다. 이전 단계에서 uuid gen 명령으로 생성된 UUID 값을 사용합니다. 각 UUID는 한 번에 하나의 게스트에만 할당할 수 있습니다.
    
    <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci'>
      <source>
        <address uuid='30820a6f-b1a5-4503-91ca-0c10ba58692a'/>
      </source>
    </hostdev>
    
    
    중요
    할당된 게스트에서 vGPU 중재된 장치가 제대로 작동하려면 게스트가 NVIDIA vGPU 게스트 소프트웨어 라이센스를 설정해야 합니다. 자세한 내용은 NVIDIA 가상 GPU 소프트웨어 설명서 를 참조하십시오.

16.7.2.2. NVIDIA vGPU에서 비디오 스트리밍용 VNC 콘솔 설정 및 사용

기술 프리뷰 로 VNC(Virtual Network Computing) 콘솔은 Red Hat Enterprise Linux 7.7 이상에서 NVIDIA vGPU를 포함한 GPU 기반 중재 장치와 함께 사용할 수 있습니다. 결과적으로 VNC를 사용하여 NVIDIA vGPU 장치에서 제공하는 빠른 그래픽 출력을 표시할 수 있습니다.
주의
이 기능은 현재 기술 프리뷰로만 제공되며 Red Hat에서 지원하지 않습니다. 따라서 프로덕션 환경에서 아래 절차를 사용하는 것은 크게 권장되지 않습니다.
가상 머신의 VNC 콘솔에서 vGPU 출력 렌더링을 구성하려면 다음을 수행합니다.
  1. NVIDIA vGPU 드라이버를 설치하고 16.7.2.1절. “NVIDIA vGPU 설정” 에 설명된 대로 시스템에 NVIDIA vGPU를 구성합니다. 중재 장치의 XML 구성에 display='on의 매개 변수가 포함되어 있는지 확인합니다. 예를 들면 다음과 같습니다.
    			
    <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='on'>
       <source>
          <address uuid='ba26a3e2-8e1e-4f39-9de7-b26bd210268a'/>
       </source>
    </hostdev>
    
    
  2. 선택적으로 VM의 비디오 모델 유형을 none 으로 설정합니다. 예를 들면 다음과 같습니다.
    			
    <video>
       <model type='none'/>
    </video>
    
    
    이를 지정하지 않으면 에뮬레이션한 Cirrus 또는 QXL 카드와 NVIDIA vGPU에서 두 개의 다른 디스플레이 출력을 받습니다. 또한 model type='none 을 사용하면 드라이버가 초기화될 때까지 부팅 그래픽 출력을 볼 수 없습니다. 그 결과 첫 번째 그래픽 출력이 로그인 화면입니다.
  3. VM의 그래픽 유형의 XML 구성이 vnc 인지 확인합니다.
    예를 들면 다음과 같습니다.
    			
    <graphics type='vnc' port='-1' autoport='yes'>
    	 <listen type='address'/>
    </graphics>
    
    
  4. 가상 머신을 시작합니다.
  5. VNC 뷰어 원격 데스크탑 클라이언트를 사용하여 가상 머신에 연결합니다.
    참고
    VM이 에뮬레이션된 VGA를 기본 비디오 장치로 사용하고 vGPU를 보조 장치로 사용하는 경우 ctrl+alt+2 키보드 바로 가기를 사용하여 vGPU 디스플레이로 전환합니다.

16.7.2.3. NVIDIA vGPU 장치 제거

중재된 vGPU 장치를 제거하려면 장치가 비활성화된 경우 다음 명령을 사용하고 uuid 를 장치의 UUID (예: 30820a6f-b1a5-4503-91ca-0c10ba58692a )로 바꿉니다.
# echo 1 > /sys/bus/mdev/devices/uuid/remove
현재 게스트에서 사용 중인 vGPU 장치를 제거하려고 하면 다음 오류가 트리거됩니다.
echo: write error: Device or resource busy

16.7.2.4. NVIDIA vGPU 기능 쿼리

시스템에서 중재된 장치(예: 지정된 유형의 중재 장치 수)에 대한 추가 정보를 얻으려면 virsh nodedev-list --cap mdev_typesvirsh nodedev-dumpxml 명령을 사용합니다. 예를 들어, 다음 표는octets P4 카드에 사용 가능한 vGPU 유형을 표시합니다.

$ virsh nodedev-list --cap mdev_types
pci_0000_01_00_0
$ virsh nodedev-dumpxml pci_0000_01_00_0
<...>
  <capability type='mdev_types'>
    <type id='nvidia-70'>
      <name>GRID P4-8A</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>1</availableInstances>
    </type>
    <type id='nvidia-69'>
      <name>GRID P4-4A</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>2</availableInstances>
    </type>
    <type id='nvidia-67'>
      <name>GRID P4-1A</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>8</availableInstances>
    </type>
    <type id='nvidia-65'>
      <name>GRID P4-4Q</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>2</availableInstances>
    </type>
    <type id='nvidia-63'>
      <name>GRID P4-1Q</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>8</availableInstances>
    </type>
    <type id='nvidia-71'>
      <name>GRID P4-1B</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>8</availableInstances>
    </type>
    <type id='nvidia-68'>
      <name>GRID P4-2A</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>4</availableInstances>
    </type>
    <type id='nvidia-66'>
      <name>GRID P4-8Q</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>1</availableInstances>
    </type>
    <type id='nvidia-64'>
      <name>GRID P4-2Q</name>
      <deviceAPI>vfio-pci</deviceAPI>
      <availableInstances>4</availableInstances>
    </type>
  </capability>
</...>

16.7.2.5. NVIDIA vGPU용 원격 데스크탑 스트리밍 서비스

다음 원격 데스크탑 스트리밍 서비스는 Red Hat Enterprise Linux 7에서 NVIDIA vGPU 기능을 사용하도록 성공적으로 테스트되었습니다.
  • HP-RGS
  • Mechdyne TGX - 현재 Mechdyne TGX를 Windows Server 2016 게스트에서 사용할 수 없습니다.
  • NICE DCV - 이 스트리밍 서비스를 사용할 때 Red Hat은 일부 경우에서 동적 해상도를 사용하므로 고정 해결 설정을 사용하는 것이 좋습니다.

16.7.2.6. NVIDIA vGPU를 사용하여 비디오 스트리밍용 VNC 콘솔 설정

소개

기술 프리뷰 로 VNC(Virtual Network Computing) 콘솔은 Red Hat Enterprise Linux 8의 NVIDIA vGPU를 포함한 GPU 기반 중재 장치와 함께 사용할 수 있습니다. 결과적으로 VNC를 사용하여 NVIDIA vGPU 장치에서 제공하는 빠른 그래픽 출력을 표시할 수 있습니다.
중요
기술 프리뷰로 인해 Red Hat에서는 이 기능을 지원하지 않습니다. 따라서 프로덕션 환경에서 아래 절차를 사용하는 것은 크게 권장되지 않습니다.

설정

가상 머신의 VNC 콘솔에서 vGPU 출력 렌더링을 구성하려면 다음을 수행합니다.
  1. NVIDIA vGPU 드라이버를 설치하고 16.7.2절. “NVIDIA vGPU Assignment” 에 설명된 대로 호스트에 NVIDIA vGPU를 구성합니다. 중재 장치의 XML 구성에 display='on의 매개 변수가 포함되어 있는지 확인합니다. 예를 들면 다음과 같습니다.
    <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='on'>
     <source>
        <address uuid='ba26a3e2-8e1e-4f39-9de7-b26bd210268a'/>
     </source>
    </hostdev>
    
  2. 선택적으로 VM의 비디오 모델 유형을 none 으로 설정합니다. 예를 들면 다음과 같습니다.
    <video>
     <model type='none'/>
    </video>
    
  3. VM의 그래픽 유형의 XML 구성이 spice 또는 vnc 인지 확인합니다.
    spice 의 예:
    <graphics type='spice' autoport='yes'>
     <listen type='address'/>
     <image compression='off'/>
    </graphics>
    
    vnc 의 예:
    <graphics type='vnc' port='-1' autoport='yes'>
     <listen type='address'/>
    </graphics>
    
  4. 가상 머신을 시작합니다.
  5. 이전 단계에서 구성한 그래픽 프로토콜에 적합한 클라이언트를 사용하여 가상 머신에 연결합니다.
    • VNC의 경우 VNC 뷰어 원격 데스크탑 클라이언트를 사용합니다. VM이 에뮬레이션된 VGA를 기본 비디오 장치로 설정하고 vGPU를 보조로 사용하여 ctrl+alt+2 키보드 바로 가기를 사용하여 vGPU 디스플레이로 전환합니다.
    • SPICE는 virt-viewer 애플리케이션을 사용합니다.

17장. 가상 네트워킹

이 장에서는 libvirt를 사용하여 가상 네트워크를 생성, 시작, 중지, 제거 및 수정하는 데 필요한 개념을 소개합니다.
자세한 내용은 libvirt 참조 장에서 확인할 수 있습니다.

17.1. 가상 네트워크 스위치

libvirt 가상 네트워킹에서는 가상 네트워크 스위치 의 개념을 사용합니다. 가상 네트워크 스위치는 가상 시스템(게스트)이 연결되는 호스트 물리적 시스템 서버에서 작동하는 소프트웨어 구조입니다. 게스트의 네트워크 트래픽은 이 스위치를 통과합니다.

그림 17.1. 게스트 두 개로 가상 네트워크 스위치

게스트 두 개로 가상 네트워크 스위치
Linux 호스트 물리적 시스템 서버는 가상 네트워크 스위치를 네트워크 인터페이스로 나타냅니다. libvirtd 데몬(libvirtd)이 먼저 설치 및 시작되면 가상 네트워크 스위치를 나타내는 기본 네트워크 인터페이스는 virbr0 입니다.
virbr0 인터페이스는 다른 인터페이스와 마찬가지로 ip 명령을 사용하여 볼 수 있습니다.
 $ ip addr show virbr0
 3: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
     link/ether 1b:c4:94:cf:fd:17 brd ff:ff:ff:ff:ff:ff
     inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0

17.2. 브리지 모드

Bridged 모드를 사용하면 모든 게스트 가상 시스템이 호스트 물리적 시스템과 동일한 서브넷 내에 표시됩니다. 동일한 물리적 네트워크에 있는 기타 모든 물리적 시스템은 가상 머신을 인식하고 가상 머신에 액세스할 수 있습니다. 브리징은 OSI 네트워킹 모델의 계층 2에서 작동합니다.

그림 17.2. 브릿지 모드로 가상 네트워크 스위치

브릿지 모드로 가상 네트워크 스위치
본딩 과 함께 결합하여 하이퍼바이저에서 여러 물리적 인터페이스를 사용할 수 있습니다. 그러면 본딩이 브리지에 추가된 다음 게스트 가상 머신도 브리지에 추가됩니다. 그러나 본딩 드라이버에는 여러 작동 모드가 있으며 이러한 모드 중 일부만 가상 게스트 시스템이 사용 중인 브릿지에서 작동합니다.
주의
브리지 모드를 사용하는 경우 게스트 가상 시스템과 함께 사용해야 하는 유일한 본딩 모드는 모드 1 모드 2 및 모드 4입니다. 모드 0, 3, 5 또는 6을 사용하면 연결이 실패할 가능성이 높습니다. 또한 ARP(Address Resolution Protocol) 모니터링이 작동하지 않기 때문에 MII(Media-Independent Interface) 모니터링을 사용하여 본딩 모드를 모니터링해야 합니다.
본딩 모드에 대한 자세한 내용은 관련 지식베이스 문서 또는 Red Hat Enterprise Linux 7 네트워킹 가이드 를 참조하십시오.
브리지 네트워킹 모드를 구성하는 데 사용되는 bridge_opts 매개 변수에 대한 자세한 설명은 Red Hat Virtualization 관리 가이드 를 참조하십시오.

17.3. 네트워크 주소 변환

기본적으로 가상 네트워크 스위치는 NAT 모드에서 작동합니다. NAT(Source-NAT) 또는 Destination-NAT( Destination-NAT) 대신 IP 마스커레이딩을 사용합니다. IP 마스커레이딩을 사용하면 연결된 게스트가 모든 외부 네트워크와의 통신에 호스트 물리적 머신 IP 주소를 사용할 수 있습니다. 기본적으로 호스트 물리적 시스템에 배치된 컴퓨터는 다음 다이어그램에 표시된 대로 가상 네트워크 스위치가 NAT 모드에서 작동할 때 내부의 게스트와 통신할 수 없습니다.

그림 17.3. 2개의 게스트가 있는 NAT를 사용하는 가상 네트워크 스위치

2개의 게스트가 있는 NAT를 사용하는 가상 네트워크 스위치
주의
가상 네트워크 스위치는 iptables 규칙에 의해 구성된 NAT를 사용합니다. 스위치가 실행되는 동안 이러한 규칙을 편집하는 것은 권장되지 않습니다. 잘못된 규칙으로 인해 스위치가 통신할 수 없게 될 수 있습니다.
스위치가 실행되고 있지 않은 경우 다음을 실행하여 포트 마스커레이딩 범위를 만들기 위해 전달 모드 NAT에 공용 IP 범위를 설정할 수 있습니다.
# iptables -j SNAT --to-source [start]-[end]

17.4. DNS 및 DHCP

IP 정보는 DHCP를 통해 게스트에 할당할 수 있습니다. 이러한 목적으로 가상 네트워크 스위치에 주소 풀을 할당할 수 있습니다. libvirt는 이를 위해 dnsmasq 프로그램을 사용합니다. dnsmasq의 인스턴스는 필요한 각 가상 네트워크 스위치에 대해 libvirt에 의해 자동으로 구성 및 시작됩니다.

그림 17.4. dnsmasq를 실행하는 가상 네트워크 스위치

dnsmasq를 실행하는 가상 네트워크 스위치

17.5. 라우팅 모드

Routed 모드를 사용하면 가상 스위치가 호스트 물리적 시스템에 연결된 물리적 LAN에 연결하여 NAT를 사용하지 않고 트래픽을 다시 전달합니다. 가상 스위치는 모든 트래픽을 검사하고 네트워크 패킷에 포함된 정보를 사용하여 라우팅 결정을 내릴 수 있습니다. 이 모드를 사용하는 경우 모든 가상 머신은 자체 서브넷에 있으며 가상 스위치를 통해 라우팅됩니다. 이러한 상황은 물리적 네트워크의 다른 호스트 물리적 시스템이 수동 물리적 라우터 구성 없이 가상 머신을 인식하지 못하므로 항상 적합하지 않으며 가상 시스템에 액세스할 수 없습니다. 라우팅 모드는 OSI 네트워킹 모델의 계층 3에서 작동합니다.

그림 17.5. 라우팅 모드의 가상 네트워크 스위치

라우팅 모드의 가상 네트워크 스위치

17.6. isolated Mode

격리 모드를 사용하는 경우 가상 스위치에 연결된 게스트가 서로 통신할 수 있으며 호스트 물리적 시스템과 통신할 수 있지만 트래픽은 호스트 물리적 시스템 외부에 전달되지 않으며 호스트 물리적 시스템 외부에서 트래픽을 수신할 수 없습니다. DHCP와 같은 기본 기능을 사용하려면 이 모드에서 dnsmasq를 사용해야 합니다. 그러나 이 네트워크가 물리적 네트워크와 분리되어 있어도 DNS 이름은 계속 확인됩니다. 따라서 DNS 이름을 확인하지만 ICMP 에코 요청(ping) 명령이 실패할 때 상황이 발생할 수 있습니다.

그림 17.6. 분리된 모드로 가상 네트워크 스위치

분리된 모드로 가상 네트워크 스위치

17.7. 기본 구성

libvirtd 데몬(libvirtd)이 처음 설치되면 NAT 모드에서 초기 가상 네트워크 스위치 구성이 포함됩니다. 이 구성은 설치된 게스트가 호스트 물리적 시스템을 통해 외부 네트워크와 통신할 수 있도록 하는 데 사용됩니다. 다음 이미지는 libvirtd 에 대한 이 기본 구성을 보여줍니다.

그림 17.7. 기본 libvirt 네트워크 구성

기본 libvirt 네트워크 구성
참고
가상 네트워크는 특정 물리적 인터페이스로 제한할 수 있습니다. 이는 여러 인터페이스가 있는 물리적 시스템에 유용할 수 있습니다(예: eth0,eth1eth2). 이는 라우팅 및 NAT 모드에서만 유용하며 dev=<interface> 옵션 또는 새 가상 네트워크를 생성할 때 virt-manager 에 정의할 수 있습니다.

17.8. 공통 시나리오의 예

이 섹션에서는 다양한 가상 네트워킹 모드를 보여주고 몇 가지 예제 시나리오를 제공합니다.

17.8.1. 브리지 모드

bridged 모드는 OSI 모델의 계층 2에서 작동합니다. 사용하면 모든 게스트 가상 시스템이 호스트 물리적 시스템과 동일한 서브넷에 나타납니다. bridged 모드의 가장 일반적인 사용 사례는 다음과 같습니다.
  • 호스트 물리적 시스템과 함께 기존 네트워크에 게스트 가상 머신을 배포하면 가상 시스템과 물리적 시스템 간의 차이를 최종 사용자에게 투명하게 할 수 있습니다.
  • 기존 물리적 네트워크 구성을 변경하지 않고 게스트 가상 머신 배포.
  • 기존 물리적 네트워크에 쉽게 액세스할 수 있어야 하는 게스트 가상 머신 배포. 게스트 가상 머신을 실제 네트워크에 배치하여 DHCP와 같은 기존 브로드캐스트 도메인 내에서 서비스에 액세스해야 합니다.
  • VLAN이 사용되는 가상 머신을 시작하는 네트워크에 게스트 가상 머신을 연결합니다.

17.8.2. 라우팅 모드

DMZ

보안상의 이유로 하나 이상의 노드가 제어되는 하위 네트워크에 배치되는 네트워크를 고려하십시오. 이와 같은 특수 하위 네트워크를 배포하는 것은 일반적인 관행이며, 하위 네트워크를 RuntimeClass라고 합니다. 이 레이아웃에 대한 자세한 내용은 다음 다이어그램을 참조하십시오.

그림 17.8. 샘플 RuntimeClass 구성

샘플 RuntimeClass 구성
RuntimeClass의 호스트 물리적 시스템은 일반적으로 WAN(외부) 호스트 물리적 시스템과 LAN(내부) 호스트 물리적 시스템에 서비스를 제공합니다. 이를 위해서는 여러 위치에서 액세스할 수 있어야 하고 이러한 위치가 보안 및 신뢰 수준에 따라 제어 및 운영된다는 점을 고려하여 라우팅 모드는 이 환경에 가장 적합한 구성입니다.

가상 서버 호스팅

각각 두 개의 물리적 네트워크 연결이 있는 여러 호스트 물리적 시스템이 있는 가상 서버 호스팅 회사. 한 인터페이스는 관리 및 회계를 위해 사용되며 다른 인터페이스는 가상 시스템이 을 통해 연결하는 것입니다. 각 게스트에는 자체 공용 IP 주소가 있지만 호스트 물리적 시스템은 개인 IP 주소를 게스트 관리로만 내부 관리자가 수행할 수 있습니다. 이 시나리오를 이해하려면 다음 다이어그램을 참조하십시오.

그림 17.9. 가상 서버 호스팅 샘플 구성

가상 서버 호스팅 샘플 구성

17.8.3. NAT 모드

NAT(Network Address Translation) 모드는 기본 모드입니다. 직접 네트워크 가시성이 필요하지 않은 경우 테스트에 사용할 수 있습니다.

17.8.4. isolated Mode

격리된 모드를 사용하면 가상 머신이 서로만 통신할 수 있습니다. 물리적 네트워크와 상호 작용할 수 없습니다.

17.9. 가상 네트워크 관리

시스템에서 가상 네트워크를 구성하려면 다음을 수행합니다.
  1. 편집 메뉴에서 연결 세부 정보를 선택합니다.
  2. 그러면 연결 세부 정보 메뉴가 열립니다. 가상 네트워크 탭을 클릭합니다.

    그림 17.10. 가상 네트워크 구성

    가상 네트워크 구성
  3. 사용 가능한 모든 가상 네트워크가 메뉴 왼쪽에 나열됩니다. 이 상자에서 가상 네트워크를 선택하고 적합한 것으로 편집하여 가상 네트워크의 구성을 편집할 수 있습니다.

17.10. 가상 네트워크 생성

Virtual Machine Manager(virt-manager)를 사용하여 시스템에 가상 네트워크를 생성하려면 다음을 수행합니다.
  1. 연결 세부 정보 메뉴에서 가상 네트워크 탭을 엽니다. 더하기 기호(+) 아이콘으로 식별되는 네트워크 추가 버튼을 클릭합니다. 자세한 내용은 17.9절. “가상 네트워크 관리”의 내용을 참조하십시오.

    그림 17.11. 가상 네트워크 구성

    가상 네트워크 구성
    그러면 Create a new virtual network (새 가상 네트워크 생성) 창이 열립니다. 계속하려면 Forward 를 클릭합니다.

    그림 17.12. 새 가상 네트워크 이름 지정

    새 가상 네트워크 이름 지정
  2. 가상 네트워크에 적절한 이름을 입력하고 Forward 를 클릭합니다.

    그림 17.13. IPv4 주소 공간 선택

    IPv4 주소 공간 선택
  3. Enable IPv4 network address space definition 확인란을 선택합니다.
    Network (네트워크) 필드에 가상 네트워크의 IPv4 주소 공간을 입력합니다.
    Enable DHCPv4 확인란을 선택합니다.
    StartEnd range of IP 주소를 지정하여 가상 네트워크의 DHCP 범위를 정의합니다.

    그림 17.14. IPv4 주소 공간 선택

    IPv4 주소 공간 선택
    계속하려면 Forward 를 클릭합니다.
  4. IPv6를 활성화하려면 Enable IPv6 네트워크 주소 공간 정의를 확인하십시오.

    그림 17.15. IPv6 활성화

    IPv6 활성화
    새 가상 네트워크 생성 창에 추가 필드가 표시됩니다.

    그림 17.16. IPv6 구성

    IPv6 구성
    Network (네트워크) 필드에 IPv6 주소를 입력합니다.
  5. DHCPv6을 활성화하려면 Enable DHCPv6 확인란을 선택합니다.
    새 가상 네트워크 생성 창에 추가 필드가 표시됩니다.

    그림 17.17. DHCPv6 구성

    DHCPv6 구성
    (선택 사항) DHCPv6 범위의 시작 및 종료를 편집합니다.
  6. 정적 경로 정의를 활성화하려면 Enable Static Route Definition 확인란을 선택합니다.
    새 가상 네트워크 생성 창에 추가 필드가 표시됩니다.

    그림 17.18. 정적 경로 정의

    정적 경로 정의
    네트워크 주소 및 적절한 필드에서 네트워크로 이동하는 데 사용할 게이트웨이를 입력합니다.
    Forward 를 클릭합니다.
  7. 가상 네트워크가 실제 네트워크에 연결하는 방법을 선택합니다.

    그림 17.19. 물리적 네트워크에 연결

    물리적 네트워크에 연결
    가상 네트워크를 분리하려면 격리된 가상 네트워크 라디오 버튼이 선택되어 있는지 확인합니다.
    가상 네트워크가 물리적 네트워크에 연결되도록 하려면 물리적 네트워크로 전달을 선택하고 대상이 모든 물리적 장치인지 특정 물리적 장치인지 특정 물리적 장치 여야 하는지를 선택합니다. 또한 모드가 NAT 여야 하는지 아니면 Routed 여야 하는지를 선택합니다.
    가상 네트워크 내에서 IPv6 라우팅을 활성화하려면 Enable IPv6 internal routing/networking 확인란을 선택합니다.
    가상 네트워크의 DNS 도메인 이름을 입력합니다.
    Finish 를 클릭하여 가상 네트워크를 만듭니다.
  8. 이제 새 가상 네트워크를 연결 세부 정보 창의 Virtual Networks (가상 네트워크) 탭에서 사용할 수 있습니다.

17.11. 게스트에 가상 네트워크 연결

가상 네트워크를 게스트에 연결하려면 다음을 수행합니다.
  1. Virtual Machine Manager 창에서 네트워크를 할당할 게스트를 강조 표시합니다.

    그림 17.20. 표시할 가상 머신 선택

    표시할 가상 머신 선택
  2. 가상 머신 관리자 편집 메뉴에서 가상 머신 세부 정보를 선택합니다.
  3. 가상 머신 세부 정보 창에서 하드웨어 추가 버튼을 클릭합니다.
  4. 새 가상 하드웨어 추가 창의 왼쪽 창에서 네트워크를 선택하고 네트워크 소스 메뉴에서 네트워크 이름(이 예제의network 1)을 선택합니다. 필요한 경우 MAC 주소를 수정하고 장치 모델을 선택합니다. 완료를 클릭합니다.

    그림 17.21. 새 가상 하드웨어 추가 창에서 네트워크를 선택합니다.

    새 가상 하드웨어 추가 창에서 네트워크를 선택합니다.
  5. 이제 새 네트워크가 시작 시 게스트에 표시되는 가상 네트워크 인터페이스로 표시됩니다.

    그림 17.22. 게스트 하드웨어 목록에 표시된 새 네트워크

    게스트 하드웨어 목록에 표시된 새 네트워크

17.12. 물리적 인터페이스에 가상 NIC 직접 연결

기본 NAT 연결 대신 macvtap 드라이버를 사용하여 게스트의 NIC를 호스트 시스템의 지정된 물리적 인터페이스에 직접 연결할 수 있습니다. 이는 장치 할당 (passthrough라고도 함)과 혼동되지 않습니다. MacVTap 연결에는 다음과 같은 모드가 있으며 각각 다양한 이점과 사용 사례가 있습니다.

물리적 인터페이스 전달 모드

VEPA
VEPA(가상 이더넷 포트 집계기) 모드에서는 게스트의 모든 패킷이 외부 스위치로 전송됩니다. 이를 통해 사용자는 스위치를 통해 게스트 트래픽을 강제 수행할 수 있습니다. VEPA 모드가 올바르게 작동하려면 외부 스위치가 hairpin 모드를 지원하므로 소스 게스트와 동일한 호스트 시스템의 게스트인 패킷이 외부 스위치를 통해 호스트로 다시 전송되도록 해야 합니다.

그림 17.23. VEPA 모드

VEPA 모드
Bridge
소스 게스트와 동일한 호스트 시스템에 대상이 있는 패킷은 대상 macvtap 장치로 직접 전달됩니다. 직접 전송이 성공하려면 소스 장치와 대상 장치 모두 브리지 모드에 있어야 합니다. 장치 중 하나가 VEPA 모드에 있는 경우 헤어핀 가능 외부 스위치가 필요합니다.

그림 17.24. 브리지 모드

브리지 모드
private
모든 패킷은 외부 스위치로 전송되며 외부 라우터 또는 게이트웨이를 통해 전송되고 호스트에 다시 전송되는 경우에만 동일한 호스트 시스템의 대상 게스트로 전달됩니다. 개인 모드를 사용하면 단일 호스트의 개별 게스트가 서로 통신하지 못하도록 할 수 있습니다. 다음 절차는 소스 또는 대상 장치가 개인 모드인 경우 수행됩니다.

그림 17.25. 프라이빗 모드

프라이빗 모드
passthrough
이 기능은 마이그레이션 기능을 손실하지 않고 물리적 인터페이스 장치 또는 SR-IOV VF(가상 기능)를 게스트에 직접 연결합니다. 모든 패킷은 지정된 네트워크 장치로 직접 전송됩니다. 네트워크 장치는 패스스루 모드의 게스트 간에 공유할 수 없으므로 단일 네트워크 장치는 단일 게스트로 전달될 수 있습니다.

그림 17.26. Passthrough 모드

Passthrough 모드
MacVTap은 도메인 XML 파일을 변경하거나 virt-manager 인터페이스를 사용하여 구성할 수 있습니다.

17.12.1. 도메인 XML을 사용하여 macvtap 구성

게스트의 도메인 XML 파일을 열고 <devices> 요소를 다음과 같이 수정합니다.
<devices>
	...
	<interface type='direct'>
		<source dev='eth0' mode='vepa'/>
	</interface>
</devices>
직접 연결된 게스트 가상 머신의 네트워크 액세스는 호스트 물리적 시스템의 물리적 인터페이스가 연결된 하드웨어 스위치에서 관리할 수 있습니다.
이 인터페이스는 스위치가 IEEE 802.1Qbg 표준을 준수하는 경우 다음과 같이 추가 매개 변수를 가질 수 있습니다. virtualport 요소의 매개 변수는 IEEE 802.1Qbg 표준에 자세히 설명되어 있습니다. 값은 네트워크별로 다르며 네트워크 관리자가 제공해야 합니다. 802.1Qbg 용어에서 VSI(Virtual Group Interface)는 가상 머신의 가상 인터페이스를 나타냅니다. 또한 IEEE 802.1Qbg에는 VLAN ID에 0이 아닌 값이 필요합니다.

가상 역 인터페이스 유형

managerid
VSI 관리자 ID는 VSI 유형 및 인스턴스 정의가 포함된 데이터베이스를 식별합니다. 이는 정수 값이며 값 0이 예약되어 있습니다.
typeid
VSI 유형 ID는 네트워크 액세스를 문자 지정하는 VSI 유형을 식별합니다. VSI 유형은 일반적으로 네트워크 관리자가 관리합니다. 정수 값입니다.
typeidversion
VSI 유형 버전에서는 VSI 유형의 여러 버전을 사용할 수 있습니다. 정수 값입니다.
instanceID
VSI 인스턴스(가상 머신의 가상 인터페이스)가 생성되면 VSI 인스턴스 ID가 생성됩니다. 이는 전역적으로 고유 식별자입니다.
profileid
프로필 ID에는 이 인터페이스에 적용할 포트 프로필 이름이 포함되어 있습니다. 이 이름은 port 프로필 데이터베이스에서 포트 프로필의 네트워크 매개 변수로 확인되고 해당 네트워크 매개 변수가 이 인터페이스에 적용됩니다.
네 가지 유형 각각은 도메인 XML 파일을 변경하여 구성됩니다. 이 파일이 열리면 다음과 같이 모드 설정을 변경합니다.
<devices>
 ...
 <interface type='direct'>
  <source dev='eth0.2' mode='vepa'/>
   <virtualport type="802.1Qbg">
    <parameters managerid="11" typeid="1193047" typeidversion="2" instanceid="09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f"/>
   </virtualport>
  </interface>
</devices>
프로필 ID는 다음과 같습니다.
<devices>
 ...
 <interface type='direct'>
  <source dev='eth0' mode='private'/>
   <virtualport type='802.1Qbh'>
    <parameters profileid='finance'/>
   </virtualport>
 </interface>
</devices>
...

17.12.2. virt-manager를 사용하여 macvtap 구성

가상 하드웨어 세부 정보 창을 열고 네트워크 소스에 대해 메뉴에서 NIC 를 선택하고 호스트 장치 이름: macvtap octets를 선택합니다.
그러면 가상 포트 하위 메뉴에서 가상 스테이션 인터페이스 유형을 설정할 수 있습니다.

그림 17.27. virt-manager에서 macvtap 구성

virt-manager에서 macvtap 구성

17.13. 가상 NIC에 연결된 호스트 물리적 머신 또는 네트워크 브리지를 동적으로 변경

이 섹션에서는 게스트 가상 머신을 손상시키지 않고 게스트 가상 시스템이 실행되는 동안 게스트 가상 시스템의 vNIC를 한 브리지에서 다른 브리지로 이동하는 방법을 설명합니다.
  1. 다음과 유사한 구성으로 게스트 가상 머신을 준비합니다.
    <interface type='bridge'>
          <mac address='52:54:00:4a:c9:5e'/>
          <source bridge='virbr0'/>
          <model type='virtio'/>
    </interface>
    
  2. 인터페이스 업데이트를 위해 XML 파일을 준비합니다.
    # cat br1.xml
    <interface type='bridge'>
          <mac address='52:54:00:4a:c9:5e'/>
          <source bridge='virbr1'/>
          <model type='virtio'/>
    </interface>
    
  3. 게스트 가상 머신을 시작하고 게스트 가상 머신의 네트워크 기능을 확인하고 표시된 브릿지에 게스트 가상 머신의 vnetX가 연결되어 있는지 확인합니다.
    # brctl show
    bridge name     bridge id               STP enabled     interfaces
    virbr0          8000.5254007da9f2       yes                  virbr0-nic
    
    vnet0
    virbr1          8000.525400682996       yes                  virbr1-nic
    
  4. 다음 명령을 사용하여 게스트 가상 머신의 네트워크를 새 인터페이스 매개 변수로 업데이트합니다.
    # virsh update-device test1 br1.xml 
    
    Device updated successfully
    
    
  5. 게스트 가상 머신에서 서비스 네트워크를 다시 시작합니다. 게스트 가상 머신은 virbr1의 새 IP 주소를 가져옵니다. guest 가상 시스템의 vnet0이 새 브리지(virbr1)에 연결되어 있는지 확인합니다.
    # brctl show
    bridge name     bridge id               STP enabled     interfaces
    virbr0          8000.5254007da9f2       yes             virbr0-nic
    virbr1          8000.525400682996       yes             virbr1-nic     vnet0
    

17.14. 네트워크 필터링 적용

이 섹션에서는 libvirt의 네트워크 필터, 목표, 개념 및 XML 형식에 대해 소개합니다.

17.14.1. 소개

네트워크 필터링의 목표는 가상화된 시스템의 관리자가 가상 시스템에서 네트워크 트래픽 필터링 규칙을 구성 및 적용하고 가상 시스템이 전송 또는 수신할 수 있는 네트워크 트래픽의 매개변수를 관리할 수 있도록 하는 것입니다. 가상 시스템이 시작될 때 네트워크 트래픽 필터링 규칙이 호스트 물리적 시스템에 적용됩니다. 필터링 규칙은 가상 머신 내에서 이동할 수 없으므로 가상 머신 사용자의 관점에서 필수입니다.
게스트 가상 머신의 관점에서 네트워크 필터링 시스템을 사용하면 각 가상 시스템의 네트워크 트래픽 필터링 규칙을 인터페이스별로 개별적으로 구성할 수 있습니다. 이러한 규칙은 가상 시스템이 시작될 때 호스트 물리적 시스템에 적용되며 가상 시스템이 실행되는 동안 수정할 수 있습니다. 후자는 네트워크 필터의 XML 설명을 수정하여 얻을 수 있습니다.
여러 가상 머신에서 동일한 일반 네트워크 필터를 사용할 수 있습니다. 이러한 필터를 수정하면 이 필터를 참조하는 실행 중인 모든 가상 머신의 네트워크 트래픽 필터링 규칙이 업데이트됩니다. 실행 중이 아닌 머신이 시작 시 업데이트됩니다.
앞에서 언급한 것처럼 특정 유형의 네트워크 구성에 대해 구성된 개별 네트워크 인터페이스에서 네트워크 트래픽 필터링 규칙을 적용할 수 있습니다. 지원되는 네트워크 유형은 다음과 같습니다.
  • network
  • 이더넷 -- 브리징 모드에서 사용해야 합니다.
  • Bridge

예 17.1. 네트워크 필터링의 예

인터페이스 XML은 최상위 필터를 참조하는 데 사용됩니다. 다음 예에서 인터페이스 설명은 필터 정리 트래픽을 참조합니다.
   <devices>
    <interface type='bridge'>
      <mac address='00:16:3e:5d:c7:9e'/>
      <filterref filter='clean-traffic'/>
    </interface>
  </devices>
네트워크 필터는 XML로 작성되며, 다른 필터에 대한 참조, 트래픽 필터링에 대한 규칙 또는 둘 다 조합되어 있을 수 있습니다. 위의 참조 필터 clean-traffic은 다른 필터에 대한 참조만 포함하며 실제 필터링 규칙이 없는 필터입니다. 다른 필터에 대한 참조를 사용할 수 있으므로 필터 트리를 빌드할 수 있습니다. clean-traffic 필터는 # virsh nwfilter-dumpxml clean-traffic 명령을 사용하여 볼 수 있습니다.
앞에서 언급한 것처럼 여러 가상 머신에서 단일 네트워크 필터를 참조할 수 있습니다. 인터페이스에는 일반적으로 해당 트래픽 필터링 규칙과 연결된 개별 매개 변수가 있으므로 필터의 XML에 설명된 규칙을 변수를 사용하여 일반화할 수 있습니다. 이 경우 변수 이름은 필터 XML에서 사용되며, 이름과 값은 필터가 참조되는 위치에 제공됩니다.

예 17.2. 설명 확장된

다음 예에서 인터페이스 설명은 매개변수 IP와 점선된 IP 주소를 값으로 사용하여 확장되었습니다.
  <devices>
    <interface type='bridge'>
      <mac address='00:16:3e:5d:c7:9e'/>
      <filterref filter='clean-traffic'>
        <parameter name='IP' value='10.0.0.1'/>
      </filterref>
    </interface>
  </devices>
이 특정 예에서 정리된 네트워크 트래픽 필터는 IP 주소 매개변수 10.0.0.1으로 표시되고 규칙에 따라 이 인터페이스의 모든 트래픽이 이 특정 필터의 목적 중 하나인 소스 IP 주소로 10.0.0.1을 항상 사용하도록 지정합니다.

17.14.2. 체인 필터링

필터링 규칙은 필터 체인으로 구성됩니다. 이러한 체인은 개별 체인 (branches)의 항목으로 패킷 필터링 규칙을 사용하는 트리 구조를 갖는 것으로 간주 될 수 있습니다.
패킷은 루트 체인에서 필터 평가를 시작하고 다른 체인에서 평가를 계속하여 해당 체인에서 다시 루트 체인으로 돌아가거나 트래버스 체인 중 하나에서 필터링 규칙에 의해 삭제 또는 수락됩니다.
libvirt의 네트워크 필터링 시스템은 사용자가 트래픽 필터링을 활성화하기 위해 선택하는 모든 가상 시스템의 네트워크 인터페이스에 대해 개별 루트 체인을 자동으로 생성합니다. 사용자는 루트 체인에서 직접 인스턴스화되거나 프로토콜별 규칙을 효율적으로 평가하기 위해 프로토콜별 필터링 체인을 생성할 수 있는 필터링 규칙을 작성할 수 있습니다.
다음 체인이 있습니다.
  • 루트
  • mac
  • STP (spanning tree protocol)
  • VLAN
  • ARP 및 rarp
  • ipv4
  • ipv6
mac, stp, vlan, arp, rarp, ipv4 또는 ipv6 프로토콜을 평가하는 여러 체인은 체인 이름에서 접두사로만 프로토콜 이름을 사용하여 생성할 수 있습니다.

예 17.3. ARP 트래픽 필터링

이 예제에서는 이름이 arp-xyz 또는 arp-test인 체인을 지정하고 해당 체인에서 ARP 프로토콜 패킷을 평가할 수 있습니다.
다음 필터 XML은 arp 체인에서 ARP 트래픽을 필터링하는 예를 보여줍니다.
<filter name='no-arp-spoofing' chain='arp' priority='-500'>
  <uuid>f88f1932-debf-4aa1-9fbe-f10d3aa4bc95</uuid>
  <rule action='drop' direction='out' priority='300'>
    <mac match='no' srcmacaddr='$MAC'/>
  </rule>
  <rule action='drop' direction='out' priority='350'>
    <arp match='no' arpsrcmacaddr='$MAC'/>
  </rule>
  <rule action='drop' direction='out' priority='400'>
    <arp match='no' arpsrcipaddr='$IP'/>
  </rule>
  <rule action='drop' direction='in' priority='450'>
    <arp opcode='Reply'/>
    <arp match='no' arpdstmacaddr='$MAC'/>
  </rule>
  <rule action='drop' direction='in' priority='500'>
    <arp match='no' arpdstipaddr='$IP'/>
  </rule>
  <rule action='accept' direction='inout' priority='600'>
    <arp opcode='Request'/>
  </rule>
  <rule action='accept' direction='inout' priority='650'>
    <arp opcode='Reply'/>
  </rule>
  <rule action='drop' direction='inout' priority='1000'/>
</filter>
루트 체인에서와 같이 arp 체인에 ARP 관련 규칙을 배치한 결과 ARP 프로토콜 대신 ARP 프로토콜을 다른 패킷 프로토콜로 평가할 필요가 없다는 것입니다. 이로 인해 트래픽 필터링의 효율성이 향상됩니다. 그러나 다른 규칙은 평가되지 않으므로 지정된 프로토콜에 대한 필터링 규칙을 체인에만 배치해야 합니다. 예를 들어 IPv4 프로토콜 패킷이 ARP 체인을 통과하지 않으므로 IPv4 규칙은 ARP 체인에서 평가되지 않습니다.

17.14.3. 체인 우선순위 필터링

앞에서 언급한 것처럼 필터링 규칙을 생성할 때 모든 체인이 루트 체인에 연결됩니다. 이러한 체인이 액세스하는 순서는 체인의 우선 순위의 영향을 받습니다. 다음 표에서는 우선순위와 기본 우선순위를 할당할 수 있는 체인을 보여줍니다.

표 17.1. 체인 기본 우선순위 값 필터링

체인 (prefix) 기본 우선순위
stp -810
mac -800
VLAN -750
ipv4 -700
ipv6 -600
arp -500
rarp -400
참고
우선 순위가 낮은 체인에 더 높은 값이 있는 체인에 액세스하십시오.
표 17.1. “체인 기본 우선순위 값 필터링” 에 나열된 체인은 필터 노드의 우선 순위(XML) 속성에 [-1000~1000] 범위의 값을 작성하여 사용자 정의 우선 순위를 지정할 수 있습니다. 17.14.2절. “체인 필터링”filter는 arp 체인의 기본 우선 순위 -500을 표시합니다.

17.14.4. 필터에서 변수 사용

네트워크 트래픽 필터링 하위 시스템에서 사용하도록 예약된 두 개의 변수가 있습니다. MAC 및 IP
MAC 은 네트워크 인터페이스의 MAC 주소로 지정됩니다. 이 변수를 참조하는 필터링 규칙은 인터페이스의 MAC 주소로 자동으로 교체됩니다. 이 작업은 사용자가 MAC 매개 변수를 명시적으로 제공할 필요 없이 작동합니다. 위의 IP 매개변수와 유사한 MAC 매개 변수를 지정할 수 있지만 libvirt는 인터페이스에서 사용할 MAC 주소를 알고 있기 때문에 권장되지 않습니다.
매개변수 IP 는 가상 머신 내부의 운영 체제가 지정된 인터페이스에서 사용할 것으로 예상되는 IP 주소를 나타냅니다. IP 매개변수는 libvirt 데몬에서 매개 변수가 명시적으로 제공되지 않고 참조되지 않는 경우 인터페이스에서 사용되는 IP 주소(및 IP 매개변수의 값)를 확인하려고 할 때까지 특별합니다. IP 주소 검색에 대한 현재 제한 사항은 이 기능을 사용하는 방법과 사용 시 예상되는 방법에 대한 제한 17.14.12절. “제한 사항” 에 대한 섹션을 참조하십시오. 17.14.2절. “체인 필터링” 에 표시된 XML 파일에는 네트워크 필터 XML을 사용하여 MAC 및 IP 변수를 참조하는 예제인 필터 no-arp-spoofing 이 포함되어 있습니다.
참조된 변수 앞에는 항상 문자 $ 가 붙습니다. 변수 값의 형식은 XML에서 식별된 필터 특성에 의해 예상되는 유형이어야 합니다. 위의 예에서 IP 매개 변수는 법적 IP 주소를 표준 형식으로 보관해야 합니다. 올바른 구조를 제공하지 않으면 필터 변수가 값으로 교체되지 않으며 핫 플러그를 사용할 때 가상 머신이 시작되지 않거나 인터페이스가 연결되지 않습니다. 각 XML 특성에 대해 예상되는 일부 유형은 예제 예 17.4. “샘플 변수 유형” 에 표시됩니다.

예 17.4. 샘플 변수 유형

변수에 요소 목록이 포함될 수 있으므로 (예: 특정 인터페이스에서 유효한 여러 IP 주소를 포함할 수 있음) IP 변수에 여러 요소를 제공하기 위한 표기법은 다음과 같습니다.
  <devices>
    <interface type='bridge'>
      <mac address='00:16:3e:5d:c7:9e'/>
      <filterref filter='clean-traffic'>
        <parameter name='IP' value='10.0.0.1'/>
        <parameter name='IP' value='10.0.0.2'/>
        <parameter name='IP' value='10.0.0.3'/>
      </filterref>
    </interface>
  </devices>
이 XML 파일은 인터페이스당 여러 IP 주소를 사용하도록 필터를 생성합니다. 각 IP 주소는 별도의 필터링 규칙을 생성합니다. 따라서 위의 XML과 다음 규칙을 사용하면 세 개의 개별 필터링 규칙(각 IP 주소에 대해 하나씩)이 생성됩니다.
  <rule action='accept' direction='in' priority='500'>
    <tcp srpipaddr='$IP'/>
  </rule>
요소 목록을 포함하는 변수의 개별 요소에 액세스할 수 있으므로 다음과 같은 필터링 규칙은 변수 DSTPORTS 의 두 번째 요소에 액세스합니다.
  <rule action='accept' direction='in' priority='500'>
    <udp dstportstart='$DSTPORTS[1]'/>
  </rule>

예 17.5. 다양한 변수 사용

$VARIABLE[@<iterator id="x">] 표기법을 사용하여 다양한 목록에서 허용 가능한 모든 규칙을 나타내는 필터링 규칙을 생성할 수 있습니다. 다음 규칙을 사용하면 가상 머신이 SRCIPADDRESSES 에 지정된 소스 IP 주소 집합에서 DSTPORTS 에 지정된 포트 세트의 트래픽을 수신할 수 있습니다. 이 규칙은 두 개의 독립 tutorial을 사용하여 해당 요소에 액세스하여 DSTPORTS 변수의 모든 요소를 SRCIPADDRESSES 와 함께 생성합니다.
  <rule action='accept' direction='in' priority='500'>
    <ip srcipaddr='$SRCIPADDRESSES[@1]' dstportstart='$DSTPORTS[@2]'/>
  </rule>
다음과 같이 SRCIPADDRESSESDSTPORTS 에 구체적인 값을 할당합니다.
  SRCIPADDRESSES = [ 10.0.0.1, 11.1.2.3 ]
  DSTPORTS = [ 80, 8080 ]
$SRCIPADDRESSES[@1]$DSTPORTS[@2] 를 사용하여 변수에 값을 할당하면 다음과 같이 모든 주소와 포트가 생성됩니다.
  • 10.0.0.1, 80
  • 10.0.0.1, 8080
  • 11.1.2.3, 80
  • 11.1.2.3, 8080
예를 들어 표기법 $SRCIPADDRESSES[@1]$DSTPORTS[@1] 를 사용하여 동일한 변수에 액세스하면 두 목록에 동시에 액세스할 수 있으므로 다음과 같은 조합이 발생합니다.
  • 10.0.0.1, 80
  • 11.1.2.3, 8080
참고
$VARIABLE$VARIABLE[@0] 의 단축입니다. 이전 표기법은 항상 이 섹션의 위쪽에 있는 열린 단락에 표시된 대로 반복 ID="0" 의 역할이 추가되었다고 가정합니다.

17.14.5. 자동 IP 주소 탐지 및 DHCP 실패

이 섹션에서는 자동 IP 주소 탐지 및 DHCP 스누핑에 대한 정보를 제공합니다.

17.14.5.1. 소개

변수 IP를 참조하지만 값이 할당되지 않은 경우 가상 머신의 인터페이스에서 사용되는 IP 주소의 탐지가 자동으로 활성화됩니다. CTRL_IP_LEARNING 변수를 사용하여 사용할 IP 주소 학습 방법을 지정할 수 있습니다. 유효한 값은 ,dhcp 또는 none 입니다.
모든 값은 libvirt에 가상 시스템에서 사용 중인 주소를 확인하도록 지시합니다. 이 설정은 CTRL_IP_LEARNING 변수가 설정되지 않은 경우 기본 설정입니다. 이 방법은 인터페이스당 하나의 IP 주소만 감지합니다. 게스트 가상 머신의 IP 주소가 감지되면 예를 들어 IP 주소 스푸핑이 필터 중 하나로 인해 IP 주소 스푸핑이 방지됩니다. 이 경우 VM의 사용자는 게스트 가상 시스템 내부의 인터페이스의 IP 주소를 변경할 수 없으므로 IP 주소 스푸핑으로 간주됩니다. 게스트 가상 시스템을 다른 호스트 물리적 시스템으로 마이그레이션하거나 일시 중지한 후 다시 시작하면 게스트 가상 시스템에서 전송된 첫 번째 패킷은 게스트 가상 시스템에서 특정 인터페이스에서 사용할 수 있는 IP 주소를 다시 결정합니다.
dhcp 값은 libvirt에 유효한 리스가 있는 DHCP 서버가 할당된 주소만 적용하도록 지시합니다. 이 방법은 인터페이스당 여러 IP 주소 감지 및 사용을 지원합니다. 일시 중단 작업 후 게스트 가상 머신이 다시 시작되면 유효한 IP 주소 리스가 해당 필터에 적용됩니다. 그렇지 않으면 게스트 가상 머신에서 DHCP를 사용하여 새 IP 주소를 가져와야 합니다. 게스트 가상 머신이 다른 물리적 호스트 물리적 시스템으로 마이그레이션되면 DHCP 프로토콜을 다시 실행하려면 guest 가상 머신이 필요합니다.
CTRL_IP_LEARNING이 none 으로 설정되어 있는 경우 libvirt는 IP 주소를 학습하고 명시적인 값을 할당하지 않고 IP를 참조하지 않습니다.

17.14.5.2. DHCP Snooping

CTRL_IP_LEARNING=dhcp (DHCP snooping)는 특히 신뢰할 수 있는 DHCP 서버만 IP 주소를 할당할 수 있는 필터와 결합할 때 추가 보안 방지 기능을 제공합니다. 이를 활성화하려면 변수 DHCPSERVER 를 유효한 DHCP 서버의 IP 주소로 설정하고 이 변수를 사용하여 들어오는 DHCP 응답을 필터링하는 필터를 제공합니다.
DHCP 스누핑이 활성화되고 DHCP 리스가 만료되면 게스트 가상 머신은 DHCP 서버에서 유효한 새 리스를 취득할 때까지 더 이상 IP 주소를 사용할 수 없습니다. 게스트 가상 머신을 마이그레이션하는 경우 IP 주소를 사용하려면 새로운 유효한 DHCP 리스를 가져와야 합니다(예: VM 인터페이스를 종료한 후 다시 시작).
참고
자동 DHCP 탐지는 게스트 가상 머신이 인프라의 DHCP 서버와 교환되는 DHCP 트래픽을 수신합니다. libvirt에 대한 서비스 거부 공격을 방지하기 위해 이러한 패킷의 평가는 속도가 제한됩니다. 즉, 인터페이스에서 초당 과도한 수의 DHCP 패킷을 보내는 게스트 가상 시스템은 이러한 패킷을 모두 평가하지 않으므로 필터가 적용되지 않을 수 있습니다. 정상적인 DHCP 클라이언트 동작은 초당 낮은 수의 DHCP 패킷을 보내는 것으로 가정합니다. 또한 인프라의 모든 게스트 가상 머신에 적절한 필터를 설정하여 DHCP 패킷을 보낼 수 없도록 하는 것이 중요합니다. 따라서 게스트 가상 머신은 UDP 및 TCP 트래픽을 포트 67에서 포트 68로 전송하지 못하거나 DHCP 서버 메시지를 모든 게스트 가상 시스템에서만 사용하도록 제한해야 합니다. 동시에 서브넷의 모든 게스트 가상 머신에서 안티 스푸핑 방지를 활성화해야 합니다.

예 17.6. DHCP 스누핑의 IP 활성화

다음 XML에서는 DHCP 스누핑 방법을 사용하여 IP 주소 학습 활성화를 위한 예를 제공합니다.
    <interface type='bridge'>
      <source bridge='virbr0'/>
      <filterref filter='clean-traffic'>
        <parameter name='CTRL_IP_LEARNING' value='dhcp'/>
      </filterref>
    </interface>

17.14.6. 예약된 변수

표 17.2. “예약된 변수” 다음은 libvirt에서 예약되고 사용되는 것으로 간주되는 변수를 보여줍니다.

표 17.2. 예약된 변수

변수 이름 정의
MAC 인터페이스의 MAC 주소
IP 인터페이스에서 사용 중인 IP 주소 목록
IPV6 현재 구현되지 않음: 인터페이스에서 사용 중인 IPV6 주소 목록
DHCPSERVER 신뢰할 수 있는 DHCP 서버의 IP 주소 목록
DHCPSERVERV6 현재 구현되지 않음: 신뢰할 수 있는 DHCP 서버의 IPv6 주소 목록
CTRL_IP_LEARNING IP 주소 감지 모드 선택

17.14.7. 요소 및 속성 개요

모든 네트워크 필터에 필요한 root 요소의 이름은 두 가지 가능한 속성을 사용하여 <필터> 의 이름을 지정합니다. name 속성은 지정된 필터의 고유 이름을 제공합니다. chain 속성은 선택 사항이지만 기본 호스트 물리적 시스템의 방화벽 하위 시스템에서 보다 효율적으로 처리할 수 있도록 특정 필터를 더 효율적으로 구성할 수 있습니다. 현재 시스템은 루트,ipv4,ipv6,arprarp 체인 만 지원합니다.

17.14.8. 다른 필터에 대한 참조

모든 필터는 다른 필터에 대한 참조를 보유할 수 있습니다. 개별 필터는 필터 트리에서 여러 번 참조될 수 있지만 필터 간 참조는 루프를 도입해서는 안 됩니다.

예 17.7. 깨끗한 트래픽 필터의 예

다음은 정리 트래픽 네트워크 필터의 XML에서 다른 여러 필터를 참조하는 방법을 보여줍니다.
<filter name='clean-traffic'>
  <uuid>6ef53069-ba34-94a0-d33d-17751b9b8cb1</uuid>
  <filterref filter='no-mac-spoofing'/>
  <filterref filter='no-ip-spoofing'/>
  <filterref filter='allow-incoming-ipv4'/>
  <filterref filter='no-arp-spoofing'/>
  <filterref filter='no-other-l2-traffic'/>
  <filterref filter='qemu-announce-self'/>
</filter>
다른 필터를 참조하려면 XML 노드 <filterref> 를 필터 노드 내부에 제공해야 합니다. 이 노드에는 참조할 필터 이름이 포함된 속성 필터가 있어야 합니다.
새 네트워크 필터는 언제든지 정의할 수 있으며 아직 libvirt에 알려지지 않은 네트워크 필터에 대한 참조가 포함될 수 있습니다. 그러나 가상 머신이 시작되거나 필터를 참조하는 네트워크 인터페이스를 핫플러그하려면 필터 트리의 모든 네트워크 필터를 사용할 수 있어야 합니다. 그렇지 않으면 가상 머신이 시작되지 않거나 네트워크 인터페이스를 연결할 수 없습니다.

17.14.9. 필터 규칙

다음 XML은 나가는 IP 패킷의 IP 주소(변수 IP 값을 통해 제공됨)가 예상되지 않아 VM에서 IP 주소 스푸핑을 방지할 때 트래픽을 삭제하는 규칙을 구현하는 간단한 예제를 보여줍니다.

예 17.8. 네트워크 트래픽 필터링의 예

<filter name='no-ip-spoofing' chain='ipv4'>
  <uuid>fce8ae33-e69e-83bf-262e-30786c1f8072</uuid>
  <rule action='drop' direction='out' priority='500'>
    <ip match='no' srcipaddr='$IP'/>
  </rule>
</filter>
트래픽 필터링 규칙은 규칙 노드로 시작됩니다. 이 노드는 다음 특성 중 최대 3개를 포함할 수 있습니다.
  • action은 필수적으로 다음 값을 가질 수 있습니다.
    • drop (더 이상 분석 없이 규칙이 자동으로 패킷을 삭제)
    • 거부(더 이상 분석 없이 ICMP reject 메시지를 생성)
    • 수락 (단일 규칙이 추가 분석 없이 패킷을 수락)
    • 반환(이 필터를 통과하지만 추가 분석을 위해 호출 필터로 제어를 반환)
    • 계속(더 많은 분석을 위해 다음 규칙과 일치)
  • 방향은 필수적으로 다음 값을 가질 수 있습니다.
    • 들어오는 트래픽의 경우
    • 나가는 트래픽의 경우
    • 수신 및 발신 트래픽에 대한 아웃
  • 우선순위는 선택 사항입니다. 규칙의 우선 순위는 다른 규칙에 대해 규칙을 인스턴스화하는 순서를 제어합니다. 값이 낮은 규칙은 값이 더 높은 규칙보다 먼저 인스턴스화됩니다. 유효한 값은 -1000~1000의 범위에 있습니다. 이 속성을 제공하지 않으면 우선 순위 500이 기본적으로 할당됩니다. 루트 체인의 필터링 규칙은 우선 순위에 따라 루트 체인에 연결된 필터를 사용하여 정렬됩니다. 이를 통해 필터 체인에 대한 액세스 권한이 있는 필터링 규칙을 인터리빙할 수 있습니다. 자세한 내용은 17.14.3절. “체인 우선순위 필터링”를 참조하십시오.
  • statematch는 선택 사항입니다. 가능한 값은 '0' 또는 'false'이며 기본 연결 상태 일치를 끄는 것입니다. 기본 설정은 'true' 또는 1입니다.
자세한 내용은 17.14.11절. “고급 필터 구성 주제”의 내용을 참조하십시오.
위의 예 예 17.7. “깨끗한 트래픽 필터의 예”ip 유형의 트래픽이 체인 ipv4 와 연결되고 규칙에 priority=500 이 있음을 나타냅니다. 예를 들어 ip 유형의 트래픽이 체인 ipv4 와 연결된 다른 필터를 참조하는 경우 표시된 규칙의 priority=500 에 대해 해당 필터 규칙이 정렬됩니다.
규칙에는 트래픽 필터링을 위한 단일 규칙이 포함될 수 있습니다. 위의 예에서는 ip 유형의 트래픽을 필터링해야 한다는 것을 보여줍니다.

17.14.10. 지원되는 프로토콜

다음 섹션에서는 네트워크 필터링 하위 시스템에서 지원하는 프로토콜에 대한 몇 가지 세부 정보를 나열하고 제공합니다. 이러한 유형의 트래픽 규칙은 규칙 노드에 중첩된 노드로 제공됩니다. 규칙이 필터링되는 트래픽 유형에 따라 속성은 다릅니다. 위 예제에서는 ip 트래픽 필터링 노드 내에서 유효한 단일 특성 os ipaddr 을 보여줍니다. 다음 섹션에서는 유효한 속성과 예상되는 데이터 유형을 보여줍니다. 사용할 수 있는 데이터 형식은 다음과 같습니다.The following datatypes are available:
  • UINT8 : 8 비트 정수; 범위 0-255
  • UINT16: 16 비트 정수; 범위 0-65535
  • MAC_ADDR: 점으로 된 10진수 형식의 MAC 주소 (예: 00:11:22:33:44:55)
  • MAC_MASK: MAC 주소 형식의 MAC 주소 마스크(예: FF:FF:FC:00:00)
  • IP_ADDR: 점으로 된 10진수 형식의 IP 주소(예: 10.1.2.3)
  • IP_MASK: 점선 10진수 형식(255.255.248.0) 또는 CIDR 마스크(0-32)의 IP 주소 마스크
  • IPV6_ADDR: 숫자 형식의 IPv6 주소(예: FFFF::1)
  • IPV6_MASK: IPv6 mask in numbers format (FFFF:FFFF:FC00::) 또는 CIDR 마스크 (0-128)
  • 문자열: 문자열
  • BOLEAN: 'true', 'yes', '1' 또는 'false', 'no', '0'
  • IPSETFLAGS: 패킷 헤더의 소스 또는 대상 부분에서 기능을 선택하는 최대 6개의 'src' 또는 'dst' 요소에 의해 설명된 ipset의 소스 및 대상 플래그입니다. 여기에서 제공할 'selectors' 수는 참조되는 ipset 유형에 따라 다릅니다.
유형 IP_MASK 또는 IPV6_MASK 유형을 제외한 모든 속성은 값이 없음 인 match 속성을 사용하여 부정할 수 있습니다. 여러 개의 부정된 속성을 함께 그룹화할 수 있습니다. 다음 XML 조각은 추상 특성을 사용하는 예를 보여줍니다.
[...]
  <rule action='drop' direction='in'>
    <protocol match='no' attribute1='value1' attribute2='value2'/>
    <protocol attribute3='value3'/>
  </rule>
[...]
규칙은 규칙을 평가하고 지정된 프로토콜 특성의 범위 내에서 논리적으로 규칙을 확인합니다. 따라서 단일 속성의 값이 규칙에서 지정된 값과 일치하지 않으면 평가 프로세스 중에 전체 규칙을 건너뜁니다. 따라서 위의 예에서 수신되는 트래픽은 protocol 속성 attribute1value1 과 일치하지 않고 protocol 속성 attribute2value2 와 일치하지 않고 protocol 속성 특성3이 value 3 과 일치하는 경우에만 삭제됩니다.

17.14.10.1. MAC(Ethernet)

프로토콜 ID: mac
이러한 유형의 규칙은 루트 체인에 들어가야 합니다.

표 17.3. MAC 프로토콜 유형

특성 이름 datatype 정의
OSSMmacaddr MAC_ADDR 보낸 사람의 MAC 주소
OSSMmacmask MAC_MASK 보낸 사람의 MAC 주소에 적용되는 마스크
dstmacaddr MAC_ADDR 대상의 MAC 주소
dstmacmask MAC_MASK 대상의 MAC 주소에 적용되는 마스크
protocolid UINT16 (0x600-0xffff), STRING 계층 3 프로토콜 ID입니다. 유효한 문자열에는 [arp, rarp, ipv4, ipv6]가 포함됩니다.
설명 문자열 최대 256자까지의 텍스트 문자열
필터는 다음과 같이 작성할 수 있습니다.
[...]
<mac match='no' srcmacaddr='$MAC'/>
[...]

17.14.10.2. VLAN (802.1Q)

프로토콜 ID: vlan
이 유형의 규칙은 루트 또는 vlan 체인으로 이동해야 합니다.

표 17.4. VLAN 프로토콜 유형

특성 이름 datatype 정의
OSSMmacaddr MAC_ADDR 보낸 사람의 MAC 주소
OSSMmacmask MAC_MASK 보낸 사람의 MAC 주소에 적용되는 마스크
dstmacaddr MAC_ADDR 대상의 MAC 주소
dstmacmask MAC_MASK 대상의 MAC 주소에 적용되는 마스크
vlan-id UINT16 (0x0-0xfff, 0 - 4095) VLAN ID
Encap-protocol UINT16 (0x03c-0xfff), 문자열 캡슐화된 계층 3 프로토콜 ID, 유효한 문자열은 arp, ipv4, ipv6입니다.
설명 문자열 최대 256자까지의 텍스트 문자열

17.14.10.3. STP(Spanning Tree Protocol)

프로토콜 ID: stp
이 유형의 규칙은 루트 또는 stp 체인으로 이동해야 합니다.

표 17.5. STP 프로토콜 유형

특성 이름 datatype 정의
OSSMmacaddr MAC_ADDR 보낸 사람의 MAC 주소
OSSMmacmask MAC_MASK 보낸 사람의 MAC 주소에 적용되는 마스크
type UINT8 BPDU( Bridge Protocol Data Unit) 유형
플래그 UINT8 BPDU 플래그dstmacmask
root-priority UINT16 루트 우선 순위 범위 시작
root-priority-hi UINT16 (0x0-0xfff, 0 - 4095) 루트 우선 순위 범위 종료
root-address MAC _ADDRESS 루트 MAC 주소
root-address-mask MAC _MASK 루트 MAC 주소 마스크
roor-cost UINT32 루트 경로 비용 (범위 시작)
root-cost-hi UINT32 루트 경로 비용 범위 종료
sender-priority-hi UINT16 발신자 우선 순위 범위 종료
sender-address MAC_ADDRESS BPDU 발신자 MAC 주소
sender-address-mask MAC_MASK BPDU 발신자 MAC 주소 마스크
port UINT16 포트 식별자(범위 시작)
port_hi UINT16 포트 ID 범위 종료
msg-age UINT16 메시지 수명 타이머 (시작 시간)
msg-age-hi UINT16 메시지 수명 타이머 범위 종료
max-age-hi UINT16 최대 사용 기간 범위 종료
hello-time UINT16 hello 시간 타이머 (시작 시간)
hello-time-hi UINT16 hello 시간 타이머 범위 종료
forward-delay UINT16 forward delay (range start)
forward-delay-hi UINT16 전달 지연 범위 종료
설명 문자열 최대 256자까지의 텍스트 문자열

17.14.10.4. ARP/RARP

프로토콜 ID: arp 또는 rarp
이 유형의 규칙은 루트 또는 arp/rarp 체인으로 이동해야 합니다.

표 17.6. ARP 및 RARP 프로토콜 유형

특성 이름 datatype 정의
OSSMmacaddr MAC_ADDR 보낸 사람의 MAC 주소
OSSMmacmask MAC_MASK 보낸 사람의 MAC 주소에 적용되는 마스크
dstmacaddr MAC_ADDR 대상의 MAC 주소
dstmacmask MAC_MASK 대상의 MAC 주소에 적용되는 마스크
hwtype UINT16 하드웨어 유형
protocoltype UINT16 프로토콜 유형
opcode UINT16, STRING opcode 유효한 문자열은 다음과 같습니다. request, Reply, Request_Reverse, Reply_Reverse, DRARP_Request, DRARP_Reply, DRARP_Error, InARP_Request, ARP_NAK
arpsrcmacaddr MAC_ADDR ARP/RARP 패킷의 소스 MAC 주소
arpdstmacaddr MAC _ADDR ARP/RARP 패킷의 대상 MAC 주소
arpsrcipaddr IP_ADDR ARP/RARP 패킷의 소스 IP 주소
arpdstipaddr IP_ADDR ARP/RARP 패킷의 대상 IP 주소
기타 부울 불필요한 ARP 패킷을 확인할지 여부를 나타내는 부울 값입니다.
설명 문자열 최대 256자까지의 텍스트 문자열

17.14.10.5. IPv4

프로토콜 ID: ip
이 유형의 규칙은 root 또는 ipv4 체인으로 이동해야 합니다.

표 17.7. IPv4 프로토콜 유형

특성 이름 datatype 정의
OSSMmacaddr MAC_ADDR 보낸 사람의 MAC 주소
OSSMmacmask MAC_MASK 보낸 사람의 MAC 주소에 적용되는 마스크
dstmacaddr MAC_ADDR 대상의 MAC 주소
dstmacmask MAC_MASK 대상의 MAC 주소에 적용되는 마스크
OSSMipaddr IP_ADDR 소스 IP 주소
Golangipmask IP_MASK 소스 IP 주소에 적용되는 마스크
dstipaddr IP_ADDR 대상 IP 주소
dstipmask IP_MASK 대상 IP 주소에 적용되는 마스크
프로토콜 UINT8, 문자열 계층 4 프로토콜 식별자 프로토콜에 유효한 문자열: tcp, udp, udp, udp, udp, esp, ah, icmp, igmp, sctp
srcportstart UINT16 유효한 소스 포트 범위 시작, 프로토콜 필요
OSSMportend UINT16 유효한 소스 포트 범위 종료, 프로토콜 필요
dstportstart UNIT16 유효한 대상 포트 범위 시작, 프로토콜 필요
dstportend UNIT16 유효한 대상 포트 범위 종료, 프로토콜 필요
설명 문자열 최대 256자까지의 텍스트 문자열

17.14.10.6. IPv6

Protocol ID: ipv6
이 유형의 규칙은 root 또는 ipv6 체인으로 이동해야 합니다.

표 17.8. IPv6 프로토콜 유형

특성 이름 datatype 정의
OSSMmacaddr MAC_ADDR 보낸 사람의 MAC 주소
OSSMmacmask MAC_MASK 보낸 사람의 MAC 주소에 적용되는 마스크
dstmacaddr MAC_ADDR 대상의 MAC 주소
dstmacmask MAC_MASK 대상의 MAC 주소에 적용되는 마스크
OSSMipaddr IP_ADDR 소스 IP 주소
Golangipmask IP_MASK 소스 IP 주소에 적용되는 마스크
dstipaddr IP_ADDR 대상 IP 주소
dstipmask IP_MASK 대상 IP 주소에 적용되는 마스크
프로토콜 UINT8, 문자열 계층 4 프로토콜 식별자 프로토콜에 유효한 문자열은 tcp, udp, udp, udp, esp, ah, icmpv6, sctp입니다.
scrportstart UNIT16 유효한 소스 포트 범위 시작, 프로토콜 필요
OSSMportend UINT16 유효한 소스 포트 범위 종료, 프로토콜 필요
dstportstart UNIT16 유효한 대상 포트 범위 시작, 프로토콜 필요
dstportend UNIT16 유효한 대상 포트 범위 종료, 프로토콜 필요
설명 문자열 최대 256자까지의 텍스트 문자열

17.14.10.7. TCP/UDP/SCTP

프로토콜 ID: tcp, udp, sctp
이러한 트래픽 유형에 대해 chain 매개변수가 무시되며 생략하거나 root로 설정해야 합니다.

표 17.9. TCP/UDP/SCTP 프로토콜 유형

특성 이름 datatype 정의
OSSMmacaddr MAC_ADDR 보낸 사람의 MAC 주소
OSSMipaddr IP_ADDR 소스 IP 주소
Golangipmask IP_MASK 소스 IP 주소에 적용되는 마스크
dstipaddr IP_ADDR 대상 IP 주소
dstipmask IP_MASK 대상 IP 주소에 적용되는 마스크
scripto IP_ADDR 소스 IP 주소 범위 시작
OSSMipfrom IP_ADDR 소스 IP 주소 범위 종료일
dstipfrom IP_ADDR 대상 IP 주소 범위 시작
dstipto IP_ADDR 대상 IP 주소 범위 종료일
scrportstart UNIT16 유효한 소스 포트 범위 시작, 프로토콜 필요
OSSMportend UINT16 유효한 소스 포트 범위 종료, 프로토콜 필요
dstportstart UNIT16 유효한 대상 포트 범위 시작, 프로토콜 필요
dstportend UNIT16 유효한 대상 포트 범위 종료, 프로토콜 필요
설명 문자열 최대 256자까지의 텍스트 문자열
상태 문자열 콤마로 구분된 NEW,ESTABLISHED,RELATED,INVALID 또는 NONE
플래그 문자열 TCP 전용: 마스크 및 플래그를 사용하는 마스크 및 플래그 형식은 각각 SYN,ACK,URG,PSH,FIN,RST 또는 NONE 또는 ALL의 쉼표로 구분된 목록입니다.
ipset 문자열 libvirt 외부에서 관리되는 IPSet의 이름입니다.
ipsetflags IPSETFLAGS IPSet의 플래그: ipset 속성 필요

17.14.10.8. ICMP

프로토콜 ID: icmp
참고: 이러한 트래픽 유형에 대해 chain 매개변수가 무시되며 생략하거나 root로 설정해야 합니다.

표 17.10. ICMP 프로토콜 유형

특성 이름 datatype 정의
OSSMmacaddr MAC_ADDR 보낸 사람의 MAC 주소
OSSMmacmask MAC_MASK 보낸 사람의 MAC 주소에 적용되는 마스크
dstmacaddr MAD_ADDR 대상의 MAC 주소
dstmacmask MAC_MASK 대상의 MAC 주소에 적용되는 마스크
OSSMipaddr IP_ADDR 소스 IP 주소
Golangipmask IP_MASK 소스 IP 주소에 적용되는 마스크
dstipaddr IP_ADDR 대상 IP 주소
dstipmask IP_MASK 대상 IP 주소에 적용되는 마스크
OSSMipfrom IP_ADDR 소스 IP 주소 범위 시작
scripto IP_ADDR 소스 IP 주소 범위 종료일
dstipfrom IP_ADDR 대상 IP 주소 범위 시작
dstipto IP_ADDR 대상 IP 주소 범위 종료일
type UNIT16 ICMP 유형
코드 UNIT16 ICMP 코드
설명 문자열 최대 256자까지의 텍스트 문자열
상태 문자열 콤마로 구분된 NEW,ESTABLISHED,RELATED,INVALID 또는 NONE
ipset 문자열 libvirt 외부에서 관리되는 IPSet의 이름입니다.
ipsetflags IPSETFLAGS IPSet의 플래그: ipset 속성 필요

17.14.10.9. IGMP, ESP, AH, UDPLITE, 'ALL'

프로토콜 ID: igmp, esp, ah, udplite, all
이러한 트래픽 유형에 대해 chain 매개변수가 무시되며 생략하거나 root로 설정해야 합니다.

표 17.11. IGMP, ESP, AH, UDPLITE, 'ALL'

특성 이름 datatype 정의
OSSMmacaddr MAC_ADDR 보낸 사람의 MAC 주소
OSSMmacmask MAC_MASK 보낸 사람의 MAC 주소에 적용되는 마스크
dstmacaddr MAD_ADDR 대상의 MAC 주소
dstmacmask MAC_MASK 대상의 MAC 주소에 적용되는 마스크
OSSMipaddr IP_ADDR 소스 IP 주소
Golangipmask IP_MASK 소스 IP 주소에 적용되는 마스크
dstipaddr IP_ADDR 대상 IP 주소
dstipmask IP_MASK 대상 IP 주소에 적용되는 마스크
OSSMipfrom IP_ADDR 소스 IP 주소 범위 시작
scripto IP_ADDR 소스 IP 주소 범위 종료일
dstipfrom IP_ADDR 대상 IP 주소 범위 시작
dstipto IP_ADDR 대상 IP 주소 범위 종료일
설명 문자열 최대 256자까지의 텍스트 문자열
상태 문자열 콤마로 구분된 NEW,ESTABLISHED,RELATED,INVALID 또는 NONE
ipset 문자열 libvirt 외부에서 관리되는 IPSet의 이름입니다.
ipsetflags IPSETFLAGS IPSet의 플래그: ipset 속성 필요

17.14.10.10. IPV6을 통한 TCP/UDP/SCTP

프로토콜 ID: tcp-ipv6, udp-ipv6, sctp-ipv6
이러한 트래픽 유형에 대해 chain 매개변수가 무시되며 생략하거나 root로 설정해야 합니다.

표 17.12. IPv6 프로토콜 유형 TCP, UDP, SCTP over IPv6 프로토콜 유형

특성 이름 datatype 정의
OSSMmacaddr MAC_ADDR 보낸 사람의 MAC 주소
OSSMipaddr IP_ADDR 소스 IP 주소
Golangipmask IP_MASK 소스 IP 주소에 적용되는 마스크
dstipaddr IP_ADDR 대상 IP 주소
dstipmask IP_MASK 대상 IP 주소에 적용되는 마스크
OSSMipfrom IP_ADDR 소스 IP 주소 범위 시작
scripto IP_ADDR 소스 IP 주소 범위 종료일
dstipfrom IP_ADDR 대상 IP 주소 범위 시작
dstipto IP_ADDR 대상 IP 주소 범위 종료일
srcportstart UINT16 유효한 소스 포트 범위 시작
OSSMportend UINT16 유효한 소스 포트 범위 종료일
dstportstart UINT16 유효한 대상 포트 범위 시작
dstportend UINT16 유효한 대상 포트 범위 종료일
설명 문자열 최대 256자까지의 텍스트 문자열
상태 문자열 콤마로 구분된 NEW,ESTABLISHED,RELATED,INVALID 또는 NONE
ipset 문자열 libvirt 외부에서 관리되는 IPSet의 이름입니다.
ipsetflags IPSETFLAGS IPSet의 플래그: ipset 속성 필요

17.14.10.11. ICMPv6

Protocol ID: icmpv6
이러한 트래픽 유형에 대해 chain 매개변수가 무시되며 생략하거나 root로 설정해야 합니다.

표 17.13. ICMPv6 프로토콜 유형

특성 이름 datatype 정의
OSSMmacaddr MAC_ADDR 보낸 사람의 MAC 주소
OSSMipaddr IP_ADDR 소스 IP 주소
Golangipmask IP_MASK 소스 IP 주소에 적용되는 마스크
dstipaddr IP_ADDR 대상 IP 주소
dstipmask IP_MASK 대상 IP 주소에 적용되는 마스크
OSSMipfrom IP_ADDR 소스 IP 주소 범위 시작
scripto IP_ADDR 소스 IP 주소 범위 종료일
dstipfrom IP_ADDR 대상 IP 주소 범위 시작
dstipto IP_ADDR 대상 IP 주소 범위 종료일
type UINT16 ICMPv6 유형
코드 UINT16 ICMPv6 코드
설명 문자열 최대 256자까지의 텍스트 문자열
상태 문자열 콤마로 구분된 NEW,ESTABLISHED,RELATED,INVALID 또는 NONE
ipset 문자열 libvirt 외부에서 관리되는 IPSet의 이름입니다.
ipsetflags IPSETFLAGS IPSet의 플래그: ipset 속성 필요

17.14.10.12. IGMP, ESP, AH, UDPLITE, 'ALL' over IPv6

프로토콜 ID: igmp-ipv6, esp-ipv6, ah-ipv6, udplite-ipv6, all-ipv6
이러한 트래픽 유형에 대해 chain 매개변수가 무시되며 생략하거나 root로 설정해야 합니다.

표 17.14. IGMP, ESP, AH, UDPLITE, 'ALL' over IPv6 프로토콜 유형

특성 이름 datatype 정의
OSSMmacaddr MAC_ADDR 보낸 사람의 MAC 주소
OSSMipaddr IP_ADDR 소스 IP 주소
Golangipmask IP_MASK 소스 IP 주소에 적용되는 마스크
dstipaddr IP_ADDR 대상 IP 주소
dstipmask IP_MASK 대상 IP 주소에 적용되는 마스크
OSSMipfrom IP_ADDR 소스 IP 주소 범위 시작
scripto IP_ADDR 소스 IP 주소 범위 종료일
dstipfrom IP_ADDR 대상 IP 주소 범위 시작
dstipto IP_ADDR 대상 IP 주소 범위 종료일
설명 문자열 최대 256자까지의 텍스트 문자열
상태 문자열 콤마로 구분된 NEW,ESTABLISHED,RELATED,INVALID 또는 NONE
ipset 문자열 libvirt 외부에서 관리되는 IPSet의 이름입니다.
ipsetflags IPSETFLAGS IPSet의 플래그: ipset 속성 필요

17.14.11. 고급 필터 구성 주제

다음 섹션에서는 고급 필터 구성 주제를 설명합니다.

17.14.11.1. 연결 추적

네트워크 필터링 하위 시스템(Linux)은 IP 테이블의 연결 추적 지원을 사용합니다. 이렇게 하면 네트워크 트래픽(상태 일치)의 방향과 게스트 가상 머신에 대한 동시 연결 수를 계산하고 제한하는 데 도움이 됩니다. 예를 들어 게스트 가상 시스템에 서버로 TCP 포트 8080이 열려 있는 경우 클라이언트는 포트 8080의 게스트 가상 머신에 연결할 수 있습니다. 그런 다음, 방향의 연결 추적 및 시행을 통해 게스트 가상 시스템에서 (TCP 클라이언트) 포트 8080에서 호스트 물리적 시스템에 다시 원격 호스트 물리적 시스템으로의 연결을 시작하지 못하게 합니다. 더 중요하게, 추적은 원격 공격자가 게스트 가상 머신에 대한 연결을 다시 설정하지 못하도록 하는 데 도움이 됩니다. 예를 들어 게스트 가상 머신의 사용자가 공격자 사이트에서 포트 80에 대한 연결을 설정한 경우 공격자가 게스트 가상 시스템으로 다시 TCP 포트 80에서 연결을 시작할 수 없습니다. 기본적으로 연결 추적을 활성화하고 트래픽 방향을 적용하는 연결 상태 일치가 설정됩니다.

예 17.9. TCP 포트에 대한 연결을 끄는 XML 예

다음은 TCP 포트 12345에 대한 수신 연결에 대해 이 기능이 꺼진 예제 XML 내용을 보여줍니다.
   [...]
    <rule direction='in' action='accept' statematch='false'>
      <cp dstportstart='12345'/>
    </rule>
   [...]
이제 TCP 포트 12345로 들어오는 트래픽을 허용하지만 VM 내에서 (클라이언트) TCP 포트 12345에서 시작될 수도 있고 바람직하지 않을 수도 있습니다.

17.14.11.2. 연결 수 제한

게스트 가상 머신이 설정할 수 있는 연결 수를 제한하려면 지정된 트래픽 유형에 대한 연결 제한을 설정하는 규칙을 제공해야 합니다. 예를 들어 VM이 한 번에 하나의 다른 IP 주소만 ping하도록 허용되며 한 번에 하나의 활성 ssh 연결만 사용해야 합니다.

예 17.10. 연결 제한을 설정하는 XML 샘플 파일

다음 XML 조각을 사용하여 연결을 제한할 수 있습니다.
  [...]
  <rule action='drop' direction='in' priority='400'>
    <tcp connlimit-above='1'/>
  </rule>
  <rule action='accept' direction='in' priority='500'>
    <tcp dstportstart='22'/>
  </rule>
  <rule action='drop' direction='out' priority='400'>
    <icmp connlimit-above='1'/>
  </rule>
  <rule action='accept' direction='out' priority='500'>
    <icmp/>
  </rule>
  <rule action='accept' direction='out' priority='500'>
    <udp dstportstart='53'/>
  </rule>
  <rule action='drop' direction='inout' priority='1000'>
    <all/>
  </rule>
  [...]
참고
제한 규칙은 트래픽을 수락하는 규칙 이전에 XML에 나열되어야 합니다. 예 17.10. “연결 제한을 설정하는 XML 샘플 파일” 의 XML 파일에 따르면 포트 22로 전송된 DNS 트래픽이 게스트 가상 머신으로 전송될 수 있도록 하는 추가 규칙이 추가되어 ssh 세션이 ssh 데몬에서 DNS 조회 실패와 관련된 이유로 설정되지 않았습니다. 이 규칙을 벗어나면 ssh 클라이언트가 연결을 시도할 때 예기치 않게 중단될 수 있습니다. 트래픽 추적과 관련된 시간 초과를 처리하는 것과 관련하여 추가로 주의해야 합니다. 사용자가 게스트 가상 머신 내에서 종료될 수 있는 ICMP ping은 호스트 물리적 시스템의 연결 추적 시스템에서 시간이 오래 걸릴 수 있으므로 다른 ICMP ping을 통과할 수 없습니다.
가장 좋은 해결책은 다음 명령을 사용하여 호스트 물리적 시스템의 sysfs 에서 시간 초과를 조정하는 것입니다. # echo 3 > /proc/sys/net/netfilter/nf_conntrack_icmp_timeout. 이 명령은 ICMP 연결 추적 타임아웃을 3초로 설정합니다. 이 문제는 한 ping이 종료되면 3초 후에 또 다른 ping을 시작할 수 있다는 것입니다.
어떠한 이유로 게스트 가상 머신이 TCP 연결을 제대로 종료하지 않은 경우, 특히 호스트 물리적 시스템에서 많은 시간 동안 TCP 제한 값을 설정한 경우 더 오랜 시간 동안 열려 있는 연결을 유지할 수 있습니다. 또한 모든 유휴 연결이 연결 추적 시스템에서 시간 초과되어 패킷을 교환하면 다시 활성화될 수 있습니다.
그러나 제한이 너무 낮게 설정되어 있으면 새로 시작한 연결은 유휴 연결을 TCP 백오프로 강제할 수 있습니다. 따라서 새 TCP 연결의 변동으로 인해 유휴 연결과 관련하여 홀수 트래픽 동작이 발생하지 않도록 연결 제한이 설정되어야 합니다.

17.14.11.3. 명령줄 툴

virsh는 네트워크 필터에 대한 라이프사이클 지원을 통해 확장되었습니다. 네트워크 필터링 하위 시스템과 관련된 모든 명령은 접두사 nwfilter 로 시작합니다. 다음 명령을 사용할 수 있습니다.
  • nwfilter-list : 모든 네트워크 필터의 UUID 및 이름을 나열
  • nwfilter-define : 새 네트워크 필터를 정의하거나 기존 네트워크 필터를 업데이트 (이름을 제공해야 함)
  • nwfilter-undefine : 지정된 네트워크 필터를 삭제합니다(이름을 제공해야 함). 현재 사용 중인 네트워크 필터를 삭제하지 마십시오.
  • nwfilter-dumpxml : 지정된 네트워크 필터를 표시합니다 (이름을 제공해야 함)
  • nwfilter-edit : 지정된 네트워크 필터를 편집 (이름을 제공해야 함)

17.14.11.4. 기존 네트워크 필터

다음은 libvirt를 사용하여 자동으로 설치된 네트워크 필터 예제 목록입니다.

표 17.15. ICMPv6 프로토콜 유형

프로토콜 이름 설명
allow-arp 게스트 가상 머신에 들어오고 나가는 Address Resolution Protocol(ARP) 트래픽을 모두 허용합니다.
no-arp-spoofing, no-arp-mac-spoofing, and no-arp-ip-spoofing 이러한 필터를 사용하면 게스트 가상 머신이 ARP 트래픽을 스푸핑하지 않습니다. 또한 ARP 요청 및 응답 메시지만 허용하고 해당 패킷에 다음이 포함됩니다.
  • No-arp-spoofing - 게스트의 MAC 및 IP 주소
  • no-arp-mac-spoofing - 게스트의 MAC 주소
  • no-arp-ip-spoofing - 게스트의 IP 주소
low-dhcp 게스트 가상 머신에서 DHCP를 통해 (DHCP 서버)를 통해 IP 주소를 요청할 수 있습니다.
low-dhcp-server 게스트 가상 시스템에서 지정된 DHCP 서버의 IP 주소를 요청할 수 있습니다. DHCP 서버의 점으로 구성된 10진수 IP 주소는 이 필터에 대한 참조로 제공되어야 합니다. 변수 이름은 DHCPSERVER 여야 합니다.
low-ipv4 가상 머신에 들어오고 나가는 모든 IPv4 트래픽을 허용합니다.
low-incoming-ipv4 가상 머신에 들어오는 IPv4 트래픽만 허용합니다. 이 필터는 클린 트래픽 필터의 일부입니다.
no-ip-spoofing 게스트 가상 머신이 패킷 내부와 다른 소스 IP 주소로 IP 패킷을 전송하지 못하도록 합니다. 이 필터는 클린 트래픽 필터의 일부입니다.
no-ip-multicast 게스트 가상 머신이 IP 멀티 캐스트 패킷을 전송하지 못하도록 합니다.
no-mac-broadcast 지정된 MAC 주소로 발신 IPv4 트래픽을 방지합니다. 이 필터는 클린 트래픽 필터의 일부입니다.
no-other-l2-traffic 네트워크에서 사용하는 다른 필터에서 지정한 트래픽을 제외한 모든 계층 2 네트워킹 트래픽을 차단합니다. 이 필터는 클린 트래픽 필터의 일부입니다.
no-other-rarp-traffic, qemu-announce-self, qemu-announce-self-rarp 이러한 필터를 사용하면 QEMU의 RRP(self-announce Reverse Address Resolution Protocol) 패킷을 허용하지만 다른 모든 RARP 트래픽을 방지할 수 있습니다. 모두 깔끔한 트래픽 필터에 포함되어 있습니다.
clean-traffic MAC, IP 및 ARP 스푸핑을 방지합니다. 이 필터는 다른 여러 필터를 빌딩 블록으로 참조합니다.
이러한 필터는 빌딩 블록일 뿐이며 유용한 네트워크 트래픽 필터링을 제공하기 위해 다른 필터와의 조합이 필요합니다. 위의 목록에서 가장 많이 사용되는 필터는 clean-traffic 필터입니다. 이 필터 자체는 예를 들어 no-ip-multicast 필터와 결합하여 가상 머신이 패킷 스푸핑 방지에 IP 멀티 캐스트 트래픽을 전송하지 못하도록 할 수 있습니다.

17.14.11.5. 자체 필터 작성

libvirt는 몇 가지 예제 네트워킹 필터만 제공하므로 자체 작성을 고려할 수 있습니다. 이렇게 할 때 네트워크 필터링 하위 시스템과 내부적으로 작동하는 방법에 대해 알아야 할 몇 가지 사항이 있습니다. 물론 당신은 또한 당신이 원하는 것 보다 더 이상 트래픽과 허용하려는 트래픽이 통과 할 수 있도록 필터링하려는 프로토콜을 매우 잘 이해하고 이해해야합니다.
네트워크 필터링 하위 시스템은 현재 Linux 호스트 물리적 머신에서만 사용할 수 있으며 QEMU 및 KVM 유형의 가상 머신에서만 작동합니다. Linux에서는 ebtables, iptables, ip6tables에 대한 지원을 기반으로 하며 해당 기능을 사용합니다. 17.14.10절. “지원되는 프로토콜” 에서 찾은 목록을 고려할 때 ebtables를 사용하여 다음 프로토콜을 구현할 수 있습니다.
  • mac
  • STP (spanning tree protocol)
  • VLAN(802.1Q)
  • arp, rarp
  • ipv4
  • ipv6
IPv4를 통해 실행되는 모든 프로토콜은 iptables를 사용하여 지원되며, IPv6을 통한 이러한 프로토콜은 ip6tables를 사용하여 구현됩니다.
Linux 호스트 물리적 시스템을 사용하면 libvirt의 네트워크 필터링 하위 시스템에서 생성된 모든 트래픽 필터링 규칙이 먼저 ebtables에서 구현한 필터링 지원을 통과하고 나중에 iptables 또는 ip6tables 필터를 통해 구현됩니다. 필터 트리에 프로토콜( mac, stp, vlan arp, rarp, ipv4, ipv4)이 포함된 규칙이 있는 경우 ebtable 규칙과 나열된 값이 자동으로 사용됩니다.
동일한 프로토콜의 여러 체인을 만들 수 있습니다. 체인 이름에는 이전에 열거한 프로토콜 중 하나의 접두사가 있어야 합니다. ARP 트래픽을 처리하기 위한 추가 체인을 만들려면 이름이 arp-test인 체인을 지정합니다. 예를 들면 다음과 같습니다.
예를 들어, ip protocol 필터를 사용하여 소스 및 대상 포트를 통해 UDP 트래픽을 필터링하고 허용할 UDP 패킷의 프로토콜, 소스 및 대상 IP 주소 및 포트에 대한 속성을 지정할 수 있습니다. 이를 통해 ebtables를 사용하여 UDP 트래픽을 조기에 필터링할 수 있습니다. 그러나 UDP 패킷과 같은 IP 또는 IPv6 패킷이 ebtables 계층을 전달하면 iptables 또는 ip6tables 규칙을 인스턴스화하는 필터 트리에 하나 이상의 규칙이 있으므로 해당 필터링 계층에 대해 UDP 패킷을 전달하도록 하는 규칙도 필요합니다. 이는 적절한 udp 또는 udp-ipv6 트래픽 필터링 노드가 포함된 규칙으로 수행할 수 있습니다.

예 17.11. 사용자 정의 필터 생성

다음 요구 사항을 충족하는 데 필터가 필요하다고 가정합니다.
  • VM의 인터페이스가 MAC, IP 및 ARP 스푸핑에서 방지
  • VM 인터페이스의 TCP 포트 22 및 80만 엽니 다
  • VM이 인터페이스에서 ping 트래픽을 보낼 수 있지만 VM이 인터페이스에서 ping을 ping하도록 허용하지 않음
  • VM에서 DNS 조회를 수행할 수 있음(포트 53으로 UDP)
스푸핑을 방지하기 위한 요구 사항은 기존의 clean-traffic 네트워크 필터에 의해 충족되므로 이를 수행하는 방법은 사용자 정의 필터에서 참조하는 것입니다.
TCP 포트 22 및 80에 대한 트래픽을 사용하려면 이러한 유형의 트래픽을 활성화하기 위해 두 개의 규칙이 추가되었습니다. 게스트 가상 시스템이 ping 트래픽을 보낼 수 있도록 하려면 ICMP 트래픽에 대한 규칙이 추가됩니다. 간단한 이유로 게스트 가상 시스템에서 일반 ICMP 트래픽을 시작할 수 있으며 ICMP 에코 요청 및 응답 메시지에 지정되지 않습니다. 기타 모든 트래픽은 게스트 가상 머신에 도달하거나 시작할 수 없습니다. 이렇게 하려면 다른 모든 트래픽을 삭제하는 규칙이 추가됩니다. 게스트 가상 머신을 test 라고 하고 필터를 eth0 과 연결하는 인터페이스를 가정하면 필터 이름이 test-eth0 라고 합니다.
다음 네트워크 필터 XML을 고려한 결과는 다음과 같습니다.
<filter name='test-eth0'>
  <!- - This rule references the clean traffic filter to prevent MAC, IP and ARP spoofing. By not providing an IP address parameter, libvirt will detect the IP address the guest virtual machine is using. - ->
  <filterref filter='clean-traffic'/>

  <!- - This rule enables TCP ports 22 (ssh) and 80 (http) to be reachable - ->
  <rule action='accept' direction='in'>
    <tcp dstportstart='22'/>
  </rule>

  <rule action='accept' direction='in'>
    <tcp dstportstart='80'/>
  </rule>

  <!- - This rule enables general ICMP traffic to be initiated by the guest virtual machine including ping traffic - ->
  <rule action='accept' direction='out'>
    <icmp/>
  </rule>>

  <!- - This rule enables outgoing DNS lookups using UDP - ->
  <rule action='accept' direction='out'>
    <udp dstportstart='53'/>
  </rule>

  <!- - This rule drops all other traffic - ->
  <rule action='drop' direction='inout'>
    <all/>
  </rule>

</filter>

17.14.11.6. 샘플 사용자 정의 필터

위의 XML의 규칙 중 하나에 소스 또는 대상 주소로 게스트 가상 시스템의 IP 주소가 포함되어 있지만 트래픽 필터링이 올바르게 작동합니다. 그 이유는 규칙의 평가가 인터페이스별로 내부적으로 수행되는 반면 규칙은 소스 또는 대상 IP 주소가 아닌 패킷을 전송하거나 수신하는 패킷을 기반으로 추가로 평가됩니다.

예 17.12. 네트워크 인터페이스 설명을 위한 XML 샘플

테스트 게스트 가상 머신의 도메인 XML 내에 있는 가능한 네트워크 인터페이스 설명에 대한 XML 조각은 다음과 같을 수 있습니다.
   [...]
    <interface type='bridge'>
      <source bridge='mybridge'/>
      <filterref filter='test-eth0'/>
    </interface>
   [...]
ICMP 트래픽을 보다 엄격하게 제어하고 게스트 가상 시스템에서 ICMP 에코 요청만 보낼 수 있고, 게스트 가상 시스템에서 ICMP 에코 응답만 수신하도록 하려면 위의 ICMP 규칙을 다음 두 가지 규칙으로 교체할 수 있습니다.
  <!- - enable outgoing ICMP echo requests- ->
  <rule action='accept' direction='out'>
    <icmp type='8'/>
  </rule>
  <!- - enable incoming ICMP echo replies- ->
  <rule action='accept' direction='in'>
    <icmp type='0'/>
  </rule>

예 17.13. 두 번째 예제 사용자 정의 필터

이 예제에서는 위의 예제와 같이 유사한 필터를 빌드하는 방법을 설명하지만 게스트 가상 시스템 내부에 있는 ftp 서버를 사용하여 요구 사항 목록을 확장합니다. 이 필터의 요구 사항은 다음과 같습니다.
  • 게스트 가상 머신의 인터페이스가 MAC, IP, ARP 스푸핑에서 방지
  • 게스트 가상 머신의 인터페이스에서 TCP 포트 22 및 80만 엽니 다
  • 게스트 가상 시스템이 인터페이스에서 ping 트래픽을 보낼 수 있지만 인터페이스에서 게스트 가상 시스템을 ping하는 것을 허용하지 않습니다.
  • 게스트 가상 머신이 DNS 조회를 수행할 수 있도록 허용 (UDP 포트 53으로)
  • 게스트 가상 머신 내에서 실행할 수 있도록 ftp 서버(활성 모드)를 활성화합니다.
FTP 서버가 FTP 제어 트래픽에 대해 포트 21에 도달할 수 있도록 하는 요구 사항 및 게스트 가상 머신의 TCP 포트 20에서 FTP 클라이언트( FTP 클라이언트)로 시작하는 발신 TCP 연결을 설정할 수 있도록 하는 요구 사항입니다. 이 필터를 작성하는 방법에는 여러 가지가 있으며 이 예제에는 두 가지 가능한 솔루션이 포함됩니다.
첫 번째 솔루션은 Linux 호스트 물리적 시스템의 연결 추적 프레임워크에 후크를 제공하는 TCP 프로토콜의 state 속성을 사용합니다. 게스트 가상 머신 시작 FTP 데이터 연결( SFTP 활성 모드)의 경우 RELATED 상태는 게스트 가상 머신 시작 FTP 데이터 연결이 (또는 '관계가 있는 관계)의 결과이며, 방화벽을 통해 패킷을 전달할 수 있음을 감지하는 데 사용됩니다. 그러나 RELATED 상태는 FTP 데이터 경로에 대한 발신 TCP 연결의 첫 번째 패킷에만 유효합니다. 그 후, 상태는 ESTABLISHED이며, 이는 수신 및 발신 방향에도 동일하게 적용됩니다. 이 모든 것은 게스트 가상 머신의 TCP 포트 20에서 발생하는 FTP 데이터 트래픽과 관련이 있습니다. 그러면 다음과 같은 해결 방법이 제공됩니다.
<filter name='test-eth0'>
  <!- - This filter (eth0) references the clean traffic filter to prevent MAC, IP, and ARP spoofing. By not providing an IP address parameter, libvirt will detect the IP address the guest virtual machine is using. - ->
  <filterref filter='clean-traffic'/>

  <!- - This rule enables TCP port 21 (FTP-control) to be reachable - ->
  <rule action='accept' direction='in'>
    <tcp dstportstart='21'/>
  </rule>

  <!- - This rule enables TCP port 20 for guest virtual machine-initiated FTP data connection related to an existing FTP control connection - ->
  <rule action='accept' direction='out'>
    <tcp srcportstart='20' state='RELATED,ESTABLISHED'/>
  </rule>

  <!- - This rule accepts all packets from a client on the FTP data connection - ->
  <rule action='accept' direction='in'>
    <tcp dstportstart='20' state='ESTABLISHED'/>
  </rule>

  <!- - This rule enables TCP port 22 (SSH) to be reachable - ->
  <rule action='accept' direction='in'>
    <tcp dstportstart='22'/>
  </rule>

  <!- -This rule enables TCP port 80 (HTTP) to be reachable - ->
  <rule action='accept' direction='in'>
    <tcp dstportstart='80'/>
  </rule>

  <!- - This rule enables general ICMP traffic to be initiated by the guest virtual machine, including ping traffic - ->
  <rule action='accept' direction='out'>
    <icmp/>
  </rule>

  <!- - This rule enables outgoing DNS lookups using UDP - ->
  <rule action='accept' direction='out'>
    <udp dstportstart='53'/>
  </rule>

  <!- - This rule drops all other traffic - ->
  <rule action='drop' direction='inout'>
    <all/>
  </rule>

</filter>
RELATED 상태를 사용하여 필터를 시도하기 전에 적절한 연결 추적 모듈이 호스트 물리적 시스템의 커널에 로드되었는지 확인해야 합니다. 커널 버전에 따라 게스트 가상 머신과 FTP 연결이 설정되기 전에 다음 두 명령 중 하나를 실행해야 합니다.
  • modprobe nf_conntrack_ftp - 사용 가능한 경우
  • 위의 모듈을 사용할 수 없는 경우 modprobe ip_conntrack_ftp
FTP 이외의 프로토콜이 RELATED 상태와 함께 사용되는 경우 해당 모듈을 로드해야 합니다. 모듈은 ftp, tftp, irc, sip, sctp, amanda 프로토콜에서 사용할 수 있습니다.
두 번째 해결책은 이전 솔루션보다 더 많은 연결의 상태 플래그를 사용합니다. 이 솔루션은 트래픽 흐름의 첫 번째 패킷이 감지될 때 연결의 NEW 상태가 유효함을 활용할 수 있습니다. 그 후, 흐름의 첫 번째 패킷이 허용되면 흐름은 연결이 되어, 이에 따라 IKEvBLISHED 상태가 됩니다. 따라서 ESTABLISHED 연결의 패킷을 게스트 가상 머신에 도달하거나 게스트 가상 머신에서 보낼 수 있도록 일반 규칙을 작성할 수 있습니다. 이 작업은 NEW 상태에서 식별되는 첫 번째 패킷에 대해 특정 규칙을 작성하고 데이터가 허용 가능한 포트를 지시합니다. 명시적으로 승인되지 않은 포트에 대해 예약된 모든 패킷은 삭제되므로, ESTABLISHED 상태에 도달하지 않습니다. 해당 포트에서 전송된 후속 패킷도 삭제됩니다.
<filter name='test-eth0'>
  <!- - This filter references the clean traffic filter to prevent MAC, IP and ARP spoofing. By not providing and IP address parameter, libvirt will detect the IP address the VM is using. - ->
  <filterref filter='clean-traffic'/>

  <!- - This rule allows the packets of all previously accepted connections to reach the guest virtual machine - ->
  <rule action='accept' direction='in'>
    <all state='ESTABLISHED'/>
  </rule>

  <!- - This rule allows the packets of all previously accepted and related connections be sent from the guest virtual machine - ->
  <rule action='accept' direction='out'>
    <all state='ESTABLISHED,RELATED'/>
  </rule>

  <!- - This rule enables traffic towards port 21 (FTP) and port 22 (SSH)- ->
  <rule action='accept' direction='in'>
    <tcp dstportstart='21' dstportend='22' state='NEW'/>
  </rule>

  <!- - This rule enables traffic towards port 80 (HTTP) - ->
  <rule action='accept' direction='in'>
    <tcp dstportstart='80' state='NEW'/>
  </rule>

  <!- - This rule enables general ICMP traffic to be initiated by the guest virtual machine, including ping traffic - ->
  <rule action='accept' direction='out'>
    <icmp state='NEW'/>
  </rule>

  <!- - This rule enables outgoing DNS lookups using UDP - ->
  <rule action='accept' direction='out'>
    <udp dstportstart='53' state='NEW'/>
  </rule>

  <!- - This rule drops all other traffic - ->
  <rule action='drop' direction='inout'>
    <all/>
  </rule>

</filter>

17.14.12. 제한 사항

다음은 현재 알려진 네트워크 필터링 하위 시스템 제한 목록입니다.
  • VM 마이그레이션은 게스트 가상 시스템의 최상위 필터에서 참조하는 전체 필터 트리를 대상 호스트 물리적 시스템에서 사용할 수 있는 경우에만 지원됩니다. 예를 들어 네트워크 필터 정리 트래픽 은 모든 libvirt 설치에서 사용할 수 있어야 하므로 이 필터를 참조하는 게스트 가상 머신을 마이그레이션할 수 있어야 합니다. 버전 호환성을 보장하기 위해서는 패키지를 정기적으로 업데이트하여 가장 최신 버전의 libvirt를 사용하고 있는지 확인하는 데 문제가 없습니다.
  • 인터페이스와 연결된 네트워크 트래픽 필터를 손실하지 않으려면 버전 0.8.1 이상의 libvirt insallation 간에 마이그레이션이 수행되어야 합니다.
  • 게스트 가상 머신에서 전송되는 VLAN(802.1Q) 패킷은 프로토콜 ID arp, rarp, ipv4 및 ipv6 규칙에 따라 필터링할 수 없습니다. 프로토콜 ID, MAC 및 VLAN만 필터링할 수 있습니다. 따라서 filter clean-traffic 예 17.1. “네트워크 필터링의 예” 예제가 예상대로 작동하지 않습니다.

17.15. 터널 생성

이 섹션에서는 다양한 터널링 시나리오를 구현하는 방법을 설명합니다.

17.15.1. 멀티 캐스트 터널 생성

멀티 캐스트 그룹은 가상 네트워크를 표시하도록 설정되어 있습니다. 네트워크 장치가 동일한 멀티 캐스트 그룹에 있는 게스트 가상 머신은 호스트 물리적 시스템에서도 서로 통신할 수 있습니다. 이 모드는 권한이 없는 사용자가도 사용할 수 있습니다. 기본 DNS 또는 DHCP를 지원하지 않으며 발신 네트워크 액세스가 없습니다. 발신 네트워크 액세스를 제공하기 위해 게스트 가상 머신 중 하나에 첫 번째 네 개의 네트워크 유형 중 하나에 연결된 두 번째 NIC가 있어야 적절한 라우팅을 제공합니다. 멀티 캐스트 프로토콜은 게스트 가상 머신 사용자 모드와 호환됩니다. 입력한 소스 주소는 멀티 캐스트 주소 블록에 사용된 주소에서 가져와야 합니다.
멀티 캐스트 터널을 생성하려면 다음 XML 세부 정보를 <devices> 요소에 배치합니다.

그림 17.28. 멀티 캐스트 터널 도메인 XMl 예

      
  ...
  <devices>
    <interface type='mcast'>
      <mac address='52:54:00:6d:90:01'>
      <source address='230.0.0.1' port='5558'/>
    </interface>
  </devices>
  ...


17.15.2. TCP 터널 생성

TCP 클라이언트-서버 아키텍처는 가상 네트워크를 제공합니다. 이 구성에서 한 게스트 가상 시스템은 네트워크의 서버 종료를 제공하는 반면 다른 모든 게스트 가상 시스템은 클라이언트로 구성됩니다. 모든 네트워크 트래픽은 게스트 가상 시스템 서버를 통해 게스트 가상 머신 클라이언트 간에 라우팅됩니다. 이 모드는 권한이 없는 사용자에게도 사용할 수 있습니다. 이 모드는 기본 DNS 또는 DHCP 지원을 제공하지 않으며 발신 네트워크 액세스를 제공하지 않습니다. 발신 네트워크 액세스를 제공하기 위해 게스트 가상 머신 중 하나에 첫 번째 네 개의 네트워크 유형 중 하나에 연결된 두 번째 NIC가 있어야 적절한 라우팅을 제공합니다.
TCP 터널을 생성하려면 다음 XML 세부 정보를 <devices> 요소에 배치합니다.

그림 17.29. TCP 터널 도메인 XMl 예

      
       ...
  <devices>
    <interface type='server'>
      <mac address='52:54:00:22:c9:42'>
      <source address='192.168.0.1' port='5558'/>
    </interface>
    ...
    <interface type='client'>
      <mac address='52:54:00:8b:c9:51'>
      <source address='192.168.0.1' port='5558'/>
    </interface>
  </devices>
  ...
      

17.16. vLAN 태그 설정

virsh net-edit 명령을 사용하여 가상 로컬 영역 네트워크(vLAN) 태그가 추가됩니다. 이 태그는 SR-IOV 장치가 있는 PCI 장치 할당에도 사용할 수 있습니다. 자세한 내용은 16.2.3절. “SR-IOV 장치를 사용하여 PCI 할당 구성”의 내용을 참조하십시오.

그림 17.30. v setting VLAN 태그(네트워크 유형만 지원됨)


<network>
  <name>ovs-net</name>
  <forward mode='bridge'/>
  <bridge name='ovsbr0'/>
  <virtualport type='openvswitch'>
    <parameters interfaceid='09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f'/>
  </virtualport>
  <vlan trunk='yes'>
    <tag id='42' nativeMode='untagged'/>
    <tag id='47'/>
  </vlan>
  <portgroup name='dontpanic'>
    <vlan>
      <tag id='42'/>
    </vlan>
  </portgroup>
</network>
(및) 네트워크 유형이 게스트에 투명한 vlan 태그를 지원하는 경우에만 선택적 <vlan> 요소는 이 네트워크를 사용하여 모든 게스트의 트래픽에 적용할 one or more vlan 태그를 지정할 수 있습니다. (openvswitch 및 type='hostdev의 SR-IOV 네트워크는 게스트 트래픽의 투명한 vlan 태그 지정을 지원합니다. 표준 linux 브리지 및 libvirt의 자체 가상 네트워크를 포함한 모든 항목을 지원합니다. 802.1QBH(vn-link) 및 802.1Qbg(VEPA) 스위치는 게스트 트래픽을 특정 vlan에 태그하는 고유한 방법( libvirt 제외)을 제공합니다. 예상대로 tag 속성은 사용할 vlan 태그를 지정합니다. 네트워크에 둘 이상의 <vlan> 요소가 정의되어 있는 경우 사용자가 지정된 모든 태그를 사용하여 VLAN 트렁크를 수행하려는 것으로 가정합니다. 단일 태그로 vlan 트렁킹이 필요한 경우 선택 사항인 trunk='yes'를 vlan 요소에 추가할 수 있습니다.
openvswitch를 사용하여 네트워크 연결의 경우 'native-tagged' 및 'native-untagged' vlan 모드를 구성할 수 있습니다. 이는 <태그> 요소에서 선택적 nativeMode 특성을 사용합니다. nativeMode는 'tagged' 또는 'untagged'로 설정할 수 있습니다. 요소의 id 속성은 네이티브 vlan을 설정합니다.
<VLAN> 요소는 도메인의 <인터페이스> 요소에서 직접 및 <portgroup> 요소에서 지정할 수도 있습니다. vlan 태그가 여러 위치에 지정되면 <인터페이스> 구성에 의해 선택된 <portgroup> 의 설정이 우선합니다. <network><vlan><portgroup> 또는 <interface> 에 없는 경우에만 선택됩니다.

17.17. 가상 네트워크에 QoS 적용

QoS(Quality of Service) 는 네트워크 상의 모든 사용자에게 최적의 환경을 보장하는 리소스 제어 시스템을 의미하고, 지연, 지터 또는 패킷 손실이 없는지 확인합니다. QoS는 특정 애플리케이션 또는 사용자/그룹 특정일 수 있습니다. 자세한 내용은 23.17.8.14절. “QoS (Quality of Service)”를 참조하십시오.

18장. 게스트의 원격 관리

이 섹션에서는 원격으로 게스트를 관리하는 방법을 설명합니다.

18.1. 전송 모드

원격 관리를 위해 libvirt 는 다음과 같은 전송 모드를 지원합니다.

TLS(Transport Layer Security)

SSL 3.1(Transport Layer Security TLS 1.0) 인증 및 암호화된 TCP/IP 소켓은 일반적으로 공용 포트 번호에서 수신 대기합니다. 이를 사용하려면 클라이언트 및 서버 인증서를 생성해야 합니다. 표준 포트는 16514입니다. 자세한 내용은 18.3절. “TLS 및 SSL을 통한 원격 관리” 에서 참조하십시오.

SSH

SSH(Secure Shell Protocol) 연결을 통해 전송되었습니다. libvirt 데몬(libvirtd)이 원격 시스템에서 실행 중이어야 합니다. SSH 액세스를 위해서는 포트 22가 열려 있어야 합니다. SSH 키 관리 (예: ssh-agent 유틸리티)를 사용하거나 암호를 입력하라는 메시지가 표시됩니다. 자세한 내용은 18.2절. “SSH를 사용한 원격 관리” 에서 참조하십시오.

UNIX 소켓

UNIX 도메인 소켓은 로컬 시스템에서만 액세스할 수 있습니다. 소켓은 암호화되지 않으며 인증에 UNIX 권한 또는 SELinux를 사용합니다. 표준 소켓 이름은 /var/run/libvirt/libvirt-sock/var/run/libvirt/libvirt-sock-ro 입니다( 읽기 전용 연결의 경우).

ext

ext 매개 변수는 libvirt 범위를 벗어나는 원격 머신에 연결할 수 있는 모든 외부 프로그램에 사용됩니다. 이 매개변수는 지원되지 않습니다.

TCP

암호화되지 않은 TCP/IP 소켓입니다. 프로덕션 용도에는 권장되지 않지만 일반적으로 비활성화되어 있지만 관리자는 신뢰할 수 있는 네트워크를 통해 테스트하거나 사용할 수 있도록 설정할 수 있습니다. 기본 포트는 16509입니다.

다른 값이 지정되지 않은 경우 기본 전송은 TLS입니다.

원격 URI

URI(Uniform Resource Identifier)는 virshlibvirt 가 원격 호스트에 연결하는 데 사용됩니다. 또한 virsh 명령의 --connect 매개 변수와 함께 URI를 사용하여 원격 호스트에서 단일 명령 또는 마이그레이션을 실행할 수 있습니다. 원격 URI는 일반 로컬 URI를 사용하고 호스트 이름 또는 전송 이름 또는 둘 다를 추가하여 구성됩니다. 특별한 경우 'remote'의 URI 스키마를 사용하면 원격 libvirtd 서버에서 최적의 하이퍼바이저 드라이버를 검색하도록 지시합니다. 로컬 연결에 대한 null URI를 전달하는 것과 같습니다.

libvirt URI에는 일반 형식(사각 괄호, "[]"의 콘텐츠)은 선택적 함수를 나타냅니다.
driver[+transport]://[username@][hostname][:port]/path[?extraparameters]
하이퍼바이저(driver)가 QEMU인 경우 경로는 필수입니다.
다음은 유효한 원격 URI의 예입니다.
  • QEMU://hostname/
외부 위치를 대상으로 하는 전송 방법 또는 호스트 이름을 제공해야 합니다. 자세한 내용은 libvirt 업스트림 문서를 참조하십시오.

원격 관리 매개변수의 예

  • SSH 전송 및 SSH 사용자 이름 virtuser 를 사용하여 host2 라는 원격 KVM 호스트에 연결합니다. 각각에 대한 connect 명령은 connect [URI] [-readonly] 입니다. virsh connect 명령에 대한 자세한 내용은 다음을 참조하십시오. 20.4절. “virsh Connect를 사용하여 하이퍼바이저에 연결”
    qemu+ssh://virtuser@host2/
  • TLS를 사용하여 host2 라는 호스트의 원격 KVM 하이퍼바이저에 연결합니다.
    qemu://host2/

예제 테스트

  • 비표준 UNIX 소켓을 사용하여 로컬 KVM 하이퍼바이저에 연결합니다. 이 경우 UNIX 소켓의 전체 경로가 명시적으로 제공됩니다.
    qemu+unix:///system?socket=/opt/libvirt/run/libvirt/libvirt-sock
  • 포트 5000에서 IP 주소 10.1.1.10이 있는 서버에 연결되지 않은 TCP/IP 연결을 사용하여 libvirt 데몬에 연결합니다. 이 명령은 기본 설정으로 테스트 드라이버를 사용합니다.
    test+tcp://10.1.1.10:5000/default

추가 URI 매개변수

추가 매개 변수를 원격 URI에 추가할 수 있습니다. 아래 표에서 인식되는 매개 변수를 설명합니다. 다른 모든 매개변수는 무시됩니다. 매개변수 값은 매개 변수 및 특수 문자가 URI 형식으로 변환되기 전에 URI-escaped(즉, 물음표(?)가 추가되어야 합니다.

표 18.1. 추가 URI 매개변수

이름 전송 모드 설명 사용 예
name 모든 모드 원격 virConnectOpen 함수에 전달된 이름입니다. 이름은 일반적으로 전송,호스트 이름 ,포트 번호,사용자 이름 , 사용자 이름 및 원격 URI에서 추가 매개 변수를 제거 하 여 형성되지만, 경우에 따라 이름을 명시적으로 제공하는 것이 좋습니다. name=qemu:///system
명령 SSH 및 ext 외부 명령. ext 전송의 경우 이 작업이 필요합니다. ssh의 경우 기본값은 ssh입니다. PATH가 명령을 검색합니다. command=/opt/openssh/bin/ssh
socket UNIX 및 ssh UNIX 도메인 소켓의 경로를 통해 기본값을 덮어씁니다. ssh 전송의 경우 이 값은 원격 netcat 명령에 전달됩니다( netcat 참조). socket=/opt/libvirt/run/libvirt/libvirt-sock
no_verify tls 0이 아닌 값으로 설정하면 서버 인증서의 클라이언트 검사가 비활성화됩니다. 클라이언트 인증서 또는 IP 주소의 서버 확인을 비활성화하려면 libvirtd 구성을 변경해야 합니다. no_verify=1
no_tty ssh 0이 아닌 값으로 설정하면 ssh가 암호를 요청하지 않고 원격 시스템에 자동으로 로그인할 수 없는 경우 가 자동으로 중지됩니다. 터미널에 액세스할 수 없는 경우 을 사용합니다. no_tty=1

18.2. SSH를 사용한 원격 관리

ssh 패키지는 원격 가상화 서버에 관리 기능을 안전하게 보낼 수 있는 암호화된 네트워크 프로토콜을 제공합니다. 아래에 설명된 방법은 SSH 연결을 통해 안전하게 터널링된 libvirt 관리 연결을 사용하여 원격 시스템을 관리합니다. 모든 인증은 로컬 SSH 에이전트에서 수집한 SSH 공개 키 암호화 및 암호 또는 암호를 사용하여 수행됩니다. 또한 각 게스트의 VNC 콘솔은 SSH 를 통해 터널링됩니다.
SSH 를 사용하여 가상 머신을 원격으로 관리하는 경우 다음과 같은 문제를 알고 있어야 합니다.
  • 가상 머신을 관리하려면 원격 머신에 대한 루트 로그인 권한이 필요합니다.
  • 초기 연결 설정 프로세스가 느려질 수 있습니다.
  • 모든 호스트 또는 게스트에서 사용자 키를 취소하는 표준 또는 간단한 방법은 없습니다.
  • SSH 는 많은 수의 원격 시스템에서 제대로 확장되지 않습니다.
참고
Red Hat Virtualization을 사용하면 다수의 가상 머신을 원격 관리할 수 있습니다. 자세한 내용은 Red Hat Virtualization 설명서 를 참조하십시오.
SSH 액세스에 필요한 패키지는 다음과 같습니다.
  • openssh
  • openssh-askpass
  • openssh-clients
  • openssh-server

virt-manager에 대한 암호 없는 또는 암호 관리 SSH 액세스 구성

다음 명령은 처음부터 시작하고 SSH 키가 설정되어 있지 않다고 가정합니다. SSH 키를 다른 시스템에 설정 및 복사한 경우 이 절차를 건너뛸 수 있습니다.

중요
SSH 키는 사용자 종속 키이며 소유자만 사용할 수 있습니다. 키의 소유자는 이를 생성한 사용자입니다. 키는 다른 사용자 간에 공유되지 않을 수 있습니다.
원격 호스트에 연결할 키를 소유하는 사용자가 virt-manager 를 실행해야 합니다. 즉, root가 아닌 사용자가 원격 시스템을 관리하는 경우 virt-manager 를 권한 없는 모드에서 실행해야 합니다. 원격 시스템이 로컬 root 사용자가 관리하는 경우 SSH 키를 root가 소유하고 생성해야 합니다.
virt-manager 를 사용하여 권한이 없는 사용자로 로컬 호스트를 관리할 수 없습니다.
  1. 선택 사항: 사용자 변경

    필요한 경우 사용자를 변경합니다. 이 예에서는 로컬 root 사용자를 사용하여 다른 호스트 및 로컬 호스트를 원격으로 관리합니다.
    $ su -
  2. SSH 키 쌍 생성

    virt-manager 가 사용되는 시스템에서 공개 키 쌍을 생성합니다. 이 예에서는 ~/.ssh/ 디렉터리의 기본 키 위치를 사용합니다.
    # ssh-keygen -t rsa
  3. 원격 호스트에 키 복사

    암호 없이 원격 로그인하거나 암호를 사용하여 SSH 키를 관리 중인 시스템에 배포해야 합니다. ssh-copy-id 명령을 사용하여 제공된 시스템 주소의 root 사용자에게 키를 복사합니다(예: root@host2.example.com).
    # ssh-copy-id -i ~/.ssh/id_rsa.pub root@host2.example.com
    root@host2.example.com's password:
    
    그런 다음 머신에 로그인하고 .ssh/authorized_keys 파일을 확인하여 예기치 않은 키가 추가되지 않았는지 확인합니다.
    ssh root@host2.example.com
    필요에 따라 다른 시스템에 대해 반복합니다.
  4. 선택 사항: ssh-agent에 암호를 추가합니다.

    필요한 경우 SSH 키의 pass-phrase를 ssh-agent 에 추가합니다. 로컬 호스트에서 다음 명령을 사용하여 암호가 없는 로그인을 활성화하려면 pass-phrase(한 번 있는 경우)를 추가합니다.
    # ssh-add ~/.ssh/id_rsa
    ssh-agent가 실행되지 않으면 이 명령이 실행되지 않습니다. 오류 또는 충돌을 방지하려면 SSH 매개변수가 올바르게 설정되어 있는지 확인합니다. 자세한 내용은 Red Hat Enterprise System Administration Guide 를 참조하십시오.

libvirt 데몬 (libvirtd)

libvirt 데몬은 가상 머신을 관리하기 위한 인터페이스를 제공합니다. 이러한 방식으로 관리하려는 모든 원격 호스트에 libvirtd 데몬을 설치하고 실행해야 합니다.

$ ssh root@somehost
# systemctl enable libvirtd.service
# systemctl start libvirtd.service
libvirtdSSH 를 구성한 후에는 가상 시스템에 원격으로 액세스하고 관리할 수 있습니다. 이 시점에서 VNC 를 사용하여 게스트에 액세스할 수도 있습니다.

virt-manager를 사용하여 원격 호스트에 액세스

원격 호스트는 virt-manager GUI 도구를 사용하여 관리할 수 있습니다. 암호 없이 로그인하려면 SSH 키가 virt-manager 를 실행하는 사용자에 속해야 합니다.

  1. virt-manager 를 시작합니다.
  2. 파일 추가 연결 메뉴를 엽니다.

    그림 18.1. 연결 메뉴 추가

    연결 메뉴 추가
  3. 드롭다운 메뉴를 사용하여 하이퍼바이저 유형을 선택하고 원격 호스트에 연결 확인란을 클릭하여 연결 방법 (이 경우 SSH를 통한 원격 터널)을 열고 사용자 이름과 호스트 이름을 입력한 다음 연결을 클릭합니다.

18.3. TLS 및 SSL을 통한 원격 관리

TLS 및 SSL 프로토콜을 사용하여 가상 머신을 관리할 수 있습니다. TLS 및 SSL은 확장성을 제공하지만 SSH보다 더 복잡한 ( 18.2절. “SSH를 사용한 원격 관리”참조) TLS 및 SSL은 보안 연결을 위해 웹 브라우저에서 사용하는 것과 동일한 기술입니다. libvirt 관리 연결은 입력 연결에 대해 TCP 포트를 엽니다. 이 포트는 x509 인증서를 기반으로 안전하게 암호화되고 인증됩니다. 다음 절차에서는 TLS 및 SSL 관리를 위한 인증 인증서 생성 및 배포에 대한 지침을 제공합니다.

절차 18.1. TLS 관리를 위한 CA(인증 기관) 키 생성

  1. 시작하기 전에 gnutls-utils 가 설치되었는지 확인합니다. 그렇지 않은 경우 설치합니다.
    # yum install gnutls-utils 
  2. 다음 명령을 사용하여 개인 키를 생성합니다.
    # certtool --generate-privkey > cakey.pem
  3. 키가 생성된 후 자체 서명할 수 있도록 서명 파일을 만듭니다. 이렇게 하려면 서명 세부 정보를 사용하여 파일을 생성하고 이름을 ca.info 로 지정합니다. 이 파일에는 다음이 포함되어야 합니다.
    cn = Name of your organization
    ca
    cert_signing_key
    
  4. 다음 명령을 사용하여 자체 서명된 키를 생성합니다.
    # certtool --generate-self-signed --load-privkey cakey.pem --template ca.info --outfile cacert.pem
    파일이 생성되면 rm 명령을 사용하여 ca.info 파일을 삭제할 수 있습니다. 생성 과정에서 발생하는 파일의 이름은 cacert.pem 입니다. 이 파일은 공개 키(certificate)입니다. 로드된 파일 cakey.pem 은 개인 키입니다. 보안상의 이유로 이 파일은 비공개로 유지해야 하며 공유 공간에 상주해서는 안 됩니다.
  5. /etc/pki/CA/ cacert.pem 디렉터리의 모든 클라이언트 및 서버에 cacert.pem CA 인증서 파일을 설치하여 CA에서 발급한 인증서를 신뢰할 수 있음을 알립니다. 이 파일의 내용을 보려면 다음을 실행합니다.
    # certtool -i --infile cacert.pem
    이는 CA를 설정하는 데 필요한 모든 것입니다. 클라이언트와 서버의 인증서를 발급하기 위해 필요한 경우 CA의 개인 키를 안전하게 유지합니다.

절차 18.2. 서버 인증서 발급

다음 절차에서는 서버의 호스트 이름으로 설정된 X.509 CN(일반 이름) 필드가 있는 인증서를 발급하는 방법을 설명합니다. CN은 클라이언트가 서버에 연결하는 데 사용할 호스트 이름과 일치해야 합니다. 이 예에서 클라이언트는 URI: qemu://mycommonname/system 를 사용하여 서버에 연결되므로 CN 필드는 "mycommoname" 예제에 대해 동일해야 합니다.
  1. 서버의 개인 키를 만듭니다.
    # certtool --generate-privkey > serverkey.pem
  2. 먼저 server.info 라는 템플릿 파일을 생성하여 CA의 개인 키에 대한 서명을 생성합니다. CN이 서버의 호스트 이름과 동일하게 설정되어 있는지 확인합니다.
    organization = Name of your organization
    cn = mycommonname
    tls_www_server
    encryption_key
    signing_key
    
  3. 인증서를 생성합니다.
    # certtool --generate-certificate --load-privkey serverkey.pem --load-ca-certificate cacert.pem --load-ca-privkey cakey.pem \ --template server.info --outfile servercert.pem
    이렇게 하면 두 개의 파일이 생성됩니다.
    • serverkey.pem - 서버의 개인 키
    • servercert.pem - 서버의 공개 키
  4. 개인 키의 위치를 secret로 유지합니다. 파일 내용을 보려면 다음 명령을 사용하십시오.
    # certtool -i --infile servercert.pem
    이 파일을 열 때 CN= 매개 변수는 이전에 설정한 CN과 동일해야 합니다. 예: mycommonname.
  5. 다음 위치에 두 파일을 설치합니다.
    • serverkey.pem - 서버의 개인 키 이 파일을 /etc/pki/libvirt/private/serverkey.pem에 배치합니다.
    • servercert.pem - 서버의 인증서 서버의 다음 위치에 설치합니다. /etc/pki/libvirt/servercert.pem

절차 18.3. 클라이언트 인증서 발급

  1. 모든 클라이언트(즉, virt-manager와 같이 libvirt와 연결된 모든 프로그램)에 대해 X.509 Distinguished Name(DN) 필드가 적절한 이름으로 설정된 인증서를 발급해야 합니다. 이는 기업 차원에서 결정되어야 합니다.
    예를 들어 다음과 같은 정보가 사용됩니다.
    C=USA,ST=North Carolina,L=Raleigh,O=Red Hat,CN=name_of_client
  2. 개인 키를 생성합니다.
    # certtool --generate-privkey > clientkey.pem
  3. 먼저 client.info 라는 템플릿 파일을 생성하여 CA의 개인 키에 대한 서명을 생성합니다. 파일에는 다음 내용이 포함되어야 합니다 (필요한 지역/위치를 반영하도록 필드를 사용자 지정해야 함):
    country = USA
    state = North Carolina
    locality = Raleigh
    organization = Red Hat
    cn = client1
    tls_www_client
    encryption_key
    signing_key
    
  4. 다음 명령을 사용하여 인증서에 서명합니다.
    # certtool --generate-certificate --load-privkey clientkey.pem --load-ca-certificate cacert.pem \ --load-ca-privkey cakey.pem --template client.info --outfile clientcert.pem
  5. 클라이언트 시스템에 인증서를 설치합니다.
    # cp clientkey.pem /etc/pki/libvirt/private/clientkey.pem
    # cp clientcert.pem /etc/pki/libvirt/clientcert.pem

18.4. VNC 서버 구성

VNC(Virtual Network Computing)를 사용하여 호스트와 게스트 머신 간의 그래픽 데스크탑 공유를 설정하려면 연결하려는 게스트에 VNC 서버를 구성해야 합니다. 이를 위해서는 게스트 XML 파일의 장치 요소에서 VNC를 그래픽 유형으로 지정해야 합니다. 자세한 내용은 23.17.11절. “그래픽 프레임 버퍼” 에서 참조하십시오.
VNC 서버에 연결하려면 virt-viewer 유틸리티 또는 virt-manager 인터페이스를 사용합니다.

18.5. NSS를 사용하여 가상 머신의 원격 관리 향상

Red Hat Enterprise Linux 7.3 이상에서는NSS( libvirt Network Security Services) 모듈을 사용하여 SSH, TLS, SSL 및 기타 원격 로그인 서비스를 사용하여 게스트에 보다 쉽게 연결할 수 있습니다. 또한 이 모듈은 ping 과 같은 호스트 이름 변환을 사용하는 유틸리티에도 이점을 제공합니다.
이 기능을 사용하려면 libvirt-nss 패키지를 설치합니다.
# yum install libvirt-nss
참고
libvirt-nss 를 설치할 수 없는 경우 Red Hat Enterprise Linux의 선택적 리포지토리가 활성화되어 있는지 확인합니다. 자세한 내용은 시스템 관리자 가이드를 참조하십시오.
마지막으로, 다음과 같이 /etc/nsswitch.conf 파일의 hosts 행에 libvirt_guest 를 추가하여 모듈을 활성화합니다.
passwd:      compat
shadow:      compat
group:       compat
hosts:       files libvirt_guest dns
...
hosts 행에 모듈이 나열된 순서에 따라 이러한 모듈이 지정된 원격 게스트를 찾는 순서를 결정합니다. 결과적으로 libvirt의 NSS 모듈이 호스트 도메인 이름을 IP 주소로 변환하는 모듈에 추가됩니다. 예를 들어, 정적 IP 주소를 설정하고 게스트의 이름만 사용하지 않고 NAT 모드에서 원격 게스트에 연결할 수 있습니다.
# ssh root@guestname
root@guestname's password:
Last login: Thu Aug 10 09:12:31 2017 from 192.168.122.1
[root@guestname ~]#
참고
게스트 이름을 모르는 경우 virsh list --all 명령을 사용하여 가져올 수 있습니다.

19장. Virtual Machine Manager를 사용하여 게스트 관리 (virt-manager)

이 장에서는 Virtual Machine Manager (virt-manager) 창, 대화 상자 및 다양한 GUI 컨트롤에 대해 설명합니다.
virt-manager 는 호스트 시스템과 원격 호스트 시스템의 하이퍼바이저 및 게스트 그래픽 보기를 제공합니다. virt-manager 는 다음을 포함하여 가상화 관리 작업을 수행할 수 있습니다.
  • 게스트 정의 및 생성
  • 메모리를 할당,
  • 가상 CPU 할당
  • 운영 성능 모니터링
  • 게스트의 저장 및 복원, 일시 중지 및 다시 시작
  • text 및 그래픽 콘솔에 대한 링크 및
  • 실시간 및 오프라인 마이그레이션.
중요
사용 중인 사용자를 기록해 두는 것이 중요합니다. 한 명의 사용자로 게스트 가상 머신을 생성하는 경우 다른 사용자를 사용하여 해당 사용자에 대한 정보를 검색할 수 없습니다. 이는 virt-manager에서 가상 머신을 생성할 때 특히 중요합니다. 이 경우 기본 사용자는 달리 지정하지 않는 한 root입니다. virsh list --all 명령을 사용하여 가상 머신을 나열할 수 없는 경우가 있는 경우 가상 머신을 생성하는 데 사용한 것과 다른 사용자를 사용하여 명령을 실행하는 경우가 가장 많습니다.

19.1. virt-manager 시작

virt-manager 세션을 시작하려면 Applications 메뉴를 열고 System Tools 메뉴에서 Virtual Machine Manager (virt-manager)를 선택합니다.
virt-manager 기본 창이 표시됩니다.

그림 19.1. virt-manager시작

virt-manager시작
또는 다음 명령에 설명된 대로 ssh 를 사용하여 virt-manager 를 원격으로 시작할 수 있습니다.
# ssh -X host's address
[remotehost]# virt-manager
ssh 를 사용하여 가상 시스템 및 호스트를 관리하는 방법은 18.2절. “SSH를 사용한 원격 관리” 에서 자세히 설명합니다.

19.2. 가상 머신 관리자 메인 창

이 기본 창에는 게스트가 사용하는 실행 중인 모든 게스트 및 리소스가 표시됩니다. 게스트 이름을 두 번 클릭하여 게스트를 선택합니다.

그림 19.2. 가상 머신 관리자 주요 창

가상 머신 관리자 주요 창

19.3. 가상 하드웨어 세부 정보 창

가상 하드웨어 세부 정보 창에 게스트에 대해 구성된 가상 하드웨어에 대한 정보가 표시됩니다. 이 창에서 가상 하드웨어 리소스를 추가, 제거 및 수정할 수 있습니다. 가상 하드웨어 세부 정보 창에 액세스하려면 도구 모음에서 아이콘을 클릭합니다.

그림 19.3. 가상 하드웨어 세부 정보 아이콘

가상 하드웨어 세부 정보 아이콘
아이콘을 클릭하면 가상 하드웨어 세부 정보 창이 표시됩니다.

그림 19.4. 가상 하드웨어 세부 정보 창

가상 하드웨어 세부 정보 창

19.3.1. 게스트 가상 머신에 부팅 옵션 적용

virt-manager 를 사용하여 게스트 가상 머신의 작동 방식을 선택할 수 있습니다. 부팅 옵션은 게스트 가상 머신이 재부팅될 때까지 적용되지 않습니다. 변경하기 전에 가상 머신의 전원을 끄거나 나중에 시스템을 재부팅할 수 있습니다. 이러한 옵션 중 하나를 수행하지 않으면 다음에 게스트가 재부팅될 때 변경 사항이 발생합니다.

절차 19.1. 부팅 옵션 구성

  1. 가상 머신 관리자 편집 메뉴에서 가상 머신 세부 정보를 선택합니다.
  2. 측면 패널에서 Boot Options 를 선택한 다음 다음 선택적 단계를 완료하십시오.
    1. 호스트 물리적 시스템이 부팅될 때마다 이 게스트 가상 시스템이 시작되어야 함을 나타내기 위해 Autostart (자동 시작) 확인란을 선택합니다.
    2. 게스트 가상 머신을 부팅해야 하는 순서를 지정하려면 부팅 활성화 메뉴 확인란을 클릭합니다. 이 값을 확인한 후 화살표 키를 사용하여 부팅하려는 장치를 확인하고 화살표 키를 사용하면 부팅 시 게스트 가상 머신이 사용되는 순서가 변경됩니다.
    3. Linux 커널에서 직접 부팅하려면 Direct 커널 부팅 메뉴를 확장합니다. 커널 경로, Initrd 경로 및 사용하려는 커널 인수를 입력합니다.
  3. Apply(적용)를 클릭합니다.

    그림 19.5. 부팅 옵션 구성

    부팅 옵션 구성

19.3.2. 게스트 가상 머신에 USB 장치 연결

참고
USB 장치를 게스트 가상 머신에 연결하려면 먼저 호스트 물리적 머신에 연결하고 장치가 작동하는지 확인해야 합니다. 게스트가 실행 중인 경우 계속하기 전에 해당 게스트를 종료해야 합니다.

절차 19.2. Virt-Manager를 사용하여 USB 장치 연결

  1. 게스트 가상 머신의 가상 머신 세부 정보 화면을 엽니다.
  2. 하드웨어 추가를클릭합니다.
  3. Add New Virtual Hardware (새 가상 하드웨어 추가) 팝업에서 USB Host Device 를 선택하고, 목록에서 연결할 장치를 선택하고 Finish 를 클릭합니다.

    그림 19.6. USB 장치 추가

    USB 장치 추가
  4. 게스트 가상 머신에서 USB 장치를 사용하려면 게스트 가상 머신을 시작합니다.

19.3.3. USB Redirection

USB 리디렉션은 데이터 센터에서 실행되는 호스트 물리적 시스템이 있는 경우에 가장 적합합니다. 사용자가 로컬 시스템 또는 씬 클라이언트의 게스트 가상 머신에 연결합니다. 로컬 시스템에 SPICE 클라이언트가 있습니다. 사용자는 모든 USB 장치를 씬 클라이언트에 연결할 수 있으며 SPICE 클라이언트는 데이터 센터의 호스트 물리적 시스템으로 장치를 리디렉션하여 씬 클라이언트에서 실행 중인 VM에서 사용할 수 있도록 합니다.

절차 19.3. USB 장치 리디렉션

  1. 게스트 가상 머신의 가상 머신 세부 정보 화면을 엽니다.
  2. 하드웨어 추가를클릭합니다.
  3. Add New Virtual Hardware (새 가상 하드웨어 추가) 팝업에서 USB 리디렉션 을 선택합니다. 유형 드롭다운 메뉴에서 Spice 채널을 선택하고 Finish 를 클릭합니다.

    그림 19.7. 새 가상 하드웨어 추가 창

    새 가상 하드웨어 추가 창
  4. 가상 머신 메뉴를 열고 Redirect USB 장치를 선택합니다. USB 장치 목록이 포함된 팝업 창이 열립니다.

    그림 19.8. USB 장치 선택

    USB 장치 선택
  5. 확인란을 선택하여 리디렉션을 위한 USB 장치를 선택하고 확인을 클릭합니다.

19.4. 가상 머신 그래프 콘솔

이 창에는 게스트의 그래픽 콘솔이 표시됩니다. 게스트는 다양한 프로토콜을 사용하여 그래픽 프레임 버퍼를 내보낼 수 있습니다. virt-managerVNCSPICE 를 지원합니다. 가상 머신에 인증이 필요한 경우 가상 머신 그래픽 콘솔에서 화면에 표시되기 전에 암호를 묻는 메시지를 표시합니다.

그림 19.9. 그래픽 콘솔 창

그래픽 콘솔 창
참고
VNC는 많은 보안 전문가가 안전하지 않은 것으로 간주되지만 Red Hat Enterprise Linux에서의 가상화를 위해 VNC를 안전하게 사용할 수 있도록 몇 가지 변경 사항이 변경되었습니다. 게스트 머신은 로컬 호스트의 루프백 주소(127.0.0.1)만 수신 대기합니다. 이렇게 하면 호스트에서 쉘 권한이 있는 사용자만 VNC를 통해 virt-manager 및 가상 머신에 액세스할 수 있습니다. virt-manager는 다른 공용 네트워크 인터페이스 및 대체 방법을 구성할 수 있도록 구성되어 있지만 구성하는 것은 권장되지 않습니다.
트래픽을 암호화하는 SSH를 통해 터널링하여 원격 관리를 수행할 수 있습니다. 보안상의 이유로 SSH를 통해 터널링하지 않고 VNC에 원격으로 액세스하도록 구성할 수 있지만 보안은 권장되지 않습니다. 게스트를 원격으로 관리하려면 18장. 게스트의 원격 관리 의 지침을 따르십시오. TLS는 게스트 및 호스트 시스템을 관리하기 위한 엔터프라이즈급 보안을 제공할 수 있습니다.
로컬 데스크탑은 키 조합(예: Ctrl+Alt+F1)을 가로채서 게스트 시스템으로 전송되지 않도록 할 수 있습니다. 키 보내기 메뉴 옵션을 사용하여 이러한 시퀀스를 보낼 수 있습니다. 게스트 머신 창에서 키 보내기 메뉴를 클릭하고 보낼 키 시퀀스를 선택합니다. 또한 이 메뉴에서는 화면 출력을 캡처할 수도 있습니다.
SPICE는 Red Hat Enterprise Linux에 사용할 수 있는 VNC의 대안입니다.

19.5. 원격 연결 추가

다음 절차에서는 virt-manager 를 사용하여 원격 시스템에 대한 연결을 설정하는 방법을 설명합니다.
  1. 새 연결을 만들려면 파일 메뉴를 열고 연결 추가 메뉴 항목을 선택합니다.
  2. 연결 추가 마법사가 나타납니다. 하이퍼바이저를 선택합니다. Red Hat Enterprise Linux 7 시스템의 경우 QEMU/KVM 을 선택합니다. 로컬 시스템 또는 원격 연결 옵션 중 하나에 대해 Local 을 선택하고 연결을 클릭합니다. 이 예에서는 기본 설치에서 작동하는 SSH를 통한 원격 터널을 사용합니다. 원격 연결 구성에 대한 자세한 내용은 다음을 참조하십시오. 18장. 게스트의 원격 관리

    그림 19.10. 연결 추가

    연결 추가
  3. 메시지가 표시되면 선택한 호스트의 root 암호를 입력합니다.
이제 원격 호스트가 연결되고 주요 virt-manager 창에 표시됩니다.

그림 19.11. 주요 virt-manager 창에서 원격 호스트

주요 virt-manager 창에서 원격 호스트

19.6. 게스트 세부 정보 표시

가상 머신 모니터를 사용하여 시스템의 모든 가상 머신에 대한 활동 정보를 볼 수 있습니다.
가상 시스템의 세부 정보를 보려면 다음을 수행합니다.
  1. Virtual Machine Manager 메인 창에서 보려는 가상 머신을 강조 표시합니다.

    그림 19.12. 표시할 가상 머신 선택

    표시할 가상 머신 선택
  2. 가상 머신 관리자 편집 메뉴에서 가상 머신 세부 정보를 선택합니다.
    가상 머신 세부 정보 창이 열리면 콘솔이 표시될 수 있습니다. 이 경우 보기를 클릭한 다음 세부 정보를 선택합니다. 개요 창이 기본적으로 열립니다. 왼쪽 창에 있는 탐색 창에서 개요를 선택합니다.Select Overview from the navigation pane on the left-hand side.
    개요 보기에 게스트에 대한 구성 세부 정보가 요약되어 있습니다.

    그림 19.13. 게스트 세부 정보 개요 표시

    게스트 세부 정보 개요 표시
  3. 왼쪽의 탐색 창에서 CPU 를 선택합니다. CPU 보기를 사용하면 현재 프로세서 할당을 보거나 변경할 수 있습니다.
    가상 머신이 실행되는 동안 가상 CPU(vCPU) 수를 늘릴 수도 있습니다. 이 수는 핫 플러그 라고 합니다.
    중요
    Red Hat Enterprise Linux 7에서는 vCPU의 핫 플러그 해제 가 지원되지 않습니다.

    그림 19.14. 프로세서 할당 패널

    프로세서 할당 패널
  4. 왼쪽의 탐색 창에서 Memory 를 선택합니다. 메모리 보기를 사용하면 현재 메모리 할당을 보거나 변경할 수 있습니다.

    그림 19.15. 메모리 할당 표시

    메모리 할당 표시
  5. 왼쪽의 탐색 창에서 Boot Options 를 선택합니다. Boot Options 보기를 사용하면 호스트가 부팅될 때 가상 머신이 시작되는지 여부와 가상 머신의 부팅 장치 순서에 따라 부팅 옵션을 보거나 변경할 수 있습니다.

    그림 19.16. 부팅 옵션 표시

    부팅 옵션 표시
  6. 가상 머신에 연결된 각 가상 디스크가 탐색 창에 표시됩니다. 가상 디스크를 클릭하여 수정하거나 제거합니다.

    그림 19.17. 디스크 구성 표시

    디스크 구성 표시
  7. 가상 머신에 연결된 각 가상 네트워크 인터페이스가 탐색 창에 표시됩니다. 가상 네트워크 인터페이스를 클릭하여 수정하거나 제거합니다.

    그림 19.18. 네트워크 구성 표시

    네트워크 구성 표시

19.7. 스냅샷 관리

virt-manager 를 사용하면 게스트 스냅샷 을 생성, 실행 및 삭제할 수 있습니다. 스냅샷은 한 시점에서 게스트의 하드 디스크, 메모리 및 장치 상태에 저장된 이미지입니다. 스냅샷이 생성되면 언제든지 게스트를 스냅샷의 구성으로 되돌릴 수 있습니다.
중요
Red Hat은 다른 가상화 툴에서 처리할 때 보다 유연하고 신뢰할 수 있으므로 외부 스냅샷을 사용하는 것이 좋습니다. 그러나 현재 virt-manager 에서 외부 스냅샷을 생성할 수 없습니다.
외부 스냅샷을 생성하려면 --diskspec vda,snapshot=external 옵션과 함께 virsh snapshot-create-as 명령을 사용합니다. 자세한 내용은 A.13절. “libvirt를 사용하여 외부 스냅샷 생성을 위한 해결방법”의 내용을 참조하십시오.
  • virt-manager에서 스냅샷을 관리하려면 게스트 콘솔에서 을 클릭하여 스냅샷 관리 인터페이스를 엽니다.
  • 새 스냅샷을 생성하려면 스냅샷 목록에서 를 클릭합니다. 스냅샷 생성 인터페이스에서 스냅샷 이름을 입력하고 선택적으로 설명을 입력한 후 완료 를 클릭합니다.
  • 게스트를 스냅샷 구성으로 되돌리려면 스냅샷을 선택하고 클릭합니다.
  • 선택한 스냅샷을 제거하려면 클릭합니다.
주의
가상 머신이 실행되는 동안 스냅샷 생성 및 로드(예: 실시간 스냅샷이라고도 함)는 qcow2 디스크 이미지에서만 지원됩니다.
자세한 스냅샷 관리에 대해 virsh snapshot-create 명령을 사용하십시오. virsh 를 사용하여 스냅샷 관리에 대한 자세한 내용은 20.39절. “스냅샷 관리” 을 참조하십시오.

20장. virsh를 사용하여 게스트 가상 머신 관리

virsh 는 게스트 가상 머신을 관리하기 위한 명령줄 인터페이스 도구이며 Red Hat Enterprise Linux 7에서 가상화를 제어하는 주요 수단으로 작동합니다. virsh 명령줄 툴은 libvirt 관리 API를 기반으로 하며 게스트 가상 머신을 생성, 배포, 관리하는 데 사용할 수 있습니다. virsh 유틸리티는 가상화 관리 스크립트를 만드는 데 이상적입니다. 루트 권한이 없는 사용자는 읽기 전용 모드로 사용할 수 있습니다. virsh 패키지는 libvirt-client 패키지의 일부로 yum 과 함께 설치됩니다.
설치 지침은 2.2.1절. “수동으로 가상화 패키지 설치” 에서 참조하십시오. 실제 데모를 포함하여 virsh의 일반적인 소개는 Virtualization Getting Started Guide 를 참조하십시오. 이 장의 나머지 섹션에서는 사용법에 따른 논리적 순서로 virsh 명령 세트를 다룹니다.
참고
도움말을 사용하거나 도움말 페이지를 읽을 때 게스트 가상 머신이라는 용어 대신 'domain'이라는 단어가 사용됩니다. 이 용어는 libvirt 에서 사용하는 용어입니다. 화면 출력이 표시되고 'domain'이라는 단어가 사용되는 경우 게스트 또는 게스트 가상 머신으로 전환되지 않습니다. 모든 예에서는 게스트 가상 시스템 'guest1'이 사용됩니다. 모든 경우에 게스트 가상 머신의 이름으로 교체해야 합니다. 게스트 가상 머신의 이름을 생성할 때는 짧은 정수(0,1,2...), 텍스트 문자열 이름 또는 모든 경우 가상 시스템의 전체 UUID를 사용할 수 있습니다.
중요
사용 중인 사용자를 기록해 두는 것이 중요합니다. 한 사용자를 사용하여 게스트 가상 머신을 생성하는 경우 다른 사용자를 사용하여 해당 사용자에 대한 정보를 검색할 수 없습니다. 이는 virt-manager에서 가상 머신을 생성할 때 특히 중요합니다. 이 경우 기본 사용자는 달리 지정하지 않는 한 root입니다. virsh list --all 명령을 사용하여 가상 머신을 나열할 수 없는 경우가 있는 경우 가상 머신을 생성하는 데 사용한 것과 다른 사용자를 사용하여 명령을 실행하는 경우가 가장 많습니다. 자세한 내용은 중요를 참조하십시오.

20.1. 게스트 가상 머신 상태 및 유형

게스트 가상 머신 상태의 영향을 받는 몇 가지 virsh 명령은 다음과 같습니다.
  • 일시적인 게스트 - 재부팅 후에도 일시 중지되지 않습니다.
  • 영구 - 영구 게스트 가상 머신이 재부팅되고 삭제될 때까지 유지됩니다.
가상 시스템의 라이프 사이클 동안 libvirt 는 게스트를 다음 상태 중 하나로 분류합니다.
  • 정의되지 않음 - 정의되거나 생성되지 않은 게스트 가상 머신입니다. 따라서 libvirt 는 이 상태의 게스트를 인식하지 못하며 이 상태의 게스트 가상 머신에 대해 보고하지 않습니다.
  • shut off - 정의된 게스트 가상 머신이지만 실행되지 않습니다. 영구 게스트만 종료된 것으로 간주할 수 있습니다. 따라서 일시적인 게스트 가상 머신이 이 상태에 배치되면 더 이상 존재하지 않습니다.
  • Running - 이 상태의 게스트 가상 머신이 정의되어 있고 현재 작동 중입니다. 이 상태는 영구 및 임시 게스트 가상 머신과 함께 사용할 수 있습니다.
  • paused - 하이퍼바이저에서 게스트 가상 머신 실행이 일시 중지되었거나 다시 시작될 때까지 해당 상태가 일시적으로 저장되었습니다. 이 상태의 게스트 가상 머신은 일시 중단되었음을 인식하지 못하며 다시 시작될 때 시간이 경과했음을 알 수 없습니다.
  • saved - 이 상태는 paused 상태와 유사하지만 게스트 가상 머신의 구성은 영구 스토리지에 저장됩니다. 이 상태의 게스트 가상 머신은 일시 중지되었음을 인식하지 못하며 복원되면 시간이 경과되었음을 알 수 없습니다.

20.2. virsh 버전 표시

virsh version 명령은 현재 libvirt 버전을 표시하고 로컬 virsh 클라이언트에 대한 정보를 표시합니다. 예를 들면 다음과 같습니다.
virsh version
Compiled against library: libvirt 1.2.8
Using library: libvirt 1.2.8
Using API: QEMU 1.2.8
Running hypervisor: QEMU 1.5.3
virsh version --daemon 은 호스트에서 실행 중인 libvirt 데몬에 대한 정보를 포함하여 libvirtd 버전 및 패키지 정보에 대한 정보를 가져오는 데 유용합니다.
virsh version --daemon
Compiled against library: libvirt 1.2.8
Using library: libvirt 1.2.8
Using API: QEMU 1.2.8
Running hypervisor: QEMU 1.5.3
Running against daemon: 1.2.8

20.3. echo를 사용하여 명령 전송

virsh echo [--shell][--xml] arguments 명령은 지정된 형식으로 지정된 인수를 표시합니다. 사용할 수 있는 형식은 --shell--xml 입니다. 쿼리된 각 인수는 공백으로 구분됩니다. --shell 옵션은 필요한 경우 작은따옴표로 포맷된 출력을 생성하여 명령으로 bash 모드로 복사하고 붙여넣는 데 적합합니다. --xml 인수가 사용되는 경우 출력은 XML 파일에 사용하도록 포맷되어 게스트 구성에 저장되거나 사용할 수 있습니다.

20.4. virsh Connect를 사용하여 하이퍼바이저에 연결

virsh connect [hostname-or-URI] [--readonly] 명령은 virsh를 사용하여 로컬 하이퍼바이저 세션을 시작합니다. 이 명령을 처음 실행하면 virsh 쉘이 실행될 때마다 자동으로 실행됩니다. 하이퍼바이저 연결 URI는 하이퍼바이저에 연결하는 방법을 지정합니다. 가장 일반적으로 사용되는 URI는 다음과 같습니다.
  • QEMU:///system - KVM 하이퍼바이저의 게스트 가상 머신을 감독하는 데몬에 root 사용자로 로컬로 연결합니다.
  • QEMU:///session - KVM 하이퍼바이저를 사용하여 사용자의 게스트 로컬 머신 세트에 로컬로 연결합니다.
  • LXC:/// - 로컬 Linux 컨테이너에 연결합니다.
다음과 같이 명령을 다음과 같이 실행할 수 있습니다. 시스템 이름(hostname) 또는 하이퍼바이저의 URL( virsh socket 명령의 출력)으로 지정된 대상 게스트를 다음과 같이 실행할 수 있습니다.
$ virsh uri
qemu:///session
예를 들어 로컬 사용자로 게스트 가상 머신 세트에 연결할 세션을 설정하려면 다음을 수행합니다.
$ virsh connect qemu:///session
읽기 전용 연결을 시작하려면 --readonly 를 사용하여 위의 명령을 추가합니다. URI에 대한 자세한 내용은 원격 URI 을 참조하십시오. URI가 확실하지 않은 경우 virshSPACE 명령은 다음을 표시합니다.

20.5. 게스트 가상 머신 및 Hypervisor에 대한 정보 표시

virsh list 명령은 요청된 검색 매개변수에 맞는 하이퍼바이저에 연결된 게스트 가상 머신을 나열합니다. 명령 출력에는 테이블에 3개의 열이 있습니다. 각 게스트 가상 머신의 ID, 이름 및 상태가 나열됩니다.
virsh list 에 다양한 검색 매개 변수를 사용할 수 있습니다. 이러한 옵션은 man virsh 를 실행하거나 virsh list --help 명령을 실행하여 도움말 페이지에서 사용할 수 있습니다.
참고
이 명령을 실행하면 root 사용자가 생성한 게스트 가상 시스템만 표시됩니다. 사용자가 생성한 가상 머신이 표시되지 않으면 가상 머신을 root로 생성할 수 없습니다.
virt-manager 인터페이스를 사용하여 생성된 게스트는 기본적으로 root로 생성됩니다.

예 20.1. 로컬로 연결된 모든 가상 머신을 나열하는 방법

다음 예제에서는 하이퍼바이저가 연결된 모든 가상 머신을 나열합니다. 이 명령은 영구 및 임시 가상 머신을 모두 나열합니다.
# virsh list --all

Id              Name                      State
------------------------------------------------
8		guest1			running
22		guest2			paused
35		guest3			shut off
38              guest4			shut off

예 20.2. 비활성 게스트 가상 머신을 나열하는 방법

다음 예제에서는 현재 비활성화되었거나 실행되지 않는 게스트를 나열합니다. 목록에는 영구 가상 머신만 포함되어 있습니다.
# virsh list --inactive

Id              Name                      State
------------------------------------------------
35		guest3			shut off
38		guest4			shut off
또한 다음 명령을 사용하여 하이퍼바이저에 대한 기본 정보를 표시할 수도 있습니다.
  • # virsh hostname - 하이퍼바이저의 호스트 이름을 표시합니다. 예를 들면 다음과 같습니다.
    # virsh hostname
    dhcp-2-157.eus.myhost.com
    
  • # virsh sysinfo - 예를 들면 다음과 같이 하이퍼바이저의 시스템 정보의 XML 표현이 표시됩니다.
    # virsh sysinfo
    <sysinfo type='smbios'>
      <bios>
        <entry name='vendor'>LENOVO</entry>
        <entry name='version'>GJET71WW (2.21 )</entry>
    [...]
    

20.6. 가상 머신 시작, 다시 시작 및 복원

20.6.1. 게스트 가상 머신 시작

virsh start domain; [--console] [--paused] [-autodestroy] [--autodestroy] [--force-boot] 명령은 이미 정의되어 있지만 마지막 관리 저장 상태 또는 새 부팅 이후의 상태가 비활성 상태인 비활성 가상 시스템을 시작합니다. 기본적으로 도메인은 virsh managedsave 명령으로 저장되면 도메인이 이전 상태로 복원됩니다. 그렇지 않으면 새로 부팅됩니다. 명령은 다음 인수를 사용할 수 있으며 가상 시스템의 이름이 필요합니다.
  • --console - virsh 를 실행하는 터미널을 도메인의 콘솔 장치에 연결합니다. 실행 수준 3입니다.
  • --paused - 드라이버에서 이를 지원하는 경우 일시 정지 상태에서 게스트 가상 머신을 시작합니다.
  • --autodestroy - virsh 연결이 끊어지면 게스트 가상 머신이 자동으로 삭제됩니다.
  • --bypass-cache - guest 가상 머신이 managedsave에 있는 경우 사용됩니다.
  • --force-boot - 모든 관리 저장 옵션을 삭제하고 새로 부팅됩니다.

예 20.3. 가상 머신 시작 방법

다음 예제에서는 이미 생성했으며 현재 비활성 상태인 guest1 가상 머신을 시작합니다. 또한 명령은 virsh를 실행하는 터미널에 게스트 콘솔을 연결합니다.
# virsh start guest1 --console
Domain guest1 started
Connected to domain guest1
Escape character is ^]

20.6.2. 부팅 시 자동으로 시작하도록 가상 머신 구성

virsh autostart [ -disable] domain 명령은 호스트 시스템이 부팅될 때 게스트 가상 시스템을 자동으로 시작합니다. 이 명령에 --disable 인수를 추가하면 autostart가 비활성화됩니다. 이 경우 게스트는 호스트 물리적 시스템이 부팅될 때 자동으로 시작되지 않습니다.

예 20.4. 호스트 물리적 시스템이 시작될 때 가상 시스템을 자동으로 시작하는 방법

다음 예제에서는 호스트가 부팅될 때 이미 자동으로 시작되도록 생성한 guest1 가상 머신을 설정합니다.
# virsh autostart guest1

20.6.3. 게스트 가상 머신 재부팅

virsh reboot domain [-mode modename] 명령을 사용하여 게스트 가상 시스템을 재부팅합니다. 이 작업은 재부팅을 실행한 후에만 반환되므로 게스트 가상 머신이 실제로 재부팅될 때까지 해당 시점의 시간이 경과할 수 있습니다. 게스트 가상 시스템의 XML 구성 파일의 on_reboot 요소를 수정하여 재부팅 게스트 가상 머신의 동작을 제어할 수 있습니다. 기본적으로 하이퍼바이저는 적절한 종료 방법을 자동으로 선택합니다. 대체 방법을 지정하기 위해 --mode 인수는 acpiagent 가 포함된 쉼표로 구분된 목록을 지정할 수 있습니다. 각 모드를 시도하는 순서는 정의되지 않으며 virsh에 지정된 순서와 관련이 없습니다. 순서를 엄격하게 제어하려면 한 번에 단일 모드를 사용하고 명령을 반복합니다.

예 20.5. 게스트 가상 머신을 재부팅하는 방법

다음 예제에서는 guest1 이라는 게스트 가상 머신을 재부팅합니다. 이 예에서 재부팅은 initctl 메서드를 사용하지만 필요에 맞는 모드를 선택할 수 있습니다.
# virsh reboot guest1 --mode initctl

20.6.4. 게스트 가상 머신 복원

virsh restore <file> [-bypass-cache] [--xml /path/to/file] [-running] [-paused] 명령은 virsh save 명령을 사용하여 이전에 저장한 게스트 가상 머신을 복원합니다. virsh save 명령에 대한 자세한 내용은 20.7.1절. “게스트 가상 머신의 구성 저장” 을 참조하십시오. 복원 작업은 저장된 게스트 가상 머신을 다시 시작하므로 다소 시간이 걸릴 수 있습니다. 게스트 가상 머신의 이름과 UUID는 보존되지만 ID는 가상 머신이 저장할 때 보유한 ID와 일치하지 않습니다.
virsh restore 명령은 다음 인수를 사용할 수 있습니다.
  • --bypass-cache - 복원을 수행하면 파일 시스템 캐시가 발생하지 않지만 이 플래그를 사용하면 복원 작업이 느려질 수 있습니다.
  • --XML - 이 인수는 XML 파일 이름과 함께 사용해야 합니다. 이 인수는 일반적으로 생략되지만 도메인 XML의 호스트 특정 부분에만 변경 사항이 있는 복원된 게스트 가상 시스템에서 사용할 대체 XML 파일을 제공하는 데 사용할 수 있습니다. 예를 들어 게스트가 저장된 후 가져온 디스크 스냅샷으로 인해 기본 스토리지의 파일 이름 차이를 설명하는 데 사용할 수 있습니다.
  • --running - 저장 이미지에 기록된 상태를 재정의하여 게스트 가상 머신을 실행 중으로 시작합니다.
  • --paused - 저장 이미지에 기록된 상태를 재정의하여 게스트 가상 머신을 일시 중지됨으로 시작합니다.

예 20.6. 게스트 가상 머신을 복원하는 방법

다음 예제에서는 게스트 가상 머신과 실행 중인 구성 파일 guest1-config.xml 을 복원합니다.
# virsh restore guest1-config.xml --running

20.6.5. 게스트 가상 머신 재시작

virsh resume domain 명령은 일시 중단된 도메인의 CPU를 다시 시작합니다. 이 작업은 즉각적입니다. 게스트 가상 머신은 일시 중단된 시점에서 실행을 다시 시작합니다. 이 작업은 정의되지 않은 게스트 가상 머신을 재시작하지 않습니다. 이 작업은 임시 가상 머신을 재시작하지 않으며 영구 가상 머신에서만 작동합니다.

예 20.7. 일시 중단된 게스트 가상 머신을 복원하는 방법

다음 예제에서는 guest1 가상 머신을 복원합니다.
# virsh resume guest1

20.7. 가상 머신 구성 관리

이 섹션에서는 가상 머신 구성 관리에 대한 정보를 제공합니다.

20.7.1. 게스트 가상 머신의 구성 저장

virsh save [-bypass-cache] domain file [--xml string] [--paused] [--paused] 명령은 지정된 도메인을 중지하여 게스트 가상 시스템의 시스템 메모리의 현재 상태를 지정된 파일에 저장합니다. 게스트 가상 머신에서 사용하는 메모리 크기에 따라 상당한 시간이 걸릴 수 있습니다. virsh restore (20.6.4절. “게스트 가상 머신 복원”) 명령을 사용하여 게스트 가상 머신의 상태를 복원할 수 있습니다.
virsh save 명령과 virsh suspend 명령의 차이점은 virsh가 도메인 CPU를 중지 하지만, 도메인의 qemu 프로세스는 실행 중이고 호스트 시스템에 상주하는 메모리 이미지를 남겨 두는 것입니다. 호스트 시스템이 재부팅되면 이 메모리 이미지가 손실됩니다.
virsh save 명령은 도메인 상태를 호스트 시스템의 하드 디스크에 저장하고 qemu 프로세스를 종료합니다. 이렇게 하면 저장된 상태에서 도메인을 다시 시작할 수 있습니다.
virsh domjobinfo 명령을 사용하여 virsh save 프로세스를 모니터링하고 virsh domjobabort 명령으로 취소할 수 있습니다.
virsh save 명령은 다음 인수를 사용할 수 있습니다.
  • --bypass-cache - 복원을 수행하면 파일 시스템 캐시가 발생하지 않지만 이 플래그를 사용하면 복원 작업이 느려질 수 있습니다.
  • --XML - 이 인수는 XML 파일 이름과 함께 사용해야 합니다. 이 인수는 일반적으로 생략되지만 도메인 XML의 호스트 특정 부분에만 변경 사항이 있는 복원된 게스트 가상 시스템에서 사용할 대체 XML 파일을 제공하는 데 사용할 수 있습니다. 예를 들어 게스트가 저장된 후 가져온 디스크 스냅샷으로 인해 기본 스토리지의 파일 이름 차이를 설명하는 데 사용할 수 있습니다.
  • --running - 저장 이미지에 기록된 상태를 재정의하여 게스트 가상 머신을 실행 중으로 시작합니다.
  • --paused - 저장 이미지에 기록된 상태를 재정의하여 게스트 가상 머신을 일시 중지됨으로 시작합니다.
  • --verbose - 저장 진행 상황을 표시합니다.

예 20.8. How to save a guest virtual machine running configuration

다음 예제에서는 guest1 가상 머신의 실행 중인 구성을 guest1-config.xml 파일에 저장합니다.
# virsh save guest1 guest1-config.xml --running

20.7.2. XML 파일을 사용하여 게스트 가상 머신 정의

virsh 는 XML 파일에서 게스트 가상 머신을 정의합니다. 이 경우 게스트 가상 머신 정의는 등록되었지만 시작되지 않습니다. guest 가상 머신이 이미 실행 중인 경우 도메인이 종료되고 다시 시작되면 변경 사항이 적용됩니다.

예 20.9. XML 파일에서 게스트 가상 머신을 만드는 방법

다음 예제에서는 가상 머신 구성이 포함된 기존 guest1-config.xml XML 파일에서 가상 머신을 생성합니다.
# virsh define guest1-config.xml

20.7.3. 게스트 가상 머신 복원에 사용할 XML 파일 업데이트

참고
이 명령은 게스트 가상 머신이 제대로 실행되지 않는 상황에서 복구하는 데만 사용해야 합니다. 이는 일반적인 사용을 위한 것이 아닙니다.
virsh save-image-define filename [--xml /path/to/file] [--running] [-paused] 명령은 virsh restore 명령 중에 가상 머신을 복원할 때 사용할 게스트 가상 머신의 XML 파일을 업데이트합니다. --xml 인수는 게스트 가상 머신의 XML에 대한 대체 XML 요소가 포함된 XML 파일 이름이어야 합니다. 예를 들어 게스트가 저장된 후 기본 스토리지의 디스크 스냅샷 생성으로 인한 파일 이름 지정 차이를 설명하는 데 사용할 수 있습니다. 게스트 가상 머신을 실행 중이거나 일시 중지됨 상태로 복원해야 하는 경우 저장 이미지 레코드입니다. --running 또는 --paused 인수를 사용하면 사용할 상태가 지정됩니다.

예 20.10. 게스트 가상 머신의 실행 중인 구성을 저장하는 방법

다음 예제에서는 guest1-config.xml 구성 파일을 실행 중인 게스트의 상태로 업데이트합니다.
# virsh save-image-define guest1-config.xml --running

20.7.4. 게스트 가상 머신 XML 파일 추출

참고
이 명령은 게스트 가상 머신이 제대로 실행되지 않는 상황에서 복구하는 데만 사용해야 합니다. 이는 일반적인 사용을 위한 것이 아닙니다.
virsh save-image-dumpxml 파일 --security-info 명령은 저장된 상태 파일( virsh save 명령에서 사용)이 참조되었을 때 적용되는 게스트 가상 머신 XML 파일을 추출합니다. security -info 인수를 사용하면 파일에 중요한 보안 정보가 포함됩니다.

예 20.11. 마지막 저장소에서 XML 구성을 가져오는 방법

다음 예제에서는 게스트 가상 머신을 마지막으로 저장할 때 생성된 구성 파일의 덤프를 트리거합니다. 이 예에서 결과 덤프 파일의 이름은 guest1-config-xml 입니다.
# virsh save-image-dumpxml guest1-config.xml

20.7.5. 게스트 가상 머신 구성 편집

참고
이 명령은 게스트 가상 머신이 제대로 실행되지 않는 상황에서 복구하는 데만 사용해야 합니다. 이는 일반적인 사용을 위한 것이 아닙니다.
virsh save-image-edit <file> [--running ][-paused] 명령은 virsh save 명령으로 생성된 XML 구성 파일을 편집합니다. virsh save 명령에 대한 자세한 내용은 20.7.1절. “게스트 가상 머신의 구성 저장” 을 참조하십시오.
게스트 가상 머신이 저장되면 결과 이미지 파일은 가상 머신을 --running 또는 --paused 상태로 복원해야 하는지를 나타냅니다. save-image-edit 명령에서 이러한 인수를 사용하지 않으면 이미지 파일 자체에 의해 상태가 결정됩니다. --running (실행 중 상태 선택) 또는 --paused (중지됨 상태 선택)를 선택하여 virsh restore 가 사용해야 하는 상태를 덮어쓸 수 있습니다.

예 20.12. 게스트 가상 머신 구성을 편집하고 머신을 실행 상태로 복원하는 방법

다음 예제에서는 기본 편집기에서 편집하기 위해 guest1-config.xml 이라는 게스트 가상 머신 구성 파일을 엽니다. 편집이 저장되면 가상 머신이 새 설정으로 부팅됩니다.
# virsh save-image-edit guest1-config.xml --running

20.8. 게스트 가상 머신 종료, 종료, 재부팅 및 종료

20.8.1. 게스트 가상 머신 종료

virsh shutdown domain [-mode modename] 명령은 게스트 가상 머신을 종료합니다. 게스트 가상 머신의 구성 파일에서 on_shutdown 매개변수를 수정하여 게스트 가상 머신이 재부팅되는 방식을 제어할 수 있습니다. on_shutdown 매개 변수를 변경하면 도메인이 종료되고 다시 시작된 후에만 적용됩니다.
virsh shutdown 명령은 다음과 같은 선택적 인수를 사용할 수 있습니다.
  • --mode 는 종료 모드를 선택합니다. acpi,agent,initctl,signal 또는 Paravirt 일 수 있습니다.

예 20.13. 게스트 가상 머신을 종료하는 방법

다음 예제에서는 acpi 모드를 사용하여 guest1 가상 머신을 종료합니다.
# virsh shutdown guest1 --mode acpi
Domain guest1 is being shutdown

20.8.2. 게스트 가상 머신 일시 중지

virsh suspend domain 명령은 게스트 가상 머신을 일시 중지합니다.
게스트 가상 머신이 일시 중단된 상태인 경우 시스템 RAM을 사용하지만 프로세서 리소스는 사용하지 않습니다. 게스트 가상 머신이 일시 중단되는 동안 디스크 및 네트워크 I/O가 발생하지 않습니다. 이 작업은 즉각적이고 guest 가상 시스템은 virsh resume 명령으로만 다시 시작할 수 있습니다. 임시 가상 머신에서 이 명령을 실행하면 삭제됩니다.

예 20.14. 게스트 가상 머신 일시 중단 방법

다음 예제에서는 guest1 가상 머신을 일시 중지합니다.
# virsh suspend guest1

20.8.3. 가상 머신 재설정

virsh reset domain 은 게스트 가상 시스템을 게스트 종료하지 않고 즉시 재설정합니다. 재설정은 시스템의 reset 버튼을 에뮬레이션합니다. 여기서 모든 게스트 하드웨어는 RST 라인을 보고 내부 상태를 다시 초기화합니다. 게스트 가상 시스템 OS 종료가 없으면 데이터 손실 위험이 있습니다.
참고
가상 시스템을 재설정해도 보류 중인 도메인 구성 변경 사항은 적용되지 않습니다. 도메인 구성에 대한 변경은 완전히 종료한 후 도메인을 다시 시작한 후에만 적용됩니다.

예 20.15. 게스트 가상 머신을 재설정하는 방법

다음 예제에서는 guest1 가상 머신을 재설정합니다.
# virsh reset guest1

20.8.4. 실행 중인 게스트 가상 머신을 순서대로 중지하여 다시 시작

virsh managedsave domain --bypass-cache --running | --paused | --verbose 명령은 나중에 동일한 상태에서 다시 시작할 수 있도록 실행 중인 게스트 가상 시스템을 저장하고 제거(중지)합니다. virsh start 명령과 함께 사용하면 이 저장 지점에서 자동으로 시작됩니다. 이 인수를 --bypass-cache 인수와 함께 사용하는 경우 저장은 파일 시스템 캐시를 사용하지 않습니다. 이 옵션은 저장 프로세스 속도가 느려질 수 있으며 --verbose 옵션을 사용하면 덤프 프로세스의 진행 상황을 표시할 수 있습니다. 정상적인 조건에서 관리 저장은 저장이 완료되면 게스트 가상 머신의 상태에 따라 실행 중이거나 일시 정지됨 상태를 결정할 수 있습니다. 그러나 --running 옵션을 사용하여 실행 중 상태에 남아 있거나 일시 정지됨을 나타내는 --paused 옵션을 사용하여 재정의할 수 있습니다. 관리형 저장 상태를 제거하려면 virsh managedsave-remove 명령을 사용하여 게스트 가상 시스템에서 다음에 시작할 때 전체 부팅을 수행하도록 합니다. 전체 관리 저장 프로세스는 domjobinfo 명령을 사용하여 모니터링할 수 있으며 domjobabort 명령을 사용하여 취소할 수도 있습니다.

예 20.16. 실행 중인 게스트를 중지하고 구성을 저장하는 방법

다음 예제에서는 guest1 가상 머신을 중지하고 실행 중인 구성 설정을 다시 시작할 수 있도록 저장합니다.
# virsh managedsave guest1 --running

20.9. 가상 머신 제거 및 삭제

20.9.1. 가상 머신 분리

virsh undefine domain [-managed-save] [--remove-all-storage] [-wipe-storage] [-wipe-storage] [--snapshots-metadata] [--nvram] 명령은 도메인을 정의하지 않습니다. domain이 비활성 상태이면 구성이 완전히 제거됩니다. 도메인이 활성 상태(실행 중)인 경우 일시적인 도메인으로 변환됩니다. 게스트 가상 머신이 비활성화되면 구성이 완전히 제거됩니다.
이 명령은 다음 인수를 사용할 수 있습니다.
  • --managed-save - 이 인수를 사용하면 관리형 저장 이미지도 정리됩니다. 이 인수를 사용하지 않으면 Save를 사용하여 게스트 가상 머신을 정의 해제하려고 하면 실패합니다.
  • --snapshots-metadata - 이 인수를 사용하면 비활성 게스트 가상 머신을 정의할 때 스냅샷과 같이 스냅샷(스냅샷 목록 )도 정리됩니다. 스냅샷 메타데이터가 있는 비활성 게스트 가상 머신을 정의 해제하려고 하면 실패합니다. 이 인수가 사용되고 게스트 가상 머신이 활성화된 경우 무시됩니다.
  • --storage - 이 인수를 사용하려면 정의되지 않은 도메인과 함께 제거할 볼륨 대상 이름 또는 스토리지 볼륨의 소스 경로 목록이 필요합니다. 이 작업은 스토리지 볼륨이 제거되기 전에 해제됩니다. 이 작업은 비활성 게스트 가상 시스템에서만 수행할 수 있으며, 이 작업은 libvirt 에서 관리하는 스토리지 볼륨에서만 작동합니다.
  • --remove-all-storage - 게스트 가상 머신의 연결을 해제하는 것 외에도 연결된 모든 스토리지 볼륨이 삭제됩니다. 가상 머신을 삭제하려면 동일한 연결된 스토리지를 사용하는 다른 가상 머신이 없는 경우에만 이 옵션을 선택합니다. 또 다른 방법은 virsh vol-delete 를 사용하는 것입니다. 자세한 내용은 20.31절. “스토리지 볼륨 삭제”를 참조하십시오.
  • --wipe-storage - 스토리지 볼륨을 삭제하는 것 외에도 콘텐츠가 지워집니다.

예 20.17. 게스트 가상 머신을 삭제하고 스토리지 볼륨을 삭제하는 방법

다음 예제에서는 guest1 가상 머신을 분리하고 연결된 모든 스토리지 볼륨을 제거합니다. 정의되지 않은 게스트가 일시 중지되므로 종료 후 삭제됩니다.
# virsh undefine guest1 --remove-all-storage

20.9.2. 게스트 가상 머신 강제 중지

참고
이 명령은 다른 방법으로 가상 게스트 시스템을 종료할 수 없는 경우에만 사용해야 합니다.
virsh destroy 명령은 즉시 비정상적인 종료를 시작하고 지정된 게스트 가상 시스템을 중지합니다. virsh destroy 을 사용하면 게스트 가상 머신 파일 시스템이 손상될 수 있습니다. guest 가상 머신이 응답하지 않는 경우에만 virsh destroy 명령을 사용하십시오. graceful 옵션을 사용하여 virsh destroy 명령을 실행하면 가상 머신의 전원을 끄기 전에 디스크 이미지 파일의 캐시를 플러시하려고 합니다.

예 20.18. 하드 종료로 게스트 가상 머신을 즉시 종료하는 방법

다음 예제에서는 응답하지 않기 때문에 guest1 가상 머신을 즉시 종료합니다.
# virsh destroy guest1
virsh undefine 명령을 사용하여 이 작업을 수행할 수 있습니다. 보기 예 20.17. “게스트 가상 머신을 삭제하고 스토리지 볼륨을 삭제하는 방법”

20.10. 게스트 가상 머신의 직렬 콘솔 연결

virsh 콘솔 도메인 [- devname devicename] [--force] [- safe] 명령은 게스트 가상 시스템의 가상 직렬 콘솔을 연결합니다. 이는 VNC 또는 SPICE 프로토콜을 제공하지 않는 게스트에 매우 유용하며(그래서 GUI 툴을위한 비디오 디스플레이를 제공하지 않음) 네트워크 연결이 없습니다(따라서 SSH를 사용하여 상호 작용할 수 없음).
선택 사항인 --devname 매개 변수는 게스트 가상 머신에 구성된 대체 콘솔, 직렬 또는 병렬 장치의 장치 별칭을 나타냅니다. 이 매개 변수를 생략하면 기본 콘솔이 열립니다. --safe 옵션을 지정하면 드라이버가 안전한 콘솔 처리를 지원하는 경우에만 연결이 시도됩니다. 이 옵션은 서버가 콘솔 장치에 대한 배타적 액세스를 보장해야 함을 지정합니다. 선택적으로 force 옵션을 지정하면 손상된 연결 경우와 같이 기존 세션의 연결을 끊도록 요청할 수 있습니다.

예 20.19. 콘솔 모드에서 게스트 가상 머신을 시작하는 방법

다음 예제에서는 안전한 콘솔 처리를 사용하여 직렬 콘솔에 연결하도록 이전에 생성된 guest1 가상 머신을 시작합니다.
# virsh console guest1 --safe

20.11. 마스크 불가능 상호 작용

virsh inject-nmi 도메인 은 게스트 가상 머신에 NMI(Non-maskable interrupt) 메시지를 삽입합니다. 이는 복구할 수 없는 하드웨어 오류와 같이 응답 시간이 중요한 경우 사용됩니다. 또한 virsh inject-nmi 는 Windows 게스트에서 크래시dump를 트리거하는 데 유용합니다.

예 20.20. 게스트 가상 머신에 NMI를 삽입하는 방법

다음 예제에서는 NMI를 guest1 가상 머신으로 보냅니다.
# virsh inject-nmi guest1

20.12. 가상 머신에 대한 정보 검색

20.12.1. 장치 블록 통계 표시

기본적으로 virsh domblkstat 명령은 도메인에 정의된 첫 번째 블록 장치에 대한 블록 통계를 표시합니다. 다른 블록 장치의 통계를 보려면 virsh domblklist domain 명령을 사용하여 모든 블록 장치를 나열한 다음 특정 블록 장치를 선택하고 도메인 이름 뒤에 virsh domblklist 명령 출력에서 Target 또는 Source 이름을 지정하여 표시합니다. 모든 하이퍼바이저가 모든 필드를 표시할 수 있는 것은 아닙니다. 출력이 가장 이해하기 쉬운 형식으로 표시되도록 --human 인수를 사용합니다.

예 20.21. 게스트 가상 머신에 대한 블록 통계를 표시하는 방법

다음 예제에서는 guest1 가상 시스템에 정의된 장치를 표시한 다음 해당 장치에 대한 블록 통계를 나열합니다.
# virsh domblklist guest1

Target     Source
------------------------------------------------
vda        /VirtualMachines/guest1.img
hdc        -

# virsh domblkstat guest1 vda --human
Device: vda
 number of read operations:      174670
 number of bytes read:           3219440128
 number of write operations:     23897
 number of bytes written:        164849664
 number of flush operations:     11577
 total duration of reads (ns):   1005410244506
 total duration of writes (ns):  1085306686457
 total duration of flushes (ns): 340645193294

20.12.2. 네트워크 인터페이스 통계 검색

virsh domifstat 도메인 interface-device 명령은 지정된 게스트 가상 시스템에서 실행되는 지정된 장치에 대한 네트워크 인터페이스 통계를 표시합니다.
도메인에 대해 정의된 인터페이스 장치를 확인하려면 virsh domiflist 명령을 사용하여 Interface 열에서 출력을 사용합니다.

예 20.22. 게스트 가상 머신에 대한 네트워킹 통계를 표시하는 방법

다음 예제에서는 guest1 가상 시스템에 정의된 네트워킹 인터페이스를 가져온 다음 가져온 인터페이스(macvtap0)에 네트워킹 통계를 표시합니다.
# virsh domiflist guest1
Interface  Type       Source     Model       MAC
-------------------------------------------------------
macvtap0   direct     em1        rtl8139     12:34:00:0f:8a:4a
# virsh domifstat guest1 macvtap0
macvtap0 rx_bytes 51120
macvtap0 rx_packets 440
macvtap0 rx_errs 0
macvtap0 rx_drop 0
macvtap0 tx_bytes 231666
macvtap0 tx_packets 520
macvtap0 tx_errs 0
macvtap0 tx_drop 0

20.12.5. 네트워크 인터페이스 Bandwidth 매개변수 설정

virsh domiftune 도메인 interface-device 명령은 지정된 도메인의 인터페이스 대역폭 매개 변수를 검색하거나 설정합니다. 도메인에 정의된 인터페이스 장치를 확인하려면 virsh domiflist 명령을 사용하여 Interface 또는 MAC 열을 인터페이스 장치 옵션으로 사용합니다. 다음 형식을 사용해야 합니다.
# virsh domiftune domain interface [--inbound] [--outbound] [--config] [--live] [--current]
--config,--live--current 옵션은 20.43절. “스케줄 매개변수 설정” 에 설명되어 있습니다. --inbound 또는 --outbound 옵션이 지정되지 않은 경우 virsh domiftune 은 지정된 네트워크 인터페이스를 쿼리하고 대역폭 설정을 표시합니다. --inbound 또는 --outbound 또는 둘 다를 지정하고 average, peak, burst 값을 지정하면 virsh domiftune 이 대역폭 설정을 설정합니다. 최소한 평균값이 필요합니다. 대역폭 설정을 지우려면 0(0)을 지정합니다. 평균, 최대 값 및 버스트 값에 대한 설명은 20.27.6.2절. “인터페이스 장치 연결” 을 참조하십시오.

예 20.25. 게스트 가상 머신 네트워크 인터페이스 매개 변수를 설정하는 방법

다음 예제에서는 guest1 이라는 게스트 가상 머신에 대해 eth0 매개 변수를 설정합니다.
# virsh domiftune guest1 eth0 outbound --live

20.12.6. 메모리 통계 검색

virsh dommemstat 도메인 [<period in seconds>] [-config] [-live] [-current] 명령은 실행 중인 게스트 가상 시스템에 대한 메모리 통계를 표시합니다. 선택적 마침표 스위치를 사용하려면 시간(초)이 필요합니다. 이 옵션을 0보다 큰 값으로 설정하면 balloon 드라이버가 후속 dommemstat 명령을 실행하여 표시되는 추가 통계를 반환할 수 있습니다. period 옵션을 0으로 설정하면 balloon 드라이버 수집이 중지되지만 balloon 드라이버에서 이미 있는 통계는 지우지 않습니다. period 옵션도 설정하지 않고 --live,--config 또는 --current 옵션을 사용할 수 없습니다. --live 옵션이 지정된 경우 게스트의 실행 중인 통계만 수집됩니다. --config 옵션을 사용하면 영구 게스트에 대한 통계가 수집되지만 다음 부팅 후에만 사용됩니다. --current 옵션을 사용하면 현재 통계를 수집합니다.
--live--config 옵션을 모두 사용할 수 있지만 --current 는 배타적입니다. 플래그를 지정하지 않으면 게스트 상태가 통계 컬렉션의 동작을 지시합니다(실행 중 또는 아님).

예 20.26. 실행 중인 게스트 가상 머신에 대한 메모리 통계를 수집하는 방법

다음 예제에서는 rhel7 도메인에 메모리 통계를 표시하는 방법을 보여줍니다.
# virsh dommemstat rhel7
actual 1048576
swap_in 0
swap_out 0
major_fault 2974
minor_fault 1272454
unused 246020
available 1011248
rss 865172

20.12.7. 블록 장치에 오류 표시

virsh domblkerror domain 명령은 오류 상태의 모든 블록 장치와 각각에 감지된 오류를 나열합니다. 이 명령은 virsh domstate 명령으로 I/O 오류로 인해 게스트 가상 머신이 일시 중지되었다고 보고한 후에 가장 잘 사용됩니다.

예 20.27. 가상 머신의 블록 장치 오류를 표시하는 방법

다음 예제는 guest1 가상 머신에 대한 블록 장치 오류를 표시합니다.
# virsh domblkerror guest1

20.12.8. 블록 장치 크기 표시

virsh domblkinfo domain 명령은 가상 시스템의 특정 블록 장치에 대한 용량, 할당, 물리적 블록 크기를 나열합니다. virsh domblklist 명령을 사용하여 모든 블록 장치를 나열한 다음 도메인 이름 뒤에 virsh domblklist 출력에서 Target 또는 Source 이름을 지정하여 특정 블록 장치를 표시하도록 선택합니다.

예 20.28. 블록 장치 크기를 표시하는 방법

이 예에서는 rhel7 가상 시스템의 블록 장치를 나열한 다음 각 장치의 블록 크기를 표시합니다.
# virsh domblklist rhel7
Target     Source
------------------------------------------------
vda        /home/vm-images/rhel7-os
vdb        /home/vm-images/rhel7-data

# virsh domblkinfo rhel7 vda
Capacity:       10737418240
Allocation:     8211980288
Physical:       10737418240

# virsh domblkinfo rhel7 /home/vm-images/rhel7-data
Capacity:       104857600
Allocation:     104857600
Physical:       104857600

20.12.9. 게스트 가상 머신과 연결된 블록 장치 표시

virsh domblklist domain [- inactive ][-details] 명령은 지정된 게스트 가상 시스템과 연결된 모든 블록 장치의 테이블을 표시합니다.
--inactive 가 지정된 경우 다음 부팅 시 사용할 장치가 표시되고 실행 중인 게스트 가상 머신에서 현재 실행 중인 장치가 표시되지 않습니다. --details 가 지정되면 디스크 유형 및 장치 값이 표에 포함됩니다. 이 표에 표시된 정보는 virsh domblkinfovirsh snapshot-create 와 같이 블록 장치를 제공해야 하는 다른 명령과 함께 사용할 수 있습니다. virsh snapshot-create 명령에 xmlfile 컨텍스트 정보를 생성할 때 디스크 대상 또는 소스 컨텍스트를 사용할 수도 있습니다.

예 20.29. 가상 머신과 연결된 블록 장치를 표시하는 방법

다음 예제에서는 rhel7 가상 시스템과 연결된 블록 장치에 대한 세부 정보를 표시합니다.
# virsh domblklist rhel7 --details
Type       Device     Target     Source
------------------------------------------------
file       disk       vda        /home/vm-images/rhel7-os
file       disk       vdb        /home/vm-images/rhel7-data

20.12.10. 게스트 가상 머신과 연결된 가상 인터페이스 표시

virsh domblklist domain 명령은 지정된 도메인과 연결된 모든 가상 인터페이스의 테이블을 표시합니다. virsh domiflist 명령에는 가상 시스템(또는 도메인)의 이름이 필요하며 선택적으로 --inactive 인수를 사용할 수 있습니다. 후자는 실행 중인 구성이 아닌 비활성 상태를 검색하며, 이 구성은 기본 설정으로 검색합니다. --inactive 가 지정된 경우 결과는 다음 부팅 시 사용할 장치를 표시하고 실행 중인 게스트에서 현재 사용 중인 장치를 표시하지 않습니다. 가상 인터페이스의 MAC 주소가 필요한 virsh 명령(예: detach-interface,domif-setlink, domif-getlink, domifstat, domiftune) 이 명령에서 표시하는 출력을 허용합니다.

예 20.30. 게스트 가상 머신과 연결된 가상 인터페이스를 표시하는 방법

다음 예제에서는 rhel7 가상 시스템과 연결된 가상 인터페이스를 표시한 다음 vnet0 장치에 대한 네트워크 인터페이스 통계를 표시합니다.
# virsh domiflist rhel7
Interface  Type       Source     Model       MAC
-------------------------------------------------------
vnet0      network    default    virtio      52:54:00:01:1d:d0

# virsh domifstat rhel7 vnet0
vnet0 rx_bytes 55308
vnet0 rx_packets 969
vnet0 rx_errs 0
vnet0 rx_drop 0
vnet0 tx_bytes 14341
vnet0 tx_packets 148
vnet0 tx_errs 0
vnet0 tx_drop 0

20.13. 스냅샷 작업

20.13.1. 데이터 복사를 통해 백업 체인 단축

이 섹션에서는 virsh blockcommit 도메인 <path> [<bandwidth>] [<base>] [--shallow] [--active] [--delete] [-wait] [-verbose] [-verbose] [--timeout <을 사용하는 방법을 보여줍니다. number>] [-pivot] [--keep-overlay] [--async] [--keep-relative] 명령을 실행하여 백업 체인을 단축할 수 있습니다. 명령에는 도움말 메뉴 또는 도움말 페이지에 나열된 많은 옵션이 있습니다.
virsh blockcommit 명령은 체인의 한 부분에서 백업 파일로 데이터를 복사하여 커밋된 부분을 우회하기 위해 나머지 체인을 피벗할 수 있습니다. 예를 들어, 이것이 현재 상태라고 가정합니다.
      base ← snap1 ← snap2 ← active.
virsh blockcommit 를 사용하여 snap2의 콘텐츠를 snap1로 이동하여 체인에서 snap2를 삭제하여 백업을 훨씬 더 빠르게 수행할 수 있습니다.

절차 20.1. 백업 체인을 단축하는 방법

  • 다음 명령을 입력하고 guest1 을 게스트 가상 시스템의 이름으로 바꾸고 disk1 을 디스크 이름으로 바꿉니다.
    # virsh blockcommit guest1 disk1 --base snap1 --top snap2 --wait --verbose
    snap2의 내용은 snap1로 이동하여 그 결과는 다음과 같습니다.
    기본 스냅샷 스냅샷1 활성. snap2는 더 이상 유효하지 않으며 삭제할 수 있습니다.
    주의
    virsh blockcommit--base 인수에 종속된 파일(- top 인수에 종속된 파일 제외)에 따라 파일이 손상됩니다. 이 문제를 방지하려면 두 개 이상의 게스트가 공유하는 파일에 변경 사항을 커밋하지 마십시오. --verbose 옵션을 사용하면 화면에 진행률을 인쇄할 수 있습니다.

20.13.2. 이미지를 저장하여 백업 체인 단축

virsh blockpull 는 다음 애플리케이션에서 사용할 수 있습니다.
  1. 백업 이미지 체인의 데이터로 채워 이미지를 병합합니다. 이렇게 하면 이미지 파일 자체가 더 이상 백업 이미지에 의존하지 않고 다음과 같이 표시됩니다.
    • 이전: base.img 활성화
    • after: guest가 base.img를 더 이상 사용하지 않고 Active에는 모든 데이터가 포함됩니다.
  2. 백업 이미지 체인의 일부를 병합합니다. 이는 스냅샷을 최상위 이미지로 병합하는 데 사용할 수 있으며 다음과 같습니다.
    • 이전: 기본 sn1 octetssn2 활성
    • 뒤: base.img가 활성화됨. 이제 active 에는 sn1sn2 의 모든 데이터가 포함되어 있으며 게스트에서 sn1 또는 sn2를 사용하지 않습니다.
  3. 디스크 이미지를 호스트의 새 파일 시스템으로 이동합니다. 게스트가 실행되는 동안 이미지 파일을 이동할 수 있으며 다음과 같이 표시됩니다.
    • 이전 (원본 이미지 파일): /fs1/base.vm.img
    • 이후: /fs2/active.vm.qcow2 는 이제 새 파일 시스템이며 /fs1/base.vm.img 가 더 이상 사용되지 않습니다.
  4. 복사 후 스토리지 마이그레이션을 통해 실시간 마이그레이션에 유용합니다. 디스크 이미지는 실시간 마이그레이션이 완료된 후 소스 호스트에서 대상 호스트로 복사됩니다.
    이 문제는 다음과 같이 발생합니다.This is what happens: 이전:/destination-host/base.vm.img 뒤:/destination-host/active.vm.qcow2./source-host/base.vm.img 가 더 이상 사용되지 않습니다.

절차 20.2. 데이터를 병합하여 백업 체인을 줄이는 방법

  1. virsh blockpull 를 실행하기 전에 스냅샷을 만드는 것이 유용할 수 있습니다. 이렇게 하려면 virsh snapshot-create-as 명령을 사용합니다. 다음 예에서 guest1 을 게스트 가상 머신의 이름으로 바꾸고 snap1 을 스냅샷 이름으로 바꿉니다.
    # virsh snapshot-create-as guest1 snap1 --disk-only
  2. 체인이 다음과 같은 경우: base snap1 octets snap2 active, 다음 명령을 입력하여 guest1 을 게스트 가상 머신의 이름으로, path1 을 디스크의 소스 경로로 바꿉니다(예:/home/username/VirtualMachines/* ).
    # virsh blockpull guest1 path1
    이 명령은 snap1 의 백업 파일을 snap2 에서 활성 상태로 가져옵니다. 기본 snap1은 활성 상태로 만듭니다.
  3. virsh blockpull 가 완료되면 체인에서 추가 이미지를 만든 스냅샷의 libvirt 추적은 더 이상 유용하지 않습니다. 이 명령으로 오래된 스냅샷에서 추적을 삭제하고 guest1을 게스트 가상 머신 이름으로 교체하고 snap1을 스냅샷 이름으로 바꿉니다.
    # virsh snapshot-delete guest1 snap1 --metadata
virsh blockpull 의 추가 애플리케이션은 다음과 같이 수행할 수 있습니다.

예 20.31. 단일 이미지를 병합하고 백업 이미지 체인의 데이터로 채우는 방법

다음 예제에서는 게스트 guest1vda 가상 디스크를 병합하고 백업 이미지 체인의 데이터로 이미지를 채우며 채우기 작업이 완료될 때까지 대기합니다.
# virsh blockpull guest1 vda --wait

예 20.32. 백업 이미지 체인의 일부를 병합하는 방법

다음 예제에서는 /path/to/base.img 디스크 이미지를 기반으로 게스트 guest1 에서 vda 가상 디스크를 병합합니다.
# virsh blockpull guest1 vda /path/to/base.img --base --wait

예 20.33. 디스크 이미지를 호스트의 새 파일 시스템으로 이동하는 방법

디스크 이미지를 호스트의 새 파일 시스템으로 이동하려면 다음 두 명령을 실행합니다. 각 명령에서 guest1 을 게스트 가상 머신의 이름으로 바꾸고 disk1 을 가상 디스크 이름으로 바꿉니다. XML 파일 이름 및 스냅샷의 위치 및 이름에 대한 경로를 변경합니다.
# virsh snapshot-create guest1 --xmlfile /path/to/snap1.xml --disk-only
# virsh blockpull guest1 disk1 --wait

예 20.34. 복사 후 스토리지 마이그레이션에서 실시간 마이그레이션을 사용하는 방법

post-copy 스토리지 마이그레이션을 통해 실시간 마이그레이션을 사용하려면 다음 명령을 입력합니다.
대상에 백업 파일을 호스트의 백업 파일 이름 및 위치로 교체한 다음 명령을 입력합니다.
# qemu-img create -f qcow2 -o backing_file=/source-host/vm.img /destination-host/vm.qcow2
소스에서 다음 명령을 입력하여 guest1 을 게스트 가상 머신 이름으로 교체합니다.
# virsh migrate guest1
대상에 guest1 을 게스트 가상 머신의 이름으로 바꾸고, disk1 을 가상 디스크 이름으로 바꿉니다.
# virsh blockpull guest1 disk1 --wait

20.13.3. 게스트 가상 머신의 블록 장치의 크기 변경

virsh blockresize 명령은 고유한 대상 이름(<target dev="name"/>) 또는 소스 파일(<source file="name"/>)에 해당하는 블록 장치의 절대 경로를 사용하여 게스트 가상 시스템의 블록 장치의 블록 장치의 블록 장치의 크기를 조정하는 데 사용할 수 있습니다. 게스트 가상 머신에 연결된 디스크 장치 중 하나에 적용할 수 있습니다. virsh domblklist 명령을 사용하여 지정된 게스트 가상 시스템과 연결된 모든 블록 장치에 대한 간단한 정보를 보여주는 테이블을 인쇄할 수 있습니다.
참고
라이브 이미지 크기 조정은 항상 이미지의 크기를 조정하지만 게스트에 의해 즉시 선택되지 않을 수 있습니다. 최근 게스트 커널에서는 virtio-blk 장치 크기가 자동으로 업데이트됩니다(이전 커널에는 게스트 재부팅이 필요함). SCSI 장치를 사용하는 경우 명령을 사용하여 게스트에서 수동으로 다시 스캔을 트리거해야 합니다. 이 명령은 echo > /sys/class/scsi_device/0:0:0:0/device/rescan. 또한 IDE를 사용하면 새 크기를 선택하기 전에 게스트를 재부팅해야 합니다.

예 20.35. 게스트 가상 머신 블록 장치의 크기를 조정하는 방법

다음 예제에서는 guest1 가상 머신의 블록 장치의 크기를 90바이트로 조정합니다.
# virsh blockresize guest1 90 B

20.14. 그래프 디스플레이에 연결하기위한 URI 표시

virsh domdisplay 명령을 실행하면 VNC, SPICE 또는 RDP를 통해 게스트 가상 시스템의 그래픽 디스플레이에 연결하는 데 사용할 수 있는 URI가 출력됩니다. 선택 사항인 --type 은 그래픽 표시 유형을 지정하는 데 사용할 수 있습니다. --include-password 인수를 사용하면 SPICE 채널 암호가 URI에 포함됩니다.

예 20.36. SPICE의 URI 표시 방법

다음 예제에서는 가상 시스템 guest1 이 사용 중인 그래픽 디스플레이인 SPICE의 URI를 표시합니다.
# virsh domdisplay --type spice guest1
spice://192.0.2.1:5900
연결 URI에 대한 자세한 내용은 libvirt 업스트림 페이지를 참조하십시오.

20.15. VNC 디스플레이의 IP 주소 및 포트 번호 표시

virsh vncdisplay 명령은 지정된 게스트 가상 머신에 대한 VNC 디스플레이의 IP 주소와 포트 번호를 반환합니다. 게스트에서 정보를 사용할 수 없는 경우 종료 코드 1 이 표시됩니다.
이 명령이 작동하려면 VNC를 게스트의 XML 파일의 devices 요소에서 그래픽 유형으로 지정해야 합니다. 자세한 내용은 23.17.11절. “그래픽 프레임 버퍼” 에서 참조하십시오.

예 20.37. VNC의 IP 주소 및 포트 번호를 표시하는 방법

다음 예제에서는 guest1 가상 머신의 VNC 디스플레이 포트 번호를 표시합니다.
# virsh vncdisplay guest1
127.0.0.1:0

20.16. 사용하지 않는 블록 삭제

virsh domfstrim 도메인 [- 최소 바이트] [--mountpoint mountPoint] 명령은 실행 중인 지정된 게스트 가상 머신 내의 모든 마운트된 파일 시스템에서 fstrim 유틸리티를 호출합니다. 이는 파일 시스템에서 사용하지 않는 블록을 삭제합니다. --minimum 인수를 사용하는 경우 바이트 단위의 크기를 지정해야 합니다. 이 값은 연속된 사용 범위의 길이로 게스트 커널에 전송됩니다. 이 양보다 작은 값은 무시할 수 있습니다. 이 값을 늘리면 파일 시스템이 잘못 분할된 여유 공간이 있는 경쟁이 생성됩니다. 이 경우 모든 블록이 삭제되는 것은 아닙니다. 기본 최소값은 0이며 모든 free 블록이 삭제됩니다. 이 값을 0보다 크게 늘리면 fstrim 작업은 일부 블록이 삭제되지는 않지만 파일 시스템에 대해 더 빨리 완료됩니다. 사용자가 특정 마운트 지점을 트리밍하려는 경우 --mountpoint 인수를 사용해야 하며 마운트 지점을 지정해야 합니다.

예 20.38. 사용하지 않는 블록을 삭제하는 방법

다음 예제에서는 guest1 이라는 게스트 가상 머신에서 실행 중인 파일 시스템을 트리밍합니다.
# virsh domfstrim guest1 --minimum 0

20.17. 게스트 가상 머신 검색 명령

20.17.1. 호스트 물리적 시스템 이름 표시

virsh domhostname domain 명령은 하이퍼바이저에서 게시할 수 있는 지정된 게스트 가상 시스템의 물리적 호스트 이름을 표시합니다.

예 20.39. 호스트 물리적 시스템 이름을 표시하는 방법

다음 예제에서는 하이퍼바이저를 사용할 수 있게 하는 경우 guest1 가상 머신의 호스트 물리적 머신 이름을 표시합니다.
# virsh domhostname guest1

20.17.2. 가상 머신에 대한 일반 정보 표시

virsh dominfo domain 명령은 지정된 게스트 가상 시스템에 대한 기본 정보를 표시합니다. 이 명령은 [- domain] 게스트이름 옵션과 함께 사용할 수도 있습니다.

예 20.40. 게스트 가상 머신에 대한 일반 정보를 표시하는 방법

다음 예제는 guest1 이라는 게스트 가상 머신에 대한 일반 정보를 표시합니다.
# virsh dominfo guest1
Id:             8
Name:           guest1
UUID:           90e0d63e-d5c1-4735-91f6-20a32ca22c40
OS Type:        hvm
State:          running
CPU(s):         1
CPU time:       271.9s
Max memory:     1048576 KiB
Used memory:    1048576 KiB
Persistent:     yes
Autostart:      disable
Managed save:   no
Security model: selinux
Security DOI:   0
Security label: system_u:system_r:svirt_t:s0:c422,c469 (enforcing)

20.17.3. 가상 머신의 ID 번호 표시

virsh 목록에 는 출력에 ID가 포함되어 있지만 virsh domid 도메인>|<ID 는 실행 중인 게스트 가상 시스템의 ID를 표시합니다. 가상 머신을 실행할 때마다 ID가 변경됩니다. 게스트 가상 머신이 종료되면 머신 이름이 일련의 대시('-----')로 표시됩니다. 이 명령은 [- domain guestname] 옵션과 함께 사용할 수도 있습니다.

예 20.41. 가상 머신의 ID 번호를 표시하는 방법

이 명령을 실행하고 사용 가능한 출력을 수신하려면 가상 머신이 실행되어야 합니다. 다음 예제에서는 guest1 가상 머신의 ID 번호를 생성합니다.
# virsh domid guest1
8

20.17.4. 게스트 가상 머신에서 실행 중인 작업 중지

virsh domjobabort domain 명령은 지정된 게스트 가상 시스템에서 현재 실행 중인 작업을 중단합니다. 이 명령은 [- domain guestname] 옵션과 함께 사용할 수도 있습니다.

예 20.42. 게스트 가상 머신에서 실행 중인 작업을 중단하는 방법

이 예에서는 중단하려는 guest1 가상 머신에서 실행되는 작업이 있습니다. 명령을 실행하는 경우 guest1 을 가상 머신의 이름으로 변경합니다.
# virsh domjobabort guest1

20.17.5. 게스트 가상 머신에서 실행 중인 작업에 대한 정보 표시

virsh domjobinfo domain 명령은 마이그레이션 통계를 포함하여 지정된 게스트 가상 시스템에서 실행되는 작업에 대한 정보를 표시합니다. 이 명령은 [- domain guestname] 옵션과 함께 사용하거나 --completed 옵션과 함께 사용하여 최근 완료된 작업의 통계에 대한 정보를 반환할 수도 있습니다.

예 20.43. 통계적 피드백을 표시하는 방법

다음 예제에서는 guest1 가상 머신에 대한 통계 정보를 나열합니다.
# virsh domjobinfo guest1
Job type:         Unbounded
Time elapsed:     1603         ms
Data processed:   47.004 MiB
Data remaining:   658.633 MiB
Data total:       1.125 GiB
Memory processed: 47.004 MiB
Memory remaining: 658.633 MiB
Memory total:     1.125 GiB
Constant pages:   114382
Normal pages:     12005
Normal data:      46.895 MiB
Expected downtime: 0            ms
Compression cache: 64.000 MiB
Compressed data:  0.000 B
Compressed pages: 0
Compression cache misses: 12005
Compression overflows: 0

20.17.6. 게스트 가상 머신의 이름 표시

virsh domname domainID 명령은 ID 또는 UUID가 지정된 이름 게스트 가상 시스템 이름을 표시합니다. virsh list --all 명령도 게스트 가상 시스템의 이름을 표시하지만 이 명령은 게스트의 이름만 나열합니다.

예 20.44. 게스트 가상 머신의 이름을 표시하는 방법

다음 예제에서는 도메인 ID 8 이 있는 게스트 가상 머신의 이름을 표시합니다.
# virsh domname 8
guest1

20.17.7. 가상 머신 상태 표시

virsh domstate domain 명령은 지정된 게스트 가상 시스템의 상태를 표시합니다. --reason 인수를 사용하면 표시된 상태의 이유도 표시됩니다. 이 명령은 상태 이유를 표시하는 --reason 옵션과 함께 [- domain guestname] 옵션과 함께 사용할 수도 있습니다. 명령이 오류를 표시하는 경우 virsh domblkerror 명령을 실행해야 합니다. 자세한 내용은 20.12.7절. “블록 장치에 오류 표시”를 참조하십시오.

예 20.45. 게스트 가상 머신의 현재 상태를 표시하는 방법

다음 예제에서는 guest1 가상 머신의 현재 상태를 표시합니다.
# virsh domstate guest1
running

20.17.8. 가상 머신에 연결 상태 표시

virsh domcontrol 도메인 은 지정된 게스트 가상 머신을 제어하는 데 사용되는 하이퍼바이저의 인터페이스 상태를 표시합니다. OK 또는 Error가 아닌 상태의 경우 제어 인터페이스가 표시된 상태를 입력했기 때문에 경과한 시간(초)도 인쇄됩니다.

예 20.46. 게스트 가상 머신의 인터페이스 상태를 표시하는 방법

다음 예제에서는 guest1 가상 머신 인터페이스의 현재 상태를 표시합니다.
# virsh domcontrol guest1
ok

20.18. QEMU 인수와 도메인 XML로 변환

virsh domxml-from-native 명령은 기존 QEMU 인수 세트를 libvirt에서 사용할 수 있는 도메인 XML 구성 파일로 변환하는 방법을 제공합니다. 이 명령은 libvirt를 통해 관리할 수 있도록 명령줄에서 이전에 시작한 기존 QEMU 게스트를 변환하는 데만 사용됩니다. 따라서 여기에 설명된 방법은 처음부터 새 게스트를 만드는 데 사용해서는 안 됩니다. virsh, virt-install 또는 virt-manager 를 사용하여 새 게스트를 생성해야 합니다. 추가 정보는 libvirt 업스트림 웹 사이트에서 확인할 수 있습니다.

절차 20.3. QEMU 게스트를 libvirt로 변환하는 방법

  1. 다음 예제에서 demo.args 라는 인수 파일(파일 유형 *.args)을 사용하여 QEMU 게스트로 시작합니다.
    $ cat demo.args
    LC_ALL=C
    PATH=/bin
    HOME=/home/test
    USER=test
    LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -monitor pty -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -net none -serial none -parallel none -usb
    
  2. 이 파일을 libvirt에서 게스트를 관리할 수 있도록 도메인 XML 파일로 변환하려면 다음 명령을 입력합니다. qemu-guest1 을 게스트 가상 머신의 이름으로 바꾸고 demo.args 를 QEMU 인수 파일의 파일 이름으로 교체합니다.
    # virsh domxml-from-native qemu-guest1 demo.args
    이 명령은 demo.args 파일을 다음 도메인 XML 파일로 변경합니다.

    그림 20.1. 게스트 가상 머신 새 구성 파일

    
    <domain type='qemu'>
      <uuid>00000000-0000-0000-0000-000000000000</uuid>
      <memory>219136</memory>
      <currentMemory>219136</currentMemory>
      <vcpu>1</vcpu>
      <os>
        <type arch='i686' machine='pc'>hvm</type>
        <boot dev='hd'/>
      </os>
      <clock offset='utc'/>
      <on_poweroff>destroy</on_poweroff>
      <on_reboot>restart</on_reboot>
      <on_crash>destroy</on_crash>
      <devices>
        <emulator>/usr/bin/qemu</emulator>
        <disk type='block' device='disk'>
          <source dev='/dev/HostVG/QEMUGuest1'/>
          <target dev='hda' bus='ide'/>
        </disk>
      </devices>
    </domain>

20.19. virsh dump를 사용하여 게스트 가상 머신 코어의 덤프 파일 생성

게스트 가상 머신 문제 해결 방법 중 하나 ( kdumppvpanic에 추가) virsh dump domain corefilepath [--bypass-cache] {--live | --reset } [--verbose] [--memory-only]--format=format] 명령을 사용하는 것입니다. 그러면 크래시 유틸리티 의 예를 들어 분석할 수 있도록 게스트 가상 시스템의 코어가 포함된 덤프 파일이 생성됩니다.
특히 virsh dump 명령을 실행하면 게스트 가상 머신 코어가 제공하는 코어 파일 경로에 지정된 파일에 덤프됩니다. 일부 하이퍼바이저는 이 작업에 대한 제한을 제공할 수 있으며 사용자가 corefilepath 매개변수에 지정된 파일 및 경로에 대한 적절한 권한을 수동으로 확인해야 할 수 있습니다. 이 명령은 SR-IOV 장치 및 기타 패스스루 장치에서 지원됩니다. 다음 인수가 지원되며 다음과 같은 효과가 있습니다.
  • --bypass-cache - 저장된 파일은 호스트의 파일 시스템 캐시를 우회하지 않습니다. 파일의 내용에는 영향을 미치지 않습니다. 이 옵션을 선택하면 덤프 작업 속도가 느려질 수 있습니다.
  • --live 는 게스트 가상 머신이 계속 실행될 때 파일을 저장하고 게스트 가상 머신을 일시 중지하거나 중지하지 않습니다.
  • --crash 는 덤프 파일을 저장하는 동안 게스트 가상 머신을 일시 정지 상태로 두는 대신 충돌한 상태로 둡니다. 게스트 가상 머신은 "중지"인 이유와 함께 "Shut off"로 나열됩니다.
  • --reset - 덤프 파일이 성공적으로 저장되면 게스트 가상 시스템이 재설정됩니다.
  • --verbose 에서 덤프 프로세스의 진행 상황을 표시
  • --memory-only - 이 옵션을 사용하여 덤프를 실행하면 덤프 파일의 콘텐츠에 게스트 가상 시스템의 메모리 및 CPU 공통 레지스터 파일만 포함하는 덤프 파일이 생성됩니다. 이 옵션은 전체 덤프가 실행되지 않는 경우 사용해야 합니다. 게스트 가상 머신을 실시간으로 마이그레이션할 수 없는 경우(passthrough PCI 장치로 인해)이 발생할 수 있습니다.
    --format=형식 옵션을 사용하여 메모리 전용 덤프를 저장할 수 있습니다. 다음 형식을 사용할 수 있습니다.
    • Elf - 기본 압축하지 않은 형식
    • kdump-zlib - kdump 압축으로 압축된 형식
    • kdump-lzo - LZO 압축으로 kdump 압축 형식
    • kdump-snappy - kdump 압축을 사용한 kdump 압축 형식
    중요
    크래시 유틸리티는 virsh dump 명령의 기본 코어 덤프 파일 형식을 더 이상 지원하지 않습니다. crash 를 사용하여 virsh dump 에서 생성한 코어 덤프 파일을 분석하는 경우 --memory-only 옵션을 사용해야 합니다.
    또한 코어 덤프 파일을 생성할 때 --memory-only 옵션을 사용하여 Red Hat Suport 케이스에 연결해야 합니다.
전체 프로세스는 virsh domjobinfo 명령을 사용하여 모니터링할 수 있으며 virsh domjobabort 명령을 사용하여 취소할 수 있습니다.

예 20.47. virsh를 사용하여 덤프 파일을 만드는 방법

다음 예제에서는 guest1 가상 머신 코어의 덤프 파일을 생성하여 core/file/path.file 파일에 저장한 다음 게스트를 재설정합니다. 이 명령을 사용하는 가장 일반적인 시나리오는 게스트 가상 머신이 제대로 작동하지 않는 경우입니다.
# virsh dump guest1 core/file/path.file --memory-only --reset

20.20. 가상 머신 XML 덤프(구성 파일) 생성

virsh dumpxml 명령은 필요에 따라 사용, 저장 또는 변경할 수 있는 게스트 가상 머신의 XML 구성 파일을 반환합니다.
그런 다음 XML 파일(guest.xml)을 사용하여 게스트 가상 머신을 다시 생성합니다( 20.22절. “게스트 가상 머신의 XML 설정 편집” 참조). 이 XML 구성 파일을 편집하여 추가 장치를 구성하거나 추가 게스트 가상 머신을 배포할 수 있습니다.

예 20.48. 게스트 가상 머신의 XML 파일을 검색하는 방법

다음 예제에서는 guest1 가상 머신의 XML 구성을 검색하고 guest1.xml 파일에 쓴 다음 프로세스가 성공적으로 완료되었는지 확인합니다.
# virsh dumpxml guest1 > guest1.xml
# cat guest1.xml
<domain type='kvm'>
  <name>guest1-rhel6-64</name>
  <uuid>b8d7388a-bbf2-db3a-e962-b97ca6e514bd</uuid>
  <memory>2097152</memory>
  <currentMemory>2097152</currentMemory>
  <vcpu>2</vcpu>
  <os>
    <type arch='x86_64' machine='rhel6.2.0'>hvm</type>
    <boot dev='hd'/>
  </os>
[...]

20.21. 구성 파일에서 게스트 가상 머신 생성

게스트 가상 머신은 XML 구성 파일에서 생성할 수 있습니다. 이전에 생성된 게스트 가상 머신에서 기존 XML을 복사하거나 virsh dumpxml 명령을 사용할 수 있습니다.

예 20.49. XML 파일에서 게스트 가상 머신을 만드는 방법

다음 예제에서는 기존 guest1.xml 구성 파일에서 새 가상 머신을 생성합니다. 시작하기 전에 이 파일이 있어야 합니다. virsh dumpxml 명령을 사용하여 파일을 검색할 수 있습니다. 자세한 내용은 예 20.48. “게스트 가상 머신의 XML 파일을 검색하는 방법” 을 참조하십시오.
# virsh create guest1.xml

20.22. 게스트 가상 머신의 XML 설정 편집

virsh edit 명령을 사용하면 지정된 게스트의 도메인 XML 구성 파일을 편집할 수 있습니다. 이 명령을 실행하면 $EDITOR 쉘 매개 변수로 지정된 텍스트 편집기에서 XML 파일이 열립니다(기본적으로 vi 로 설정).

예 20.50. 게스트 가상 머신의 XML 구성 설정을 편집하는 방법

다음 예제에서는 기본 텍스트 편집기에서 guest1 가상 머신과 연결된 XML 구성 파일을 엽니다.
# virsh edit guest1

20.23. KVM 게스트 가상 머신에 멀티 기능 PCI 장치 추가

KVM 게스트 가상 머신에 다중 기능 PCI 장치를 추가하려면 다음을 수행합니다.
  1. virsh edit guestname 명령을 실행하여 게스트 가상 시스템의 XML 구성 파일을 편집합니다.
  2. <address> 요소에서 multifunction='on' 속성을 추가합니다. 이를 통해 특정 다중 함수 PCI 장치에 다른 기능을 사용할 수 있습니다.
    <disk type='file' device='disk'>
    <driver name='qemu' type='raw' cache='none'/>
    <source file='/var/lib/libvirt/images/rhel62-1.img'/>
    <target dev='vda' bus='virtio'/>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/>
    </disk>
    
    두 함수가 있는 PCI 장치의 경우 XML 구성 파일을 수정하여 첫 번째 장치와 동일한 슬롯 번호와 동일한 두 번째 장치 및 function='0x1 과 다른 함수 번호를 포함합니다. 예를 들면 다음과 같습니다.
    <disk type='file' device='disk'>
    <driver name='qemu' type='raw' cache='none'/>
    <source file='/var/lib/libvirt/images/rhel62-1.img'/>
    <target dev='vda' bus='virtio'/>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/>
    </disk>
    <disk type='file' device='disk'>
    <driver name='qemu' type='raw' cache='none'/>
    <source file='/var/lib/libvirt/images/rhel62-2.img'/>
    <target dev='vdb' bus='virtio'/>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/>
    </disk>
    
  3. lspci 명령을 실행합니다. KVM 게스트 가상 시스템의 출력에는 virtio 블록 장치가 표시됩니다.
    $ lspci
    
    00:05.0 SCSI storage controller: Red Hat, Inc Virtio block device
    00:05.1 SCSI storage controller: Red Hat, Inc Virtio block device
    
    참고
    serialBIOS 애플리케이션은 BIOS 인터페이스와의 호환성을 위해 실제 모드에서 실행됩니다. 이렇게 하면 사용 가능한 메모리 양이 제한됩니다. 결과적으로 foBIOS는 제한된 수의 디스크 만 처리 할 수 ​​있습니다. 현재 지원되는 디스크 수는 다음과 같습니다.
    • virtio-scsi — 64
    • virtio-blk - 4
    • AHCI/sata - 24 (4개의 포트가 모두 연결된 컨트롤러)
    • usb-storage — 4
    이 문제에 대한 해결 방법으로 많은 수의 디스크를 가상 머신에 연결할 때 시스템 디스크에 작은 pci 슬롯 번호가 있는지 확인하십시오. 따라서 screenBIOS는 pci 버스를 스캔할 때 먼저 확인합니다. 디스크당 메모리 오버헤드가 작기 때문에 virtio-blk 대신 virtio-scsi 장치를 사용하는 것도 좋습니다.

20.24. 지정된 게스트 가상 머신에 대한 CPU 통계 표시

virsh cpu-stats domain --total start count 명령은 지정된 게스트 가상 머신에 대한 CPU 통계 정보를 제공합니다. 기본적으로 모든 CPU 및 총 통계가 표시됩니다. --total 옵션은 총 통계만 표시합니다. --count 옵션은 개수 CPU에 대한 통계만 표시합니다.

예 20.51. 게스트 가상 머신에 대한 CPU 통계를 생성하는 방법

다음 예제에서는 guest1 이라는 게스트 가상 머신에 대한 CPU 통계를 생성합니다.
# virsh cpu-stats guest1

CPU0:
	cpu_time           242.054322158 seconds
	vcpu_time          110.969228362 seconds
CPU1:
	cpu_time           170.450478364 seconds
	vcpu_time          106.889510980 seconds
CPU2:
	cpu_time           332.899774780 seconds
	vcpu_time          192.059921774 seconds
CPU3:
	cpu_time           163.451025019 seconds
	vcpu_time           88.008556137 seconds
Total:
	cpu_time           908.855600321 seconds
	user_time           22.110000000 seconds
	system_time         35.830000000 seconds

20.25. 게스트 콘솔의 스크린샷 가져오기

virsh screenshot guestname [imagefilepath] 명령은 현재 게스트 가상 머신 콘솔의 스크린샷을 가져와서 파일에 저장합니다. 파일 경로가 제공되지 않으면 스크린샷이 현재 디렉터리에 저장됩니다. 하이퍼바이저가 게스트 가상 머신에 여러 디스플레이를 지원하는 경우 --screen ID 옵션을 사용하여 캡처할 화면을 지정합니다.

예 20.52. 게스트 머신 콘솔의 스크린샷을 가져오는 방법

다음 예제는 guest1 머신의 콘솔 스크린샷을 가져와서 /home/username/pics/guest1-screen.png 로 저장합니다.
# virsh screenshot guest1 /home/username/pics/guest1-screen.ppm
Screenshot saved to /home/username/pics/guest1-screen.ppm, with type of image/x-portable-pixmap

20.26. 지정된 게스트 가상 머신에 Keystroke Combination 전송

virsh send-key domain --codeset --holdtime keycode 명령을 사용하면 특정 게스트 가상 머신에 키 코드로 시퀀스를 보낼 수 있습니다. 각 키 코드는 숫자 값이거나 아래의 해당 코드 세트에서의 심볼릭 이름일 수 있습니다.
--holdtime 을 지정하면 지정된 양(밀리초)에 대해 각 키 입력이 유지됩니다. --codeset 을 사용하면 코드 세트를 지정할 수 있으며 기본값은 Linux 이지만 다음 옵션이 허용됩니다.
  • Linux - 이 옵션을 선택하면 심볼릭 이름이 해당 Linux 키 상수 매크로 이름과 일치하도록 하고 숫자 값은 Linux 일반 입력 이벤트 하위 시스템에서 제공하는 것입니다.
  • XT - 이것은 XT 키보드 컨트롤러에서 정의한 값을 보냅니다. 기호 이름은 제공되지 않습니다.
  • atset1 - 숫자 값은 AT 키보드 컨트롤러, set1(XT 호환 가능 세트)에 의해 정의된 값입니다. atset1의 확장된 키 코드는 XT 코드 세트의 확장 키 코드와 다를 수 있습니다. 심볼릭 이름은 제공되지 않습니다.
  • atset2 - 숫자 값은 AT 키보드 컨트롤러에서 정의한 값이며 2를 설정합니다. 심볼릭 이름은 제공되지 않습니다.
  • atset3 - 숫자 값은 AT 키보드 컨트롤러에서 정의하는 값이며 3(PS/2 호환 가능)을 설정합니다. 심볼릭 이름은 제공되지 않습니다.
  • os_x - 숫자 값은 OS-X 키보드 입력 하위 시스템에서 정의한 값입니다. 심볼릭 이름은 해당 OS-X 키 상수 매크로 이름과 일치합니다.
  • Xt_kbd - 숫자 값은 Linux KBD 장치에서 정의한 값입니다. 이는 원래 XT 코드 세트에서의 변형이지만 종종 확장 키 코드에 대해 다른 인코딩이 있는 경우가 많습니다. 심볼릭 이름은 제공되지 않습니다.
  • win32 - 숫자 값은 Win32 키보드 입력 하위 시스템에서 정의한 값입니다. 심볼릭 이름은 해당 Win32 키 상수 매크로 이름과 일치합니다.
  • USB - 숫자 값은 키보드 입력을 위해 USB HID 사양으로 정의된 값입니다. 심볼릭 이름은 제공되지 않습니다.
  • IngesterB - 숫자 값은 원시 키 코드를 전송하기 위해 IngesterB 확장에 의해 정의된 값입니다. 이는 XT 코드 세트에서의 변형이지만 확장된 키 코드는 첫 번째 바이트의 높은 비트 대신 두 번째 비트 세트의 낮은 비트를 갖습니다. 심볼릭 이름은 제공되지 않습니다.

예 20.53. 게스트 가상 머신에 키 입력 조합을 보내는 방법

다음 예제에서는 6443 Ctrl,Alt, Delete 를 Linux 인코딩으로 guest1 가상 머신에 전송하고 1초 동안 유지합니다. 이러한 키는 모두 동시에 전송되며 게스트가 임의의 순서로 수신할 수 있습니다.
# virsh send-key guest1 --codeset Linux --holdtime 1000 KEY_LEFTCTRL KEY_LEFTALT KEY_DELETE
참고
여러 개의 키 코드가 지정된 경우 모두 게스트 가상 머신에 동시에 전송되며 따라서 임의의 순서로 수신될 수 있습니다. 별도의 키 코드가 필요한 경우 시퀀스를 전송하려는 순서대로 virsh send-key 명령을 여러 번 실행해야 합니다.

20.27. 호스트 머신 관리

이 섹션에는 호스트 시스템을 관리하는 데 필요한 명령이 포함되어 있습니다(명령에 의해 노드로 참조됨).

20.27.1. 호스트 정보 표시

virsh nodeinfo 명령은 모델 번호, CPU 수, CPU 유형 및 실제 메모리 크기를 포함하여 호스트에 대한 기본 정보를 표시합니다. 출력은 virNodeInfo 구조에 해당합니다. 특히 "CPU 소켓" 필드는 NUMA 셀당 CPU 소켓 수를 나타냅니다.

예 20.54. 호스트 시스템에 대한 정보를 표시하는 방법

다음 예제에서는 호스트에 대한 정보를 검색합니다.
$ virsh nodeinfo
CPU model:           x86_64
CPU(s):              4
CPU frequency:       1199 MHz
CPU socket(s):       1
Core(s) per socket:  2
Thread(s) per core:  2
NUMA cell(s):        1
Memory size:         3715908 KiB

20.27.2. NUMA 매개변수 설정

virsh numatune 명령은 지정된 게스트 가상 머신에 대한 NUMA 매개변수를 설정하거나 검색할 수 있습니다. 게스트 가상 머신의 구성 XML 파일 내에서 이러한 매개변수는 <numatune> 요소에 중첩되어 있습니다. 플래그를 사용하지 않으면 현재 설정만 표시됩니다. numatune domain 명령에는 지정된 게스트 가상 머신 이름이 필요하며 다음 인수를 사용할 수 있습니다.
  • --mode - 모드를 strict,interleave 또는 preferred 로 설정할 수 있습니다. 게스트 가상 머신이 엄격한 모드 내에서 시작된 경우를 제외하고 도메인 실행은 라이브 동안에는 모드가 변경될 수 없습니다.
  • --nodeset 에는 게스트 가상 머신을 실행하는 데 호스트 물리적 시스템에서 사용하는 NUMA 노드 목록이 포함되어 있습니다. 목록에는 각각 노드 범위에 사용되는 대시와 노드를 제외하는 데 사용되는 캐럿이 각각 쉼표로 구분된 노드가 포함됩니다.
  • 인스턴스당 다음 세 가지 플래그 중 하나만 사용할 수 있습니다.
    • --config 는 영구 게스트 가상 머신의 다음 부팅에 적용됩니다.
    • --live 는 실행 중인 게스트 가상 머신의 스케줄러 정보를 설정합니다.
    • --current 은 게스트 가상 머신의 현재 상태에 영향을 미칩니다.

예 20.55. 게스트 가상 머신에 대한 NUMA 매개변수를 설정하는 방법

다음 예제에서는 실행중인 guest1 가상 머신에 대해 노드 0, 2 및 3에 대해 NUMA 모드를 strict 로 설정합니다.
# virsh numatune guest1 --mode strict --nodeset 0,2-3 --live
이 명령을 실행하면 guest1에 대해 실행 중인 구성이 XML 파일에서 다음 구성으로 변경됩니다.
<numatune>
        <memory mode='strict' nodeset='0,2-3'/>
</numatune>

20.27.3. NUMA 셀에 Free Memory의 Amount 표시

virsh freecell 명령은 지정된 NUMA 셀 내의 머신에 사용 가능한 메모리 양을 표시합니다. 이 명령은 지정된 옵션에 따라 시스템에서 사용 가능한 메모리의 세 가지 디스플레이 중 하나를 제공할 수 있습니다. 지정된 셀입니다.

예 20.56. 가상 머신 및 NUMA 셀의 메모리 속성을 표시하는 방법

다음 명령은 모든 셀에서 사용 가능한 총 메모리 양을 표시합니다.
# virsh freecell
Total: 684096 KiB
개별 셀에서 사용 가능한 메모리 크기도 표시하려면 --all 옵션을 사용합니다.
# virsh freecell --all
    0:     804676 KiB
--------------------
Total:     804676 KiB

특정 셀에 개별 메모리의 양을 표시하려면 --cellno 옵션을 사용합니다.
# virsh freecell --cellno 0
0: 772496 KiB

20.27.4. CPU 목록 표시

virsh nodecpumap 명령은 호스트 시스템에서 사용할 수 있는 CPU 수를 표시하며 현재 온라인 상태의 CPU 수도 나열합니다.

예 20.57. 호스트에서 사용 가능한 CPU 수를 표시하는 방법

다음 예제에서는 호스트에서 사용할 수 있는 CPU 수를 표시합니다.
# virsh nodecpumap
   CPUs present: 4
   CPUs online: 1
   CPU map: y

20.27.5. CPU 통계 표시

virsh nodecpustats [cpu_number] [-percent] 명령은 호스트의 CPU 로드 상태에 대한 통계 정보를 표시합니다. CPU를 지정하면 통계가 지정된 CPU에만 적용됩니다. 백분율 옵션을 지정하면 명령은 1 (1)초 간격으로 기록된 각 CPU 통계 유형의 백분율을 표시합니다.

예 20.58. CPU 사용량에 대한 통계 정보를 표시하는 방법

다음 예제에서는 호스트 CPU 로드에 대한 일반 통계를 반환합니다.
# virsh nodecpustats
user:               1056442260000000
system:              401675280000000
idle:               7549613380000000
iowait:               94593570000000
이 예에서는 CPU 번호 2에 대한 통계를 백분율로 표시합니다.
# virsh nodecpustats 2 --percent
usage:            2.0%
user:             1.0%
system:           1.0%
idle:            98.0%
iowait:           0.0%

20.27.6. 장치 관리

20.27.6.1. virsh를 사용하여 장치 연결 및 업데이트

스토리지 장치 연결에 대한 자세한 내용은 13.3.6절. “게스트에 스토리지 장치 추가” 을 참조하십시오.

절차 20.4. 게스트 가상 머신에서 사용할 USB 장치 핫 플러그

USB 장치는 핫 플러그로 실행되거나 게스트가 종료되는 동안 실행 중인 가상 머신에 연결할 수 있습니다. 게스트에서 사용하려는 장치는 호스트 시스템에 연결되어 있어야 합니다.
  1. 다음 명령을 실행하여 연결할 USB 장치를 찾습니다.
    # lsusb -v
    
    idVendor           0x17ef Lenovo
    idProduct          0x480f Integrated Webcam [R5U877]
    
  2. XML 파일을 만들고 논리 이름(예:usb_device.xml )을 지정합니다. 검색에 표시된 대로 공급 업체 및 제품 ID 번호( hexidecimal 번호)를 복사합니다. 그림 20.2. “USB 장치 XML 스니펫” 에 표시된 대로 이 정보를 XML 파일에 추가합니다. 이 파일의 이름은 다음 단계에서 필요하므로 기록해 둡니다.

    그림 20.2. USB 장치 XML 스니펫

    <hostdev mode='subsystem' type='usb' managed='yes'>
      <source>
        <vendor id='0x17ef'/>
        <product id='0x480f'/>
      </source>
    </hostdev>
  3. 다음 명령을 실행하여 장치를 연결합니다. 명령을 실행하면 guest1 을 가상 머신의 이름으로 바꾸고, usb_device.xml 을 이전 단계에서 생성한 공급 업체 및 제품 ID가 포함된 XML 파일의 이름으로 바꿉니다. 다음 재부팅 시 변경 사항이 적용되면 --config 인수를 사용합니다. 현재 게스트 가상 머신에 변경 사항이 적용되려면 --current 인수를 사용합니다. 추가 인수는 virsh 도움말 페이지를 참조하십시오.
    # virsh attach-device guest1 --file usb_device.xml --config

예 20.59. 게스트 가상 머신에서 장치 연결 해제 방법

다음 예제에서는 guest1 가상 머신에서 usb_device1.xml 파일 로 구성된 USB 장치를 분리합니다.
# virsh detach-device guest1 --file usb_device.xml

20.27.6.2. 인터페이스 장치 연결

virsh attach-interface 도메인 유형 소스 [<target>] [<mac>] [<script>] [<model>] [<inbound> ] [<outbound>] [- config] [- live] [- current] 명령은 다음 인수를 사용할 수 있습니다.
  • --type - 인터페이스 유형을 설정할 수 있습니다.
  • --source - 네트워크 인터페이스의 소스를 설정할 수 있습니다.
  • --live - 실행 중인 게스트 가상 머신 구성 설정에서 해당 값을 가져옵니다.
  • --config - 다음 부팅시 적용
  • --current - 현재 구성 설정에 따라 해당 값을 가져옵니다.
  • --target - 게스트 가상 시스템의 대상 장치를 나타냅니다.
  • -- macOS - 이 옵션을 사용하여 네트워크 인터페이스의 MAC 주소를 지정합니다.
  • --script - 이 옵션을 사용하여 기본 브리지 대신 브리지를 처리하는 스크립트 파일 경로를 지정합니다.
  • --model - 이 옵션을 사용하여 모델 유형을 지정합니다.
  • --inbound - 인터페이스의 인바운드 대역폭을 제어합니다. 허용 가능한 값은 평균,최대버스트 입니다.
  • --outbound - 인터페이스의 아웃바운드 대역폭을 제어합니다. 허용 가능한 값은 평균,최대버스트 입니다.
    참고
    평균 및 최대 값은 초당 킬로바이트로 표현되고, burst는 네트워크 XML 업스트림 설명서에 설명된 대로 최대 속도의 단일 버스트로 표현됩니다.
유형은 물리 네트워크 장치를 나타내는 네트워크 또는 장치에 대한 브리지 를 나타내는 브리지일 수 있습니다. source 는 장치의 소스입니다. 연결된 장치를 제거하려면 virsh detach-device 명령을 사용합니다.

예 20.60. 게스트 가상 머신에 장치를 연결하는 방법

다음 예제에서는 networkw 네트워크 장치를 guest1 가상 머신에 연결합니다. 인터페이스 모델이 virtio:로 게스트에 표시됩니다.
# virsh attach-interface guest1 networkw --model virtio

20.27.6.3. CDROM 미디어 변경

virsh change-media 명령은 CDROM의 미디어를 다른 소스 또는 형식으로 변경합니다. 이 명령은 다음 인수를 사용합니다. 이러한 인수에 대한 더 많은 예제 및 설명은 도움말 페이지에서도 확인할 수 있습니다.
  • --path - 디스크 장치의 정규화된 경로 또는 대상을 포함하는 문자열입니다.
  • --source - 미디어의 소스를 포함하는 문자열
  • --eject - 미디어를 제거
  • --insert - 미디어를 삽입
  • --update - 미디어를 업데이트
  • --current - 하이퍼바이저 드라이버 구현에 따라 --live--config 중 하나 또는 둘 다일 수 있습니다.
  • --live - 실행 중인 게스트 가상 머신의 실시간 구성을 대체
  • --config - 영구 구성을 대체하여 다음 부팅 시 관찰되었습니다.
  • --force - 미디어를 강제로 변경

20.27.7. 노드 메모리 매개변수 설정 및 표시

virsh node-memory-tune [shm-pages-to-scan] [shm-sleep-milisecs] [shm-merge-across-nodes] 명령이 표시되고 노드 메모리 매개변수를 설정할 수 있습니다. 이 명령을 사용하여 다음 매개변수를 설정할 수 있습니다.
  • --shm-pages-to-scan - 커널 동일 페이지 병합(KSM) 서비스가 절전 상태로 전환되기 전에 검사할 페이지 수를 설정합니다.
  • --shm-sleep-milisecs - KSM이 다음 검사 전에 자는 miliseconds 수를 설정합니다.
  • --shm-merge-across-nodes - 다른 NUMA 노드의 페이지를 병합할 수 있는지 여부를 지정합니다.

예 20.61. NUMA 노드에서 메모리 페이지를 병합하는 방법

다음 예제는 모든 NUMA 노드의 모든 메모리 페이지를 병합합니다.
# virsh node-memory-tune --shm-merge-across-nodes 1

20.27.8. 호스트의 장치 나열

virsh nodedev-list --cap --tree 명령은 libvirt 서비스에 알려진 호스트에서 사용 가능한 모든 장치를 나열합니다. --cap 은 각각 쉼표로 구분된 기능 유형별로 목록을 필터링하는 데 사용되며 --tree 와 함께 사용할 수 없습니다. --tree 인수를 사용하여 출력을 트리 구조에 배치합니다.

예 20.62. 호스트에서 사용 가능한 장치를 표시하는 방법

다음 예제에서는 호스트에서 사용할 수 있는 장치를 트리 형식으로 나열합니다. 목록이 잘립니다.
# virsh nodedev-list --tree
computer
  |
  +- net_lo_00_00_00_00_00_00
  +- net_macvtap0_52_54_00_12_fe_50
  +- net_tun0
  +- net_virbr0_nic_52_54_00_03_7d_cb
  +- pci_0000_00_00_0
  +- pci_0000_00_02_0
  +- pci_0000_00_16_0
  +- pci_0000_00_19_0
  |   |
  |   +- net_eth0_f0_de_f1_3a_35_4f
	[...]
이 예에서는 호스트에서 사용 가능한 SCSI 장치를 나열합니다.
# virsh nodedev-list --cap scsi
scsi_0_0_0_0

20.27.9. 호스트 시스템에 장치 생성

virsh nodedev-create file 명령을 사용하면 호스트 물리적 시스템에서 장치를 만든 다음 게스트 가상 머신에 할당할 수 있습니다. libvirt 에서 사용할 수 있는 호스트 노드를 자동으로 감지하지만 이 명령을 사용하면 libvirt 에서 탐지하지 않은 하드웨어를 등록할 수 있습니다. 지정된 파일에는 호스트 <장치의 최상위 장치> 설명에 대한 XML 설명이 포함되어야 합니다. 이러한 파일의 예는 예 20.65. “장치의 XML 파일을 검색하는 방법” 을 참조하십시오.

예 20.63. XML 파일에서 장치를 만드는 방법

이 예제에서는 PCI 장치의 XML 파일을 이미 생성하여 scsi_host2.xml 으로 저장했습니다. 다음 명령을 사용하면 이 장치를 게스트에 연결할 수 있습니다.
# virsh nodedev-create scsi_host2.xml

20.27.10. 장치 제거

virsh nodedev-destroy 명령은 호스트에서 장치를 제거합니다. virsh 노드 장치 드라이버는 영구 구성을 지원하지 않으므로 호스트 시스템을 재부팅하면 장치를 다시 사용할 수 있습니다.
또한 다른 할당에서는 장치가 다른 백엔드 드라이버(vfio, kvm)에 바인딩되어야 합니다. --driver 인수를 사용하면 의도한 백엔드 드라이버를 지정할 수 있습니다.

예 20.64. 호스트 물리적 시스템에서 장치를 제거하는 방법

다음 예제에서는 호스트 시스템에서 scsi_host2 라는 SCSI 장치를 제거합니다.
# virsh nodedev-destroy scsi_host2

20.27.11. 장치 설정 수집

virsh nodedev-dumpxml device명령은 장치 이름과 같은 정보, 장치가 연결된 버스, 공급 업체, 제품 ID, 기능, libvirt 에서 사용할 수 있는 정보를 포함하여 지정된 호스트 장치에 대한 XML 표현을 출력합니다. 인수 장치는 WWNN, WWPN 형식(HBA만 해당)의 장치 이름 또는 WWN 쌍일 수 있습니다.

예 20.65. 장치의 XML 파일을 검색하는 방법

다음 예제에서는 scsi_host2 로 식별되는 SCSI 장치의 XML 파일을 검색합니다. virsh nodedev-list 명령을 사용하여 이름을 가져옵니다.
# virsh nodedev-dumpxml scsi_host2 <device> <name>scsi_host2</name> <parent>scsi_host1</parent> <capability type='scsi_host'> <capability type='fc_host'> <wwnn>2001001b32a9da5b</wwnn> <wwpn>2101001b32a9da5b</wwpn> </capability> </capability> </device>

20.27.12. 장치에 대한 초기화 트리거

virsh nodedev-reset device 명령은 지정된 장치에 대해 장치 재설정을 트리거합니다. 이 명령을 실행하면 게스트 가상 시스템이 통과하거나 호스트 물리적 시스템 간에 노드 장치를 전송하기 전에 유용합니다. libvirt 는 필요에 따라 이 작업을 자동으로 수행하지만, 이 명령은 필요한 경우 명시적인 재설정을 허용합니다.

예 20.66. 게스트 가상 머신에서 장치를 재설정하는 방법

다음 예제에서는 scsi_host2 라는 게스트 가상 머신에서 장치를 재설정합니다.
# virsh nodedev-reset scsi_host2

20.28. 게스트 가상 머신 정보 검색

20.28.1. 게스트 가상 머신의 도메인 ID 가져오기

virsh domid 명령은 게스트 가상 시스템의 ID를 반환합니다. 게스트를 시작하거나 다시 시작할 때마다 변경됩니다. 이 명령에는 가상 시스템의 이름 또는 가상 시스템의 UUID가 필요합니다.

예 20.67. 게스트 가상 머신의 도메인 ID 검색 방법

다음 예제에서는 guest1 이라는 게스트 가상 머신의 도메인 ID를 검색합니다.
# virsh domid guest1
8
domid 는 종료 상태에 있는 게스트 가상 머신 의 경우 - 를 반환합니다. 가상 머신이 종료되었는지 확인하려면 virsh list --all 명령을 실행할 수 있습니다.

20.28.2. 게스트 가상 머신의 도메인 이름 가져오기

virsh domname 명령은 ID 또는 UUID가 지정된 게스트 가상 시스템의 이름을 반환합니다. 게스트가 시작될 때마다 ID가 변경됩니다.

예 20.68. 가상 머신의 ID 검색 방법

다음 예제에서는 ID가 8 인 게스트 가상 머신의 이름을 검색합니다.
# virsh domname 8
guest1

20.28.3. 게스트 가상 머신의 UUID 가져오기

virsh domuuid 명령은 지정된 게스트 가상 머신 또는 ID의 UUID 또는 범용 고유 식별자 를 반환합니다.

예 20.69. 게스트 가상 머신의 UUID를 표시하는 방법

다음 예제에서는 guest1 이라는 게스트 가상 머신의 UUID를 검색합니다.
# virsh domuuid guest1
r5b2-mySQL01 4a4c59a7-ee3f-c781-96e4-288f2862f011

20.28.4. 게스트 가상 머신 정보 표시

virsh dominfo 명령은 가상 시스템의 이름, ID 또는 UUID가 지정된 게스트 가상 시스템에 대한 정보를 표시합니다. 가상 머신이 시작될 때마다 ID가 변경됩니다.

예 20.70. 게스트 가상 머신 일반 세부 정보를 표시하는 방법

다음 예제에서는 guest1 이라는 게스트 가상 머신에 대한 일반 세부 정보를 표시합니다.
# virsh dominfo guest1
Id:             8
Name:           guest1
UUID:           90e0d63e-d5c1-4735-91f6-20a32ca22c48
OS Type:        hvm
State:          running
CPU(s):         1
CPU time:       32.6s
Max memory:     1048576 KiB
Used memory:    1048576 KiB
Persistent:     yes
Autostart:      disable
Managed save:   no
Security model: selinux
Security DOI:   0
Security label: system_u:system_r:svirt_t:s0:c552,c818 (enforcing)

20.29. 스토리지 풀 명령

libvirt 를 사용하면 가상 머신 내의 장치로 표시되는 스토리지 볼륨을 제공하는 데 사용되는 파일, 원시 파티션 및 도메인별 형식을 포함하여 다양한 스토리지 솔루션을 관리할 수 있습니다. 자세한 내용은 libvirt 업스트림 페이지를 참조하십시오. 스토리지 풀을 관리하는 대부분의 명령은 게스트 가상 머신에 사용되는 것과 유사합니다.

20.29.1. 스토리지 풀 XML 검색

virsh find-storage-pool-sources type 명령은 찾을 수 있는 지정된 소스의 모든 스토리지 풀을 설명하는 XML을 표시합니다. 유형은 netfs, disk, dir, fs, iscsi, logical, gluster 등이 있습니다. 모든 유형은 스토리지 백엔드 드라이버에 대응하고 더 많은 유형을 사용할 수 있습니다(자세한 내용은 man 페이지를 참조하십시오). --srcSpec 옵션을 사용하여 템플릿 소스 XML 파일을 제공하여 풀에 대한 쿼리를 추가로 제한할 수도 있습니다.

예 20.71. 사용 가능한 스토리지 풀의 XML 설정을 나열하는 방법

다음 예제에서는 시스템에서 사용할 수 있는 모든 논리 스토리지 풀의 XML 설정을 출력합니다.
# virsh find-storage-pool-sources logical
<sources>
  <source>
    <device path='/dev/mapper/luks-7a6bfc59-e7ed-4666-a2ed-6dcbff287149'/>
    <name>RHEL_dhcp-2-157</name>
    <format type='lvm2'/>
  </source>
</sources>

20.29.2. 스토리지 풀 검색

virsh find-storage-pool-sources-as type 명령은 특정 유형의 경우 잠재적인 스토리지 풀 소스를 찾습니다. 유형은 netfs, disk, dir, fs, iscsi, logical, gluster 등이 있습니다. 모든 유형은 스토리지 백엔드 드라이버에 대응하고 더 많은 유형을 사용할 수 있습니다(자세한 내용은 man 페이지를 참조하십시오). 이 명령은 선택적 인수 호스트,포트, 이니시에이터 도 사용합니다. 이러한 각 옵션에는 쿼리되는 항목이 지정됩니다.

예 20.72. 잠재적인 스토리지 풀 소스를 찾는 방법

다음 예제에서는 지정된 호스트 시스템에서 디스크 기반 스토리지 풀을 검색합니다. 호스트 이름을 모르는 경우 먼저 virsh hostname 명령을 실행하십시오.
# virsh find-storage-pool-sources-as disk --host myhost.example.com

20.29.3. 스토리지 풀 정보 나열

virsh pool-info pool 명령은 지정된 스토리지 풀 오브젝트에 대한 기본 정보를 나열합니다. 이 명령에는 스토리지 풀의 이름 또는 UUID가 필요합니다. 이 정보를 검색하려면 pool-list 명령을 사용합니다.

예 20.73. 스토리지 풀에 대한 정보를 검색하는 방법

다음 예제에서는 vdisk 라는 스토리지 풀에 대한 정보를 검색합니다.
# virsh pool-info vdisk

Name:           vdisk
UUID:
State:          running
Persistent:     yes
Autostart:      no
Capacity:       125 GB
Allocation:     0.00
Available:      125 GB

20.29.4. 사용 가능한 스토리지 풀 나열

virsh pool-list 명령은 libvirt 에 알려진 모든 스토리지 풀 오브젝트를 나열합니다. 기본적으로 활성 풀만 나열되지만 --inactive 인수를 사용하면 비활성 풀만 나열하고 --all 인수를 사용하면 모든 스토리지 풀이 나열됩니다. 이 명령은 검색 결과를 필터링하는 다음과 같은 선택적 인수를 사용합니다.
  • --inactive - 비활성 스토리지 풀 나열
  • --all - 활성 스토리지 풀과 비활성 스토리지 풀 모두 나열
  • --persistent - 영구 스토리지 풀 나열
  • --transient - 임시 스토리지 풀 나열
  • --autostart - autostart가 활성화된 스토리지 풀을 나열합니다.
  • --no-autostart - autostart가 비활성화된 스토리지 풀을 나열합니다.
  • --type 유형 - 지정된 유형만 있는 풀을 나열합니다.
  • --details - 스토리지 풀의 확장된 세부 정보를 나열
위의 인수 외에도 목록의 콘텐츠를 필터링하는 데 사용할 수 있는 필터링 플래그 세트가 있습니다. --persistent 는 목록을 임시 풀로 제한하고 --transient 는 목록을 임시 풀로 제한하고, --autostart 는 목록을 임시 풀로 제한하고, 마지막으로 --no-autostart 를 자동으로 시작한 스토리지 풀로 목록을 제한합니다.
--type 이 필요한 모든 스토리지 풀 명령의 경우 풀 유형을 쉼표로 구분해야 합니다. 유효한 풀 유형에는 dir,fs,netfs,logical,disk,iscsi,scsi,mpath,rbd, Hepdog, gluster 가 있습니다.
--details 옵션은 virsh 에 사용 가능한 풀 지속성 및 용량 관련 정보를 추가로 표시하도록 지시합니다.
참고
이 명령을 이전 서버와 함께 사용하면 고유 경쟁이 있는 일련의 API 호출을 사용해야 하며, 이 경우 목록이 수집되는 동안 호출 간 상태를 변경하는 경우 풀이 나열되지 않거나 두 번 이상 표시될 수 있습니다. 그러나 최신 서버에는 이러한 문제가 없습니다.

예 20.74. 모든 스토리지 풀을 나열하는 방법

이 예에서는 활성 및 비활성 상태의 스토리지 풀을 나열합니다.
# virsh pool-list --all
Name                 State      Autostart
-----------------------------------------
default             active     yes
vdisk               active     no

20.29.5. 스토리지 풀 목록 새로 고침

virsh pool-refresh pool 명령은 스토리지 풀에 포함된 스토리지 볼륨 목록을 새로 고칩니다.

예 20.75. 스토리지 풀에서 스토리지 볼륨 목록을 새로 고치는 방법

다음 예제에서는 vdisk 라는 스토리지 볼륨 목록을 새로 고칩니다.
# virsh pool-refresh vdisk

Pool vdisk refreshed

20.29.6. 스토리지 풀 생성, 삭제 및 시작

20.29.6.1. 스토리지 풀 빌드

virsh pool-build pool 명령은 명령에 지정된 이름을 사용하여 스토리지 풀을 빌드합니다. 선택적 인수 --overwrite--no-overwrite 는 FS 스토리지 풀 또는 디스크 또는 논리 유형 기반 스토리지 풀에만 사용할 수 있습니다. [-overwrite] 또는 [-no-overwrite] 또는 [-no-overwrite]가 제공되지 않고 사용된 풀이 FS인 경우 유형이 실제로 디렉토리 기반인 것으로 가정합니다. 풀 이름 외에도 스토리지 풀 UUID도 사용할 수 있습니다.
--no-overwrite 가 지정된 경우 대상 장치에 파일 시스템이 이미 있는지 확인하거나, 오류가 있는지 반환하거나 mkfs 를 사용하여 대상 장치를 포맷하지 않는 경우 해당 장치를 포맷합니다. --overwrite 가 지정된 경우 mkfs 명령이 실행되고 대상 장치의 기존 데이터를 덮어씁니다.

예 20.76. 스토리지 풀을 구축하는 방법

다음 예제에서는 vdisk 라는 디스크 기반 스토리지 풀을 생성합니다.
# virsh pool-build vdisk

Pool vdisk built

20.29.6.2. XML 파일에서 스토리지 풀 정의

virsh pool-define file 명령은 XML 파일에서 스토리지 풀 오브젝트를 생성하지만 시작하지는 않습니다.

예 20.77. XML 파일에서 스토리지 풀을 정의하는 방법

이 예에서는 스토리지 풀 설정을 사용하여 XML 파일을 이미 생성했다고 가정합니다. 예를 들면 다음과 같습니다.
<pool type="dir">
	<name>vdisk</name>
	<target>
          <path>/var/lib/libvirt/images</path>
	</target>
</pool>
다음 명령은 XML 파일에서 디렉터리 유형 스토리지 풀을 빌드합니다(이 예제에서는 이름이 vdisk.xml 임).
# virsh pool-define vdisk.xml

Pool vdisk defined
스토리지 풀이 정의되었는지 확인하려면 예 20.74. “모든 스토리지 풀을 나열하는 방법” 에 표시된 대로 virsh pool-list --all 명령을 실행합니다. 그러나 명령을 실행하면 풀이 시작되지 않았기 때문에 상태가 inactive로 표시됩니다. 스토리지 풀 시작에 대한 지침은 예 20.81. “스토리지 풀을 시작하는 방법” 에서 참조하십시오.

20.29.6.3. 스토리지 풀 생성

virsh pool-create file 명령은 연결된 XML 파일에서 스토리지 풀을 생성하고 시작합니다.

예 20.78. XML 파일에서 스토리지 풀을 생성하는 방법

이 예에서는 스토리지 풀 설정을 사용하여 XML 파일을 이미 생성했다고 가정합니다. 예를 들면 다음과 같습니다.
<pool type="dir">
	<name>vdisk</name>
	<target>
          <path>/var/lib/libvirt/images</path>
	</target>
</pool>
다음 예제에서는 XML 파일(이 예제에서는 vdisk.xml 이라는 이름)을 기반으로 디렉터리 유형 스토리지 풀을 빌드합니다.
# virsh pool-create vdisk.xml

Pool vdisk created
스토리지 풀이 생성되었는지 확인하려면 예 20.74. “모든 스토리지 풀을 나열하는 방법” 에 표시된 대로 virsh pool-list --all 명령을 실행합니다. 그러나 명령을 실행하면 풀이 시작되지 않았기 때문에 상태가 inactive로 표시됩니다. 스토리지 풀 시작에 대한 지침은 예 20.81. “스토리지 풀을 시작하는 방법” 에서 참조하십시오.

20.29.6.4. 스토리지 풀 생성

virsh pool-create-as name 명령은 지정된 원시 매개 변수에서 풀 오브젝트 이름을 생성하고 시작합니다. 이 명령은 다음 옵션을 사용합니다.
  • --print-xml - XML 파일의 내용을 표시하지만 스토리지 풀을 정의하거나 생성하지는 않음
  • --type 유형은 스토리지 풀 유형을 정의합니다. 사용할 수 있는 형식은 20.29.4절. “사용 가능한 스토리지 풀 나열” 을 참조하십시오.
  • --source-host 호스트 이름 - 기본 스토리지의 소스 호스트 물리적 시스템
  • --source-path 경로 - 기본 스토리지의 위치
  • --source-dev path - 기본 스토리지의 장치
  • --source-name name - 소스 기본 스토리지의 이름
  • --source-format 형식 - 소스 기본 스토리지의 형식
  • --target 경로 - 기본 스토리지의 대상

예 20.79. 스토리지 풀을 생성하고 시작하는 방법

다음 예제에서는 /mnt 디렉터리에 vdisk 라는 스토리지 풀을 생성하고 시작합니다.
# virsh pool-create-as --name vdisk --type dir --target /mnt

Pool vdisk created

20.29.6.5. 스토리지 풀 정의

virsh pool-define-as <name> 명령은 생성된 원시 매개 변수에서 풀 오브젝트 이름을 생성하지만 시작하지는 않습니다. 이 명령에는 다음 옵션을 사용할 수 있습니다.
  • --print-xml - XML 파일의 내용을 표시하지만 스토리지 풀을 정의하거나 생성하지는 않음
  • --type 유형은 스토리지 풀 유형을 정의합니다. 사용할 수 있는 형식은 20.29.4절. “사용 가능한 스토리지 풀 나열” 을 참조하십시오.
  • --source-host 호스트 이름 - 기본 스토리지를 위한 소스 호스트 물리적 머신
  • --source-path 경로 - 기본 스토리지의 위치
  • --source-dev devicename - 기본 스토리지를 위한 장치
  • --source-name sourcename - 소스 기본 스토리지의 이름
  • --source-format 형식 - 소스 기본 스토리지의 형식
  • --target targetname - 기본 스토리지의 대상
--print-xml 이 지정된 경우 풀을 생성하거나 정의하지 않고 풀 오브젝트의 XML을 출력합니다. 그러지 않으면 풀을 빌드할 지정된 형식이 필요합니다. 유형이 필요한 모든 스토리지 풀 명령의 경우 풀 유형을 쉼표로 구분해야 합니다. 유효한 풀 유형에는 dir,fs,netfs,logical,disk,iscsi,scsi,mpath,rbd, Hepdog, gluster 가 있습니다.

예 20.80. 스토리지 풀 정의 방법

다음 예제에서는 vdisk 라는 스토리지 풀을 정의하지만 시작하지는 않습니다. 이 명령을 실행한 후 virsh pool-start 명령을 사용하여 스토리지 풀을 활성화합니다.
# virsh pool-define-as --name vdisk --type dir --target /mnt

Pool vdisk defined

20.29.6.6. 스토리지 풀 시작

virsh pool-start pool 명령은 이전에 정의되었지만 비활성 상태인 지정된 스토리지 풀을 시작합니다. 이 명령은 스토리지 풀과 풀의 이름에 UUID를 사용할 수도 있습니다.

예 20.81. 스토리지 풀을 시작하는 방법

다음 예제는 예 20.78. “XML 파일에서 스토리지 풀을 생성하는 방법” 에서 빌드한 vdisk 스토리지 풀을 시작합니다.
# virsh pool-start vdisk

Pool vdisk started
풀이 시작되었는지 확인하려면 virsh pool-list --all 명령을 실행하고 예 20.74. “모든 스토리지 풀을 나열하는 방법” 에 표시된 대로 상태가 활성 상태인지 확인합니다.

20.29.6.7. 스토리지 풀 자동 시작

virsh pool-autostart pool 명령을 사용하면 부팅 시 스토리지 풀이 자동으로 시작됩니다. 이 명령에는 풀 이름 또는 UUID가 필요합니다. pool-autostart 명령을 비활성화하려면 명령에 --disable 인수를 사용합니다.

예 20.82. 스토리지 풀 자동 시작 방법

다음 예제에서는 예 20.78. “XML 파일에서 스토리지 풀을 생성하는 방법” 에 빌드한 vdisk 스토리지 풀을 자동으로 시작합니다.
# virsh pool-autostart vdisk

Pool vdisk autostarted

20.29.7. 스토리지 풀 중지 및 삭제

virsh pool-destroy pool 명령은 스토리지 풀을 중지합니다. libvirt가 중지되면 libvirt 에서 더 이상 풀을 관리하지 않지만 풀에 포함된 원시 데이터는 변경되지 않으며 나중에 pool-create 명령을 사용하여 복구할 수 있습니다.

예 20.83. 스토리지 풀을 중지하는 방법

다음 예제에서는 예 20.78. “XML 파일에서 스토리지 풀을 생성하는 방법” 에 빌드한 vdisk 스토리지 풀을 중지합니다.
# virsh pool-destroy vdisk

Pool vdisk destroyed
virsh pool-delete pool 명령은 지정된 스토리지 풀에서 사용하는 리소스를 삭제합니다. 이 작업은 복구할 수 없으며 되돌릴 수 없다는 점에 유의해야 합니다. 그러나 이 명령 후에도 풀 구조는 계속 존재하며 새 스토리지 볼륨 생성을 허용할 준비가 되어 있습니다.

예 20.84. 스토리지 풀 삭제 방법

다음 샘플에서는 예 20.78. “XML 파일에서 스토리지 풀을 생성하는 방법” 에 빌드한 vdisk 스토리지 풀을 삭제합니다.
# virsh pool-delete vdisk

Pool vdisk deleted
virsh pool-undefine pool 명령은 비활성 풀에 대한 구성을 분리합니다.

예 20.85. 스토리지 풀을 해제하는 방법

다음 예제에서는 예 20.78. “XML 파일에서 스토리지 풀을 생성하는 방법” 빌드한 vdisk 스토리지 풀을 정의합니다. 이렇게 하면 스토리지 풀이 일시 중지됩니다.
# virsh pool-undefine vdisk

Pool vdisk undefined

20.29.8. 풀에 대한 XML 덤프 파일 생성

virsh pool-dumpxml pool 명령은 지정된 스토리지 풀 오브젝트에 대한 XML 정보를 반환합니다. -inactive dumps 옵션을 사용하면 현재 풀 구성이 아닌 다음 풀 시작 시 사용할 구성을 사용합니다.

예 20.86. 스토리지 풀의 구성 설정을 검색하는 방법

다음 예제에서는 예 20.78. “XML 파일에서 스토리지 풀을 생성하는 방법” 에서 빌드한 vdisk 스토리지 풀의 구성 설정을 검색합니다. 명령이 실행되면 터미널에서 구성 파일이 열립니다.
# virsh pool-dumpxml vdisk
<pool type="dir">
	<name>vdisk</name>
	<target>
          <path>/var/lib/libvirt/images</path>
	</target>
</pool>

20.29.9. 스토리지 풀의 구성 파일 편집

pool-edit pool 명령은 편집을 위해 지정된 스토리지 풀의 XML 구성 파일을 엽니다.
이 메서드는 적용 전에 오류 확인을 수행하므로 XML 구성 파일을 편집하는 데 사용해야 하는 유일한 방법입니다.

예 20.87. 스토리지 풀의 구성 설정을 편집하는 방법

다음 예제에서는 예 20.78. “XML 파일에서 스토리지 풀을 생성하는 방법” 에서 빌드한 vdisk 스토리지 풀의 구성 설정을 편집합니다. 명령이 실행되면 기본 편집기에서 구성 파일이 열립니다.
# virsh pool-edit vdisk
<pool type="dir">
	<name>vdisk</name>
	<target>
          <path>/var/lib/libvirt/images</path>
	</target>
</pool>

20.30. 스토리지 볼륨 명령

이 섹션에서는 스토리지 볼륨을 생성, 삭제 및 관리하기 위한 명령에 대해 설명합니다. 스토리지 볼륨을 생성하려면 하나 이상의 스토리지 풀이 필요합니다. 스토리지 풀을 생성하는 방법에 대한 예제는 예 20.78. “XML 파일에서 스토리지 풀을 생성하는 방법” 에서 참조하십시오. 스토리지 풀 정보는 13.2절. “스토리지 풀 사용” 참조하십시오. 스토리지 볼륨에 대한 자세한 내용은 13.3절. “스토리지 볼륨 사용” 을 참조하십시오.

20.30.1. 스토리지 볼륨 생성

virsh vol-create-from pool file vol 명령은 다른 볼륨을 입력으로 사용하여 볼륨을 생성합니다. 이 명령에는 스토리지 풀 이름 또는 스토리지 풀 UUID가 필요하며 다음과 같은 매개변수 및 옵션이 허용됩니다.
  • --pool 문자열 - 필수 - 스토리지 풀의 이름 또는 스토리지 볼륨에 연결할 스토리지 풀의 UUID를 포함합니다. 이 스토리지 풀은 이 새 스토리지 볼륨을 기반으로 하는 데 사용 중인 스토리지 볼륨과 동일한 스토리지 풀일 필요는 없습니다.
  • --file string - required - 스토리지 볼륨의 매개 변수가 포함된 XML 파일의 이름을 포함합니다.
  • --Vol string - required - 이 새 스토리지 볼륨을 기반으로 하는 데 사용 중인 스토리지 볼륨의 이름을 포함합니다.
  • --inputpool 문자열 - 선택 사항 - 새 스토리지 볼륨의 입력으로 사용하는 스토리지 볼륨과 연결된 스토리지 풀의 이름을 지정할 수 있습니다.
  • --prealloc-metadata - 선택 사항 - 새 스토리지 볼륨에 대한 전체 할당 대신 metadata ( qcow2의 경우)를 사전 할당합니다.
예를 들면 13.3.2절. “스토리지 볼륨 생성” 의 내용을 참조하십시오.

20.30.2. 매개 변수에서 스토리지 볼륨 생성

virsh vol-create-as 이름 capacity 명령은 인수 집합에서 볼륨을 생성합니다. pool 인수에는 볼륨을 생성할 스토리지 풀의 이름 또는 UUID가 포함되어 있습니다. 이 명령은 다음과 같은 필수 매개변수 및 옵션을 사용합니다.
  • [-pool] string - required - 연결된 스토리지 풀의 이름을 포함합니다.
  • [--name] 문자열 - required - 새 스토리지 볼륨의 이름을 포함합니다.
  • [-capacity] 문자열 - required - 정수로 표시된 스토리지 볼륨의 크기를 포함합니다. 지정하지 않는 경우 기본값은 바이트입니다. 각각 B, k, M, G, T 접미사를 바이트, 킬로바이트, 메가바이트, 기가바이트, 테라바이트에 사용합니다.
  • --allocation 문자열 - 선택 사항 - 초기 할당 크기를 포함하는 정수입니다. 지정하지 않는 경우 기본값은 바이트입니다.
  • --format 문자열 - 선택 사항 - 파일 형식 유형이 포함됩니다. 허용 가능한 유형에는 raw, bochs, qcow2, qed, host_device, vmdk 등이 있습니다. 그러나 이는 파일 기반 스토리지 풀에만 사용됩니다. 기본적으로 qcow 버전은 버전 3입니다. 버전을 변경하려면 23.19.2절. “대상 요소 설정” 를 참조하십시오.
  • --backing-vol 문자열 - 선택 사항 - 백업 볼륨이 포함되어 있습니다. 스냅샷을 생성하는 경우 사용됩니다.
  • --backing-vol-format 문자열 - 선택 사항 - 백업 볼륨의 형식이 포함됩니다. 스냅샷을 생성하는 경우 사용됩니다.
  • --prealloc-metadata - 선택 사항 - 메타데이터를 사전 할당할 수 있습니다(전체 할당 대신 qcow2의 경우).

예 20.88. 매개변수 세트에서 스토리지 볼륨을 생성하는 방법

다음 예제에서는 vol-new 라는 100MB 스토리지 볼륨을 생성합니다. 여기에는 예 20.78. “XML 파일에서 스토리지 풀을 생성하는 방법” 에서 생성한 vdisk스토리지 풀이 포함되어 있습니다.
# virsh vol-create-as vdisk vol-new 100M


vol vol-new created

20.30.3. XML 파일에서 스토리지 볼륨 생성

virsh vol-create pool file 명령은 스토리지 볼륨 매개 변수가 포함된 XML 파일에서 새 스토리지 볼륨을 생성합니다.

예 20.89. 기존 XML 파일에서 스토리지 볼륨을 생성하는 방법

다음 예제에서는 다음과 같이 vol-new.xml 파일에 스토리지 볼륨 기반 을 생성합니다.
<volume>
	<name>vol-new</name>
	<allocation>0</allocation>
	<capacity unit="M">100</capacity>
	<target>
		<path>/var/lib/libvirt/images/vol-new</path>
		<permissions>
			<owner>107</owner>
			<group>107</group>
            		<mode>0744</mode>
            		<label>virt_image_t</label>
          	</permissions>
        </target>
</volume>

스토리지 볼륨은 스토리지 풀 vdisk 와 연결됩니다. 이미지 경로는 /var/lib/libvirt/images/vol-new 입니다.
# virsh vol-create vdisk vol-new.xml

vol vol-new created

20.30.4. 스토리지 볼륨 복제

virsh vol-clone vol-name new-vol-name 명령은 기존 스토리지 볼륨을 복제합니다. virsh vol-create-from 명령을 사용할 수도 있지만 스토리지 볼륨을 복제하는 데 권장되는 방법은 아닙니다. 이 명령을 사용하면 새 스토리지 볼륨과 연결된 스토리지 풀을 지정할 수 있는 --pool 문자열 옵션을 사용할 수 있습니다. vol 인수는 소스 스토리지 볼륨의 이름 또는 키 또는 경로이며 name 인수는 새 스토리지 볼륨의 이름을 나타냅니다. 자세한 내용은 13.3.2.1절. “virsh를 사용하여 스토리지 볼륨 생성” 에서 참조하십시오.

예 20.90. 스토리지 볼륨을 복제하는 방법

다음 예제에서는 vol-new 라는 스토리지 볼륨을 vol-clone 이라는 새 볼륨에 복제합니다.
# virsh vol-clone vol-new vol-clone


vol vol-clone cloned from vol-new

20.31. 스토리지 볼륨 삭제

virsh vol-delete vol pool 명령은 지정된 볼륨을 삭제합니다. 명령에는 볼륨이 있는 스토리지 풀의 이름 또는 UUID와 스토리지 볼륨 이름이 필요합니다. 볼륨 이름 대신 삭제할 볼륨의 키 또는 경로를 사용할 수도 있습니다.

예 20.91. 스토리지 볼륨 삭제 방법

다음 예제에서는 스토리지 풀 vdisk 가 포함된 new-vol 이라는 스토리지 볼륨을 삭제합니다.
# virsh vol-delete new-vol vdisk

vol new-vol deleted

20.32. 스토리지 볼륨의 콘텐츠 삭제

virsh vol-wipe vol pool 명령은 볼륨을 종료하여 이전에 볼륨의 데이터에 나중에 읽을 수 없도록 합니다. 명령에는 볼륨에 있는 스토리지 의 이름 또는 UUID인 --pool 과 초기화할 볼륨의 이름 또는 키 또는 경로인 풀이 필요합니다. --algorithm 인수와 다음과 같은 지원되는 알고리즘 유형 중 하나를 사용하여 0으로 볼륨을 다시 작성하는 대신 다른니핑 알고리즘을 선택할 수 있습니다.
  • Zero - 1-pass all zeros
  • NNSA - 4-pass NNSA Policy Letter NAP-14.1-C (XVI-8) for sanitizing removable and non-movable hard disks: random x2, 0x00, verify.
  • DoD - 4-pass DoD 5220.22-M 섹션 8-306: 이동식 및 비-재개 디스크: random, 0x00, 0xff, verify.
  • DomainMapping - 정보기술 ( 독일어 센터 of Security Center of Security in Information technologies에서 권장하는 9-pass 방법: 0xff, 0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f.
  • Gutmann - Gutmann의 문서에 설명된 표준 35-pass 시퀀스입니다.
  • Schneier - " Applied Cryptography" (1996)의 Bruce Schneier에서 설명하는 7-pass 방법: 0x00, 0xff, 임의의 x5.
  • Pfitzner7 - Roy Pfitzner의 7-random-pass 방법: random x7
  • Pfitzner33 - Roy Pfitzner's 33-random-pass 방법: random x33.
  • random - 1-pass 패턴: random.
참고
알고리즘의 가용성은 호스트에 설치된 "scrub" 바이너리 버전에 따라 제한될 수 있습니다.

예 20.92. 스토리지 볼륨의 콘텐츠를 삭제하는 방법(스토리지 볼륨을 삭제하는 방법)

다음 예제에서는 스토리지 볼륨 new-vol 의 내용을 지우고, 스토리지 풀 vdisk 가 연결되어 있습니다.
# virsh vol-wipe new-vol vdisk

vol new-vol wiped

20.33. XML 파일에 스토리지 볼륨 정보 덤프

virsh vol-dumpxml vol 명령은 볼륨 정보를 가져와서 내용이 포함된 XML 파일을 만들어 stdout 스트림에 설정된 설정으로 출력합니다. 선택적으로 --pool 옵션을 사용하여 연결된 스토리지 풀의 이름을 제공할 수 있습니다.

예 20.93. 스토리지 볼륨의 내용을 덤프하는 방법

다음 예제에서는 vol-new 라는 스토리지 볼륨의 내용을 XML 파일로 덤프합니다.
# virsh vol-dumpxml vol-new

20.34. 볼륨 정보 나열

virsh vol-info vol 명령은 지정된 스토리지 볼륨에 대한 기본 정보를 나열합니다. 스토리지 볼륨 이름, 키 또는 경로를 제공해야 합니다. 또한 이 명령은 스토리지 볼륨과 연결된 스토리지 풀을 지정할 수 있는 --pool 옵션을 허용합니다. 풀 이름 또는 UUID를 제공할 수 있습니다.

예 20.94. 스토리지 볼륨에 대한 정보를 확인하는 방법

다음 예제에서는 vol-new 라는 스토리지 볼륨에 대한 정보를 검색합니다. 이 명령을 실행하는 경우 스토리지 볼륨의 이름을 스토리지 볼륨 이름으로 변경해야 합니다.
# virsh vol-info vol-new
virsh vol-list pool 명령은 지정된 스토리지 풀에 연결된 모든 볼륨을 나열합니다. 이 명령에는 스토리지 풀의 이름 또는 UUID가 필요합니다. --details 옵션은 virsh 에 사용 가능한 볼륨 유형 및 용량 관련 정보를 추가로 표시하도록 지시합니다.

예 20.95. 스토리지 볼륨과 연결된 스토리지 풀을 표시하는 방법

다음 예제에서는 스토리지 풀 vdisk 와 관련된 모든 스토리지 볼륨을 나열합니다.
# virsh vol-list vdisk

20.35. 스토리지 볼륨 정보 검색

virsh vol-pool vol 명령은 지정된 스토리지 볼륨의 풀 이름 또는 UUID를 반환합니다. 기본적으로 스토리지 풀 이름이 반환됩니다. uuid 옵션을 사용하면 풀 UUID가 대신 반환됩니다. 명령에는 요청된 정보를 반환하는 스토리지 볼륨의 키 또는 경로가 필요합니다.

예 20.96. 스토리지 볼륨의 이름 또는 UUID를 표시하는 방법

다음 예제에서는 /var/lib/libvirt/images/vol-new 경로에 있는 스토리지 볼륨의 이름을 검색합니다.
# virsh vol-pool /var/lib/libvirt/images/vol-new

vol-new
vol-path --pool pool-or-uuid vol-name-or-key 명령은 지정된 볼륨의 경로를 반환합니다. 명령에는 볼륨이 있는 스토리지 풀의 이름 또는 UUID인 --pool pool-or-uuid 가 필요합니다. 또한 경로가 요청된 볼륨의 이름 또는 키인 vol-name-or-key 가 필요합니다.
vol-name vol-key-or-path 명령은 지정된 볼륨의 이름을 반환합니다. 여기서 vol-key-or-path 는 이름을 반환할 볼륨의 키 또는 경로입니다.
vol-key --pool pool-or-uuid vol-name-or-path 명령은 지정된 볼륨의 볼륨 키를 반환합니다. --pool pool-or-uuid 는 볼륨이 있는 스토리지 풀의 이름 또는 UUID이며 vol-name-or-path 는 볼륨 키를 반환할 볼륨의 이름 또는 경로입니다.

20.36. 게스트 가상 머신 정보 표시

20.36.1. 게스트 가상 머신 표시

virsh 를 사용하여 활성 게스트 가상 머신 목록과 해당 현재 상태를 표시하려면 다음을 수행합니다.
# virsh list
사용 가능한 다른 옵션은 다음과 같습니다.
  • --all - 모든 게스트 가상 머신을 나열합니다. 예를 들면 다음과 같습니다.
    # virsh list --all
     Id Name                 State
    ----------------------------------
      0 Domain-0             running
      1 Domain202            paused
      2 Domain010            shut off
      3 Domain9600           crashed
    
    참고
    virsh list --all 을 실행할 때 결과가 표시되지 않으면 root 사용자로 가상 머신을 생성하지 못할 수 있습니다.
    virsh list --all 명령은 다음 상태를 인식합니다.
    • Running - running 상태는 현재 CPU에서 활성 상태인 게스트 가상 머신을 나타냅니다.
    • idle - 유휴 상태는 게스트 가상 머신이 유휴 상태이며 실행 중이거나 실행되지 않을 수 있음을 나타냅니다. 이는 게스트 가상 시스템이 I/O(기존 대기 상태)에서 대기 중인 경우 또는 다른 작업을 수행할 수 없으므로 유휴 상태가 되지 않은 경우 발생할 수 있습니다.
    • 일시 정지 - 게스트 가상 머신이 일시 중지되면 메모리와 기타 리소스를 소비하지만 하이퍼바이저에서 CPU 리소스를 예약할 수 없습니다. 일시 정지 상태는 virt-manager 또는 virsh suspend 명령에서 일시 정지 버튼을 사용한 후에 발생합니다.
    • 종료 - 종료 중 상태는 게스트 가상 시스템 종료 프로세스에 사용됩니다. 게스트 가상 시스템은 종료 신호를 전송하며 작업을 정상적으로 중지하는 프로세스에 있어야 합니다. 이는 모든 게스트 가상 머신 운영 체제에서는 작동하지 않을 수 있습니다. 일부 운영 체제는 이러한 신호에 응답하지 않습니다.
    • shut off - guest 가상 머신이 실행되지 않음을 나타냅니다. 이는 게스트 가상 머신이 완전히 종료되거나 시작되지 않은 경우 발생할 수 있습니다.
    • 충돌 - 충돌 상태는 게스트 가상 머신이 충돌했으며 게스트 가상 시스템이 충돌하도록 구성되지 않은 경우에만 발생할 수 있음을 나타냅니다.
    • pmsuspended - 게스트 전원 관리에 의해 일시 중단되었습니다.
  • --inactive - 정의된 게스트 가상 머신을 나열하지만 현재 활성화되어 있지 않습니다. 여기에는 및 크래시 된 시스템이 포함됩니다.
  • --managed-save - Save state가 활성화된 게스트가 저장된 것으로 나열됩니다. 이 옵션을 사용하여 게스트를 필터링하려면 --all 또는 --inactive 옵션도 사용해야 합니다.
  • --name - 명령은 기본 테이블 형식 대신 게스트의 이름을 나열합니다. 이 옵션은 게스트 UUID 목록만 인쇄하고 테이블 스타일 출력을 사용해야 함을 결정하는 --table 옵션을 사용하여 --uuid 옵션과 함께 사용할 수 없습니다.
  • --title - 일반적으로 게스트에 대한 간단한 설명이 포함된 게스트 제목 필드도 나열됩니다. 이 옵션은 기본값(-table) 출력 형식과 함께 사용해야 합니다. 예를 들면 다음과 같습니다.
    $ virsh list --title
    
    Id       Name                                          State     Title
    ----------------------------------------------------------------------------
    0        Domain-0                                      running   Mailserver1
    2        rhelvm                                        paused
    
  • --persistent - 영구 게스트만 목록에 포함됩니다. --transient 인수를 사용하여 일시적인 게스트를 나열합니다.
  • --with-managed-save - 관리형 저장소로 구성된 게스트를 나열합니다. 키가 없는 게스트를 나열하려면 -- without-managed-save 옵션을 사용합니다.
  • --state-running - 실행 중인 게스트만 나열합니다. 마찬가지로 일시 중지된 게스트에 --state-paused 를 사용하고, 꺼진 게스트의 경우 --state-shutoff 를 사용하고 --state-other 는 모든 상태를 폴백으로 나열합니다.
  • --autostart - 자동 시작 게스트만 나열됩니다. 이 기능이 비활성화된 게스트를 나열하려면 --no-autostart 인수를 사용합니다.
  • --with-snapshot - 스냅샷 이미지를 나열할 수 있는 게스트를 나열합니다. 스냅샷이 없는 게스트를 필터링하려면 --without-snapshot 옵션을 사용합니다.

20.36.2. 가상 CPU 정보 표시

virsh 를 사용하여 게스트 가상 머신에서 가상 CPU 정보를 표시하려면 다음을 수행하십시오.
# virsh vcpuinfo {domain-id, domain-name or domain-uuid}
virsh vcpuinfo 출력 예는 다음과 같습니다.
# virsh vcpuinfo guest1
VCPU:           0
CPU:            2
State:          running
CPU time:       7152.4s
CPU Affinity:   yyyy

VCPU:           1
CPU:            2
State:          running
CPU time:       10889.1s
CPU Affinity:   yyyy

20.36.3. 호스트 물리적 머신의 CPU에 vCPU 고정

virsh vcpupin 명령은 가상 CPU를 물리적 CPU에 할당합니다.
# virsh vcpupin guest1
VCPU: CPU Affinity
----------------------------------
   0: 0-3
   1: 0-3
vcpupin 명령은 다음 인수를 사용할 수 있습니다.
  • --vCPU 에는 vcpu 번호가 필요합니다.
  • [--cpulist] 문자열 은 설정할 호스트 물리적 머신의 CPU 수를 나열하거나 쿼리할 옵션을 생략합니다.
  • --config 는 다음 부팅에 영향을 미칩니다.
  • --live 는 실행 중인 게스트 가상 머신에 영향을 미칩니다.
  • --current 은 현재 게스트 가상 머신 상태에 영향을 미칩니다.

20.36.4. Given 도메인의 가상 CPU 수에 대한 정보 표시

virsh vcpucount 명령에는 도메인 이름 또는 도메인 ID가 필요합니다.
# virsh vcpucount guest1
maximum      config         2
maximum      live           2
current      config         2
current      live           2
vcpucount 는 다음 인수를 사용할 수 있습니다.
  • --maximum get maximum on vcpus
  • --active get number of currently active vcpus
  • --live get value from running guest virtual machine
  • --config get value to be used on next boot
  • 현재 게스트 가상 머신 상태에 따라 --current get value
  • 반환된 --guest 수는 게스트 관점에서입니다.

20.36.5. 가상 CPU 유사성 구성

가상 CPU의 선호도를 물리적 CPU로 구성하려면 다음을 수행합니다.
# virsh vcpupin domain-id vcpu cpulist
domain-id 매개변수는 게스트 가상 머신의 ID 또는 이름입니다.
vcpu 매개변수는 게스트 가상 머신에 할당된 가상화된 CPU 수를 나타냅니다. vcpu 매개 변수를 제공해야 합니다.
cpulist 매개변수는 쉼표로 구분된 물리적 CPU 식별자 번호 목록입니다. cpulist 매개 변수는 VCPU가 실행할 수 있는 물리적 CPU를 결정합니다.
--config 와 같은 추가 매개변수는 다음 부팅에 미치는 반면 --live 는 실행 중인 게스트 가상 머신 및 --current 은 현재 게스트 가상 머신 상태에 영향을 미칩니다.

20.36.6. 가상 CPU 수 구성

이 명령을 사용하여 게스트 가상 시스템에서 활성 상태의 가상 CPU 수를 변경합니다. 기본적으로 이 명령은 활성 게스트 가상 머신에서 작동합니다. 다음에 게스트 가상 머신이 시작될 때 사용할 비활성 설정을 변경하려면 --config 플래그를 사용하십시오. virsh 를 사용하여 게스트 가상 머신에 할당된 CPU 수를 수정하려면 다음을 수행합니다.
# virsh setvcpus {domain-name, domain-id or domain-uuid} count [[--config] [--live] | [--current]] [--maximum] [--guest] 
예를 들면 다음과 같습니다.
# virsh setvcpus guestVM1 2 --live
는 vCPU 수를 guestVM1로 설정하고 guestVM1이 실행되는 동안 이 작업이 수행됩니다.
중요
Red Hat Enterprise Linux 7에서 vCPU의 핫 플러그 해제는 지원되지 않습니다.
수 값은 호스트, 하이퍼바이저 또는 게스트 가상 머신의 원래 설명에서 오는 제한에 따라 제한될 수 있습니다.
--config 플래그가 지정되면 게스트 가상 시스템에 저장된 XML 구성이 변경되고 게스트가 시작될 때만 적용됩니다.
--live 가 지정되면 게스트 가상 머신이 활성화되어야 하며 변경 사항이 즉시 수행됩니다. 이 옵션을 사용하면 vCPU를 핫 플러그로 연결할 수 있습니다. 하이퍼바이저에서 지원하는 경우 --config--live 플래그를 모두 함께 지정할 수 있습니다.
--current 이 지정된 경우 플래그는 현재 게스트 가상 머신 상태에 영향을 미칩니다.
플래그를 지정하지 않으면 --live 플래그를 가정합니다. 게스트 가상 머신이 활성 상태가 아닌 경우 명령이 실패합니다. 또한 지정된 플래그가 없는 경우 --config 플래그도 가정했는지 하이퍼바이저에 따라 달라집니다. 이렇게 하면 XML 구성이 변경되도록 조정되는지가 결정됩니다.
--maximum 플래그는 다음에 게스트 가상 머신을 부팅할 때 핫플러그할 수 있는 최대 가상 CPU 수를 제어합니다. 따라서 --live 플래그를 사용하는 것이 아니라 --config 플래그에서만 사용할 수 있습니다.
개수 는 게스트 가상 머신에 할당된 CPU 수를 초과할 수 없습니다.
--guest 가 지정된 경우 플래그는 현재 게스트 가상 시스템의 CPU 상태를 수정합니다.

20.36.7. 메모리 할당 구성

virsh 를 사용하여 게스트 가상 머신의 메모리 할당을 수정하려면 다음을 수행합니다.
# virsh setmem {domain-id or domain-name} count
예를 들면 다음과 같습니다.
# virsh setmem vr-rhel6u1-x86_64-kvm --kilobytes 1025000
를 킬로바이트로 지정해야 합니다. 새 개수 값은 게스트 가상 머신에 지정한 양을 초과할 수 없습니다. 64MB 미만의 값은 대부분의 게스트 가상 머신 운영 체제에서는 작동하지 않을 수 있습니다. 최대 메모리 값이 클수록 활성 게스트 가상 머신에는 영향을 미치지 않습니다. 새 값이 사용 가능한 메모리보다 작으면 게스트 가상 머신이 충돌할 수 있습니다.
이 명령에는 다음과 같은 옵션이 있습니다.
  • domain - 도메인 이름, id 또는 uuid로 지정
  • size - 스케일링된 정수로 새 메모리 크기를 결정합니다. 기본 단위는 KiB이지만 다른 단위를 지정할 수 있습니다.
    유효한 메모리 단위는 다음과 같습니다.
    • 바이트의 경우 B 또는 바이트
    • KB (KB: 킬로바이트)(10~1000바이트 블록)
    • k ibibytes의 경우 K 또는 KiB (210 또는 1024바이트 블록)
    • 메가바이트( MB )의 경우 1TiB바이트의6 개 또는 블록입니다.
    • 메비 바이트의 경우 m 또는 MiB (20 또는 블록 1,048,576 바이트)
    • GB (GB for gigabytes)(9 또는 1,000만 바이트 블록)
    • G or GiB for gibibytes (230 또는 블록 1,073,741,824 바이트)
    • 테라바이트의 경우 TB (10만바이트)11,000 만바이트의 블록(12개 또는 블록)
    • t 또는 TiB for tebibytes(240 또는 블록 1,099,511,627,776 바이트)
    모든 값은 libvirt에 의해 가장 가까운 kibibyte로 반올림되며 하이퍼바이저에서 지원하는 단위로 추가로 반올림될 수 있습니다. 또한 일부 하이퍼바이저는 4000KiB(또는 4000 x 210 또는 4,096,000바이트)와 같은 최소값을 적용합니다. 이 값의 단위는 선택적 특성 메모리 단위에 따라 결정되며, 기본값은 kibibytes (KiB) 단위로 지정되며, 여기서 지정된 값이 210 또는 1024 바이트 블록으로 곱한 측정 단위로 설정됩니다.
  • --config - 명령은 다음 부팅에 적용됩니다.
  • --live - 명령은 실행 중인 게스트 가상 머신의 메모리를 제어합니다.
  • --current - 명령은 현재 게스트 가상 머신의 메모리를 제어합니다.

20.36.8. 도메인의 메모리 할당 변경

virsh setmaxmem 도메인 크기 --config --live --current 명령을 사용하면 다음과 같이 게스트 가상 시스템에 대한 최대 메모리 할당을 설정할 수 있습니다.
# virsh setmaxmem guest1 1024 --current
최대 메모리에 지정할 수 있는 크기는 지원되는 접미사가 제공되지 않는 한 기본적으로 kibibytes로 표시되는 스케일링된 정수입니다. 이 명령과 함께 다음 인수를 사용할 수 있습니다.
  • --config - 다음 부팅에 영향을 미칩니다.
  • --live - 실행 중인 게스트 가상 머신의 메모리를 제어하여 하이퍼바이저를 통해 최대 메모리 제한을 실시간으로 변경할 수 있는 것은 아니므로 하이퍼바이저가 이 작업을 지원합니다.
  • --current - 현재 게스트 가상 머신의 메모리 제어

20.36.9. 게스트 가상 머신 블록 장치 정보 표시

virsh domblkstat 명령을 사용하여 실행 중인 게스트 가상 시스템에 대한 블록 장치 통계를 표시합니다. --human 을 사용하여 더 친숙한 방식으로 통계를 표시합니다.
# virsh domblkstat GuestName block-device

20.36.10. 게스트 가상 머신 네트워크 장치 정보 표시

virsh domifstat 명령을 사용하여 실행 중인 게스트 가상 시스템에 대한 네트워크 인터페이스 통계를 표시합니다.
# virsh domifstat GuestName interface-device 

20.37. 가상 네트워크 관리

이 섹션에서는 virsh 명령을 사용하여 가상 네트워크를 관리하는 방법을 설명합니다. 가상 네트워크를 나열하려면 다음을 수행합니다.
# virsh net-list
이 명령은 다음과 유사한 출력을 생성합니다.
# virsh net-list
Name                 State      Autostart
-----------------------------------------
default              active     yes
vnet1	             active     yes
vnet2	             active     yes
특정 가상 네트워크에 대한 네트워크 정보를 보려면 다음을 수행합니다.
# virsh net-dumpxml NetworkName
그러면 지정된 가상 네트워크에 대한 정보가 XML 형식으로 표시됩니다.
# virsh net-dumpxml vnet1
<network>
  <name>vnet1</name>
  <uuid>98361b46-1581-acb7-1643-85a412626e70</uuid>
  <forward dev='eth0'/>
  <bridge name='vnet0' stp='on' forwardDelay='0' />
  <ip address='192.168.100.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.100.128' end='192.168.100.254' />
    </dhcp>
  </ip>
</network>
가상 네트워크 관리에 사용되는 다른 virsh 명령은 다음과 같습니다.
  • virsh net-autostart network-name : libvirt 데몬이 시작될 때 network-name 을 자동으로 시작합니다. --disable 옵션은 network-name 을 표시합니다.
  • virsh net-create XMLfile : 기존 파일의 XML 정의를 사용하여 새(전송) 네트워크를 시작합니다.
  • virsh net-define XMLfile : 시작하지 않고 기존 파일의 XML 정의를 사용하여 새 네트워크를 정의합니다.
  • virsh net-destroy network-name : 네트워크 이름으로 지정된 네트워크를 삭제합니다.
  • virsh net-name networkUUID : 지정된 네트워크 UUID 를 네트워크 이름으로 변환합니다.
  • virsh net-uuid network-name : 지정된 네트워크 이름을 네트워크 UUID로 변환합니다.
  • virsh net-start nameOfInactiveNetwork : 비활성 네트워크를 시작합니다.
  • virsh net-undefine nameOfInactiveNetwork : 네트워크의 비활성 XML 정의를 제거합니다. 이는 네트워크 상태에 영향을 미치지 않습니다. 이 명령이 실행될 때 도메인이 실행 중인 경우 네트워크가 계속 실행됩니다. 그러나 네트워크는 영구적이지 않습니다.
libvirt 에는 도메인에서 사용하고 실제 네트워크 장치에 연결할 수 있는 가상 네트워크를 정의하는 기능이 있습니다. 이 기능에 대한 자세한 내용은 libvirt 업스트림 웹 사이트에서 설명서를 참조하십시오. 가상 네트워크에 대한 대부분의 명령은 도메인에 사용되는 명령과 유사하지만 가상 네트워크 이름을 지정하는 방법은 이름 또는 UUID입니다.

20.37.1. 가상 네트워크 자동 시작

virsh net-autostart 명령은 게스트 가상 시스템이 부팅될 때 자동으로 시작하도록 가상 네트워크를 구성합니다.
# virsh net-autostart network [--disable]
이 명령은 autostart 명령을 비활성화하는 --disable 옵션을 허용합니다.

20.37.2. XML 파일에서 가상 네트워크 생성

virsh net-create 명령은 XML 파일에서 가상 네트워크를 생성합니다. libvirt에서 사용하는 XML 네트워크 형식에 대한 설명을 보려면 libvirt 업스트림 웹 사이트를 참조하십시오. 이 명령 파일에서 는 XML 파일의 경로입니다. XML 파일에서 가상 네트워크를 생성하려면 다음을 실행합니다.
# virsh net-create file

20.37.3. XML 파일에서 가상 네트워크 정의

virsh net-define 명령은 XML 파일에서 가상 네트워크를 정의하지만 인스턴스화하지는 않습니다.
# virsh net-define file

20.37.4. 가상 네트워크 중지

virsh net-destroy 명령은 해당 이름 또는 UUID로 지정된 지정된 가상 네트워크를 제거(중지)합니다. 이 효과가 즉시 적용됩니다. 지정된 네트워크 네트워크를 중지하려면 다음이 필요합니다.
# virsh net-destroy network

20.37.5. 덤프 파일 생성

virsh net-dumpxml 명령은 지정된 가상 네트워크에 대해 가상 네트워크 정보를 XML 덤프로 stdout에 출력합니다. --inactive 가 지정된 경우 물리적 함수가 연결된 가상 기능으로 확장되지 않습니다.
# virsh net-dumpxml network [--inactive]

20.37.6. 가상 네트워크의 XML 구성 파일 편집

다음 명령은 네트워크의 XML 구성 파일을 편집합니다.
# virsh net-edit network
XML 파일을 편집하는 데 사용되는 편집기는 $VISUAL 또는 $EDITOR 환경 변수를 통해 제공할 수 있으며 기본값은 vi 입니다.

20.37.7. 가상 네트워크에 대한 정보 가져오기Getting information about a Virtual Network

virsh net-info네트워크 오브젝트에 대한 기본 정보를 반환합니다.
# virsh net-info network

20.37.8. 가상 네트워크에 대한 정보 나열

virsh net-list 명령은 활성 네트워크 목록을 반환합니다. --all 을 지정하면 정의되었지만 비활성 네트워크가 포함됩니다. --inactive 가 지정된 경우 비활성 항목만 나열됩니다. 또한 반환된 네트워크를 --persistent 로 필터링하여 영구 네트워크를 나열합니다. --transient 는 일시적인 네트워크를 나열하고 --autostart 를 사용하여 autostart가 활성화된 것을 나열하고 --no-autostart 를 사용하여 autostart가 비활성화된 항목을 나열할 수도 있습니다.
참고: 이전 서버에 대해 설명할 때 이 명령은 고유 경쟁이 있는 일련의 API 호출을 사용해야 합니다. 여기서 목록이 수집되는 동안 호출 간 상태를 변경하는 경우 풀이 나열되지 않거나 두 번 이상 표시될 수 있습니다. 최신 서버에는 이 문제가 없습니다.
가상 네트워크를 나열하려면 다음을 실행합니다.
# virsh net-list [--inactive | --all] [--persistent] [<--transient>] [--autostart] [<--no-autostart>]

20.37.9. 네트워크 UUID를 네트워크 이름으로 변환

virsh net-name 명령은 네트워크 UUID를 네트워크 이름으로 변환합니다.
# virsh net-name network-UUID

20.37.10. 네트워크 이름을 네트워크 UUID로 변환

virsh net-uuid 명령은 네트워크 이름을 네트워크 UUID로 변환합니다.
# virsh net-uuid network-name

20.37.11. 이전 정의된 Inactive 네트워크 시작

virsh net-start 명령은 이전에 정의된 비활성 네트워크를 시작합니다.
# virsh net-start network

20.37.12. Inactive Network 설정 해제

virsh net-undefine 명령은 비활성 네트워크에 대한 구성을 분리합니다.
# virsh net-undefine network

20.37.13. 기존 네트워크 정의 파일 업데이트

# virsh net-update network directive section XML [--parent-index index] [[--live] [--config] | [--current]]
virsh net-update 명령은 다음 지시문 중 하나를 섹션에 실행하여 기존 네트워크 정의의 지정된 섹션을 업데이트합니다.
  • add-first
  • add-last 또는 add (이는 동의어)
  • delete
  • 수정
섹션은 다음 중 하나일 수 있습니다.
  • bridge
  • domain
  • ip
  • ip-dhcp-host
  • ip-dhcp-range
  • forward
  • forward interface
  • forward-pf
  • portgroup
  • dns-host
  • dns-txt
  • dns-srv
각 섹션은 변경된 요소를 가리키는 XML 요소 계층 구조의 연결로 이름이 지정됩니다. 예를 들어 ip-dhcp-host 는 네트워크의 <ip> 요소 내의 <dhcp> 요소에 포함된 <호스트> 요소를 변경합니다.
XML 은 변경 중인 유형의 전체 XML 요소(예: <host mac="00:11:22:33:44:55' ip='1.2.3.4'/>) 또는 완전한 XML 요소가 포함된 파일의 이름입니다. 디ambiguation은 제공된 텍스트의 첫 번째 문자를 보고 수행되며 첫 번째 문자가 < 이면 XML 텍스트입니다. 첫 번째 문자가 아닌 경우 사용할 xml 텍스트가 포함된 파일의 이름입니다. --parent-index 옵션은 요청된 요소가 있는 여러 개의 상위 요소(0 기반)를 지정하는 데 사용됩니다.
예를 들어 dhcp <호스트> 요소는 네트워크의 여러 < <ip> > 요소 중 하나에 있을 수 있습니다. parent-index가 제공되지 않으면(일반적으로 이미 <dhcp> 요소가 있는 유일한 <IP> 요소)가 선택되지만 --parent-index 가 지정된 경우 해당 특정 인스턴스가 수정됩니다. --live 를 지정하면 실행 중인 네트워크에 영향을 미칩니다. --config 를 지정하면 영구 네트워크의 다음 시작에 영향을 미칩니다. --current 이 지정된 경우 현재 네트워크 상태에 영향을 미칩니다. --live--config 플래그를 모두 제공할 수 있지만 --current 는 배타적입니다. 플래그를 지정하지 않는 것은 --current 을 지정하는 것과 동일합니다.

20.37.14. virsh를 사용하여 게스트 가상 머신 마이그레이션

virsh를 사용한 마이그레이션에 대한 정보는 virsh See을 사용하여 라이브 KVM 마이그레이션 섹션에 있습니다. 15.5절. “virsh를 사용한 실시간 KVM 마이그레이션”

20.37.15. 게스트 가상 머신의 고정 IP 주소 설정

게스트 가상 머신이 DHCP에서 해당 IP 주소를 가져오도록 구성되어 있지만 예측 가능한 고정 IP 주소를 보유해야 하는 경우 다음 절차를 사용하여 libvirt 에서 사용하는 DHCP 서버 구성을 수정할 수 있습니다. 이 절차를 수행하려면 이러한 변경을 위해 게스트 인터페이스의 MAC 주소를 알아야 합니다. 따라서 게스트를 생성한 후 작업을 수행하거나 게스트를 만들기 전에 게스트의 MAC 주소를 결정한 다음 게스트 가상 머신을 생성할 때 이 동일한 주소를 수동으로 설정해야 합니다.
또한 이 절차는 "nat", "route" 또는 전달 모드가 없는 libvirt 가상 네트워크에 연결된 게스트 인터페이스에서만 작동합니다. 이 절차는 네트워크가 forward mode="bridge" 또는 "hostdev" 로 구성된 경우 작동하지 않습니다. 이러한 경우 DCHP 서버는 네트워크의 다른 위치에 위치하므로 libvirt를 관리하지 않습니다. 이 경우 원격 DHCP 서버에서 고정 IP 항목을 만들어야 합니다. 이러한 작업을 수행하려면 서버에 제공된 설명서를 참조하십시오.

절차 20.5. 고정 IP 주소 설정

이 절차는 호스트 물리적 시스템에서 수행됩니다.
  1. 게스트 XML 구성 파일 확인

    virsh domiflist guest1명령을 실행하여 게스트 의 네트워크 구성 설정을 표시합니다. guest1 대신 가상 머신의 이름을 대체합니다. 테이블이 표시됩니다. Source 열을 확인합니다. 네트워크의 이름입니다. 이 예제에서는 네트워크를 default라고 합니다. 이 이름은 절차의 나머지 부분과 MAC 주소로 사용됩니다.
    # virsh domiflist guest1
    Interface  Type       Source     Model       MAC
    -------------------------------------------------------
    vnet4      network    default    virtio      52:54:00:48:27:1D
    
    
  2. DHCP 범위 확인

    설정한 IP 주소는 네트워크에 지정된 dhcp 범위 내에 있어야 합니다. 또한 네트워크의 다른 기존 고정 IP 주소와 충돌하지 않아야 합니다. 사용 가능한 주소 범위와 사용되는 주소를 확인하려면 호스트 머신에서 다음 명령을 사용하십시오.
    # virsh net-dumpxml default | egrep 'range|host\ mac'
    
    <range start='198.51.100.2' end='198.51.100.254'/>
    <host mac='52:54:00:48:27:1C:1D' ip='198.51.100.2'/>
    
    표시되는 출력은 예제와 다르며 더 많은 행과 여러 개의 호스트 mac 행이 표시될 수 있습니다. 각 게스트 고정 IP 주소에는 하나의 행이 있습니다.
  3. 고정 IP 주소 설정

    호스트 시스템에서 다음 명령을 사용하고 default 를 네트워크 이름으로 바꿉니다.
    # virsh net-update default add ip-dhcp-host '<host mac="52:54:00:48:27:1D" ip="198.51.100.3"/>' --live --config
    --live 옵션을 사용하면 이 변경 사항을 즉시 적용할 수 있으며 --config 옵션을 사용하면 영구적으로 변경됩니다. 이 명령은 유효한 IP 및 MAC 주소를 사용하는 한 아직 생성되지 않은 게스트 가상 머신에서도 작동합니다. MAC 주소는 유효한 유니캐스트 MAC 주소( : 로 구분된 6 16진수 쌍)이어야 합니다. libvirt 에서 새 임의의 MAC 주소를 생성하는 경우 처음 세 자리 쌍에 52:54:00 을 사용하므로 이 규칙을 따르는 것이 좋습니다.
  4. 인터페이스 다시 시작 (선택 사항)

    게스트 가상 머신이 현재 실행 중인 경우 게스트 가상 머신에서 DHCP 주소를 다시 요청하도록 강제해야 합니다. 게스트가 실행되고 있지 않으면 다음에 시작할 때 새 IP 주소가 구현됩니다. 인터페이스를 다시 시작하려면 호스트 시스템에 다음 명령을 입력합니다.
    # virsh domif-setlink guest1 52:54:00:48:27:1D down
    # sleep 10
    # virsh domif-setlink guest1 52:54:00:48:27:1D up
    이 명령을 실행하면 게스트 가상 머신의 운영 체제가 이더넷 케이블이 연결되지 않은 것으로 간주하고 10초 후에 다시 연결될 수 있습니다. sleep 명령은 많은 DHCP 클라이언트가 IP 주소를 다시 요청하지 않고 케이블의 연결을 끊을 수 있기 때문에 중요합니다. 10초 정도 길어서 DHCP 클라이언트가 이전 IP 주소를 잊어 버리고, up 명령이 실행되면 새 IP 주소를 요청합니다. 어떤 이유로든 이 명령이 실패하는 경우 게스트 운영 체제의 관리 인터페이스에서 게스트 인터페이스를 재설정해야 합니다.

20.38. 인터페이스 명령

다음 명령은 호스트 인터페이스를 조작하므로 게스트 가상 시스템에서 실행할 수 없습니다. 이러한 명령은 호스트 물리적 시스템의 터미널에서 실행해야 합니다.
주의
이 섹션의 명령은 시스템에 NetworkManager 서비스가 비활성화된 경우에만 지원되며 네트워크 서비스를 대신 사용합니다.
종종 이러한 호스트 인터페이스는 게스트 가상 머신 <인터페이스> 요소(예: 시스템 생성 브리지 인터페이스) 내의 이름으로 사용할 수 있지만 호스트 인터페이스를 특정 게스트 구성 XML에 연결할 필요는 없습니다. 호스트 인터페이스의 많은 명령은 게스트 가상 머신에 사용되는 명령과 유사하며 인터페이스 이름을 지정하는 방법은 이름 또는 MAC 주소에 따라 다릅니다. 그러나 iface 인수에 MAC 주소를 사용하는 것은 해당 주소가 고유할 때만 작동합니다(인터페이스와 브리지가 동일한 MAC 주소를 공유하는 경우, 종종 해당 MAC 주소를 사용하면 모호함으로 인해 오류가 발생하고 대신 이름에 의존해야 합니다).

20.38.1. XML 파일을 통해 호스트 물리적 머신 인터페이스 정의 및 시작

virsh iface-define file 명령은 XML 파일에서 호스트 인터페이스를 정의합니다. 이 명령은 인터페이스만 정의하고 시작되지 않습니다.
# virsh iface-define iface.xml
이미 정의된 인터페이스를 시작하려면 iface-start 인터페이스를 실행합니다. 여기서 interface 는 인터페이스 이름입니다.

20.38.2. 호스트 인터페이스의 XML 구성 파일 편집

virsh iface-edit 인터페이스는 호스트 인터페이스에 대한 XML 구성 파일을 편집합니다. XML 구성 파일을 편집할 수 있는 유일한 권장 방법입니다. (이러한 파일에 대한 자세한 내용은 23장. 도메인 XML 조작 을 참조하십시오.)

20.38.3. 호스트 인터페이스 나열

virsh iface-list 는 활성 호스트 인터페이스 목록을 표시합니다. --all 이 지정된 경우 이 목록에는 정의되어 있지만 비활성 상태인 인터페이스도 포함됩니다. --inactive 가 지정된 경우 비활성 인터페이스만 나열됩니다.

20.38.4. MAC 주소를 인터페이스 이름으로 변환

virsh iface-name interface 명령은 호스트 인터페이스 MAC 주소를 인터페이스 이름으로 변환하고, 제공된 MAC 주소는 호스트의 인터페이스 간에 고유합니다. 이 명령에는 인터페이스 MAC 주소인 인터페이스가 필요합니다.
virsh iface-mac interface 명령은 호스트의 인터페이스 이름을 이 경우 인터페이스 이름인 MAC 주소로 변환합니다.

20.38.5. 특정 호스트 물리적 머신 인터페이스 중지 및 해제

virsh iface-destroy interface 명령은 호스트에서 virsh if-down 을 실행하는 것과 동일한 지정된 호스트 인터페이스를 제거(중지)합니다. 이 명령은 활성 사용에서 해당 인터페이스를 비활성화하고 즉시 적용됩니다.
인터페이스를 해제하려면 virsh iface-undefine interface명령을 인터페이스 이름과 함께 사용합니다.

20.38.6. 호스트 구성 파일 표시

virsh iface-dumpxml interface --inactive 명령은 호스트 인터페이스 정보를 stdout에 대한 XML 덤프로 표시합니다. --inactive 인수가 지정된 경우 출력은 다음에 시작할 인터페이스의 영구 상태를 반영합니다.

20.38.7. 브리지 장치 생성

virsh iface-bridge 명령은 bridge 라는 브리지 장치를 만들고 기존 네트워크 장치 인터페이스를 새 브리지에 연결하여 즉시 작동을 시작하고 STP가 활성화되고 지연이 0입니다.
# virsh iface-bridge interface bridge
이러한 설정은 --no-stp 옵션, --no-start 옵션 및 지연 시간(초)을 사용하여 변경할 수 있습니다. 인터페이스의 IP 주소 구성은 새 브리지 장치로 이동합니다. 브리지 분리에 대한 자세한 내용은 다음을 참조하십시오. 20.38.8절. “브리지 장치 분리”

20.38.8. 브리지 장치 분리

virsh iface-unbridge bridge --no-start 명령은 지정된 브리지 장치인 bridge 를 종료하고 기본 인터페이스를 다시 일반 사용량으로 해제한 후 브리지 장치에서 기본 IP 주소 구성을 기본 장치로 이동합니다. 기본 인터페이스는 --no-start 인수를 사용하지 않는 한 재시작되지만 일반적으로 다시 시작하지 않는 것은 권장되지 않습니다. 브리지를 만들려면 20.38.7절. “브리지 장치 생성” 를 참조하십시오.

20.38.9. 인터페이스 스냅샷 조작

virsh iface-begin 명령은 나중에 커밋( virsh iface-commit) 또는 복원(virsh iface-rollback)할 수 있는 현재 호스트 인터페이스 설정의 스냅샷을 생성합니다. 이 기능은 새 호스트 인터페이스를 정의하고 시작할 때 오류가 발생하고 시스템 구성이 발생하는 경우에 유용합니다. 스냅샷이 이미 있는 경우 이전 스냅샷이 커밋되거나 복원될 때까지 이 명령이 실패합니다. 정의되지 않은 동작은 스냅샷 생성과 해당 최종 커밋 또는 롤백 시점 사이에 libvirt API 외부의 호스트 인터페이스에 대한 외부 변경이 발생합니다.
virsh iface-commit 명령을 사용하여 마지막 virsh iface-begin 이후의 모든 변경 사항을 작업으로 선언한 다음 롤백 지점을 삭제합니다. virsh iface-begin 을 사용하여 인터페이스 스냅샷이 아직 시작되지 않은 경우 이 명령이 실패합니다.
virsh iface-rollback 을 사용하여 virsh iface-begin 명령이 실행된 마지막 시간을 기록한 상태로 모든 호스트 인터페이스 설정을 되돌립니다. virsh iface-begin 명령이 이전에 실행되지 않은 경우 virsh iface-rollback 이 실패합니다. virsh iface-commit 가 실행되기 전에 호스트 물리적 시스템을 재부팅하면 virsh iface-begin 이 실행된 시점으로 호스트의 구성을 복원하는 자동 롤백이 수행됩니다. 이는 네트워크 구성을 부적절하게 변경하면 변경 내용을 취소하기 위해 호스트에 연결할 수 없는 경우 유용하지만 호스트는 전원을 끄거나 재부팅해야 하는 경우에 유용합니다.

예 20.97. 스냅샷 작업 예

새 호스트 인터페이스를 정의하고 시작합니다.
# virsh iface-begin
# virsh iface-define eth4-if.xml
# virsh if-start eth4
문제가 발생하여 네트워크가 실행을 중지하면 변경 사항을 롤백합니다.
# virsh iface-rollback
모든 항목이 제대로 작동하는 경우 변경 사항을 커밋합니다.
# virsh iface-commit

20.39. 스냅샷 관리

다음 섹션에서는 게스트 가상 머신 스냅샷을 조작하기 위해 수행할 수 있는 작업을 설명합니다. 스냅샷 은 지정된 시점에서 게스트 가상 머신의 디스크, 메모리 및 장치 상태를 가져와서 나중에 사용할 수 있도록 저장합니다. 스냅샷에는 잠재적으로 파괴적인 작업이 되기 전에 게스트 가상 머신의 상태를 절약하기 위해 OS 이미지의 "clean" 사본을 저장하는 데 많은 용도가 있습니다. 스냅샷은 고유한 이름으로 식별됩니다. 스냅샷 속성 을 나타내는 데 사용되는 XML 형식에 대한 설명은 libvirt 업스트림 웹 사이트를 참조하십시오.
중요
Red Hat Enterprise Linux 7은 게스트 가상 머신이 일시 중지되거나 전원이 꺼지는 동안 스냅샷 생성만 지원합니다. 실행 중인 게스트의 스냅샷(예: 실시간 스냅샷이라고도 함) 생성은 Red Hat Virtualization™ 에서 사용할 수 있습니다. 자세한 내용은 서비스 담당자에게 문의하십시오.

20.39.1. 스냅샷 생성

virsh snapshot-create 명령은 게스트 가상 머신의 XML 파일에 지정된 속성을 사용하여 게스트 가상 머신의 스냅샷을 생성합니다(예: <name><description> 요소, <disks>). 스냅샷을 실행하려면 다음을 수행합니다.
# virsh snapshot-create domain XML file [--redefine [--current] [--no-metadata] [--halt] [--disk-only] [--reuse-external] [--quiesce] [--atomic]
게스트 가상 머신 이름, id 또는 uid를 게스트 가상 머신 요구 사항으로 사용할 수 있습니다. XML 요구 사항은 최소의 이름,설명디스크 요소를 포함해야 하는 문자열입니다.
나머지 선택적 인수는 다음과 같습니다.
  • --disk-only - 게스트 가상 머신의 메모리 상태가 스냅샷에 포함되지 않습니다.
  • XML 파일 문자열이 완전히 생략된 경우 libvirt는 모든 필드의 값을 선택합니다. 새 스냅샷은 snapshot-current에 나열된 대로 최신 상태가 됩니다. 또한 스냅샷에는 게스트 가상 머신 상태가 있는 일반 시스템 검사점이 아닌 디스크 상태만 포함됩니다. 디스크 스냅샷은 전체 시스템 체크포인트보다 빠르지만 디스크 스냅샷으로 되돌리려면 power cord가 예기치 않게 가져온 시점의 디스크 상태와 같기 때문에 fsck 또는 저널 리플레이가 필요할 수 있습니다. --halt--disk-only 를 혼합하면 그 때 디스크에 플러시되지 않은 데이터가 손실됩니다.
  • --halt - 스냅샷을 생성한 후 게스트 가상 머신이 비활성 상태가 됩니다. --halt--disk-only 를 혼합하면 메모리 상태 외에도 디스크로 플러시되지 않은 데이터가 손실됩니다.
  • --redefinevirsh snapshot-dumpxml 에 의해 생성된 모든 XML 요소가 유효한 경우, 스냅샷 계층 구조를 다른 머신으로 마이그레이션하고, 임시 게스트 가상 머신의 경우 계층 구조를 다시 만드는 데 사용할 수 있고 나중에 동일한 이름과 UUID로 다시 생성되거나 스냅샷 메타데이터(예: 호스트별 가상 머신의 게스트 XML)에서 가상 머신의 특정 측면을 추측하는 데 사용할 수 있습니다. 이 플래그를 제공하면 xmlfile 인수가 필수이며 --current 플래그를 지정하지 않는 한 게스트 가상 머신의 현재 스냅샷이 변경되지 않습니다.
  • --no-metadata 는 스냅샷을 생성하지만(즉, libvirt는 스냅샷을 현재 상태로 처리하지 않으며, --redefine 이 나중에 메타데이터에 대해 libvirt 를 교육하는 데 사용되지 않는 한) 스냅샷으로 되돌릴 수 없습니다.
  • --reuse-external. used 및 스냅샷 XML에서 기존 파일 대상이 있는 외부 스냅샷을 요청하는 경우 대상이 존재하고 재사용되어야 합니다. 그렇지 않으면 기존 파일의 내용이 손실되지 않도록 스냅샷이 거부됩니다.
  • --quiesce libvirt는 게스트 가상 시스템의 마운트된 파일 시스템을 정지하고 해제하려고 합니다. 그러나 게스트 가상 머신에 게스트 에이전트가 없는 경우 스냅샷 생성에 실패합니다. 스냅샷에는 가상 게스트 머신의 메모리 상태가 포함될 수 있습니다. 스냅샷은 외부이어야 합니다.
  • --Atomic 을 사용하면 libvirt에서 스냅샷이 성공하거나 변경없이 실패하도록 합니다. 모든 하이퍼바이저가 이를 지원하는 것은 아닙니다. 이 플래그를 지정하지 않으면 작업을 부분적으로 수행한 후 일부 하이퍼바이저가 실패할 수 있으며, partial changes가 발생하는지 확인하려면 virsh dumpxml 을 사용해야 합니다.
스냅샷 메타데이터가 있으면 영구 게스트 가상 머신을 정의하는 시도가 방지됩니다. 그러나 임시 게스트 가상 머신의 경우 게스트 가상 시스템이 실행을 종료할 때 스냅샷 메타데이터가 자동으로 손실됩니다(예: 제거 또는 내부 게스트 작업의 경우).

20.39.2. 현재 게스트 가상 머신의 스냅샷 생성

virsh snapshot-create-as 명령은 도메인 XML 파일(예: 이름설명 요소)에 지정된 속성을 사용하여 게스트 가상 머신의 스냅샷을 생성합니다. 이러한 값이 XML 문자열에 포함되어 있지 않으면 libvirt 에서 값을 선택합니다. 스냅샷을 실행하려면 다음을 수행합니다.
# snapshot-create-as domain {[--print-xml] | [--no-metadata] [--halt] [--reuse-external]} [name] [description] [--disk-only [--quiesce]] [--atomic] [[--memspec memspec]] [--diskspec] diskspec]
나머지 선택적 인수는 다음과 같습니다.
  • --print-xml은 스냅샷을 실제로 생성하는 대신 snapshot-create 에 적절한 XML을 출력으로 생성합니다.
  • --halt 는 스냅샷을 생성한 후 게스트 가상 머신을 비활성 상태로 유지합니다.
  • --disk-only 는 게스트 가상 머신 상태가 포함되지 않은 스냅샷을 생성합니다.
  • --memspec 을 사용하여 checkpoint가 내부인지 외부인지 제어할 수 있습니다. 플래그는 필수이며 [file=]name[,snapshot=type]. 여기서 type은 none, internal 또는 external 형식이어야 합니다. file=name에 리터럴 쉼표를 포함하려면 두 번째 쉼표로 이스케이프합니다.
  • --diskspec 옵션을 사용하여 --disk-only 및 외부 검사점이 외부 파일을 생성하는 방법을 제어할 수 있습니다. 이 옵션은 도메인 XML의 <disk> 요소 수에 따라 여러 번 발생할 수 있습니다. 각 <diskspec> 은 디스크[,snapshot=type][,driver=type][,file=name] 형식으로 되어 있습니다. 특정 디스크에 --diskspec 을 생략하면 가상 머신 구성의 기본 동작이 사용됩니다. 리터럴 쉼표를 디스크 또는 file=name 에 포함하려면 두 번째 쉼표로 이스케이프합니다. 리터럴 --diskspec 은 세 가지 도메인,이름설명이 모두 존재하지 않는 한 각 디스크spec 앞에 와야 합니다. 예를 들어 vda,snapshot=external,file=/path/to의 diskspec은 다음 XML이 생성됩니다.
    
    <disk name=’vda’ snapshot=’external’>
       <source file=’/path/to,new’/>
    </disk>
    
    
    중요
    Red Hat은 다른 가상화 툴에서 처리할 때 보다 유연하고 신뢰할 수 있으므로 외부 스냅샷을 사용하는 것이 좋습니다. 외부 스냅샷을 만들려면 --diskspec vda,snapshot=external 옵션과 함께 virsh-create-as 명령을 사용하십시오.
    이 옵션을 사용하지 않는 경우 virsh 는 안정성 및 최적화 부족으로 인해 사용할 수 없는 내부 스냅샷을 생성합니다. 자세한 내용은 A.13절. “libvirt를 사용하여 외부 스냅샷 생성을 위한 해결방법”의 내용을 참조하십시오.
  • --reuse-external 이 지정되고 도메인 XML 또는 diskspec 옵션은 기존 파일 대상이 있는 외부 스냅샷을 요청한 다음 대상이 있어야 하며 재사용해야 합니다. 그렇지 않으면 기존 파일의 내용이 손실되지 않도록 스냅샷이 거부됩니다.
  • --quiesce 를 지정하면 libvirt에서 게스트 에이전트를 사용하여 게스트 가상 시스템의 마운트된 파일 시스템을 정지 및 해제하려고 합니다. 그러나 도메인에 게스트 에이전트가 없는 경우 스냅샷 생성에 실패합니다. 현재 이 작업을 수행하려면 --disk-only 를 전달해야 합니다.
  • --no-metadata 는 스냅샷 데이터를 생성하지만, 메타데이터는 즉시 삭제(즉,libvirt 가 스냅샷을 현재 상태로 처리하지 않으며, 스냅샷 생성은 나중에 메타데이터에 대해 libvirt를 교육하는 데 사용되지 않는 한 스냅샷으로 되돌릴 수 없습니다). 이 플래그는 --print-xml과 호환되지 않습니다.
  • --Atomic 을 사용하면 libvirt에서 스냅샷이 성공하거나 변경없이 실패하도록 합니다. 모든 하이퍼바이저가 이를 지원하는 것은 아닙니다. 이 플래그를 지정하지 않으면 작업을 부분적으로 수행한 후 일부 하이퍼바이저가 실패할 수 있으며, partial changes가 발생하는지 확인하려면 virsh dumpxml 을 사용해야 합니다.
주의
64비트 ARM 플랫폼 호스트에서 실행 중인 KVM 게스트의 스냅샷을 만드는 작업은 현재 작동하지 않습니다. 64비트 ARM의 KVM은 Red Hat에서 지원되지 않습니다.

20.39.3. 사용 중인 스냅샷 표시

virsh snapshot-current 명령은 현재 사용 중인 스냅샷을 쿼리하는 데 사용됩니다.
# virsh snapshot-current domain {[--name] | [--security-info] | [snapshotname]}
snapshotname 을 사용하지 않으면 게스트 가상 머신의 현재 스냅샷(있는 경우)에 대한 스냅샷 XML이 출력으로 표시됩니다. --name 이 지정된 경우 전체 XML 대신 현재 스냅샷 이름만 출력으로 전송됩니다. security-info 를 제공하면 중요한 정보가 XML에 포함됩니다. snapshotname 을 사용하여 게스트 가상 머신으로 되돌아가지 않고도 기존 명명된 스냅샷을 현재 스냅샷이 되도록 만들기 위한 요청을 생성합니다.

20.39.4. snapshot-edit

이 명령은 현재 사용 중인 스냅샷을 편집하는 데 사용됩니다.
# virsh snapshot-edit domain [snapshotname] [--current] {[--rename] [--clone]}
snapshotname--current 둘 다 지정된 경우 편집한 스냅샷이 현재 스냅샷이 되도록 강제 적용됩니다. snapshotname 이 생략된 경우 현재 스냅샷을 편집하려면 --current 를 제공해야 합니다.
아래 명령 시퀀스와 동일하지만 몇 가지 오류 검사도 포함됩니다.
# virsh snapshot-dumpxml dom name > snapshot.xml 
# vi snapshot.xml [note - this can be any editor] 
# virsh snapshot-create dom snapshot.xml --redefine [--current] 
--rename 이 지정되면 스냅샷의 이름이 변경됩니다. --clone 이 지정된 경우 스냅샷 이름을 변경하면 스냅샷 메타데이터의 복제본이 생성됩니다. 둘 다 지정하지 않으면 편집에서 스냅샷 이름은 변경되지 않습니다. 스냅샷 이름은 단일 qcow2 파일 내의 내부 스냅샷과 같은 일부 스냅샷의 내용은 원래 스냅샷 이름에서만 액세스할 수 있으므로 신중하게 변경해야 합니다.

20.39.5. snapshot-info

snapshot-info domain 명령은 스냅샷에 대한 정보를 표시합니다. 사용하려면 다음을 실행합니다.
# snapshot-info domain {snapshot | --current}
지정된 스냅샷 또는 --current 을 사용하여 현재 스냅샷에 대한 기본 정보를 출력합니다.

20.39.6. snapshot-list

지정된 게스트 가상 머신에 사용 가능한 모든 스냅샷을 나열하여 기본적으로 스냅샷 이름, 생성 시간 및 게스트 가상 머신 상태에 대한 열을 표시합니다. 사용하려면 다음을 실행합니다.
# virsh snapshot-list domain [{--parent | --roots | --tree}] [{[--from] snapshot | --current} [--descendants]] [--metadata] [--no-metadata] [--leaves] [--no-leaves] [--inactive] [--active] [--disk-only] [--internal] [--external]
선택적 인수는 다음과 같습니다.
  • --parent 는 각 스냅샷의 부모 이름을 나타내는 출력 테이블에 열을 추가합니다. 이 옵션은 --roots 또는 --tree 와 함께 사용할 수 없습니다.
  • --roots 는 부모가 없는 스냅샷만 표시하도록 목록을 필터링합니다. 이 옵션은 --parent 또는 --tree 와 함께 사용할 수 없습니다.
  • --tree 는 스냅샷 이름만 나열한 트리 형식으로 출력을 표시합니다. 이 옵션은 --roots 또는 --parent 와 함께 사용할 수 없습니다.
  • --from 은 지정된 스냅샷의 하위 항목이거나 --current 이 제공된 경우 목록이 현재 스냅샷에서 시작되는 스냅샷에 목록을 필터링합니다. 분리 또는 --parent 와 함께 사용하면 --descendants 도 없으면 목록이 직접 자식으로 제한됩니다. --tree 와 함께 사용하면 --descendants 를 사용할 수 없습니다. 이 옵션은 --roots 와 호환되지 않습니다. --tree 옵션도 없는 경우 --from 또는 --current 의 시작 지점이 목록에 포함되지 않습니다.
  • --leaves 를 지정하면 목록이 하위 항목이 없는 스냅샷으로만 필터링됩니다. 마찬가지로 --no-leaves 가 지정된 경우 하위 항목이 있는 스냅샷에만 목록이 필터링됩니다. (두 옵션을 모두 생략해도 필터링이 발생하지 않지만 두 옵션을 제공하면 해당 서버가 플래그를 인식하는지 여부에 따라 동일한 목록 또는 오류가 발생합니다.) Filtering options are not compatible with --tree.
  • --metadata 가 지정된 경우 libvirt 메타데이터와 관련된 스냅샷으로 목록이 필터링되므로 영구 게스트 가상 머신을 분리하지 않거나 일시적인 게스트 가상 머신 제거 시 손실됩니다. 마찬가지로 --no-metadata 가 지정된 경우 libvirt 메타데이터 없이 존재하는 스냅샷으로 목록이 필터링됩니다.
  • --inactive 가 지정되어 게스트 가상 머신이 종료될 때 가져온 스냅샷에 목록이 필터링됩니다. --active 가 지정된 경우 게스트 가상 시스템이 실행 중일 때 수행한 스냅샷에 목록이 필터링되고 스냅샷에 해당 실행 상태로 되돌릴 메모리 상태가 포함됩니다. --disk-only 가 지정된 경우 게스트 가상 시스템이 실행 중일 때 만든 스냅샷에 목록이 필터링되지만 스냅샷에는 디스크 상태만 포함됩니다.
  • --internal 이 지정되면 목록이 기존 디스크 이미지의 내부 스토리지를 사용하는 스냅샷으로 필터링됩니다. external을 지정하면 디스크 이미지 또는 메모리 상태에 외부 파일을 사용하는 스냅샷으로 목록이 필터링됩니다.

20.39.7. snapshot-dumpxml

virsh snapshot-dumpxml 도메인 스냅샷 명령은 스냅샷이라는 게스트 가상 머신의 스냅샷 XML을 출력합니다. 사용하려면 다음을 실행합니다.
# virsh snapshot-dumpxml domain snapshot [--security-info]
security -info 옵션에는 보안에 민감한 정보도 포함됩니다. virsh snapshot-current 를 사용하여 현재 스냅샷의 XML에 쉽게 액세스할 수 있습니다.

20.39.8. snapshot-parent

지정된 스냅샷에 대해 또는 --current 을 사용하여 현재 스냅샷의 경우 상위 스냅샷의 이름을 출력합니다. 사용하려면 다음을 실행합니다.
# virsh snapshot-parent domain {snapshot | --current}

20.39.9. snapshot-revert

지정된 도메인을 스냅샷 에서 지정한 스냅샷 또는 --current 을 사용하여 현재 스냅샷으로 되돌립니다.
주의
이 작업은 안전하지 않은 동작입니다. 마지막 스냅샷이 수행되었기 때문에 도메인의 변경 사항이 손실됩니다. 또한 snapshot-revert 가 완료된 후 도메인의 상태는 원래 스냅샷을 만들 때 도메인의 상태가 됩니다.
스냅샷을 되돌리려면 다음을 실행합니다.
# virsh snapshot-revert domain {snapshot | --current} [{--running | --paused}] [--force]
일반적으로 스냅샷으로 되돌리면 게스트 가상 시스템 상태가 없는 디스크 스냅샷은 도메인을 비활성 상태로 남겨 두는 것을 제외하고 스냅샷이 생성된 시점으로 도메인이 남아 있습니다. --running 또는 --paused 옵션을 전달하면 추가 상태 변경(예: 비활성 도메인 부팅 또는 실행 중인 도메인 일시 중지)이 수행됩니다. 임시 도메인을 비활성화할 수 없으므로 임시 도메인의 디스크 스냅샷으로 되돌릴 때 이러한 플래그 중 하나를 사용해야 합니다.
스냅샷을 되돌리려면 추가 위험이 관련된 두 가지 경우가 있습니다. 이 경우 --force 를 사용해야 합니다. 하나는 설정을 되돌리기 위한 전체 도메인 정보가 없는 스냅샷의 경우입니다. libvirt는 현재 구성이 스냅샷 시점에서 사용 중인 구성과 일치한다는 것을 증명할 수 없으므로 --force s libvirt 를 현재 구성과 호환할 수 있다는 것을 증명할 수 없습니다(및 그렇지 않은 경우 도메인은 실행되지 않을 수 있음). 다른 하나는 실행 중인 도메인에서 기존 하이퍼바이저를 재사용하는 대신 새 하이퍼바이저를 생성해야 하는 활성 상태로 되돌리는 경우입니다. 이는 기존 VNC 또는 Spice 연결을 중단하는 등 단점을 의미합니다. 이 조건은 호환되지 않는 구성을 사용하는 활성 스냅샷과 --start 또는 --pause 플래그와 결합된 비활성 스냅샷과 함께 발생합니다.

20.39.10. snapshot-delete

virsh snapshot-delete domain 명령은 지정된 도메인의 스냅샷을 삭제합니다. 이렇게 하려면 다음을 실행합니다.
# virsh snapshot-delete domain {snapshot | --current} [--metadata] [{--children | --children-only}]
이 명령은 snapshot 라는 도메인의 스냅샷을 삭제하거나 현재 스냅샷은 --current. 이 스냅샷에 하위 스냅샷이 있는 경우 이 스냅샷의 변경 사항이 하위 항목으로 병합됩니다. --children 옵션을 사용하면 이 스냅샷과 이 스냅샷의 하위 항목이 삭제됩니다. --children-only 를 사용하면 이 스냅샷의 하위 항목이 삭제되지만 이 스냅샷은 그대로 둡니다. 이 두 플래그는 함께 사용할 수 없습니다.
--metadata 를 사용하면 libvirt 에서 유지 관리하는 스냅샷 메타데이터가 삭제되며, 스냅샷 내용을 외부 툴에서 그대로 유지하면서도 그대로 둡니다. 그렇지 않으면 스냅샷을 삭제하면 해당 시점에서 해당 데이터 콘텐츠도 제거됩니다.

20.40. 게스트 가상 머신 CPU 모델 구성

20.40.1. 소개

모든 하이퍼바이저에는 기본적으로 게스트 가상 머신이 표시되는 자체 정책이 있습니다. 일부 하이퍼바이저는 게스트 가상 머신에 사용할 수 있는 CPU 호스트 물리적 머신 기능을 결정하는 반면 QEMU/KVM은 게스트 가상 머신에 qemu32 또는 qemu64 라는 일반 모델을 제공합니다. 이러한 하이퍼바이저는 고급 필터링을 수행하여 모든 물리적 CPU를 여러 그룹으로 분류하고 게스트 가상 머신에 제공되는 각 그룹에 대해 하나의 기본 CPU 모델을 갖습니다. 이러한 동작은 호스트 물리적 시스템 간에 게스트 가상 시스템을 안전하게 마이그레이션할 수 있습니다. libvirt에는 일반적으로 동일한 그룹으로 분류된 물리적 CPU가 있습니다. libvirt는 일반적으로 더 높은 계층이 자체 필수 정책을 정의하는 메커니즘을 제공합니다. CPU 모델 정보를 얻고 적절한 게스트 가상 머신 CPU 모델을 정의하는 방법을 이해하는 것은 호스트 물리적 시스템 간에 게스트 가상 머신 마이그레이션이 성공할 수 있도록 하는 것이 중요합니다. 하이퍼바이저는 하이퍼바이저가 릴리스된 후 생성된 기능과 해당 기능을 에뮬레이션할 수 없습니다.

20.40.2. 호스트 물리적 시스템 CPU 모델에 대해 알아보기

virsh capabilities 명령은 하이퍼바이저 연결 및 호스트 물리적 시스템의 기능을 설명하는 XML 문서를 표시합니다. 표시된 XML 스키마가 호스트 물리적 시스템 CPU 모델에 대한 정보를 제공하도록 확장되었습니다. CPU 모델을 설명할 때의 문제 중 하나는 모든 아키텍처가 기능을 노출하는 다른 접근 방식을 가지고 있다는 것입니다. QEMU/KVM 및 libvirt 는 CPU 모델 이름 문자열을 일련의 named 플래그와 결합하는 스키마를 사용합니다.
알려진 모든 CPU 모델을 나열하는 데이터베이스는 실용적이지 않으므로 libvirt에는 기본 CPU 모델 이름의 작은 목록이 있습니다. 가장 많은 CPUID 비트를 실제 호스트 물리적 시스템 CPU와 공유한 다음 나머지 비트를 이름의 기능으로 나열합니다. libvirt는 기본 CPU에 포함된 기능이 표시되지 않습니다. 처음에는 결함이있는 것처럼 보일 수도 있지만 이 섹션에서 설명하는 것처럼 보일 수도 있지만 이 정보를 실제로 알 필요는 없습니다.

20.40.3. VFIO IOMMU 장치에 대한 지원 확인

virsh domcapabilities 명령을 사용하여 VFIO에 대한 지원을 확인합니다. 다음 예제 출력을 확인합니다.

그림 20.3. VFIO 지원 확인


# virsh domcapabilities

[...output truncated...]

<enum name='pciBackend'>
        <value>default</value>
        <value>vfio</value>

[...output truncated...]

20.40.4. 호스트 물리적 머신 풀을 연장하기 위한 호환 CPU 모델 확인

이제 단일 호스트 물리적 시스템의 CPU 기능을 확인할 수 있으므로 다음 단계는 게스트 가상 머신에 표시할 CPU 기능을 결정하는 것입니다. 게스트 가상 머신을 다른 호스트 물리적 시스템으로 마이그레이션할 필요가 없다는 것을 알고 있는 경우 호스트 물리적 시스템 CPU 모델을 수정되지 않은 상태로 바로 전달할 수 있습니다. 가상화된 데이터 센터에는 모든 서버가 100% 동일한 CPU를 보유할 수 있는 구성 세트가 있을 수 있습니다. 호스트 물리적 시스템 CPU 모델을 수정하지 않은 상태로 바로 전달할 수 있습니다. 그러나 가장 일반적인 경우는 호스트 물리적 시스템 간의 CPU가 달라질 수 있다는 것입니다. 이 혼합 CPU 환경에서 가장 낮은 공통 분모 CPU를 결정해야합니다. 이 작업은 쉽지 않으므로 libvirt에서 이 작업에 대한 API를 제공합니다. libvirt가 호스트 물리적 시스템의 CPU 모델을 설명하는 각 XML 문서 목록을 제공하는 경우 libvirt는 내부적으로 CPUID 마스크로 변환하고 교집합을 계산하고 CPUID 마스크 결과를 XML CPU 설명으로 변환합니다.
virsh 기능이 실행될 때 libvirt에서 기본 워크스테이션의 기능으로 보고하는 내용의 예는 다음과 같습니다.

그림 20.4. 호스트 물리적 시스템의 CPU 모델 정보 가져오기


<capabilities>
  <host>
    <cpu>
      <arch>i686</arch>
      <model>pentium3</model>
      <topology sockets='1' cores='2' threads='1'/>
      <feature name='lahf_lm'/>
      <feature name='lm'/>
      <feature name='xtpr'/>
      <feature name='cx16'/>
      <feature name='ssse3'/>
      <feature name='tm2'/>
      <feature name='est'/>
      <feature name='vmx'/>
      <feature name='ds_cpl'/>
      <feature name='monitor'/>
      <feature name='pni'/>
      <feature name='pbe'/>
      <feature name='tm'/>
      <feature name='ht'/>
      <feature name='ss'/>
      <feature name='sse2'/>
      <feature name='acpi'/>
      <feature name='ds'/>
      <feature name='clflush'/>
      <feature name='apic'/>
    </cpu>
 </host>
</capabilities>
이제 동일한 virsh 기능을 사용하여 다른 서버와 비교합니다.

그림 20.5. 임의의 서버에서 CPU 설명 생성


<capabilities>
  <host>
    <cpu>
      <arch>x86_64</arch>
      <model>phenom</model>
      <topology sockets='2' cores='4' threads='1'/>
      <feature name='osvw'/>
      <feature name='3dnowprefetch'/>
      <feature name='misalignsse'/>
      <feature name='sse4a'/>
      <feature name='abm'/>
      <feature name='cr8legacy'/>
      <feature name='extapic'/>
      <feature name='cmp_legacy'/>
      <feature name='lahf_lm'/>
      <feature name='rdtscp'/>
      <feature name='pdpe1gb'/>
      <feature name='popcnt'/>
      <feature name='cx16'/>
      <feature name='ht'/>
      <feature name='vme'/>
    </cpu>
    ...snip...
이 CPU 설명이 이전 워크스테이션 CPU 설명과 호환되는지 확인하려면 virsh cpu-compare 명령을 사용합니다.
축소된 콘텐츠는 virsh-caps-hiera-cpu-only.xml 파일에 저장되고 virsh cpu-compare 명령을 이 파일에서 실행할 수 있습니다.
# virsh cpu-compare virsh-caps-workstation-cpu-only.xml
Host physical machine CPU is a superset of CPU described in virsh-caps-workstation-cpu-only.xml
이 출력에서 볼 수 있듯이 libvirt 는 CPU가 엄격하게 호환되지 않는 것으로 올바르게 보고합니다. 이는 서버 CPU에 클라이언트 CPU에서 누락된 여러 기능이 있기 때문입니다. 클라이언트와 서버 간에 마이그레이션하려면 XML 파일을 열고 일부 기능을 주석으로 처리해야 합니다. 제거해야 하는 기능을 확인하려면 두 시스템의 CPU 정보가 포함된 both-cpus.xml 에서 virsh cpu-baseline 명령을 실행합니다. # virsh cpu-baseline both-cpus.xml 을 실행하면 다음과 같은 결과가 나타납니다.

그림 20.6. 복합 CPU 기준


<cpu match='exact'>
  <model>pentium3</model>
  <feature policy='require' name='lahf_lm'/>
  <feature policy='require' name='lm'/>
  <feature policy='require' name='cx16'/>
  <feature policy='require' name='monitor'/>
  <feature policy='require' name='pni'/>
  <feature policy='require' name='ht'/>
  <feature policy='require' name='sse2'/>
  <feature policy='require' name='clflush'/>
  <feature policy='require' name='apic'/>
</cpu>
이 복합 파일은 어떤 요소가 공통인지 보여줍니다. 공통으로 있지 않은 모든 것은 주석으로 처리해야 합니다.

20.41. 게스트 가상 머신 CPU 모델 구성

간단한 기본값을 위해 게스트 가상 머신 CPU 구성은 호스트 물리적 머신 기능 XML과 동일한 기본 XML 표현을 사용할 수 있습니다. 즉, virsh cpu-baseline 명령의 XML을 도메인 요소 아래의 최상위 수준에서 게스트 가상 머신 XML로 직접 복사할 수 있습니다. 이전 XML 스니펫에는 게스트 가상 머신 XML에서 CPU를 설명할 때 몇 가지 추가 속성을 사용할 수 있습니다. 이러한 작업은 대부분 무시될 수 있지만, 여기서 난관에 대한 간략한 설명은 생략하고 있습니다. 최상위 <cpu> 요소에는 다음과 같은 가능한 값이 있는 이름이 일치하는 속성이 있습니다.
  • match='minimum' - 호스트 물리적 머신 CPU에는 게스트 가상 머신 XML에 설명된 CPU 기능이 있어야 합니다. 호스트 물리적 시스템에 게스트 가상 머신 구성 이외의 추가 기능이 있는 경우 게스트 가상 머신에도 노출됩니다.
  • match='exact' - 호스트 물리적 머신 CPU에는 게스트 가상 머신 XML에 설명된 CPU 기능이 있어야 합니다. 호스트 물리적 시스템에 게스트 가상 시스템 구성 이외의 추가 기능이 있는 경우 게스트 가상 시스템에서 마스킹됩니다.
  • match='strict' - 호스트 물리적 시스템 CPU에는 게스트 가상 머신 XML에 설명된 동일한 CPU 기능이 있어야 합니다.
다음 개선된 기능은 <feature> 요소가 각각 가능한 값을 가진 추가 'policy' 속성을 가질 수 있다는 것입니다.
  • policy='force' - 호스트 물리적 머신에 없는 경우에도 해당 기능을 게스트 가상 머신에 노출합니다. 이는 일반적으로 소프트웨어 에뮬레이션의 경우에만 유용합니다.
    참고
    강제 정책을 사용하면 하이퍼바이저가 특정 기능을 에뮬레이션하지 못할 수 있습니다.
  • policy='require' - 기능을 게스트 가상 머신에 노출하고 호스트 물리적 시스템에 없는 경우 실패합니다. 이는 합리적인 기본값입니다.
  • policy='선택 사항' - 게스트 가상 머신을 지원하는 경우 해당 기능을 게스트 가상 머신에 노출합니다.
  • policy='disable' - 호스트 물리적 시스템에 이 기능이 있는 경우 게스트 가상 시스템에서 해당 기능을 숨깁니다.
  • policy='forbid' - 호스트 물리적 시스템에 이 기능이 있는 경우 실패하여 게스트 가상 시스템 시작을 거부합니다.
'forbid' 정책은 잘못 작동하는 애플리케이션이 CPUID 마스크에 없는 경우에도 기능을 사용하려고 하고 해당 기능이 있는 호스트 물리적 시스템에서 게스트 가상 시스템을 실수로 실행하지 않는 것을 방지하는 틈새 시나리오를 위한 것입니다. '선택 사항' 정책에는 마이그레이션과 관련된 특별한 동작이 있습니다. 게스트 가상 머신이 처음 시작될 때 플래그는 선택 사항이지만 게스트 가상 머신을 실시간으로 마이그레이션하는 경우 마이그레이션 간에 기능이 사라질 수 없으므로 이 정책은 'require'로 전환됩니다.

20.42. 게스트 가상 머신의 리소스 관리

virsh 를 사용하면 게스트 가상 머신별로 리소스를 그룹화하고 할당할 수 있습니다. 게스트 가상 시스템을 대신하여 cgroup 을 생성하고 관리하는 libvirt 데몬에서 관리합니다. 시스템 관리자가 할 수 있는 유일한 방법은 지정된 게스트 가상 머신에 대해 튜닝 가능 항목을 쿼리하거나 설정하는 것입니다. libvirt 서비스는 가상 시스템 튜닝 및 모니터링에 다음 cgroups를 사용합니다.
  • memory - 메모리 컨트롤러를 사용하면 RAM 및 스왑 사용량에 대한 제한을 설정하고 그룹에 있는 모든 프로세스의 누적 사용량을 쿼리할 수 있습니다.
  • cpuset - CPU 세트 컨트롤러는 그룹 내의 프로세스를 CPU 세트에 바인딩하고 CPU 간 마이그레이션을 제어합니다.
  • cpuacct - CPU 계정 컨트롤러는 프로세스 그룹의 CPU 사용량에 대한 정보를 제공합니다.
  • CPU -CPU 스케줄러 컨트롤러는 그룹의 프로세스 우선 순위를 제어합니다. 이는 nice 수준 권한을 부여하는 것과 유사합니다.
  • devices - 장치 컨트롤러는 문자 및 블록 장치에 액세스 제어 목록을 부여합니다.
  • freezer - freezer 컨트롤러는 일시 중지되고 그룹의 프로세스 실행을 재개합니다. 이는 전체 그룹의 SIGSTOP 와 유사합니다.
  • net_cls - 네트워크 클래스 컨트롤러는 프로세스를 tc 네트워크 클래스와 연결하여 네트워크 사용률을 관리합니다.
cgroup은 libvirtsystemd 에 의해 설정됩니다. 다음 virsh 튜닝 명령은 cgroups가 구성된 방식에 영향을 미칩니다.
cgroups에 대한 자세한 내용은 Red Hat Enterprise Linux 7 리소스 관리 가이드 를 참조하십시오.

20.43. 스케줄 매개변수 설정

virsh schedinfo 명령은 호스트 시스템의 가상 머신 프로세스의 호스트 스케줄링 매개 변수를 수정합니다. 다음 명령 형식을 사용해야 합니다.
# virsh schedinfo domain --set --current --config --live
각 매개변수는 아래에 설명되어 있습니다.
  • domain - guest 가상 머신 도메인
  • --set - 여기에 배치된 문자열은 호출해야 하는 컨트롤러 또는 작업입니다. 문자열은 매개변수 = 형식을 사용합니다. 필요한 경우 추가 매개변수 또는 값을 추가해야 합니다.
  • --current - --set 와 함께 사용하면 지정된 set 문자열을 현재 스케줄러 정보로 사용합니다. 없이 사용하면 현재 스케줄러 정보가 표시됩니다.
  • --config - - - set 와 함께 사용하면 다음 재부팅 시 지정된 set 문자열이 사용됩니다. 없이 사용하면 구성 파일에 저장된 스케줄러 정보가 표시됩니다.
  • --live - --set 와 함께 사용하면 현재 실행 중인 게스트 가상 머신에서 지정된 세트 문자열을 사용합니다. 없이 사용하면 실행 중인 가상 머신에서 현재 사용되는 구성 설정이 표시됩니다.
스케줄러는 cpu_shares,vcpu_periodvcpu_quota 매개변수 중 하나를 사용하여 설정할 수 있습니다. 이러한 매개변수는 vCPU 스레드에 적용됩니다.
다음은 매개변수가 cgroup 필드 이름에 매핑되는 방법을 보여줍니다.
  • cpu_shares:cpu.shares
  • vcpu_period:cpu.cfs_period_us
  • vcpu_quota:cpu.cfs_quota_us

예 20.98. schedinfo show

이 예에서는 쉘 게스트 가상 머신의 일정 정보를 보여줍니다.
# virsh schedinfo shell
Scheduler      : posix
cpu_shares     : 1024
vcpu_period    : 100000
vcpu_quota     : -1

예 20.99. schedinfo set

이 예에서는 cpu_shares가 2046로 변경되었습니다. 이는 구성 파일이 아닌 현재 상태에 영향을 미칩니다.
# virsh schedinfo --set cpu_shares=2046 shell
Scheduler      : posix
cpu_shares     : 2046
vcpu_period    : 100000
vcpu_quota     : -1
libvirt 는 에뮬레이터 프로세스의 설정을 수정하는 emulator_periodemulator_quota 매개변수도 지원합니다.

20.44. 디스크 I/O 3rottling

virsh blkdeviotune 명령은 지정된 게스트 가상 머신에 대해 디스크 I/O 제한을 설정합니다. 이렇게 하면 게스트 가상 머신이 공유 리소스를 사용하는 것을 방지할 수 있으므로 다른 게스트 가상 머신의 성능에 영향을 미칠 수 있습니다. 다음 형식을 사용해야 합니다.
#virsh blkdeviotune domain <device> [[--config] [--live] | [--current]] [[total-bytes-sec] | [read-bytes-sec] [write-bytes-sec]] [[total-iops-sec] [read-iops-sec] [write-iops-sec]]
유일한 필수 매개변수는 게스트 가상 머신의 도메인 이름입니다. 도메인 이름을 나열하려면 virsh domblklist 명령을 실행합니다. --config,--live--current 인수는 20.43절. “스케줄 매개변수 설정” 에서와 동일하게 작동합니다. 제한을 지정하지 않으면 현재 I/O 제한 설정을 쿼리합니다. 그렇지 않으면 다음 플래그를 사용하여 제한을 변경합니다.
  • --total-bytes-sec - 초당 총 처리량 제한을 지정합니다.
  • --read-bytes-sec - 초당 읽기 처리량 제한을 지정합니다.
  • --write-bytes-sec - 초당 쓰기 처리량 제한을 지정합니다.
  • --total-iops-sec 은 초당 총 I/O 작업 제한을 지정합니다.
  • --read-iops-sec - 초당 읽기 I/O 작업 제한을 지정합니다.
  • --write-iops-sec - 초당 쓰기 I/O 작업 제한을 지정합니다.
자세한 내용은 virsh 도움말 페이지의 blkdeviotune 섹션을 참조하십시오. 도메인 XML 예제는 그림 23.27. “장치 - 하드 드라이브, 플로피 디스크, CD-ROM 예” 을 참조하십시오.

20.45. 블록 I/O 매개 변수 표시 또는 설정

blkiotune 명령은 지정된 게스트 가상 머신에 대한 I/O 매개변수를 설정하거나 표시합니다. 다음 형식을 사용해야 합니다.
# virsh blkiotune domain [--weight weight] [--device-weights device-weights] [---device-read-iops-sec -device-read-iops-sec] [--device-write-iops-sec device-write-iops-sec] [--device-read-bytes-sec device-read-bytes-sec] [--device-write-bytes-sec device-write-bytes-sec] [[--config] [--live] | [--current]]
이 명령에 대한 자세한 내용은 가상화 튜닝 및 최적화 가이드를 참조하십시오.

20.46. 메모리 튜닝 구성

virsh memtune virtual_machine --parameter size 명령은 가상화 튜닝 및 최적화 가이드에서 다룹니다.

21장. 오프라인 도구를 사용하여 게스트 가상 머신 디스크 액세스

21.1. 소개

Red Hat Enterprise Linux 7은 게스트 가상 머신 디스크 또는 기타 디스크 이미지에 액세스, 편집 및 생성할 수 있는 여러 libguestfs 유틸리티를 제공합니다. 이러한 툴에는 다음과 같은 여러 용도가 있습니다.
  • 게스트 가상 머신 디스크에 있는 파일 보기 또는 다운로드.
  • 게스트 가상 머신 디스크에서 파일 편집 또는 업로드.
  • 게스트 가상 머신 구성 읽기 또는 쓰기.
  • 파일, 디렉토리, 파일 시스템, 파티션, 논리 볼륨 및 기타 옵션이 포함된 새 디스크 이미지 준비
  • 부팅이 실패하거나 부팅 구성 변경이 필요한 게스트 가상 머신을 복구하고 복구합니다.
  • 게스트 가상 시스템의 디스크 사용량 모니터링.
  • 게스트 가상 시스템의 규정 준수 감사(예: 조직의 보안 표준).
  • 템플릿을 복제 및 수정하여 게스트 가상 머신 배포.
  • CD 및 DVD ISO 이미지 및 디스크 이미지 읽기.
주의
이 장에 나열된 유틸리티를 사용하여 쓰기 모드에서 이러한 디스크 이미지를 열지 않고도 실행 중인 가상 머신에 연결된 게스트 가상 머신 또는 디스크 이미지에 쓰지 않아야 합니다.
이렇게 하면 게스트 가상 머신이 디스크 손상됩니다. 도구를 사용하여 이 작업을 수행하는 것을 방지하지만 모든 사례를 보호하지는 않습니다. 게스트 가상 머신이 실행 중일 수 있다는 의심이 있는 경우, Red Hat은 유틸리티를 사용하지 않는 것이 좋습니다.
안전성 향상을 위해 변경 사항을 저장하지 않는 읽기 전용 모드(- ro 옵션 사용)에서 특정 유틸리티를 사용할 수 있습니다.
참고
libguestfs 및 관련 유틸리티에 대한 문서의 기본 소스는 Linux 도움말 페이지입니다. API에 대한 자세한 내용은 guestfs(3) 에 설명되어 있으며, RuntimeClass (1) 에 기재되어 있으며, virtualization 유틸리티가 자체 도움말 페이지(예: virt-df(1))에 설명되어 있습니다. 문제 해결 정보는 다음을 참조하십시오. A.17절. “libguestfs 문제 해결”

21.1.1. 원격 연결 사용에 대해 자세히 알아보기

Red Hat Enterprise Linux 7의 일부 가상화 명령을 사용하면 원격 libvirt 연결을 지정할 수 있습니다. 예를 들면 다음과 같습니다.
# virt-df -c  qemu://remote/system -d Guest
그러나 Red Hat Enterprise Linux 7의 libguestfs 유틸리티는 원격 libvirt 게스트 디스크에 액세스할 수 없으며, 위에서 설명한 대로 원격 URL을 사용하는 명령이 예상대로 작동하지 않습니다.
하지만 Red Hat Enterprise Linux 7부터 libguestfs 는 네트워크 블록 장치(NBD)를 통해 원격 디스크 소스에 액세스할 수 있습니다. qemu-nbd 명령을 사용하여 원격 머신에서 디스크 이미지를 내보내고 nbd:// URL을 사용하여 액세스할 수 있습니다. 방화벽에서 포트를 열어야 할 수도 있습니다(포트 64439)는 다음과 같습니다.
원격 시스템에서 qemu-nbd -t disk.img
로컬 시스템에서 virt-df -a nbd://remote
다음의 libguestfs 명령은 영향을 받습니다.
  • RuntimeClass
  • 게스트 마운트
  • virt-alignment-scan
  • virt-cat
  • virt-copy-in
  • virt-copy-out
  • virt-df
  • virt-edit
  • virt-filesystems
  • virt-inspector
  • virt-ls
  • virt-rescue
  • virt-sysprep
  • virt-tar-in
  • virt-tar-out
  • virt-win-reg

21.2. 용어

이 섹션에서는 이 장 전체에 사용된 용어에 대해 설명합니다.
  • libguestfs(GUEST FileSystem LIBrary) - 디스크 이미지 열기, 읽기 및 쓰기 등의 기본 C 라이브러리입니다. 이 API 에 C 프로그램을 직접 작성할 수 있습니다.
  • RuntimeClass(GUEST Filesystem Interactive SHell) 는 명령줄 또는 쉘 스크립트에서 사용할 수 있는 대화형 쉘입니다. libguestfs API의 모든 기능을 노출합니다.
  • 다양한 가상화 툴은 libguestfs 상단에 구축되며, 이러한 툴은 명령줄에서 특정 단일 작업을 수행할 수 있는 방법을 제공합니다. 이러한 툴에는 virt-df,virt-rescue,virt-resize, virt-edit 등이 있습니다.
  • Augeas는 Linux 구성 파일을 편집하기 위한 라이브러리입니다. libguestfs와는 별도로 있지만 대부분의 libguestfs 값은 이 툴과 함께 제공됩니다.
  • 게스트 마운트 는 libguestfs와 FUSE 간의 인터페이스입니다. 주로 호스트 물리적 시스템의 디스크 이미지에서 파일 시스템을 마운트하는 데 사용됩니다. 이 기능은 필수는 아니지만 유용할 수 있습니다.

21.3. 설치

libguestfs, libguestfs 툴, guestmount를 설치하려면 다음 명령을 입력합니다.
# yum install libguestfs libguestfs-tools 
언어 바인딩을 포함한 모든 libguestfs 관련 패키지를 설치하려면 다음 명령을 입력합니다.
# yum install '*guestf*'

21.4. RuntimeClass 쉘

RuntimeClass 는 명령줄 또는 쉘 스크립트에서 게스트 가상 머신 파일 시스템에 액세스하는 데 사용할 수 있는 대화형 쉘입니다. libguestfs API의 모든 기능은 쉘에서 사용할 수 있습니다.
가상 머신 디스크 이미지 보기 또는 편집을 시작하려면 다음 명령을 입력하고 원하는 디스크 이미지 경로를 대체합니다.
$ guestfish --ro -a /path/to/disk/image
--ro 는 디스크 이미지가 읽기 전용으로 열려 있음을 나타냅니다. 이 모드는 항상 안전하지만 쓰기 액세스를 허용하지 않습니다. 게스트 가상 머신이 실행되고 있지 않거나 디스크 이미지가 라이브 게스트 가상 머신에 연결되어 있지 않은 경우에만 이 옵션을 생략하십시오. libguestfs 를 사용하여 라이브 게스트 가상 머신을 편집할 수 없으며, 시도할 경우 복구할 수 없는 디스크 손상이 발생합니다.
/path/to/disk/image 는 디스크 경로입니다. 이는 파일, 호스트 물리적 시스템 논리 볼륨(예: /dev/VG/LV) 또는 SAN LUN(/dev/sdf3)일 수 있습니다.
참고
libguestfs 및 RuntimeClass에는 root 권한이 필요하지 않습니다. 액세스 중인 디스크 이미지에서 읽기 또는 쓰기 또는 둘 다 root가 필요한 경우에만 root로 실행하면 됩니다.
pxe를 대화식으로 시작하면 다음과 같은 프롬프트가 표시됩니다.
$ guestfish --ro -a /path/to/disk/image

Welcome to guestfish, the guest filesystem shell for
editing virtual machine filesystems and disk images.

 Type: 'help' for help on commands
       'man' to read the manual
       'quit' to quit the shell

><fs>
프롬프트에서 run 을 입력하여 라이브러리를 시작하고 디스크 이미지를 연결합니다. 이 작업을 처음 수행할 때 최대 30초가 걸릴 수 있습니다. 후속 시작은 훨씬 더 빨리 완료됩니다.
참고
libguestfs는 이러한 프로세스의 속도를 높이기 위해 KVM(사용 가능한 경우)과 같은 하드웨어 가상화 가속을 사용합니다.
run 명령을 입력하면 다음 섹션에서 설명합니다.

21.4.1. RuntimeClass를 사용하여 파일 시스템 보기

이 섹션에서는 RuntimeClass로 파일 시스템 보기에 대한 정보를 제공합니다.

21.4.1.1. 수동 목록 및 보기

list-filesystems 명령은 libguestfs에서 찾은 파일 시스템을 나열합니다. 이 출력은 Red Hat Enterprise Linux 4 디스크 이미지를 보여줍니다.
><fs> run
><fs> list-filesystems
/dev/vda1: ext3
/dev/VolGroup00/LogVol00: ext3
/dev/VolGroup00/LogVol01: swap
기타 유용한 명령은 list-devices,list-partitions,lvs,pvs,vfs-typefile 입니다. 다음 출력에 표시된 대로 help 명령을 입력하여 모든 명령에 대한 자세한 정보와 도움말 을 얻을 수 있습니다.
><fs> help vfs-type
 NAME
    vfs-type - get the Linux VFS type corresponding to a mounted device

 SYNOPSIS
     vfs-type mountable

 DESCRIPTION
    This command gets the filesystem type corresponding to the filesystem on
    "device".

    For most filesystems, the result is the name of the Linux VFS module
    which would be used to mount this filesystem if you mounted it without
    specifying the filesystem type. For example a string such as "ext3" or
    "ntfs".
파일 시스템의 실제 콘텐츠를 보려면 먼저 마운트해야 합니다.
ls,ll,cat,more,downloadtar-out 과 같은 RuntimeClass 명령을 사용하여 파일 및 디렉토리를 보고 다운로드할 수 있습니다.
참고
이 쉘에는 현재 작업 디렉터리에 대한 개념이 없습니다. 일반 쉘과 달리, 예를 들어 cd 명령을 사용하여 디렉토리를 변경할 수 없습니다. 모든 경로는 슬래시(/) 문자로 맨 위부터 완전히 정규화되어야 합니다. 경로를 완료하려면 Tab 키를 사용합니다.
RuntimeClass 쉘을 종료하려면 exit 을 입력하거나 Ctrl+d 를 입력합니다.

21.4.1.2. pxe 검사를 통해

파일 시스템을 직접 나열 및 마운트하는 대신 Guest virtual machine에 있는 이미지를 검사하고 파일 시스템을 마운트하도록 할 수 있습니다. 이렇게 하려면 명령줄에 -i 옵션을 추가합니다.
$ guestfish --ro -a /path/to/disk/image -i

Welcome to guestfish, the guest filesystem shell for
editing virtual machine filesystems and disk images.

 Type: 'help' for help on commands
       'man' to read the manual
       'quit' to quit the shell

 Operating system: Red Hat Enterprise Linux AS release 4 (Nahant Update 8)
 /dev/VolGroup00/LogVol00 mounted on /
 /dev/vda1 mounted on /boot

 ><fs> ll /
 total 210
 drwxr-xr-x. 24 root root  4096 Oct 28 09:09 .
 drwxr-xr-x  21 root root  4096 Nov 17 15:10 ..
 drwxr-xr-x.  2 root root  4096 Oct 27 22:37 bin
 drwxr-xr-x.  4 root root  1024 Oct 27 21:52 boot
 drwxr-xr-x.  4 root root  4096 Oct 27 21:21 dev
 drwxr-xr-x. 86 root root 12288 Oct 28 09:09 etc
 ...
검사 및 마운트를 수행하려면 libguestfs 백엔드를 시작해야 하므로 -i 옵션을 사용할 때 run 명령이 필요하지 않습니다. i 옵션은 많은 일반 Linux 게스트 가상 시스템에서 작동합니다.

21.4.1.3. 이름으로 게스트 가상 머신에 액세스

libvirt에 알려진 이름을 지정하면 명령줄에서 게스트 가상 시스템에 액세스할 수 있습니다(즉, virsh list --all에 표시됨). i 옵션을 사용하여 이름별로 게스트 가상 머신에 액세스하거나 -i 옵션 없이 -d 옵션을 사용합니다.
$ guestfish --ro -d GuestName -i

21.4.2. RuntimeClass를 사용하여 파일 추가

RuntimeClass로 파일을 추가하려면 전체 URI가 필요합니다. 파일은 로컬 파일이거나 네트워크 블록 장치(NBD) 또는 원격 블록 장치(RBD)에 있는 파일일 수 있습니다.
URI에 사용되는 형식은 다음 예와 같아야 합니다. 로컬 파일의 경우 ///를 사용합니다.
  • RuntimeClass -a 디스크.img
  • RuntimeClass -a file:///디렉토리/disk.img
  • pxe -a nbd://example.com[:port]
  • guestfish -a nbd://example.com[:port]/exportname
  • pxe -a nbd://?socket=/소켓
  • sandbox -a nbd:///exportname?socket=/socket
  • RuntimeClass -a rbd:///pool/disk
  • RuntimeClass -a rbd://example.com[:포트]//디스크

21.4.3. RuntimeClass를 사용하여 파일 수정

파일을 수정하려면 디렉토리를 생성하거나 게스트 가상 머신을 변경하려면 먼저 이 섹션의 시작 부분에 경고가 표시되었습니다. 게스트 가상 머신을 종료해야 합니다. RuntimeClass를 사용하여 실행 중인 디스크를 편집하거나 변경하면 디스크 손상이 발생합니다. 이 섹션에서는 /boot/grub/grub.conf 파일을 편집하는 예를 제공합니다. 게스트 가상 머신이 종료된 경우 다음과 같은 명령을 사용하여 쓰기 액세스 권한을 얻기 위해 --ro 플래그를 생략할 수 있습니다.
$ guestfish -d RHEL3 -i

Welcome to guestfish, the guest filesystem shell for
editing virtual machine filesystems and disk images.

 Type: 'help' for help on commands
       'man' to read the manual
       'quit' to quit the shell

 Operating system: Red Hat Enterprise Linux AS release 3 (Taroon Update 9)
 /dev/vda2 mounted on /
 /dev/vda1 mounted on /boot

><fs> edit /boot/grub/grub.conf
파일을 편집하는 명령에는 edit,viemacs 가 포함됩니다. 쓰기, kill ,uploadtar-in 과 같은 파일과 디렉토리를 만들기 위한 많은 명령이 있습니다.

21.4.4. RuntimeClass를 사용하는 기타 작업

파일 시스템을 포맷하고, 파티션을 만들고, LVM 논리 볼륨을 생성 및 조정하고, mkfs,part-add,lvresize,lvcreate, pvcreate 및 pvcreate과 같은 명령으로 훨씬 더 많은 작업을 수행할 수 있습니다.

21.4.5. RuntimeClass를 사용한 쉘 스크립팅

구성 요소를 대화형으로 사용하면 필요에 따라 셸 스크립트를 작성하는 것이 유용할 수 있습니다.Once you are familiar with using interactively, according to your needs, writing shell scripts with it may be useful. 다음은 게스트에 새로운 MOTD(메시지)를 추가하는 간단한 쉘 스크립트입니다.
#!/bin/bash -
 set -e
 guestname="$1"

 guestfish -d "$guestname" -i <<'EOF'
   write /etc/motd "Welcome to Acme Incorporated."
   chmod 0644 /etc/motd
 EOF

21.4.6. augeas 및 libguestfs 스크립팅

libguestfs와 Augeas를 결합하면 Linux 게스트 가상 머신 구성을 조작하는 스크립트를 작성할 때 도움이 될 수 있습니다. 예를 들어 다음 스크립트는 Augeas를 사용하여 게스트 가상 시스템의 키보드 구성을 구문 분석하고 레이아웃을 출력합니다. 이 예제는 Red Hat Enterprise Linux를 실행하는 게스트 가상 머신에서만 작동합니다.
#!/bin/bash -
 set -e
 guestname="$1"

 guestfish -d "$1" -i --ro <<'EOF'
   aug-init / 0
   aug-get /files/etc/sysconfig/keyboard/LAYOUT
 EOF
Augeas를 사용하여 설정 파일을 수정할 수도 있습니다. 위의 스크립트를 수정하여 키보드 레이아웃을 변경할 수 있습니다.
#!/bin/bash -
 set -e
 guestname="$1"

 guestfish -d "$1" -i <<'EOF'
   aug-init / 0
   aug-set /files/etc/sysconfig/keyboard/LAYOUT '"gb"'
   aug-save
 EOF
두 스크립트 사이의 세 가지 변경 사항을 확인합니다.
  1. 두 번째 예에서 --ro 옵션이 제거되어 게스트 가상 머신에 작성할 수 있는 기능이 있습니다.
  2. 값을 가져오는 대신 값을 변경하기 위해 aug-get 명령이 aug-set 로 변경되었습니다. 새 값은 "gb"( 표 포함)입니다.
  3. 여기에 aug-save 명령이 사용되어 Augeas가 변경 사항을 디스크에 씁니다.
참고
Augeas에 대한 자세한 내용은 웹 사이트에서 http://augeas.net 확인할 수 있습니다.
RuntimeClass는 이 소개 문서에서 다룰 수 있는 것보다 훨씬 더 많은 작업을 수행할 수 있습니다. 예를 들어 처음부터 디스크 이미지를 생성합니다.
guestfish -N fs
또는 디스크 이미지에서 전체 디렉터리를 복사하십시오.
><fs> copy-out /home /tmp/home
자세한 내용은 man 페이지 pxe(1)을 참조하십시오.

21.5. 기타 명령

이 섹션에서는 guest 가상 머신 디스크 이미지를 보고 편집하기 위해 RuntimeClass를 사용하는 것과 더 유사한 툴에 대해 설명합니다.
  • virt-cat 은 RuntimeClass 다운로드 명령과 유사합니다. 게스트 가상 머신에 단일 파일을 다운로드하여 표시합니다. 예를 들면 다음과 같습니다.
    # virt-cat RHEL3 /etc/ntp.conf | grep ^server
     server	    127.127.1.0	      # local clock
    
  • virt-edit 는 RuntimeClass 편집 명령과 유사합니다. 게스트 가상 머신 내에서 단일 파일을 대화형으로 편집하는 데 사용할 수 있습니다. 예를 들어 부팅하지 않는 Linux 기반 게스트 가상 머신에서 grub.conf 파일을 편집해야 할 수 있습니다.
    # virt-edit LinuxGuest /boot/grub/grub.conf
    virt-edit 에는 단일 파일에 대한 간단한 비대화형 변경을 수행하는 데 사용할 수 있는 또 다른 모드가 있습니다. 이를 위해 -e 옵션이 사용됩니다. 예를 들어 다음 명령은 암호가 없는 Linux 게스트 가상 머신의 root 암호를 변경합니다.
    # virt-edit LinuxGuest /etc/passwd -e 's/^root:.*?:/root::/'
  • virt-ls 는 RuntimeClass ls, ll 및 find 명령과 유사합니다. 디렉터리 또는 디렉터리를 나열하는 데 사용됩니다(재구적으로). 예를 들어 다음 명령은 Linux 게스트 가상 머신의 /home 아래에 있는 파일과 디렉터리를 재귀적으로 나열합니다.
    # virt-ls -R LinuxGuest /home/ | less

21.6. virt-rescue: 복구 쉘

이 섹션에서는 rescue 쉘에 대한 정보를 제공합니다.

21.6.1. 소개

이 섹션에서는 가상 머신의 복구 CD와 유사한 것으로 간주할 수 있는 virt-rescue 에 대해 설명합니다. 오류를 수정하고 게스트 가상 머신을 복구할 수 있도록 유지 관리를 수행할 수 있도록 게스트 가상 머신을 복구 쉘로 부팅합니다.
virt-rescue와 RuntimeClass 간에 약간의 중복이 있습니다. 서로 다른 사용법을 구별하는 것이 중요합니다. virt-rescue는 일반 Linux 파일 시스템 도구를 사용하여 대화식으로 변경될 수 있습니다. 특히 오류가 발생한 게스트 가상 머신을 복구하는 데 특히 적합합니다. virt-rescue는 스크립팅을 할 수 없습니다.
반면, pxe은 특히 대화식으로 사용할 수 있지만 공식 명령 집합( libguestfs API)을 통해 스크립팅되고 구조화된 변경을 수행하는 데 특히 유용합니다.

21.6.2. virt-rescue 실행

게스트 가상 머신에서 virt-rescue 를 사용하기 전에 guest 가상 머신이 실행되고 있지 않은지 확인합니다. 그렇지 않으면 디스크 손상이 발생합니다. 게스트 가상 머신이 존재하지 않는 경우 다음을 입력합니다.
$ virt-rescue -d GuestName
(여기서 GuestName은 libvirt에 알려진 게스트 이름입니다.
$ virt-rescue -a /path/to/disk/image
(여기서 경로는 게스트 가상 머신 디스크를 포함하는 모든 파일, 논리 볼륨, LUN 등)일 수 있습니다.
virt-rescue가 rescue VM을 부팅할 때 먼저 출력 스크롤이 표시됩니다. 결국에는 다음이 표시됩니다.
Welcome to virt-rescue, the libguestfs rescue shell.

 Note: The contents of / are the rescue appliance.
 You have to mount the guest virtual machine's partitions under /sysroot
 before you can examine them.

 bash: cannot set terminal process group (-1): Inappropriate ioctl for device
 bash: no job control in this shell
 ><rescue>
쉘 프롬프트는 일반 bash 쉘이며 축소된 일반 Red Hat Enterprise Linux 명령 집합을 사용할 수 있습니다. 예를 들어 다음을 입력할 수 있습니다.
><rescue> fdisk -l /dev/vda
이전 명령은 디스크 파티션을 나열합니다. 파일 시스템을 마운트하려면 사용자가 원하는 대로 마운트할 수 있도록 복구 시스템의 빈 디렉터리인 /sysroot 아래에 마운트하는 것이 좋습니다. / 아래의 파일은 rescue VM 자체의 파일입니다.
><rescue> mount /dev/vda1 /sysroot/
EXT4-fs (vda1): mounted filesystem with ordered data mode. Opts: (null)
><rescue> ls -l /sysroot/grub/
 total 324
 -rw-r--r--. 1 root root     63 Sep 16 18:14 device.map
 -rw-r--r--. 1 root root  13200 Sep 16 18:14 e2fs_stage1_5
 -rw-r--r--. 1 root root  12512 Sep 16 18:14 fat_stage1_5
 -rw-r--r--. 1 root root  11744 Sep 16 18:14 ffs_stage1_5
 -rw-------. 1 root root   1503 Oct 15 11:19 grub.conf
 [...]
게스트 가상 머신 복구가 완료되면 exit 또는 Ctrl+d 를 입력하여 쉘을 종료합니다.
virt-rescue 에는 많은 명령줄 옵션이 있습니다. 가장 자주 사용되는 옵션은 다음과 같습니다.
  • --ro: 게스트 가상 머신에서 읽기 전용 모드로 작동합니다. 변경 사항은 저장되지 않습니다. 이를 사용하여 게스트 가상 머신을 실험할 수 있습니다. 쉘을 종료하면 모든 변경 사항이 삭제됩니다.
  • --network: rescue 쉘에서 네트워크 액세스를 활성화합니다. 예를 들어 RPM 또는 기타 파일을 게스트 가상 머신에 다운로드해야 하는 경우 이 방법을 사용합니다.

21.7. virt-df: 디스크 사용량 모니터링

이 섹션에서는 디스크 사용량 모니터링에 대한 정보를 제공합니다.

21.7.1. 소개

이 섹션에서는 디스크 이미지 또는 게스트 가상 머신의 파일 시스템 사용량을 표시하는 virt-df 에 대해 설명합니다. 이는 Linux df 명령과 유사하지만 가상 머신용과 유사합니다.

21.7.2. virt-df 실행

디스크 이미지에 있는 모든 파일 시스템의 파일 시스템 사용량을 표시하려면 다음을 입력합니다.
# virt-df -a /dev/vg_guests/RHEL7
 Filesystem                   1K-blocks       Used  Available  Use%
 RHEL6:/dev/sda1                 101086      10233      85634   11%
 RHEL6:/dev/VolGroup00/LogVol00 7127864    2272744    4493036   32%
(여기서 /dev/vg_guests/RHEL7 은 Red Hat Enterprise Linux 7 게스트 가상 머신 디스크 이미지입니다. 이 경우 경로는 이 디스크 이미지가 있는 호스트 물리 시스템 논리 볼륨입니다.)
virt-df 를 자체적으로 사용하여 libvirt에 알려진 모든 게스트 가상 머신에 대한 정보를 나열할 수도 있습니다. virt-df 명령은 -h (human-readable) 및 -i (블록 대신 inode 표시)와 같은 표준 df 와 동일한 옵션 중 일부를 인식합니다.
# virt-df -h -d domname
 Filesystem                       Size       Used  Available  Use%
 F14x64:/dev/sda1               484.2M      66.3M     392.9M   14%
 F14x64:/dev/vg_f14x64/lv_root    7.4G       3.0G       4.4G   41%
 RHEL6brewx64:/dev/sda1         484.2M      52.6M     406.6M   11%
 RHEL6brewx64:/dev/vg_rhel6brewx64/lv_root
                                 13.3G       3.4G       9.2G   26%
참고
라이브 게스트 가상 머신에서 virt-df 를 안전하게 사용할 수 있습니다. 읽기 전용 권한만 필요하기 때문입니다. 그러나 게스트 가상 시스템 내에서 실행되는 df 명령의 숫자와 정확히 같을 것으로 예상해서는 안 됩니다. 이는 디스크의 기능이 라이브 게스트 가상 머신 상태와 약간 동기화되지 않기 때문입니다. 그러나 분석 및 모니터링 목적으로 충분한 근사치가 있어야 합니다.
virt-df 는 통계를 모니터링 도구, 데이터베이스 등에 통합할 수 있도록 설계되었습니다. 이를 통해 시스템 관리자는 디스크 사용량 추세에 대한 보고서를 생성할 수 있으며 게스트 가상 머신이 디스크 공간 부족으로 실행되고 있는지 여부를 경고할 수 있습니다. 이렇게 하려면 --csv 옵션을 사용하여 컴퓨터에서 읽을 수 있는 Comma-Separated-Values(CSV) 출력을 생성해야 합니다. CSV 출력은 대부분의 데이터베이스, 스페인어 소프트웨어 및 기타 다양한 툴 및 프로그래밍 언어에서 읽을 수 있습니다. 원시 CSV는 다음과 같습니다.
# virt-df --csv -d RHEL6Guest
 Virtual Machine,Filesystem,1K-blocks,Used,Available,Use%
 RHEL6brewx64,/dev/sda1,102396,24712,77684,24.1%
 RHEL6brewx64,/dev/sda2,20866940,7786652,13080288,37.3%

21.8. virt-resize: 게스트 가상 머신 오프라인 크기 조정

이 섹션에서는 오프라인 게스트 가상 머신 크기 조정에 대한 정보를 제공합니다.

21.8.1. 소개

이 섹션에서는 게스트 가상 머신을 확장하거나 축소하는 툴인 virt-resize 에 대해 설명합니다. 오프라인 상태인 게스트 가상 머신에서만 작동합니다(종료). 게스트 가상 머신 이미지를 복사하고 원래 디스크 이미지를 그대로 두면 작동합니다. 이는 원본 이미지를 백업으로 사용할 수 있기 때문에 이상적이지만 디스크 공간의 두 배가 필요하므로 절오프가 있습니다.

21.8.2. 디스크 이미지 확장

이 섹션에서는 디스크 이미지를 확장하는 간단한 사례를 보여줍니다.
  1. 크기를 조정할 디스크 이미지를 찾습니다. libvirt 게스트 가상 머신에 virsh dumpxml GuestName 명령을 사용할 수 있습니다.
  2. 게스트 가상 머신을 확장하는 방법을 결정합니다. 다음 출력에 표시된 대로 게스트 가상 머신 디스크에서 virt-df -hvirt-filesystems 를 실행합니다.
    # virt-df -h -a /dev/vg_guests/RHEL6
    Filesystem                      Size       Used  Available  Use%
    RHEL6:/dev/sda1                98.7M      10.0M      83.6M   11%
    RHEL6:/dev/VolGroup00/LogVol00  6.8G       2.2G       4.3G   32%
    
    # virt-filesystems -a disk.img --all --long -h
    /dev/sda1 ext3 101.9M
    /dev/sda2 pv 7.9G
    
다음 예제에서는 방법을 보여 줍니다.The following example demonstrates how to:
  • 첫 번째(부팅) 파티션의 크기를 약 100MB에서 500MB로 늘립니다.
  • 총 디스크 크기를 8GB에서 16GB로 늘립니다.
  • 두 번째 파티션을 확장하여 나머지 공간을 채웁니다.
  • /dev/VolGroup00/LogVol00 을 확장하여 두 번째 파티션에 새 공간을 채웁니다.
  1. guest 가상 머신이 종료되었는지 확인합니다.
  2. 원래 디스크의 이름을 백업으로 바꿉니다. 이 작업을 수행하는 방법은 원래 디스크의 호스트 물리적 시스템 스토리지 환경에 따라 다릅니다. 파일로 저장된 경우 mv 명령을 사용합니다. 논리 볼륨(이 예제에서는 설명됨)의 경우 lvrename 을 사용하십시오.
    # lvrename /dev/vg_guests/RHEL6 /dev/vg_guests/RHEL6.backup
  3. 새 디스크를 만듭니다. 이 예제의 요구 사항은 총 디스크 크기를 16GB까지 확장하는 것입니다. 여기에서 논리 볼륨이 사용되므로 다음 명령이 사용됩니다.
    # lvcreate -L 16G -n RHEL6 /dev/vg_guests
    Logical volume "RHEL6" created
    
  4. 2단계의 요구 사항은 다음 명령으로 표시됩니다.
    # virt-resize \
           /dev/vg_guests/RHEL6.backup /dev/vg_guests/RHEL6 \
           --resize /dev/sda1=500M \
           --expand /dev/sda2 \
           --LV-expand /dev/VolGroup00/LogVol00
    
    처음 두 개의 인수는 입력 디스크와 출력 디스크입니다. --resize /dev/sda1=500M 은 첫 번째 파티션 최대 500MB의 크기를 조정합니다. --expand /dev/sda2 는 두 번째 파티션을 확장하여 나머지 공간을 모두 채웁니다. --LV-expand /dev/VolGroup00/LogVol00 은 게스트 논리 볼륨을 확장합니다.
    virt-resize 는 출력에서 수행하는 작업을 설명합니다.
    Summary of changes:
       /dev/sda1: partition will be resized from 101.9M to 500.0M
       /dev/sda1: content will be expanded using the 'resize2fs' method
       /dev/sda2: partition will be resized from 7.9G to 15.5G
       /dev/sda2: content will be expanded using the 'pvresize' method
       /dev/VolGroup00/LogVol00: LV will be expanded to maximum size
       /dev/VolGroup00/LogVol00: content will be expanded using the 'resize2fs' method
       Copying /dev/sda1 ...
       [#####################################################]
       Copying /dev/sda2 ...
       [#####################################################]
       Expanding /dev/sda1 using the 'resize2fs' method
       Expanding /dev/sda2 using the 'pvresize' method
       Expanding /dev/VolGroup00/LogVol00 using the 'resize2fs' method
    
  5. 가상 머신을 부팅합니다. 작동 중인 경우(및 철저하게 테스트한 후에) 백업 디스크를 삭제할 수 있습니다. 가상 머신이 실패하면 가상 머신을 종료하고 새 디스크를 삭제하고 백업 디스크 이름을 다시 원래 이름으로 변경합니다.
  6. virt-df 또는 virt-filesystems 를 사용하여 새 크기를 표시합니다.
    # virt-df -h -a /dev/vg_pin/RHEL6
       Filesystem                      Size       Used  Available  Use%
       RHEL6:/dev/sda1               484.4M      10.8M     448.6M    3%
       RHEL6:/dev/VolGroup00/LogVol00 14.3G       2.2G      11.4G   16%
    
경우에 따라 게스트 가상 머신 크기 조정에 문제가 있을 수 있습니다. virt-resize 에 실패하면 virt-resize(1) 매뉴얼 페이지를 검토하고 시도할 수 있는 여러 가지 팁이 있습니다. 일부 이전 Red Hat Enterprise Linux 게스트 가상 머신의 경우 GRUB에 대한 팁에 특히 주의해야 할 수도 있습니다.

21.9. virt-inspector: 게스트 가상 머신 검사

이 섹션에서는 게스트 가상 머신 검사에 대한 정보를 제공합니다.

21.9.1. 소개

virt-inspector 는 디스크 이미지를 검사하여 포함된 운영 체제를 찾는 툴입니다.

21.9.2. 설치

virt-inspector 및 문서를 설치하려면 다음 명령을 입력합니다.
# yum install libguestfs-tools
출력용 Relax-NG 스키마와 예제 XML 출력을 포함한 문서는 /usr/share/doc/libguestfs-devel-*/ 에 설치됩니다. 여기서 *libguestfs 버전 번호로 대체됩니다.

21.9.3. virt-inspector 실행

다음 예와 같이 모든 디스크 이미지 또는 libvirt 게스트 가상 머신에 대해 virt-inspector 를 실행할 수 있습니다.
$ virt-inspector -a disk.img > report.xml
예를 들면 다음과 같습니다.
$ virt-inspector -d GuestName > report.xml
결과는 XML 보고서(report.xml)입니다. XML 파일의 주요 구성 요소는 다음과 유사하게 일반적으로 단일 <operatingsystem> 요소를 포함하는 최상위 <operatingsytems> 요소입니다.
 <operatingsystems>
   <operatingsystem>

     <!-- the type of operating system and Linux distribution -->
     <name>linux</name>
     <distro>rhel</distro>
     <!-- the name, version and architecture -->
     <product_name>Red Hat Enterprise Linux Server release 6.4 </product_name>
     <major_version>6</major_version>
     <minor_version>4</minor_version>
     <package_format>rpm</package_format>
     <package_management>yum</package_management>
     <root>/dev/VolGroup/lv_root</root> 
     <!-- how the filesystems would be mounted when live -->
     <mountpoints>
       <mountpoint dev="/dev/VolGroup/lv_root">/</mountpoint>
       <mountpoint dev="/dev/sda1">/boot</mountpoint>
       <mountpoint dev="/dev/VolGroup/lv_swap">swap</mountpoint>
     </mountpoints>

    < !-- filesystems-->
      <filesystem dev="/dev/VolGroup/lv_root">
        <label></label>
        <uuid>b24d9161-5613-4ab8-8649-f27a8a8068d3</uuid>
        <type>ext4</type>
        <content>linux-root</content>
        <spec>/dev/mapper/VolGroup-lv_root</spec>
      </filesystem>
      <filesystem dev="/dev/VolGroup/lv_swap">
        <type>swap</type>
        <spec>/dev/mapper/VolGroup-lv_swap</spec>
      </filesystem>
     <!-- packages installed -->
     <applications>
       <application>
         <name>firefox</name>
         <version>3.5.5</version>
         <release>1.fc12</release>
       </application>
     </applications>

   </operatingsystem>
 </operatingsystems>
이러한 보고서를 처리하는 것은 W3C 표준 EgressIP 쿼리를 사용하여 가장 잘 수행됩니다. Red Hat Enterprise Linux 7에는 간단한 인스턴스에 사용할 수 있는 xpath 명령줄 프로그램이 포함되어 있습니다. 그러나 장기 사용 및 고급 사용의 경우 원하는 프로그래밍 언어와 함께 etcdctl 라이브러리를 사용하는 것이 좋습니다.
예를 들어 다음 EgressIP 쿼리를 사용하여 모든 파일 시스템 장치를 나열할 수 있습니다.
$ virt-inspector GuestName | xpath //filesystem/@dev
 Found 3 nodes:
 -- NODE --
 dev="/dev/sda1"
 -- NODE --
 dev="/dev/vg_f12x64/lv_root"
 -- NODE --
 dev="/dev/vg_f12x64/lv_swap"
또는 다음을 입력하여 설치된 모든 애플리케이션의 이름을 나열하십시오.
$ virt-inspector GuestName | xpath //application/name
 [...long list...]

21.10. 프로그래밍 언어의 API 사용

libguestfs API는 Red Hat Enterprise Linux 7의 다음 언어에서 직접 사용할 수 있습니다. C, C++, Perl, Python, Java, Ruby 및 OCaml.
  • C 및 C++ 바인딩을 설치하려면 다음 명령을 입력합니다.
    # yum install libguestfs-devel
  • Perl 바인딩을 설치하려면 다음을 수행합니다.
    # yum install 'perl(Sys::Guestfs)'
  • Python 바인딩을 설치하려면 다음을 수행합니다.
    # yum install python-libguestfs
  • Java 바인딩을 설치하려면 다음을 수행합니다.
    # yum install libguestfs-java libguestfs-java-devel libguestfs-javadoc
  • Ruby 바인딩을 설치하려면 다음을 수행합니다.
    # yum install ruby-libguestfs
  • OCaml 바인딩을 설치하려면 다음을 수행합니다.
    # yum install ocaml-libguestfs ocaml-libguestfs-devel
각 언어에 대한 바인딩은 본질적으로 동일하지만 약간의 합성 변경 사항이 있습니다. A C 문:
guestfs_launch (g);
Perl에서 다음과 같이 표시 됩니다.
$g->launch ()
또는 OCaml에서 다음과 같습니다.
g#launch ()
이 섹션에는 C의 API만 자세히 설명되어 있습니다.
C 및 C++ 바인딩에서 오류를 수동으로 확인해야 합니다.In the C and C++ bindings, you must manually check for errors. 다른 바인딩에서는 오류가 예외로 변환됩니다. 아래 예에 표시된 추가 오류 검사는 다른 언어에는 필요하지 않지만 반대로 예외를 catch하도록 코드를 추가할 수 있습니다. libguestfs API의 아키텍처와 관련된 몇 가지 관심 사항은 다음 목록을 참조하십시오.
  • libguestfs API가 동기화됩니다. 각 호출은 완료될 때까지 차단됩니다. 호출을 비동기적으로 수행하려는 경우 스레드를 만들어야 합니다.If you want to make calls asynchronously, you have to create a thread.
  • libguestfs API는 스레드가 안전하지 않습니다. 각 핸들은 단일 스레드에서만 사용하거나 스레드 간 처리를 공유하려는 경우 두 스레드가 동시에 하나의 처리에서 명령을 실행할 수 없도록 자체 semaphore를 구현해야 합니다.
  • 동일한 디스크 이미지에서 여러 개의 처리를 열 수 없습니다. 모든 처리가 읽기 전용인 경우 허용되지만 여전히 권장되지는 않습니다.
  • 해당 디스크 이미지(예: 라이브 VM)를 사용할 수 있는 경우 쓰기 위해 디스크 이미지를 추가하지 않아야 합니다. 이렇게 하면 디스크 손상이 발생합니다.
  • 현재 사용 중인 디스크 이미지에서 읽기 전용(예: 실시간 VM)을 열 수 있습니다. 그러나 결과는 예측할 수 없거나 일관되지 않을 수 있습니다. 특히 디스크 이미지를 읽는 시점에 디스크 이미지가 많이 기록되는 경우 특히 그렇습니다.

21.10.1. C 프로그램을 사용하여 API와 상호 작용

C 프로그램은 <guestfs.h> 헤더 파일을 포함하고 처리를 생성해야 합니다.
#include <stdio.h>
#include <stdlib.h>
#include <guestfs.h>

int
main (int argc, char *argv[])
{
  guestfs_h *g;

  g = guestfs_create ();
  if (g == NULL) {
    perror ("failed to create libguestfs handle");
    exit (EXIT_FAILURE);
   }

   /* ... */

   guestfs_close (g);

   exit (EXIT_SUCCESS);
 }
이 프로그램을 파일에 저장합니다(test.c). 이 프로그램을 컴파일하고 다음 두 가지 명령으로 실행합니다.
gcc -Wall test.c -o test -lguestfs
./test
이 단계에서는 출력을 출력하지 않아야 합니다. 이 섹션의 나머지 부분에서는 이 프로그램을 확장하여 새 디스크 이미지를 만들고 파티션을 지정하고 ext4 파일 시스템으로 포맷한 다음 파일 시스템에 일부 파일을 생성하는 방법을 보여주는 예제를 보여줍니다. 디스크 이미지는 disk.img 라고 하며 현재 디렉터리에 생성됩니다.
이 프로그램의 개요는 다음과 같습니다.
  • 핸들을 만듭니다.
  • 디스크 추가Add disk(s) to the handle.
  • libguestfs 백엔드를 시작합니다.
  • 파티션, 파일 시스템 및 파일을 만듭니다.
  • 핸들을 닫고 종료합니다.
수정된 프로그램은 다음과 같습니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <guestfs.h>

 int
 main (int argc, char *argv[])
 {
   guestfs_h *g;
   size_t i;

   g = guestfs_create ();
   if (g == NULL) {
     perror ("failed to create libguestfs handle");
     exit (EXIT_FAILURE);
  }

   /* Create a raw-format sparse disk image, 512 MB in size. */
   int fd = open ("disk.img", O_CREAT|O_WRONLY|O_TRUNC|O_NOCTTY, 0666);
   if (fd == -1) {
     perror ("disk.img");
     exit (EXIT_FAILURE);
   }
   if (ftruncate (fd, 512 * 1024 * 1024) == -1) {
     perror ("disk.img: truncate");
     exit (EXIT_FAILURE);
   }
   if (close (fd) == -1) {
     perror ("disk.img: close");
     exit (EXIT_FAILURE);
   }

   /* Set the trace flag so that we can see each libguestfs call. */
   guestfs_set_trace (g, 1);

   /* Set the autosync flag so that the disk will be synchronized
    * automatically when the libguestfs handle is closed.
    */
   guestfs_set_autosync (g, 1);

   /* Add the disk image to libguestfs. */
   if (guestfs_add_drive_opts (g, "disk.img",
         GUESTFS_ADD_DRIVE_OPTS_FORMAT, "raw", /* raw format */
         GUESTFS_ADD_DRIVE_OPTS_READONLY, 0,   /* for write */
         -1 /* this marks end of optional arguments */ )
       == -1)
     exit (EXIT_FAILURE);

   /* Run the libguestfs back-end. */
   if (guestfs_launch (g) == -1)
     exit (EXIT_FAILURE);

   /* Get the list of devices. Because we only added one drive
    * above, we expect that this list should contain a single
    * element.
    */
   char **devices = guestfs_list_devices (g);
   if (devices == NULL)
     exit (EXIT_FAILURE);
   if (devices[0] == NULL || devices[1] != NULL) {
     fprintf (stderr,
              "error: expected a single device from list-devices\n");
     exit (EXIT_FAILURE);
   }

   /* Partition the disk as one single MBR partition. */
   if (guestfs_part_disk (g, devices[0], "mbr") == -1)
     exit (EXIT_FAILURE);

   /* Get the list of partitions. We expect a single element, which
    * is the partition we have just created.
    */
   char **partitions = guestfs_list_partitions (g);
   if (partitions == NULL)
     exit (EXIT_FAILURE);
   if (partitions[0] == NULL || partitions[1] != NULL) {
     fprintf (stderr,
              "error: expected a single partition from list-partitions\n");
     exit (EXIT_FAILURE);
   }

   /* Create an ext4 filesystem on the partition. */
   if (guestfs_mkfs (g, "ext4", partitions[0]) == -1)
     exit (EXIT_FAILURE);

   /* Now mount the filesystem so that we can add files. */
   if (guestfs_mount_options (g, "", partitions[0], "/") == -1)
     exit (EXIT_FAILURE);

   /* Create some files and directories. */
   if (guestfs_touch (g, "/empty") == -1)
     exit (EXIT_FAILURE);

   const char *message = "Hello, world\n";
   if (guestfs_write (g, "/hello", message, strlen (message)) == -1)
     exit (EXIT_FAILURE);

   if (guestfs_mkdir (g, "/foo") == -1)
     exit (EXIT_FAILURE);

   /* This uploads the local file /etc/resolv.conf into the disk image. */
   if (guestfs_upload (g, "/etc/resolv.conf", "/foo/resolv.conf") == -1)
     exit (EXIT_FAILURE);

   /* Because 'autosync' was set (above) we can just close the handle
    * and the disk contents will be synchronized. You can also do
    * this manually by calling guestfs_umount_all and guestfs_sync.
    */
   guestfs_close (g);

   /* Free up the lists. */
   for (i = 0; devices[i] != NULL; ++i)
     free (devices[i]);
   free (devices);
   for (i = 0; partitions[i] != NULL; ++i)
     free (partitions[i]);
   free (partitions);

   exit (EXIT_SUCCESS);
 }
다음 두 가지 명령을 사용하여 이 프로그램을 컴파일하고 실행합니다.
gcc -Wall test.c -o test -lguestfs
./test
프로그램이 성공적으로 완료되는 경우 disk.img.img 라는 디스크 이미지로 남아 있어야 합니다.
guestfish --ro -a disk.img -m /dev/sda1
><fs> ll /
><fs> cat /foo/resolv.conf
기본적으로 (C 및 C++ 바인딩 전용) libguestfs는 stderr에 오류를 출력합니다. 오류 처리기를 설정하여 이 동작을 변경할 수 있습니다. guestfs(3) 도움말 페이지에는 이 내용에 대해 자세히 설명합니다.

21.11. virt-sysprep: 가상 머신 설정 재설정

virt-sysprep 명령줄 툴을 사용하여 게스트 가상 시스템을 재설정하거나 구성 해제하여 복제본을 만들 수 있습니다. 이 프로세스에서는 SSH 호스트 키를 제거하고, 영구 네트워크 MAC 구성을 제거하고, 사용자 계정을 제거해야 합니다. virt-sysprep은 SSH 키, 사용자 또는 로고를 추가하여 가상 머신을 사용자 지정할 수도 있습니다. 각 단계는 필요에 따라 활성화 또는 비활성화할 수 있습니다.
virt-sysprep 을 사용하려면 게스트 가상 머신이 오프라인 상태여야 하므로 명령을 실행하기 전에 종료해야 합니다. virt-sysprep 은 복사본을 만들지 않고 게스트 또는 디스크 이미지를 그대로 수정합니다. 게스트 가상 머신의 기존 콘텐츠를 유지하려면 먼저 디스크를 스냅샷, 복사 또는 복제해야 합니다. 디스크 복사 및 복제에 대한 자세한 내용은 libguestfs.org 를 참조하십시오.
디스크 이미지에 액세스하기 위해 root가 필요하지 않는 한 virt-sysprep 를 root로 사용하지 않는 것이 좋습니다. 그러나 이러한 경우 virt-sysprep 을 실행하는 루트가 아닌 사용자가 쓸 수 있도록 디스크 이미지의 권한을 변경하는 것이 좋습니다.
virt-sysprep 을 설치하려면 다음 명령을 입력합니다.
# yum install /usr/bin/virt-sysprep
다음 명령 옵션을 virt-sysprep 과 함께 사용할 수 있습니다.

표 21.1. virt-sysprep 명령

명령 설명 예제
--help 특정 명령 또는 virt-sysprep 명령에 대한 간략한 도움말 항목을 표시합니다. 추가 도움말은 virt-sysprep 도움말 페이지를 참조하십시오. virt-sysprep --help
-a [파일] 또는 --add [file] 게스트 가상 머신의 디스크 이미지여야 하는 지정된 파일 을 추가합니다. 디스크 이미지 형식이 자동으로 탐지됩니다. 이 값을 재정의하고 특정 형식을 강제 적용하려면 --format 옵션을 사용합니다. virt-sysprep --add /dev/vms/disk.img
-a [URI] 또는 --add [URI] 원격 디스크를 추가합니다. URI 형식은 RuntimeClass와 호환됩니다. 자세한 내용은 21.4.2절. “RuntimeClass를 사용하여 파일 추가”의 내용을 참조하십시오. virt-sysprep -a rbd://example.com[:port]/pool/disk
-c [URI] 또는 --connect [URI] libvirt 를 사용하는 경우 지정된 URI에 연결합니다. 생략하면 KVM 하이퍼바이저를 통해 연결됩니다. 게스트 블록 장치를 직접 지정하는 경우(virt-sysprep -a) libvirt 가 전혀 사용되지 않습니다. virt-sysprep -c qemu:///system
-d [guest] 또는 --domain [guest] 지정된 게스트 가상 머신의 모든 디스크를 추가합니다. 도메인 UUID는 도메인 이름 대신 사용할 수 있습니다. virt-sysprep --domain 90df2f3f-8857-5ba9-2714-7d95907b1c9e
-n 또는 --dry-run 게스트 가상 시스템에서 읽기 전용 "dry run" sysprep 작업을 수행합니다. 이렇게 하면 sysprep 작업이 실행되지만 결국 디스크에 변경 사항이 취소됩니다. virt-sysprep -n
--enable [작업] 지정된 작업을 활성화합니다. 가능한 작업을 나열하려면 --list 명령을 사용합니다. virt-sysprep --enable ssh-hostkeys,udev-persistent-net
--operation 또는 --operations 수행할 sysprep 작업을 선택합니다. 작업을 비활성화하려면 작업 이름 앞에 -를 사용합니다. virt-sysprep --operations ssh-hotkeys,udev-persistent-net 는 두 작업을 모두 활성화하는 반면 virt-sysprep --operations firewall-rules,-tmp-files 는 firewall-rules 작업을 활성화하고 tmp-files 작업을 비활성화합니다. 유효한 작업 목록은 libguestfs.org 를 참조하십시오.
--format [raw|qcow2|auto] a 옵션의 기본값은 디스크 이미지 형식을 자동으로 검색하는 것입니다. 이를 사용하면 명령줄에서 뒤에 오는 -a 옵션에 대해 디스크 형식이 강제 적용됩니다. --format auto를 사용하여 후속 -a 옵션에 대한 자동 감지로 다시 전환합니다(위의 -a 명령 참조). virt-sysprep --format raw -a disk.imgdisk.img 에 대해 원시 형식(자동 감지 없음)을 강제 적용하지만 virt-sysprep --format raw -a disk.img --format auto-format auto -a another.imgdisk.img 에 대해 원시 형식(자동 탐지 없음)을 강제 적용하여 다른.img .img의 경우 원시 형식(자동 탐지 없음)으로 되돌립니다.img 신뢰할 수 없는 원시 형식 게스트 디스크 이미지가 있는 경우 이 옵션을 사용하여 디스크 형식을 지정해야 합니다. 이로 인해 악의적인 게스트의 보안 문제가 발생할 수 있습니다.
--list-operations virt-sysprep 프로그램에서 지원하는 작업을 나열합니다. 이러한 필드는 한 줄에 하나씩 나열되며, 하나 이상의 단일 공백으로 구분된 필드가 있습니다. 출력의 첫 번째 필드는 --enable 플래그에 제공할 수 있는 작업 이름입니다. 두 번째 필드는 작업이 기본적으로 활성화되어 있거나 그렇지 않은 경우 비어 있는 경우 * 문자입니다. 동일한 줄의 추가 필드에는 작업에 대한 설명이 포함됩니다. virt-sysprep --list-operations
--Mount-options 게스트 가상 시스템의 각 마운트 지점에 대한 마운트 옵션을 설정합니다. RuntimeClass로 구분된 마운트 지점:options 쌍을 사용합니다. 쉘에서 보호하려면 이 목록에 따옴표를 배치해야 할 수 있습니다. virt-sysprep --mount-options "/:notime"notime 작업을 통해 루트 디렉토리를 마운트합니다.
-q 또는 --quiet 로그 메시지 인쇄를 방지합니다. virt-sysprep -q
-v 또는 --verbose 디버깅을 위해 자세한 메시지를 활성화합니다. virt-sysprep -v
-v 또는 --version virt-sysprep 버전 번호를 표시하고 종료합니다. virt-sysprep -V
--root-password 루트 암호를 설정합니다. 을 사용하여 새 암호를 명시적으로 지정하거나 선택한 파일의 첫 번째 행에서 문자열을 더 안전하게 지정할 수 있습니다.
virt-sysprep --root-password password:123456 -a guest.img
또는
virt-sysprep --root-password file:SOURCE_FILE_PATH -a guest.img
자세한 내용은 libguestfs 설명서 를 참조하십시오.

21.12. virt-customize 가상 머신 설정 사용자 정의

virt-customize 명령줄 툴을 사용하여 가상 머신을 사용자 지정할 수 있습니다. 예를 들어 패키지를 설치하고 구성 파일을 편집하면 됩니다.
virt-customize 를 사용하려면 게스트 가상 머신이 오프라인 상태여야 하므로 명령을 실행하기 전에 종료해야 합니다. virt-customize 는 게스트 또는 디스크 이미지를 복사본을 만들지 않고 수정됩니다. 게스트 가상 머신의 기존 콘텐츠를 유지하려면 먼저 디스크를 스냅샷, 복사 또는 복제해야 합니다. 디스크 복사 및 복제에 대한 자세한 내용은 libguestfs.org 를 참조하십시오.
주의
라이브 가상 머신에서 virt-customize 를 사용하거나 다른 디스크 편집 툴과 동시에 사용하면 디스크 손상이 발생할 수 있습니다. 이 명령을 사용하려면 가상 머신을 종료해야 합니다. 또한 디스크 이미지를 동시에 편집해서는 안 됩니다.
root로 virt-customize 를 실행하지 않는 것이 좋습니다.
virt-customize 를 설치하려면 다음 명령 중 하나를 실행합니다.
# yum install /usr/bin/virt-customize
또는
# yum install libguestfs-tools-c
다음 명령 옵션을 virt-customize 와 함께 사용할 수 있습니다.

표 21.2. virt-customize 옵션

명령 설명 예제
--help 특정 명령 또는 virt-customize 유틸리티에 대한 간단한 도움말 항목을 표시합니다. 추가 도움말은 virt-customize man 페이지를 참조하십시오. virt-customize --help
-a [파일] 또는 --add [file] 게스트 가상 머신의 디스크 이미지여야 하는 지정된 파일 을 추가합니다. 디스크 이미지 형식이 자동으로 탐지됩니다. 이 값을 재정의하고 특정 형식을 강제 적용하려면 --format 옵션을 사용합니다. virt-customize --add /dev/vms/disk.img
-a [URI] 또는 --add [URI] 원격 디스크를 추가합니다. URI 형식은 RuntimeClass와 호환됩니다. 자세한 내용은 21.4.2절. “RuntimeClass를 사용하여 파일 추가”의 내용을 참조하십시오. virt-customize -a rbd://example.com[:port]/pool/disk
-c [URI] 또는 --connect [URI] libvirt 를 사용하는 경우 지정된 URI에 연결합니다. 생략하면 KVM 하이퍼바이저를 통해 연결됩니다. 게스트 블록 장치를 직접 지정하는 경우 (virt-customize -a), libvirt 가 전혀 사용되지 않습니다. virt-customize -c qemu:///system
-d [guest] 또는 --domain [guest] 지정된 게스트 가상 머신의 모든 디스크를 추가합니다. 도메인 UUID는 도메인 이름 대신 사용할 수 있습니다. virt-customize --domain 90df2f3f-8857-5ba9-2714-7d95907b1c9e
-n 또는 --dry-run 게스트 가상 시스템에서 읽기 전용 "실행" 사용자 지정 작업을 수행합니다. 이렇게 하면 사용자 지정 작업이 실행되지만 끝에 디스크에 모든 변경 사항이 제거됩니다. virt-customize -n
--format [raw|qcow2|auto] a 옵션의 기본값은 디스크 이미지 형식을 자동으로 검색하는 것입니다. 이를 사용하면 명령줄에서 뒤에 오는 -a 옵션에 대해 디스크 형식이 강제 적용됩니다. --format auto 를 사용하여 후속 -a 옵션에 대한 자동 감지로 다시 전환합니다(위의 -a 명령 참조). virt-customize --format raw -a disk.img 는 disk.img에 대해 원시 형식(자동 감지 없음)을 강제 적용하지만 virt-customize --format raw -a disk.img --format auto -a another.imgdisk.img 에 대해 원시 형식(자동 탐지 없음)을 강제 적용하고 다른.img를 위해 원시 형식(자동 탐지 없음)으로 되돌립니다.img 신뢰할 수 없는 원시 형식 게스트 디스크 이미지가 있는 경우 이 옵션을 사용하여 디스크 형식을 지정해야 합니다. 이로 인해 악의적인 게스트의 보안 문제가 발생할 수 있습니다.
-m [MB] 또는 --memsize [MB] --run 스크립트에 할당된 메모리 양을 변경합니다. --run scripts 또는 --install 옵션을 사용하면 메모리 문제가 부족하여 메모리 할당을 늘립니다. virt-customize --memsize 1024
--network 또는 --no-network 설치하는 동안 게스트에서 네트워크 액세스를 활성화하거나 비활성화합니다. 기본값은 enabled입니다. --no-network 를 사용하여 액세스를 비활성화합니다. 이 명령은 부팅 후 네트워크에 대한 게스트 액세스에 영향을 미치지 않습니다. 자세한 내용은 libguestfs 설명서 를 참조하십시오. virt-customize -a http://[user@]example.com[:port]/disk.img
-q 또는 --quiet 로그 메시지 인쇄를 방지합니다. virt-customize -q
-smp [N] --install 스크립트에서 사용할 수 있는 N 가상 CPU를 활성화합니다. N 은 2 이상이어야 합니다. virt-customize -smp 4
-v 또는 --verbose 디버깅을 위해 자세한 메시지를 활성화합니다. virt-customize --verbose
-v 또는 --version virt-customize 버전 번호를 표시하고 종료합니다. virt-customize --V
-x libguestfs API 호출 추적을 활성화합니다. virt-customize -x
virt-customize 명령은 사용자 지정 옵션을 사용하여 게스트 사용자 지정 방법을 구성합니다. 다음은 --selinux-relabel 사용자 지정 옵션에 대한 정보를 제공합니다.
--selinux-relabel 사용자 지정 옵션은 올바른 SELinux 레이블이 있도록 게스트의 파일의 레이블을 다시 지정합니다. 이 옵션은 즉시 파일의 레이블을 다시 지정하려고 합니다. 실패하면 이미지에서 /.autorelabel 이 활성화됩니다. 그러면 다음에 이미지가 부팅될 때 레이블 재지정 작업이 예약됩니다.
참고
이 옵션은 SELinux를 지원하는 게스트에만 사용해야 합니다.
다음 예제에서는 게스트에 GIMP 및 Inkscape 패키지를 설치하고 다음에 게스트를 부팅할 때 SELinux 레이블이 수정되도록 합니다.

예 21.1. virt-customize 를 사용하여 게스트에 패키지 설치

virt-customize -a disk.img --install gimp,inkscape --selinux-relabel
사용자 지정 옵션을 포함한 자세한 내용은 libguestfs.org 를 참조하십시오.

21.13. virt-diff: 가상 머신 파일 간의 차이점 나열

virt-diff 명령줄 툴을 사용하여 두 가상 머신 디스크 이미지의 파일 차이점을 나열할 수 있습니다. 출력에 가상 시스템의 디스크 이미지가 실행된 후 변경 사항이 표시됩니다. 명령을 사용하여 오버레이 간의 차이점을 표시할 수도 있습니다.
참고
읽기 전용 액세스만 필요하므로 실시간 게스트 가상 머신에서 virt-diff 를 안전하게 사용할 수 있습니다.
이 툴은 실행 중인 가상 머신과 선택한 이미지 간의 파일 이름, 파일 크기, 체크섬, 확장 속성, 파일 콘텐츠 등에 차이점을 찾습니다.
참고
virt-diff 명령은 부트 로더, 파티션 또는 파일 시스템 간 사용되지 않은 공간 또는 "hidden" 섹터를 확인하지 않습니다. 따라서 보안 또는 법학 도구로 사용하지 않는 것이 좋습니다.
virt-diff 를 설치하려면 다음 명령 중 하나를 실행합니다.
# yum install /usr/bin/virt-diff
또는
# yum install libguestfs-tools-c
두 게스트를 지정하려면 첫 번째 게스트에 -a 또는 -d 옵션과 두 번째 게스트에 -A 또는 -D 옵션을 사용해야 합니다. 예를 들면 다음과 같습니다.
$ virt-diff -a old.img -A new.img
libvirt 에 알려진 이름을 사용할 수도 있습니다. 예를 들면 다음과 같습니다.
$ virt-diff -d oldguest -D newguest
다음 명령 옵션을 virt-diff 와 함께 사용할 수 있습니다.

표 21.3. virt-diff 옵션

명령 설명 예제
--help 특정 명령 또는 virt-diff 유틸리티에 대한 간략한 도움말 항목을 표시합니다. 추가 도움말은 virt-diff 매뉴얼 페이지를 참조하십시오. virt-diff --help
-a [파일] 또는 --add [file]
첫 번째 가상 시스템의 디스크 이미지여야 하는 지정된 파일 을 추가합니다. 가상 머신에 블록 장치가 여러 개 있는 경우 별도의 -a 옵션으로 모든 장치를 제공해야 합니다.
디스크 이미지 형식이 자동으로 탐지됩니다. 이 값을 재정의하고 특정 형식을 강제 적용하려면 --format 옵션을 사용합니다.
virt-customize --add /dev/vms/original.img -A /dev/vms/new.img
-a [URI] 또는 --add [URI] 원격 디스크를 추가합니다. URI 형식은 RuntimeClass와 호환됩니다. 자세한 내용은 21.4.2절. “RuntimeClass를 사용하여 파일 추가”의 내용을 참조하십시오. virt-diff -a rbd://example.com[:port]/pool/newdisk -A rbd://example.com[:port]/pool/olddisk
--all --extra-stats --uids --uids --xattrs 와 동일합니다. virt-diff --all
--atime 기본적으로 virt-diff 는 파일 액세스 시간에 대한 변경 사항을 무시합니다. 이러한 변경 사항은 흥미로운 경우가 거의 없기 때문입니다. --atime 옵션을 사용하여 액세스 시간 차이를 표시합니다. virt-diff --atime
-a [파일] 두 번째 가상 시스템의 디스크 이미지여야 하는 지정된 파일 또는 URI 를 추가합니다. virt-diff --add /dev/vms/original.img -A /dev/vms/new.img
-c [URI] 또는 --connect [URI] libvirt 를 사용하는 경우 지정된 URI에 연결합니다. 생략하면 기본 libvirt 하이퍼바이저에 연결됩니다. 게스트 블록 장치를 직접 지정하는 경우 (virt-diff -a), libvirt 가 전혀 사용되지 않습니다. virt-diff -c qemu:///system
--csv 결과를 쉼표로 구분된 값(CSV) 형식으로 제공합니다. 이 형식은 데이터베이스 및 스프레드로 쉽게 가져올 수 있습니다. 자세한 내용은 참고 에서 참조하십시오. virt-diff --csv
-d [guest] 또는 --domain [guest] 지정된 게스트 가상 머신의 모든 디스크를 첫 번째 게스트 가상 시스템으로 추가합니다. 도메인 UUID는 도메인 이름 대신 사용할 수 있습니다. $ virt-diff --domain 90df2f3f-8857-5ba9-2714-7d95907b1c9e
-d [guest] 지정된 게스트 가상 시스템의 모든 디스크를 두 번째 게스트 가상 시스템으로 추가합니다. 도메인 UUID는 도메인 이름 대신 사용할 수 있습니다. virt-diff --D 90df2f3f-8857-5ba9-2714-7d95907b1cd4
--extra-stats 추가 통계를 표시합니다. virt-diff --extra-stats
--format 또는 --format=[raw|qcow2] -a/-A 옵션의 기본값은 디스크 이미지의 형식을 자동으로 감지하는 것입니다. 이 기능을 사용하면 명령줄에서 뒤에 오는 -a/-A 옵션에 대한 디스크 형식이 강제 적용됩니다. --format auto 를 사용하여 후속 -a 옵션에 대한 자동 감지로 다시 전환합니다(위의 -a 명령 참조). virt-diff --format raw -a new.img -A old.img 는 new.img 및 old.img에 대해 원시 형식(자동 감지 없음)을 강제 적용하지만 virt-diff --format raw -a new.img --format auto-format auto -a old.img 는 원시 형식(자동 감지 없음)을 강제 적용하며 new.img 에 대해 원시 형식(자동 탐지 없음)을 강제 적용합니다. 신뢰할 수 없는 원시 형식 게스트 디스크 이미지가 있는 경우 이 옵션을 사용하여 디스크 형식을 지정해야 합니다. 이로 인해 악의적인 게스트의 보안 문제가 발생할 수 있습니다.
-H 또는 --human-readable 사용자가 읽을 수 있는 형식으로 파일 크기를 표시합니다. virt-diff -h
--time-days
변경된 파일의 시간 필드를 이제까지의 일(나중에 있는 경우)으로 표시합니다.
0 은 향후 86,399초(23시간, 59분, 59분, 59초) 사이를 의미합니다.
virt-diff --time-days
-v 또는 --verbose 디버깅을 위해 자세한 메시지를 활성화합니다. virt-diff --verbose
-v 또는 --version virt-diff 버전 번호를 표시하고 종료합니다. virt-diff -V
-x libguestfs API 호출 추적을 활성화합니다. virt-diff -x
참고
쉼표로 구분된 값(CSV) 형식은 구문 분석하기 어려울 수 있습니다. 따라서 쉘 스크립트에서 csvtool을 사용하고 다른 언어의 경우 CSV 처리 라이브러리(예: Perl 또는 Python의 내장 csv 라이브러리)를 사용하는 것이 좋습니다. 또한 대부분의 스프레드 및 데이터베이스는 CSV를 직접 가져올 수 있습니다.
추가 옵션을 포함한 자세한 내용은 libguestfs.org 를 참조하십시오.

21.14. virt-sparsify: 빈 디스크 공간 회수

virt-sparsify 명령줄 툴을 사용하여 가상 머신 디스크(또는 디스크 이미지) 스파스를 만들 수 있습니다. 이를 씬 프로비저닝이라고도 합니다. 디스크 이미지의 여유 디스크 공간이 호스트의 여유 공간으로 변환됩니다.
virt-sparsify 명령은 ext2, ext3, ext4, btrfs, NTFS와 같은 대부분의 파일 시스템에서 작동할 수 있습니다. 또한 LVM 물리 볼륨에서 작동합니다. virt-sparsify 는 가상 머신 디스크 이미지뿐만 아니라 모든 디스크 이미지에서 작동할 수 있습니다.
주의
라이브 가상 머신에서 virt-sparsify 를 사용하거나 다른 디스크 편집 툴과 동시에 사용하면 디스크 손상이 발생할 수 있습니다. 이 명령을 사용하려면 가상 머신을 종료해야 합니다. 또한 디스크 이미지를 동시에 편집해서는 안 됩니다.
명령을 사용하여 일부 디스크 형식 간에 변환할 수도 있습니다. 예를 들어 virt-sparsify 는 원시 디스크 이미지를 씬 프로비저닝된 qcow2 이미지로 변환할 수 있습니다.
참고
가상 머신에 여러 개의 디스크가 있고 볼륨 관리를 사용하는 경우 virt-sparsify 가 작동하지만 제대로 작동하지 않습니다.
입력이 raw 이면 기본 출력은 raw sparse 입니다. 스파스를 이해하는 툴을 사용하여 출력 이미지의 크기를 확인해야 합니다.
$ ls -lh test1.img
-rw-rw-r--. 1 rjones rjones 100M Aug  8 08:08 test1.img
$ du -sh test1.img
3.6M   test1.img
ls 명령은 100M로 된 이미지 크기를 보여줍니다. 그러나 du 명령은 3.6M이 될 이미지 크기를 올바르게 표시합니다.

중요한 제한 사항

다음은 중요한 제한 목록입니다.
  • virt-sparsify 를 사용하기 전에 가상 머신을 종료해야 합니다.
  • 심각한 경우 virt-sparsify 는 소스 디스크 이미지의 가상 크기보다 두 배가 필요할 수 있습니다. 임시 복사용이고 하나는 대상 이미지용입니다.
    --in-place 옵션을 사용하는 경우 대량의 임시 공간이 필요하지 않습니다.
  • virt-sparsify 는 디스크 이미지의 크기를 조정하는 데 사용할 수 없습니다. 디스크 이미지의 크기를 조정하려면 virt-resize. virt-resize 에 대한 자세한 내용은 21.8절. “virt-resize: 게스트 가상 머신 오프라인 크기 조정” 을 참조하십시오.
  • 암호화된 디스크를 확장할 수 없기 때문에 virt-sparsify 는 암호화된 디스크에서 작동하지 않습니다.
  • virt-sparsify 는 파티션 간의 공간을 강화할 수 없습니다. 이 공간은 종종 부트로더와 같은 중요한 항목에 사용되므로 실제로는 사용되지 않는 공간이 아닙니다.
  • 복사 모드에서 qcow2 내부 스냅샷은 대상 이미지에 복사되지 않습니다.

virt-sparsify 를 설치하려면 다음 명령 중 하나를 실행합니다.
# yum install /usr/bin/virt-sparsify
또는
# yum install libguestfs-tools-c
디스크를 확장하려면 다음을 수행합니다.
# virt-sparsify /dev/sda1 /dev/device
/dev/sda1 의 콘텐츠를 /dev/device 에 복사하여 출력을 스파스로 만듭니다. /dev/device 가 이미 있는 경우 덮어씁니다. /dev/sda1 의 형식이 탐지되어 /dev/device 의 형식으로 사용됩니다.
형식 간에 변환하려면 다음을 수행합니다.
# virt-sparsify disk.raw --convert qcow2 disk.qcow2
0으로 설정하면 소스 디스크 이미지 내에서 찾을 수 있는 모든 파일 시스템에서 여유 공간이 확보됩니다.
특정 파일 시스템에서 0으로 여유 공간을 덮어쓰지 않도록 하려면 다음을 수행합니다.
# virt-sparsify --ignore /dev/device /dev/sda1 /dev/device
0이 있는 파일 시스템의 여유 공간을 덮어쓰지 않고 디스크 이미지의 모든 파일 시스템에서 스파인 디스크 이미지를 생성합니다.
임시 복사본을 생성하지 않고 디스크 이미지를 스파스로 만들려면 다음을 수행합니다.
# virt-sparsify --in-place disk.img
지정된 디스크 이미지를 스파스로 만들고 이미지 파일을 덮어씁니다.

virt-sparsify 옵션

다음 명령 옵션을 virt-sparsify 와 함께 사용할 수 있습니다.

표 21.4. virt-sparsify 옵션

명령 설명 예제
--help 특정 명령 또는 virt-sparsify 유틸리티에 대한 간략한 도움말 항목을 표시합니다. 추가 도움말은 virt-sparsify man 페이지를 참조하십시오. virt-sparsify --help
--check-tmpdir ignore|continue|warn|fail tmpdir 에 작업을 완료하기에 충분한 공간이 있는지 추정합니다. 지정된 옵션에서 작업을 완료하기에 충분한 공간이 없는 경우 동작을 결정합니다.
  • ignore: 이 문제는 무시되고 작업이 계속됩니다.
  • 계속하십시오. 오류를 보고하고 작업을 계속 수행합니다.
  • warn: 오류를 보고하고 사용자가 Enter를 누를 때까지 기다립니다.
  • fail: 오류를 보고하고 작업을 중단합니다.
이 옵션은 --in-place 옵션과 함께 사용할 수 없습니다.
virt-sparsify --check-tmpdir ignore /dev/sda1 /dev/device
virt-sparsify --check-tmpdir continue /dev/sda1 /dev/device
virt-sparsify --check-tmpdir warn /dev/sda1 /dev/device
virt-sparsify --check-tmpdir fail /dev/sda1 /dev/device
--compress 출력 파일을 압축합니다. 이는 출력 형식이 qcow2인 경우에만 작동합니다. 이 옵션은 --in-place 옵션과 함께 사용할 수 없습니다. virt-sparsify --compress /dev/sda1 /dev/device
--convert
지정된 형식을 사용하여 스파스 이미지를 생성합니다. 형식을 지정하지 않으면 입력 형식이 사용됩니다.
다음 출력 형식이 지원되며, raw, qcow, vdi로 알려져 있습니다.
QEMU 에뮬레이터에서 지원하는 모든 형식을 사용할 수 있습니다.
--convert 옵션을 사용하는 것이 좋습니다. 이렇게 하면 virt-sparsify 가 입력 형식을 추측할 필요가 없습니다.
이 옵션은 --in-place 옵션과 함께 사용할 수 없습니다.
virt-sparsify --convert raw /dev/sda1 /dev/device
virt-sparsify --convert qcow2 /dev/sda1 /dev/device
virt-sparsify --convert other_format indisk outdisk
--format 입력 디스크 이미지의 형식을 지정합니다. 지정하지 않으면 이미지에서 형식이 감지됩니다. 신뢰할 수 없는 원시 형식 게스트 디스크 이미지로 작업할 때는 형식을 지정해야 합니다.
virt-sparsify --format raw /dev/sda1 /dev/device
virt-sparsify --format qcow2 /dev/sda1 /dev/device
--ignore
지정된 파일 시스템 또는 볼륨 그룹을 무시합니다.
파일 시스템을 지정하고 --in-place 옵션을 지정하지 않으면 파일 시스템의 사용 가능한 공간이 0되지 않습니다. 그러나 기존 제로 블록은 스파르화되어 있습니다. --in-place 옵션을 지정하면 파일 시스템이 완전히 무시됩니다.
볼륨 그룹을 지정하면 볼륨 그룹이 무시됩니다. 볼륨 그룹 이름은 /dev/ 접두사 없이 사용해야 합니다. 예를 들면 --ignorevirtualization_foo입니다.
--ignore 옵션은 명령에 여러 번 포함될 수 있습니다.
virt-sparsify --ignore filesystem1 /dev/sda1 /dev/device
virt-sparsify --ignore volume_group/dev/sda1 /dev/device
--in-place
임시 복사본을 만드는 대신 이미지 스파스를 위치에 만듭니다. 인플레이션 스파화는 스파저션을 복사하는 것보다 더 효율적이지만 스파재를 복사하는 것과는 상당히 많은 디스크 공간을 복구할 수 없습니다. 내부 스파화는 삭제 (Fours or unmap) 지원을 사용하여 작동합니다.
인플레이션 스파 기능을 사용하려면 제대로 작동하는 디스크 이미지를 지정합니다.
인플레이스 스파 기능을 지정할 때 다음 옵션을 사용할 수 없습니다.
  • --convert--compress 는 전체 도매 디스크 형식 변경이 필요하기 때문에.
    --check-tmpdir 은 많은 임시 공간이 필요하지 않기 때문입니다.
virt-sparsify --in-place disk.img
-x libguestfs API 호출 추적을 활성화합니다. virt-sparsify -x filesystem1 /dev/sda1 /dev/device
추가 옵션을 포함한 자세한 내용은 libguestfs.org 를 참조하십시오.

22장. 게스트 가상 머신 관리용 그래픽 사용자 인터페이스 도구

virt-manager 외에도 Red Hat Enterprise Linux 7은 게스트 가상 머신의 콘솔에 액세스할 수 있는 다음과 같은 도구를 제공합니다.

22.1. virt-viewer

virt-viewer 는 게스트 가상 시스템의 그래픽 콘솔을 표시하기 위한 최소 명령줄 유틸리티입니다. 콘솔은 VNC 또는 SPICE 프로토콜을 사용하여 액세스할 수 있습니다. 게스트는 이름, ID 또는 UUID로 참조할 수 있습니다. 게스트가 아직 실행되고 있지 않은 경우, 뷰어는 콘솔에 연결을 시도하기 전에 시작할 때까지 대기하도록 설정할 수 있습니다. 뷰어는 원격 호스트에 연결하여 콘솔 정보를 가져온 다음 동일한 네트워크 전송을 사용하여 원격 콘솔에 연결할 수도 있습니다.
virt-manager 와 비교하여virt-viewer 는 더 작은 기능 세트를 제공하지만 리소스 요구 사항이 줄어듭니다. 또한 virt-manager 와 달리 대부분의 경우virt-viewer 에는 libvirt에 대한 읽기-쓰기 권한이 필요하지 않습니다. 따라서 권한이 없는 사용자가 게스트에 연결하고 표시할 수는 있지만 구성할 수는 없습니다.
virt-viewer 를 설치하려면 다음을 실행합니다.
# yum install virt-viewer

구문

기본 virt-viewer 명령줄 구문은 다음과 같습니다.
# virt-viewer [OPTIONS] {guest-name|id|uuid}
virt-viewer와 함께 사용할 수 있는 전체 옵션 목록을 보려면 virt-viewer 도움말 페이지를 참조하십시오.

게스트 가상 머신에 연결

옵션 없이 사용하는 경우 virt-viewer 는 로컬 시스템의 기본 하이퍼바이저에서 연결할 수 있는 게스트를 나열합니다.
기본 하이퍼바이저를 사용하는 지정된 게스트 가상 머신에 연결하려면 다음을 수행합니다.
# virt-viewer guest-name
KVM-QEMU 하이퍼바이저를 사용하는 게스트 가상 머신에 연결하려면 다음을 수행합니다.
# virt-viewer --connect qemu:///system guest-name
TLS를 사용하여 원격 콘솔에 연결하려면 다음을 수행합니다.
# virt-viewer --connect qemu://example.org/ guest-name
SSH를 사용하여 원격 호스트의 콘솔에 연결하려면 게스트 구성을 확인한 다음 콘솔에 직접 터널링되지 않은 연결을 만듭니다.
# virt-viewer --direct --connect qemu+ssh://root@example.org/ guest-name

인터페이스

기본적으로 virt-viewer 인터페이스는 게스트와 상호 작용하기 위한 기본 툴만 제공합니다.

그림 22.1. 샘플 virt-viewer 인터페이스

샘플 virt-viewer 인터페이스

핫키 설정

virt-viewer 세션에 대해 사용자 정의 키보드 바로 가기( hotkey라고도 함)를 생성하려면 --hotkeys 옵션을 사용합니다.
# virt-viewer --hotkeys=action1=key-combination1[,action2=key-combination2] guest-name
다음 작업을 핫키에 할당할 수 있습니다.
  • toggle-full screen
  • release-cursor
  • smartcard-insert
  • smartcard-remove
key-name combination hotkeys는 대소문자를 구분하지 않습니다. hotkey 설정은 향후 virt-viewer 세션에 적용되지 않습니다.

예 22.1. virt-viewer hotkey 설정

testguest라는 KVM-QEMU 게스트에 연결할 때 전체 화면 모드로 변경되는 hotkey를 추가하려면 다음을 수행합니다.
# virt-viewer --hotkeys=toggle-fullscreen=shift+f11 qemu:///system testguest

Kiosk 모드

키오스크 모드에서는 virt-viewer 가 연결된 데스크탑과만 상호 작용할 수 있으며 게스트 설정을 종료하지 않는 한 게스트 설정 또는 호스트 시스템과 상호 작용할 수 있는 옵션을 제공하지 않습니다. 이는 관리자가 지정된 게스트에 사용자의 작업 범위를 제한하려는 경우에 유용할 수 있습니다.
키오스크 모드를 사용하려면 -k 또는 --kiosk 옵션을 사용하여 게스트에 연결합니다.

예 22.2. 키오스크 모드에서 virt-viewer 사용

시스템이 종료된 후 종료되는 키오스크 모드에서 KVM-QEMU 가상 머신에 연결하려면 다음 명령을 사용합니다.
# virt-viewer --connect qemu:///system guest-name --kiosk --kiosk-quit on-disconnect
그러나 키오스크 모드만으로는 게스트가 종료된 후 사용자가 호스트 시스템 또는 게스트 설정과 상호 작용하지 않도록 할 수 없습니다. 그러면 호스트에서 창 관리자 비활성화와 같은 추가 보안 조치가 필요합니다.

22.2. remote-viewer

remote-viewer 는 SPICE 및 VNC를 지원하는 간단한 원격 데스크탑 디스플레이 클라이언트입니다. 대부분의 기능 및 제한 사항을 virt-viewer 와 공유합니다.
그러나 virt-viewer 와 달리remote-viewer 에는 원격 게스트 디스플레이에 연결하는 데 libvirt가 필요하지 않습니다. 따라서 예를 들어 libvirt와 상호 작용하거나 SSH 연결을 사용하는 권한을 제공하지 않는 원격 호스트의 가상 시스템에 연결하는 데 remote-viewer 를 사용할 수 있습니다.
remote-viewer 유틸리티를 설치하려면 다음을 실행합니다.
# yum install virt-viewer

구문

기본 remote-viewer 명령줄 구문은 다음과 같습니다.
# remote-viewer [OPTIONS] {guest-name|id|uuid}
remote-viewer와 함께 사용할 수 있는 전체 옵션 목록을 보려면 remote-viewer 도움말 페이지를 참조하십시오.

게스트 가상 머신에 연결

옵션 없이 사용하는 경우 remote-viewer 는 로컬 시스템의 기본 URI에 연결할 수 있는 게스트를 나열합니다.
remote-viewer를 사용하여 특정 게스트에 연결하려면 VNC/SPICE URI를 사용합니다. URI 가져오기에 대한 자세한 내용은 20.14절. “그래프 디스플레이에 연결하기위한 URI 표시” 을 참조하십시오.

예 22.3. SPICE를 사용하여 게스트 디스플레이에 연결

다음을 사용하여 SPICE 통신에 포트 5900을 사용하는 "testguest"라는 머신에서 SPICE 서버에 연결합니다.
# remote-viewer spice://testguest:5900

예 22.4. VNC를 사용하여 게스트 디스플레이에 연결

다음을 사용하여 VNC 통신에 포트 5900을 사용하는 testguest2 라는 시스템의 VNC 서버에 연결합니다.
# remote-viewer vnc://testguest2:5900

인터페이스

기본적으로 remote-viewer 인터페이스는 게스트와 상호 작용하기 위한 기본 툴만 제공합니다.

그림 22.2. 샘플 remote-viewer 인터페이스

샘플 remote-viewer 인터페이스

22.3. GNOME Boxes

boxes 는 가상 머신 및 원격 시스템을 보고 액세스하는 데 사용되는 경량 그래픽 데스크탑 가상화 도구입니다.
virt-viewerremote-viewer 와 달리Boxes 를 사용하면 게스트 가상 머신을 볼 수 있지만 이를 생성하고 구성할 수도 있습니다. 그러나 virt-manager 와 비교하여Boxes 는 관리 옵션과 기능을 줄일 수 있지만 사용하기가 더 쉽습니다.
상자를 설치하려면 다음을 실행합니다.
# yum install gnome-boxes
애플리케이션 시스템 툴을 통해 상자를 엽니다.
기본 화면에 사용 가능한 게스트 가상 머신이 표시됩니다. 화면 오른쪽에는 두 개의 버튼이 있습니다.
  • The search button, a magnifying glass. - 검색 버튼을 사용하여 게스트 가상 머신을 이름으로 검색하고,
  • The selection button, a tick. 선택 버튼입니다.
선택 버튼을 클릭하면 개별적으로 또는 그룹으로 작업을 수행하기 위해 하나 이상의 게스트 가상 머신을 선택할 수 있습니다. 사용 가능한 작업은 작업 표시줄의 화면 하단에 표시됩니다.

그림 22.3. Operations Bar

작업 표시줄. 왼쪽에서 오른쪽으로: favorite, pause, delete, properties.
수행할 수 있는 네 가지 작업이 있습니다.
  • 자주 하는 질문: 선택한 게스트 가상 머신에 중심을 추가하고 게스트 목록의 맨 위로 이동합니다. 이는 게스트 수가 증가함에 따라 점점 더 도움이 되고 있습니다.
  • 일시 중지: 선택한 게스트 가상 머신이 실행을 중지합니다.
  • 삭제: 선택한 게스트 가상 머신을 제거합니다.
  • properties: 선택한 게스트 가상 머신의 속성을 표시합니다.
기본 화면의 왼쪽에 있는 New 버튼을 사용하여 새 게스트 가상 머신을 생성합니다.

절차 22.1. 상자를 사용하여 새 게스트 가상 머신 생성

  1. 새로생성을 클릭합니다.

    그러면 Introduction 화면이 열립니다. Continue 를 클릭합니다.

    그림 22.4. 소개 화면

    Introduction screen은 "Creating a Box will allow you to use another operating system directly from your existing login"이라는 메시지가 표시됩니다. 네트워크를 통해 기존 머신에 연결하거나 로컬로 실행되는 가상 머신을 생성할 수 있습니다.
  2. 소스 선택

    소스 선택 화면에는 다음 세 가지 옵션이 있습니다.
    • 사용 가능한 미디어: 즉시 사용 가능한 설치 미디어가 여기에 표시됩니다. 이 중 하나를 클릭하면 검토 화면으로 직접 이동합니다.
    • URL을 입력하십시오. URL에 입력하여 ISO 파일의 로컬 URI 또는 경로를 지정합니다. 이 방법은 원격 시스템에 액세스하는 데도 사용할 수 있습니다. 주소는 프로토콜://IPaddress?포트 (예:)의 패턴을 따라야 합니다.
      spice://192.168.122.1?port=5906;
      프로토콜은 spice://, qemu:// 또는 vnc://
    • 파일 선택: 설치 미디어를 수동으로 검색할 파일 디렉터리를 엽니다.

    그림 22.5. 소스 선택 화면

    사용 가능한 .iso 파일 중 하나와 URL을 입력하거나 수동으로 파일을 선택하는 옵션을 표시하는 소스 선택 화면입니다.
  3. 세부 정보 검토

    검토 화면에 게스트 가상 머신의 세부 정보가 표시됩니다.

    그림 22.6. 화면 검토

    새 게스트 가상 머신의 메모리 및 디스크 크기를 보여주는 검토 화면입니다.
    이러한 세부 사항은 다음과 같이 남겨질 수 있으며, 이 경우 최종 단계로 진행하거나:
  4. 선택 사항: 세부 정보 사용자 지정

    Customize 를 클릭하면 메모리 및 디스크 크기와 같은 게스트 가상 머신의 구성을 조정할 수 있습니다.

    그림 22.7. 사용자 정의 화면

    메모리 및 디스크 크기에 대한 마커 표시줄을 표시하는 사용자 지정 화면입니다.
  5. create

    생성을 클릭합니다. 새로운 게스트 가상 머신이 열립니다.

23장. 도메인 XML 조작

이 장에서는 게스트 가상 머신 XML 구성 파일의 구성 요소를 도메인 XML 이라고도 합니다. 이 장에서는 도메인 이라는 용어는 모든 게스트 가상 머신에 필요한 루트 <도메인> 요소를 나타냅니다. 도메인 XML에는 typeid 라는 두 가지 속성이 있습니다.type 은 도메인 실행에 사용되는 하이퍼바이저를 지정합니다. 허용되는 값은 드라이버별이지만 KVM 과 기타를 포함합니다. id 는 실행 중인 게스트 가상 머신의 고유한 정수 식별자입니다. 비활성 시스템에는 id 값이 없습니다. 이 장의 섹션에서는 도메인 XML의 구성 요소에 대해 설명합니다. 이 설명서의 추가 장에서는 도메인 XML을 조작해야 할 때 이 장을 확인할 수 있습니다.
중요
지원되는 관리 인터페이스(예: virshVirtual Machine Manager) 및 명령(예: virt-xml)을 사용하여 도메인 XML 파일의 구성 요소를 편집합니다. 텍스트 편집기에서 도메인 XML 파일을 직접 열고 편집하지 마십시오. 도메인 XML 파일을 직접 편집해야 하는 경우 virsh edit 명령을 사용합니다.
참고
이 장은 libvirt 업스트림 문서를 기반으로 합니다.

23.1. 일반 정보 및 메타데이터

이 정보는 다음 도메인 XML에 포함되어 있습니다.

그림 23.1. 도메인 XML 메타데이터


<domain type='kvm' id='3'>
  <name>fv0</name>
  <uuid>4dea22b31d52d8f32516782e98ab3fa0</uuid>
  <title>A short description - title - of the domain</title>
  <description>A human readable description</description>
  <metadata>
    <app1:foo xmlns:app1="http://app1.org/app1/">..</app1:foo>
    <app2:bar xmlns:app2="http://app1.org/app2/">..</app2:bar>
  </metadata>
  ...
</domain>
도메인 XML의 이 섹션의 구성 요소는 다음과 같습니다.

표 23.1. 일반 메타데이터 요소

element 설명
<name> 가상 머신의 이름을 할당합니다. 이 이름은 alpha-numeric 문자로만 구성되어야 하며 단일 호스트 물리적 머신 범위 내에서 고유해야 합니다. 영구 구성 파일을 저장하기 위해 파일 이름을 형성하는 데 사용되는 경우가 많습니다.
<uuid> 가상 머신의 전역 고유 식별자를 할당합니다. 형식은 RFC 4122-호환해야 합니다(예: 3e3fce45-4f53-4fa7-bb32-11f34168b82b ). 새 시스템을 정의하거나 생성할 때 생략된 경우 임의의 UUID가 생성됩니다. 또한 sysinfo 사양을 사용하여 UUID를 제공할 수도 있습니다.
<title> 도메인에 대한 간단한 설명을 위한 공간을 만듭니다. 제목에는 새 줄이 포함되어서는 안 됩니다.
<description> 제목과 달리 이 데이터는 libvirt에서 사용되지 않습니다. 여기에는 사용자가 표시하도록 선택하는 모든 정보가 포함될 수 있습니다.
<metadata> 애플리케이션에서 사용자 지정 메타데이터를 XML 노드/트리 형태로 저장하는 데 사용할 수 있습니다. 애플리케이션은 XML 노드/트리에서 사용자 지정 네임 스페이스를 사용해야 하며, 네임 스페이스당 하나의 최상위 요소(애플리케이션 요구 사항이 있는 경우)는 이름 공간에 하위 요소를 사용해야 합니다.

23.2. 운영 체제 부팅

BIOS 부트 로더, 호스트 물리적 머신 부트 로더, 직접 커널 부팅 및 컨테이너 부팅 등 가상 머신을 부팅하는 방법에는 여러 가지가 있습니다.

23.2.1. BIOS Boot Loader

완전한 가상화를 지원하는 하이퍼바이저에서 BIOS 부팅을 사용할 수 있습니다. 이 경우 BIOS에는 부팅 순서 우선 순위(floppy, 하드 디스크, CD-ROM, 네트워크)가 부팅 이미지를 찾을 위치를 결정합니다. 도메인 XML의 <os> 섹션에는 다음 정보가 포함되어 있습니다.

그림 23.2. BIOS 부트 로더 도메인 XML


  ...
  <os>
    <type>hvm</type>
    <boot dev='fd'/>
    <boot dev='hd'/>
    <boot dev='cdrom'/>
    <boot dev='network'/>
    <bootmenu enable='yes'/>
    <smbios mode='sysinfo'/>
    <bios useserial='yes' rebootTimeout='0'/>
  </os>
  ...
도메인 XML의 이 섹션의 구성 요소는 다음과 같습니다.

표 23.2. BIOS 부트 로더 요소

element 설명
<type> 게스트 가상 머신에서 부팅할 운영 체제 유형을 지정합니다. hvm 은 운영 체제가 베어 메탈에서 실행되도록 설계되었으며 완전한 가상화가 필요하다는 것을 나타냅니다. linux 는 KVM 하이퍼바이저 게스트 ABI를 지원하는 운영 체제를 나타냅니다. 또한 두 가지 선택적 속성이 있습니다. arch 는 CPU 아키텍처를 가상화에 지정하고 시스템은 시스템 유형을 나타냅니다. 자세한 내용은 libvirt 업스트림 문서를 참조하십시오.
<boot> 다음 값(fd,hd,cdrom 또는 network ) 중 하나로 고려할 다음 부팅 장치를 지정합니다. 부트 요소를 여러 번 반복하여 시도할 부팅 장치의 우선 순위 목록을 설정할 수 있습니다. 동일한 유형의 여러 장치가 버스의 순서를 유지하면서 목표에 따라 정렬됩니다. 도메인을 정의하면 libvirt에서 반환된 XML 구성이 정렬된 순서로 나열됩니다. 정렬되면 첫 번째 장치는 부팅 가능으로 표시됩니다. 자세한 내용은 libvirt 업스트림 문서를 참조하십시오.
<부팅 메뉴> 게스트 가상 머신을 시작할 때 대화형 부팅 메뉴 프롬프트를 활성화할지 여부를 결정합니다. enable 속성은 yes 또는 no 일 수 있습니다. 지정하지 않으면 하이퍼바이저 기본값이 사용됩니다.
<SMBIOS> 게스트 가상 머신에 SMBIOS 정보를 표시하는 방법을 결정합니다. mode 속성은 에뮬레이션 (하이퍼바이저가 모든 값을 생성할 수 있음), host (호스트의 물리적 시스템의 SMBIOS 값에서 UUID를 제외한 모든 블록 0 및 블록 1과 동일한)로 지정되어야 합니다. virConnectGetSysinfo 호출을 사용하여 어떤 값을 복사할지 확인할 수 있습니다( sysinfo 요소에서 사용). 지정하지 않으면 하이퍼바이저의 기본 설정이 사용됩니다.
<BIOS> 이 요소에는 가능한 값이 yes 또는 no 인 속성 use erial 가 있습니다. 이 속성은 사용자가 직렬 포트에서 BIOS 메시지를 볼 수 있도록 하는 직렬 그래픽 어댑터를 활성화하거나 비활성화합니다. 따라서 직렬 포트가 정의되어 있어야 합니다. rebootTimeout 속성은 부팅이 실패할 경우 게스트 가상 머신의 부팅을 다시 시작할 때까지의 기간( BIOS에 따라)을 제어합니다. 값은 최대 65535; 설정 -1 은 재부팅을 비활성화합니다.

23.2.2. 직접 커널 부팅

새 게스트 가상 머신 운영 체제를 설치할 때 호스트 물리적 머신 운영 체제에 저장된 커널 및 initrd 에서 직접 부팅하면 명령줄 인수를 설치 프로그램에 직접 전달할 수 있습니다. 이 기능은 일반적으로 완전히 가상화된 게스트 가상 머신 모두에서 사용할 수 있습니다.

그림 23.3. 직접 커널 부팅


  ...
  <os>
    <type>hvm</type>
    <kernel>/root/f8-i386-vmlinuz</kernel>
    <initrd>/root/f8-i386-initrd</initrd>
    <cmdline>console=ttyS0 ks=http://example.com/f8-i386/os/</cmdline>
    <dtb>/root/ppc.dtb</dtb>
  </os>
  ...
도메인 XML의 이 섹션의 구성 요소는 다음과 같습니다.

표 23.3. 직접 커널 부팅 요소

element 설명
<type> BIOS 부팅 섹션에 설명된 것과 동일합니다.
<kernel> 호스트 물리적 시스템 운영 체제에서 커널 이미지의 정규화된 경로를 지정합니다.
<initrd> 호스트 물리적 머신 운영 체제에서 (선택 사항) 램디스크 이미지에 대한 정규화된 경로를 지정합니다.
<cmdline> 부팅 시 커널(또는 설치 프로그램)에 전달할 인수를 지정합니다. 이는 종종 대체 기본 콘솔(예: 직렬 포트) 또는 설치 미디어 소스 또는 Kickstart 파일을 지정하는 데 사용됩니다.

23.2.3. 컨테이너 부팅

커널 또는 부팅 이미지 대신 컨테이너 기반 가상화를 사용하여 도메인을 부팅하는 경우 init 요소를 사용하여 init 바이너리의 경로가 필요합니다. 기본적으로 이 작업은 인수 없이 시작됩니다. 초기 argv 를 지정하려면 필요에 따라 반복된 initarg 요소를 사용합니다. cmdline 요소는 /proc/cmdline 과 동일하지만 <initarg> 에는 영향을 미치지 않습니다.

그림 23.4. 컨테이너 부팅

...
<os>
  <type arch='x86_64'>exe</type>
  <init>/bin/systemd</init>
  <initarg>--unit</initarg>
  <initarg>emergency.service</initarg>
</os>
...

23.3. SMBIOS 시스템 정보

일부 하이퍼바이저를 사용하면 게스트 가상 시스템에 제공되는 시스템 정보를 제어할 수 있습니다(예: 게스트 가상 머신에서 dmidecode 명령을 사용하여 SMBIOS 필드를 채울 수 있습니다). 선택 사항인 sysinfo 요소는 이러한 정보의 모든 카테고리를 다룹니다.

그림 23.5. SMBIOS 시스템 정보


  ...
  <os>
    <smbios mode='sysinfo'/>
    ...
  </os>
  <sysinfo type='smbios'>
    <bios>
      <entry name='vendor'>LENOVO</entry>
    </bios>
    <system>
      <entry name='manufacturer'>Fedora</entry>
      <entry name='vendor'>Virt-Manager</entry>
    </system>
  </sysinfo>
  ...
<sysinfo> 요소에는 하위 요소 레이아웃을 결정하는 필수 특성 유형이 있으며 다음과 같이 정의할 수 있습니다.
  • <SMBIOS> - Sub- elements는 특정 SMBIOS 값을 호출합니다. 이 값은 <os> 요소의 KubeMacPool ios 하위 항목과 함께 사용되는 경우 게스트 가상 머신에 영향을 미칩니다. <sysinfo> 의 각 하위 요소는 SMBIOS 블록 이름을 지정하고 해당 요소 내에는 블록 내의 필드를 설명하는 엔트리 요소 목록이 될 수 있습니다. 다음 블록 및 항목이 인식됩니다.
    • <BIOS> - SMBIOS의 블록 0이며 벤더 에서 입력 이름이 ,버전,날짜릴리스.
    • <시스템> - 이 블록은 SMBIOS의 블록 1이며, 제조업체,제품,버전,직렬,uuid,스쿠제품군 에서 가져온 엔트리 이름이 있습니다. uuid 항목이 최상위 수준 uuid 요소와 함께 제공되는 경우 두 값이 일치해야 합니다.

23.4. CPU 할당

그림 23.6. CPU allocation


<domain>
  ...
  <vcpu placement='static' cpuset="1-4,^3,6" current="1">2</vcpu>
  ...
</domain>
<vcpu> 요소는 게스트 가상 머신 운영 체제에 할당된 최대 가상 CPU 수를 정의합니다. 이는 하이퍼바이저에서 지원하는 최대 수와 1 사이여야 합니다. 이 요소에는 기본적으로 도메인 프로세스 및 가상 CPU를 고정할 수 있는 쉼표로 구분된 물리 CPU 번호 목록인 선택적 cpuset 속성이 포함될 수 있습니다.
cputune 속성을 사용하여 도메인 프로세스 및 가상 CPU의 고정 정책을 별도로 지정할 수 있습니다. emulatorpin 속성이 <cputune> 에 지정되면 <vcpu> 로 지정된cpuset 가 무시됩니다.
마찬가지로 vcpupin 에 대한 값을 설정한 가상 CPU는 cpuset 설정을 무시하게 됩니다. vcpupin 이 지정되지 않은 가상 CPU의 경우 cpuset 에서 지정한 물리적 CPU에 고정됩니다. cpuset 목록의 각 요소는 단일 CPU 번호, CPU 번호 범위 또는 캐럿(^) 뒤에 이전 범위에서 제외할 CPU 번호입니다. 현재 속성을 사용하여 최대 가상 CPU 수를 활성화할지 여부를 지정할 수 있습니다.
배치 선택적 속성은 도메인 프로세스의 CPU 배치 모드를 나타내는 데 사용할 수 있습니다. 배치 값은 다음 중 하나로 설정할 수 있습니다.
  • 정적 - vCPU를 cpuset 특성에 정의된 물리적 CPU에 고정합니다. cpuset 가 정의되지 않은 경우 도메인 프로세스는 사용 가능한 모든 물리적 CPU에 고정됩니다.
  • auto - 도메인 프로세스가 쿼리 numad에서 권고 노드 세트에 고정되고 지정된 경우 속성 cpuset 값이 무시됨을 나타냅니다.
참고
cpuset 속성이 배치와 함께 사용되는 경우 배치 값은 기본적으로 <numatune> 요소의 값(사용되는 경우) 또는 정적 입니다.

23.5. CPU 튜닝

그림 23.7. CPU 튜닝


<domain>
  ...
  <cputune>
    <vcpupin vcpu="0" cpuset="1-4,^2"/>
    <vcpupin vcpu="1" cpuset="0,1"/>
    <vcpupin vcpu="2" cpuset="2,3"/>
    <vcpupin vcpu="3" cpuset="0,4"/>
    <emulatorpin cpuset="1-3"/>
    <shares>2048</shares>
    <period>1000000</period>
    <quota>-1</quota>
    <emulator_period>1000000</emulator_period>
    <emulator_quota>-1</emulator_quota>
  </cputune>
  ...
</domain>
모두 선택 사항이지만 도메인 XML의 이 섹션의 구성 요소는 다음과 같습니다.

표 23.4. CPU 튜닝 요소

element 설명
<cputune> 도메인의 CPU 튜닝 가능한 매개변수에 대한 세부 정보를 제공합니다. 이는 선택 사항입니다.
<vcpupin> 도메인 vCPU가 고정될 호스트 물리적 CPU 중 어느 것입니까. 이 값이 생략되고 <vcpu> 요소의 cpuset 속성이 지정되지 않은 경우 vCPU는 기본적으로 모든 물리적 CPU에 고정됩니다. 여기에는 두 가지 필수 특성이 포함되어 있습니다. <vcpu> 속성은 id 를 지정하고 cpuset 속성은 <vcpu> 요소의 cpuset 속성과 동일합니다.
<emulatorpin> 호스트 물리적 시스템 CPU 중 "emulator"(vcpu <를>포함하지 않는 도메인의 서브 세트)를 고정할 호스트 물리적 시스템 CPU를 지정합니다. 이 값이 생략되고 <vcpu> 요소의 cpuset 속성이 지정되지 않은 경우 기본적으로 "emulator"가 모든 물리적 CPU에 고정됩니다. 고정할 물리적 CPU를 지정하는 데 필요한 cpuset 속성이 포함되어 있습니다. <vcpu> 요소의 placement 속성이 auto 로 설정된 경우 emulatorpin 은 허용되지 않습니다.
<shares> 도메인의 비율 가중치 공유를 지정합니다. 이 문제가 생략되면 기본값이 제공된 운영 체제의 기본값입니다. 값에 대한 장치가 없으면 다른 게스트 가상 머신의 설정에 따라 계산됩니다. 예를 들어 < <shares> > 값이 2048인 게스트 가상 시스템으로 구성된 게스트 가상 시스템은 공유 값 1024로 구성된 게스트 가상 머신의 두 배의 CPU 시간을 가져옵니다.
<기간> 적용 간격을 마이크로초 단위로 지정합니다. <마침표> 를 사용하면 도메인의 vCPU마다 할당된 할당량 이상의 실행 시간을 사용할 수 없습니다. 이 값은 다음 범위 내에 있어야 합니다. 1000-1000000. 값이 0<period> 는 값이 없음을 의미합니다.
<할당량> microseconds에서 허용되는 최대 대역폭을 지정합니다. <할당량> 이 있는 도메인은 도메인에 무한 대역폭이 있음을 나타냅니다. 이는 대역폭이 제어되지 않음을 의미합니다. 값은 다음 범위 내에 있어야 합니다. 1000 - 18446744073709551 이하 0. 값이 0할당량 은 값이 없음을 의미합니다. 이 기능을 사용하여 모든 vCPU가 동일한 속도로 실행되도록 할 수 있습니다.
<emulator_period> 적용 간격을 마이크로초 단위로 지정합니다. <에뮬레이터_period> 내에서 도메인의 에뮬레이터 스레드(vCPU 제외)는 <에뮬레이터_quota> 이상의 런타임을 사용할 수 없습니다. <emulator_period> 값은 다음 범위에 있어야 합니다. 1000 - 1000000. 값이 0<emulator_period> 는 값이 없음을 의미합니다.
<emulator_quota> 도메인의 에뮬레이터 스레드(vCPU 제외)에 대해 microseconds에서 허용되는 최대 대역폭을 지정합니다. <에뮬레이터_quota> 를 음수 값으로 사용하는 도메인은 도메인에 에뮬레이터 스레드에 대한 무한 대역폭( vCPU 제외)이 있음을 나타냅니다. 이는 대역폭이 제어되지 않음을 의미합니다. 값은 다음 범위에 있어야 합니다. 1000 - 18446744073709551 또는 0 미만입니다. 값이 0<emulator_quota> 는 값이 없음을 의미합니다.

23.6. 메모리 백업

메모리 지원을 통해 하이퍼바이저는 게스트 가상 머신 내의 대규모 페이지를 올바르게 관리할 수 있습니다.

그림 23.8. 메모리 지원


<domain>
  ...
  <memoryBacking>
    <hugepages>
			<page size="1" unit="G" nodeset="0-3,5"/>
			<page size="2" unit="M" nodeset="4"/>
		</hugepages>
		<nosharepages/>
		<locked/>
  </memoryBacking>
  ...
</domain>
memoryBacking 요소에 대한 자세한 내용은 libvirt 업스트림 문서를 참조하십시오.

23.7. 메모리 튜닝

그림 23.9. 메모리 튜닝


<domain>
  ...
  <memtune>
    <hard_limit unit='G'>1</hard_limit>
    <soft_limit unit='M'>128</soft_limit>
    <swap_hard_limit unit='G'>2</swap_hard_limit>
    <min_guarantee unit='bytes'>67108864</min_guarantee>
  </memtune>
  ...
</domain>
<memtune> 은 선택 사항이지만 도메인 XML의 이 섹션의 구성 요소는 다음과 같습니다.

표 23.5. 메모리 튜닝 요소

element 설명
<memtune> 도메인의 메모리 튜닝 가능 매개변수에 대한 세부 정보를 제공합니다. 이 문제가 생략되면 기본값이 제공된 운영 체제의 기본값입니다. 매개 변수가 프로세스에 전체적으로 적용되는 경우 제한을 설정할 때 게스트 가상 시스템 비디오 RAM에 게스트 가상 머신 RAM을 추가하여 값을 확인하여 일부 메모리 오버헤드를 허용합니다. 각 튜닝 가능 항목의 경우 <메모리와> 동일한 값을 사용하여 입력 시 번호가 있는 단위를 지정할 수 있습니다. 이전 버전과의 호환성을 위해 출력은 항상 kibibytes(KiB)입니다.
<hard_limit> 게스트 가상 머신에서 사용할 수 있는 최대 메모리입니다. 이 값은 kibibytes (24 바이트 블록)로 표시됩니다.
<soft_limit> 메모리 경합 중에 적용할 메모리 제한입니다. 이 값은 kibibytes (24 바이트 블록)로 표시됩니다.
<swap_hard_limit> 게스트 가상 머신에서 사용할 수 있는 최대 메모리와 스왑입니다. 이 값은 kibibytes (24 바이트 블록)로 표시됩니다. 이 값은 <hard_limit> 값보다 커야 합니다.
<min_guarantee> 게스트 가상 머신에 대한 최소 메모리 할당이 보장됩니다. 이 값은 kibibytes (24 바이트 블록)로 표시됩니다.

23.8. 메모리 할당

게스트 가상 머신이 충돌하는 경우 선택 사항인 dumpCore 특성을 사용하여 게스트 가상 시스템의 메모리가 생성된 코어 덤프(dumpCore='on')에 포함되어야 하는지 또는 포함하지 않아야 하는지를 제어할 수 있습니다(dumpCore='off'). 기본 설정은 있으므로 매개 변수가 off 로 설정되어 있지 않으면 게스트 가상 머신 메모리가 코어 dumpfile에 포함됩니다.
<maxMemory> 요소는 게스트의 최대 런타임 메모리 할당을 결정합니다. slots 속성은 게스트에 메모리를 추가하는 데 사용할 수 있는 슬롯 수를 지정합니다.
<memory> 요소는 부팅 시 게스트의 최대 메모리 할당을 지정합니다. 이 값은 NUMA 셀 크기 구성을 사용하여 설정할 수도 있으며, 메모리를 핫플러그하여 maxMemory 에서 지정한 제한에 의해 증가될 수 있습니다.
<currentMemory> 요소는 게스트 가상 시스템의 실제 메모리 할당을 결정합니다. 이 값은 필요에 따라 게스트 가상 머신 <메모리>balloon 로 설정되도록 최대 할당(메모리로 설정)보다 작을 수 있습니다. 생략하면 기본값은 <memory> 요소와 동일합니다. unit 속성은 메모리와 동일하게 작동합니다.

그림 23.10. 메모리 단위


<domain>
  <maxMemory slots='16' unit='KiB'>1524288</maxMemory>
  <memory unit='KiB' dumpCore='off'>524288</memory>
  <!-- changes the memory unit to KiB and does not allow the guest virtual machine's memory to be included in the generated core dumpfile -->
  <currentMemory unit='KiB'>524288</currentMemory>
  <!-- makes the current memory unit 524288 KiB -->
  ...
</domain>

23.9. NUMA 노드 튜닝

virsh edit 를 사용하여 NUMA 노드 튜닝을 수행한 후 다음 도메인 XML 매개 변수가 영향을 받습니다.

그림 23.11. NUMA 노드 튜닝


<domain>
  ...
  <numatune>
    <memory mode="strict" nodeset="1-4,^3"/>
  </numatune>
  ...
</domain>
모두 선택 사항이지만 도메인 XML의 이 섹션의 구성 요소는 다음과 같습니다.

표 23.6. NUMA 노드 튜닝 요소

element 설명
<numatune> 도메인 프로세스에 대한 NUMA 정책을 제어하여 NUMA 호스트 물리적 시스템의 성능을 조정하는 방법에 대한 세부 정보를 제공합니다.
<memory> NUMA 호스트 물리적 시스템에서 도메인 프로세스에 대한 메모리를 할당하는 방법을 지정합니다. 여기에는 몇 가지 선택적 속성이 포함되어 있습니다. mode 속성은 interleave,strict 또는 preferred 로 설정할 수 있습니다. 값을 지정하지 않으면 기본값은 strict 입니다. nodeset 속성은 <vcpu> 요소의 cpuset 속성과 동일한 구문을 사용하여 NUMA 노드를 지정합니다. 특성 배치를 사용하여 도메인 프로세스의 메모리 배치 모드를 나타낼 수 있습니다. 해당 값은 static 또는 auto 일 수 있습니다. <nodeset> 속성이 지정된 경우 기본값은 <vcpu> 또는 static.auto 는 도메인 프로세스가 numad 쿼리에서 반환된 권고 노드 세트의 메모리만 할당함을 나타내고 nodeset 속성 값이 지정된 경우 무시됩니다. <> vcpu<placement> 속성이 auto 로 설정되고 <numatune> 속성이 지정되지 않은 경우 <placement> autostrict 모드로 기본 <numatune> 이 암시적으로 추가됩니다.

23.10. 블록 I/O 튜닝

그림 23.12. 블록 I/O 튜닝


<domain>
  ...
  <blkiotune>
    <weight>800</weight>
    <device>
      <path>/dev/sda</path>
      <weight>1000</weight>
    </device>
    <device>
      <path>/dev/sdb</path>
      <weight>500</weight>
    </device>
  </blkiotune>
  ...
</domain>
모두 선택 사항이지만 도메인 XML의 이 섹션의 구성 요소는 다음과 같습니다.

표 23.7. 블록 I/O 튜닝 요소

element 설명
<blkiotune> 이 선택적 요소는 도메인의 blkio cgroup 튜닝 가능 매개 변수를 튜닝하는 기능을 제공합니다. 이 문제가 생략되면 기본값이 제공된 운영 체제의 기본값입니다.
<weight> 이 선택적 weight 요소는 게스트 가상 시스템의 전체 I/O 가중치입니다. 값은 100~1000 범위 내에 있어야 합니다.
<device> 도메인에는 도메인에서 사용하는 각 호스트 물리적 시스템 블록 <장치에> 대한 가중치를 추가로 조정하는 여러 장치 요소가 있을 수 있습니다. 여러 게스트 가상 머신 디스크가 단일 호스트 물리적 시스템 블록 장치를 공유할 수 있습니다. 또한 동일한 호스트 물리적 머신 파일 시스템 내의 파일로 백업되기 때문에 이 튜닝 매개 변수는 각 게스트 가상 머신 디스크 장치(단일 <디스크에>적용할 수 있는 <iotune> 요소와 연관되는 것이 아니라 글로벌 도메인 수준에 있습니다.) 각 장치 요소에는 두 가지 필수 하위 요소, 장치의 절대 <경로를> 설명하는 경로와 장치의 상대 가중치를 부여하는 가중치는 100 - 1000의 허용 가능한 범위가 있습니다. <>

23.11. 리소스 파티셔닝

하이퍼바이저를 사용하면 가상 머신을 리소스 파티션에 배치할 수 있으며, 잠재적으로 해당 파티션이 중첩될 수 있습니다. <리소스 요소는 리소스> 파티셔닝과 관련된 구성을 함께 그룹화합니다. 현재 콘텐츠를 도메인에 배치할 리소스 파티션의 경로를 정의하는 자식 요소 파티션을 지원합니다. 파티션이 나열되지 않으면 도메인이 기본 파티션에 배치됩니다. 게스트 가상 머신을 시작하기 전에 파티션을 생성해야 합니다. 기본적으로 (하이퍼바이저별) 기본 파티션만 존재할 수 있습니다.

그림 23.13. 리소스 파티션

<resource>
  <partition>/virtualmachines/production</partition>
</resource>
리소스 파티션은 현재 모든 마운트된 컨트롤러에서 cgroup 디렉토리에 파티션 경로를 매핑하는 KVM 및 LXC 드라이버에서 지원됩니다.

23.12. CPU 모델 및 토폴로지

이 섹션에서는 CPU 모델에 대한 요구 사항에 대해 설명합니다. 모든 하이퍼바이저에는 기본적으로 게스트가 표시되는 CPU 기능에 대한 자체 정책이 있습니다. KVM에서 게스트에 제공되는 CPU 기능 세트는 게스트 가상 머신 구성에서 선택한 CPU 모델에 따라 다릅니다. qemu32qemu64 는 기본 CPU 모델이지만 사용 가능한 다른 모델(추가 기능)이 있습니다. 각 모델 및 해당 토폴로지는 도메인 XML의 다음 요소를 사용하여 지정됩니다.

그림 23.14. CPU 모델 및 토폴로지 예 1

<cpu match='exact'>
    <model fallback='allow'>core2duo</model>
    <vendor>Intel</vendor>
    <topology sockets='1' cores='2' threads='1'/>
    <feature policy='disable' name='lahf_lm'/>
</cpu>

그림 23.15. CPU 모델 및 토폴로지 예 2

<cpu mode='host-model'>
   <model fallback='forbid'/>
   <topology sockets='1' cores='2' threads='1'/>
</cpu>

그림 23.16. CPU 모델 및 토폴로지 예 3

<cpu mode='host-passthrough'/>
CPU 모델 또는 해당 기능에 제한이 없는 경우 다음과 같은 간단한 <cpu> 요소를 사용할 수 있습니다.

그림 23.17. CPU 모델 및 토폴로지 예 4

<cpu>
   <topology sockets='1' cores='2' threads='1'/>
</cpu>

그림 23.18. PPC64/PSeries CPU 모델 예

<cpu mode='custom'>
   <model>POWER8</model>
</cpu>

그림 23.19. aarch64/virt CPU 모델 예

<cpu mode='host-passthrough'/>
도메인 XML의 이 섹션의 구성 요소는 다음과 같습니다.

표 23.8. CPU 모델 및 토폴로지 요소

element 설명
<cpu> 게스트 가상 머신 CPU 요구 사항을 설명하는 주요 컨테이너입니다.
<match> 게스트 가상 머신에 가상 CPU를 제공하는 방법을 이러한 요구 사항과 일치하도록 지정합니다. 토폴로지가 <cpu> 내의 유일한 요소인 경우 match 속성을 생략할 수 있습니다. match 특성에 사용 가능한 값은 다음과 같습니다.
  • minimum - 지정된 CPU 모델 및 기능은 요청된 최소 CPU를 설명합니다.
  • 정확히 - 게스트 가상 머신에 제공되는 가상 CPU는 사양과 정확히 일치합니다.
  • Strict - 호스트 물리적 머신 CPU가 사양과 정확히 일치하지 않는 한 게스트 가상 머신이 생성되지 않습니다.
match 속성은 생략할 수 있으며 기본값은 정확한 입니다.
<mode> 이 선택적 속성을 사용하면 가능한 한 호스트 물리적 머신 CPU에 가까운 게스트 가상 머신 CPU를 더 쉽게 구성할 수 있습니다. mode 특성에 가능한 값은 다음과 같습니다.
  • Custom - 게스트 가상 머신에 CPU가 표시되는 방법을 설명합니다. mode 속성이 지정되지 않은 경우 기본 설정입니다. 이 모드에서는 게스트 가상 머신이 부팅되는 호스트 실제 시스템과 관계없이 영구 게스트 가상 머신에서 동일한 하드웨어를 볼 수 있습니다.
  • host-model - 기능 XML에서 도메인 XML로 호스트 물리적 시스템 CPU 정의를 복사하는 바로 가기입니다. 도메인을 시작하기 직전에 CPU 정의가 복사되므로, 각 호스트 물리적 시스템에서 지원하는 최상의 게스트 가상 시스템 CPU를 제공하는 동시에 동일한 XML을 다른 호스트 물리적 시스템에서 사용할 수 있습니다. match 속성 및 기능 요소는 이 모드에서 사용할 수 없습니다. 자세한 내용은 libvirt 업스트림 웹 사이트를 참조하십시오.
  • 이 모드에서 호스트 패스스루 는 게스트 가상 머신에 표시되는 CPU는 libvirt 내에서 오류를 일으키는 요소를 포함하여 호스트 물리적 시스템 CPU와 정확히 동일합니다. 이 모드의 단점은 게스트 가상 머신 환경을 다른 하드웨어에서 재현할 수 없으므로 이 모드를 신중하게 사용하는 것이 좋습니다. 모델기능 요소는 이 모드에서 허용되지 않습니다.
<model> 게스트 가상 머신에서 요청한 CPU 모델을 지정합니다. 사용 가능한 CPU 모델 및 해당 정의 목록은 libvirt의 데이터 디렉터리에 설치된 cpu_map.xml 파일에서 확인할 수 있습니다. 하이퍼바이저가 정확한 CPU 모델을 사용할 수 없는 경우 libvirt는 CPU 기능 목록을 유지하면서 하이퍼바이저에서 지원하는 가장 가까운 모델로 자동 대체합니다. 선택적 대체 특성을 사용하여 이 동작을 금지할 수 있습니다. 이 경우 지원되지 않는 CPU 모델을 요청하는 도메인을 시작하려고 하면 실패합니다. 대체 특성에 지원되는 값은 allow (기본값) 및 forbid 입니다. 선택적 vendor_id 특성을 사용하여 게스트 가상 머신에서 표시되는 벤더 ID를 설정할 수 있습니다. 정확히 12자여야 합니다. 설정하지 않으면 호스트 물리적 시스템의 벤더 iID가 사용됩니다. 가능한 일반적인 값은 AuthenticAMDGenuineIntel 입니다.
<vendor> 게스트 가상 머신에서 요청한 CPU 벤더를 지정합니다. 이 요소가 없는 경우 게스트 가상 머신은 공급업체에 관계없이 지정된 기능과 일치하는 CPU에서 실행됩니다. 지원되는 공급 업체 목록은 cpu_map.xml.에서 확인할 수 있습니다.
<토폴로지> 게스트 가상 머신에 제공된 가상 CPU의 요청된 토폴로지를 지정합니다. 소켓, 코어 및 스레드에 대해 0이 아닌 세 개의 값은 각각 소켓당 총 CPU 소켓 수, 소켓당 코어 수 및 코어당 스레드 수입니다.
<feature> 선택한 CPU 모델에서 제공하는 기능을 미세 조정하는 데 사용되는 요소가 0개 이상 포함될 수 있습니다. 알려진 기능 이름 목록은 cpu_map.xml 파일에서 확인할 수 있습니다. 각 기능 요소의 의미는 다음 값 중 하나로 설정해야 하는 policy 특성에 따라 달라집니다.
  • force - 호스트 물리적 시스템 CPU에서 실제로 지원하는지 여부에 관계없이 가상의 지원을 강제 적용합니다.
  • require - 호스트 물리적 시스템 CPU에서 기능을 지원하지 않는 한 게스트 가상 머신 생성에 실패합니다. 기본 설정입니다.
  • 선택 사항 - 이 기능은 가상 CPU에서 지원하지만 호스트 물리적 시스템 CPU에서 지원하는 경우에만 지원됩니다.
  • disable - 가상 CPU에서 지원되지 않습니다.
  • For bid - 호스트 물리적 머신 CPU에서 기능을 지원하는 경우 게스트 가상 머신 생성에 실패합니다.

23.12.1. 지정된 CPU의 기능 세트 변경

CPU 모델에는 고유의 기능 세트가 있지만 개별 기능 구성 요소는 기능별로 허용되거나 금지되므로 CPU에 대한 개별 구성을 사용할 수 있습니다.

절차 23.1. CPU 기능 활성화 및 비활성화

  1. 먼저 게스트 가상 머신을 종료합니다.
  2. virsh edit [domain] 명령을 실행하여 게스트 가상 시스템의 구성 파일을 엽니다.
  3. 'allow' 속성 값을 포함하도록 <기능> 또는 <모델> 내의 매개변수를 변경하여 기능을 허용하도록 강제 적용하거나 'forbid' 가 해당 기능에 대한 지원을 거부하도록 합니다.

    그림 23.20. CPU 기능 활성화 또는 비활성화 예

    		      
    <!-- original feature set -->
    <cpu mode='host-model'>
       <model fallback='allow'/>
       <topology sockets='1' cores='2' threads='1'/>
    </cpu>
    
    <!--changed feature set-->
    <cpu mode='host-model'>
       <model fallback='forbid'/>
       <topology sockets='1' cores='2' threads='1'/>
    </cpu>
    
    

    그림 23.21. CPU 기능 활성화 또는 비활성화를 위한 예 2

    		         
    <!--original feature set-->
    <cpu match='exact'>
        <model fallback='allow'>core2duo</model>
        <vendor>Intel</vendor>
        <topology sockets='1' cores='2' threads='1'/>
        <feature policy='disable' name='lahf_lm'/>
    </cpu>
    
    <!--changed feature set-->
    <cpu match='exact'>
        <model fallback='allow'>core2duo</model>
        <vendor>Intel</vendor>
        <topology sockets='1' cores='2' threads='1'/>
        <feature policy='enable' name='lahf_lm'/>
      </cpu>
    
    
  4. 변경 사항을 완료하면 구성 파일을 저장하고 게스트 가상 머신을 시작합니다.

23.12.2. 게스트 가상 머신 NUMA 토폴로지

게스트 가상 머신 NUMA 토폴로지는 도메인 XML의 numa <요소를> 사용하여 지정할 수 있습니다.

그림 23.22. 게스트 가상 머신 NUMA 토폴로지


  <cpu>
    <numa>
      <cell cpus='0-3' memory='512000'/>
      <cell cpus='4-7' memory='512000'/>
    </numa>
  </cpu>
  ...

각 셀 요소는 NUMA 셀 또는 NUMA 노드를 지정합니다. cpus 는 노드의 일부인 CPU 또는 CPU 범위를 지정합니다. memory 는 kibibytes (24 바이트 블록)로 노드 메모리를 지정합니다. 각 셀 또는 노드는 0부터 시작하는 순서를 늘리기 위해 cellid 또는 nodeid 가 할당됩니다.

23.13. 이벤트 구성

도메인 XML의 다음 섹션을 사용하면 다양한 이벤트에 대한 기본 작업을 재정의할 수 있습니다.

그림 23.23. 이벤트 구성


  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <on_lockfailure>poweroff</on_lockfailure>
다음 요소 컬렉션을 통해 게스트 가상 머신 운영 체제가 라이프 사이클 작업을 트리거할 때 작업을 지정할 수 있습니다. 일반적인 사용 사례는 초기 운영 체제 설치를 수행할 때 재부팅을 전원 끄기로 취급하도록 하는 것입니다. 이를 통해 첫 번째 설치 후 부팅에 대해 VM을 다시 구성할 수 있습니다.
도메인 XML의 이 섹션의 구성 요소는 다음과 같습니다.

표 23.9. 이벤트 구성 요소

상태 설명
<on_poweroff> 게스트 가상 머신이 전원을 끄도록 요청할 때 실행할 작업을 지정합니다. 4 개의 인수가 가능합니다.
  • destroy - 이 작업은 도메인을 완전히 종료하고 모든 리소스를 해제합니다.
  • restart - 이 작업은 도메인을 완전히 종료하고 동일한 구성으로 다시 시작합니다.
  • preserve - 이 작업은 도메인을 완전히 종료하지만, 향후 분석을 위해 해당 리소스가 보존됩니다.
  • rename-restart - 이 작업은 도메인을 완전히 종료한 다음 새 이름으로 다시 시작합니다.
<on_reboot> 게스트 가상 머신이 재부팅을 요청할 때 실행할 작업을 지정합니다. 4 개의 인수가 가능합니다.
  • destroy - 이 작업은 도메인을 완전히 종료하고 모든 리소스를 해제합니다.
  • restart - 이 작업은 도메인을 완전히 종료하고 동일한 구성으로 다시 시작합니다.
  • preserve - 이 작업은 도메인을 완전히 종료하지만, 향후 분석을 위해 해당 리소스가 보존됩니다.
  • rename-restart - 이 작업은 도메인을 완전히 종료한 다음 새 이름으로 다시 시작합니다.
<on_crash> 게스트 가상 머신이 충돌할 때 실행할 작업을 지정합니다. 또한 다음과 같은 추가 작업을 지원합니다.
  • coredump-destroy - 충돌된 도메인의 코어가 덤프되고, 도메인이 완전히 종료되고 모든 리소스가 릴리스됩니다.
  • coredump-restart - 충돌한 도메인의 코어가 덤프되고 동일한 구성 설정으로 도메인이 다시 시작됩니다.
4 개의 인수가 가능합니다.
  • destroy - 이 작업은 도메인을 완전히 종료하고 모든 리소스를 해제합니다.
  • restart - 이 작업은 도메인을 완전히 종료하고 동일한 구성으로 다시 시작합니다.
  • preserve - 이 작업은 도메인을 완전히 종료하지만, 향후 분석을 위해 해당 리소스가 보존됩니다.
  • rename-restart - 이 작업은 도메인을 완전히 종료한 다음 새 이름으로 다시 시작합니다.
<on_lockfailure> 잠금 관리자가 리소스 잠금을 잃을 때 수행할 작업을 지정합니다. 다음 작업은 libvirt에서 인식되지만 개별 잠금 관리자가 모두 지원할 필요는 없습니다. 작업을 지정하지 않으면 각 잠금 관리자가 기본 작업을 수행합니다. 다음과 같은 인수가 가능합니다.
  • poweroff - 도메인의 전원을 강제로 끕니다.
  • restart - 도메인을 다시 시작하여 잠금을 다시 시작합니다.
  • pause - 잠금 문제가 해결될 때 수동으로 다시 시작할 수 있도록 도메인을 일시 중지합니다.
  • ignore - 아무 일도 없는 것처럼 도메인을 계속 실행 상태로 유지합니다.

23.14. 하이퍼바이저 기능

하이퍼바이저를 사용하면 특정 CPU 또는 시스템 기능을 사용할 수 있습니다(state='on') 또는 disabled (state='off').

그림 23.24. 하이퍼바이저 기능


  ...
  <features>
    <pae/>
    <acpi/>
    <apic/>
    <hap/>
    <privnet/>
    <hyperv>
      <relaxed state='on'/>
    </hyperv>
  </features>
  ...
  

<상태가> 지정되지 않은 경우 모든 기능은 <features> 요소 내에 나열됩니다. 사용 가능한 기능은 기능 XML을 호출하여 찾을 수 있지만, 완전히 가상화된 도메인의 공통 세트는 다음과 같습니다.

표 23.10. 하이퍼 바이저 기능 요소

상태 설명
<pae> 실제 주소 확장 모드를 사용하면 32비트 게스트 가상 머신이 4GB 이상의 메모리를 처리할 수 있습니다.
<acpi> 전원 관리에 유용합니다. 예를 들어 KVM 게스트 가상 머신을 사용하려면 정상적으로 종료해야 합니다.
<apic> 프로그래밍 가능한 IRQ 관리를 사용할 수 있습니다. 이 요소에는 게스트 가상 머신에 대한 EOI (End of Interrupt)의 가용성을 설정하는 의 값이 있는 선택적 속성 eoi 가 있습니다.
<hap> 하드웨어에서 사용 가능한 경우 하드웨어 지원 페이징을 사용할 수 있습니다.

23.15. Timekeeping

게스트 가상 시스템 클럭은 일반적으로 호스트 실제 시스템 클럭에서 초기화됩니다. 대부분의 운영 체제에서는 하드웨어 클럭이 기본 설정인 UTC로 유지될 것으로 예상됩니다.
게스트 가상 머신에서 정확한 시간 유지는 가상화 플랫폼의 핵심 과제입니다. 다른 하이퍼바이저는 다양한 방법으로 시간 유지 문제를 해결하려고 합니다. libvirt 는 도메인 XML의 <clock><timer> 요소를 사용하여 시간 관리를 위한 하이퍼바이저 독립적인 구성 설정을 제공합니다. 도메인 XML은 virsh edit 명령을 사용하여 편집할 수 있습니다. 자세한 내용은 20.22절. “게스트 가상 머신의 XML 설정 편집”의 내용을 참조하십시오.

그림 23.25. Timekeeping


  ...
  <clock offset='localtime'>
    <timer name='rtc' tickpolicy='catchup' track='guest'>
      <catchup threshold='123' slew='120' limit='10000'/>
    </timer>
    <timer name='pit' tickpolicy='delay'/>
  </clock>
  ...


도메인 XML의 이 섹션의 구성 요소는 다음과 같습니다.

표 23.11. 시간 유지 요소

상태 설명
<clock> <clock> 요소는 게스트 가상 시스템 클럭이 호스트 실제 시스템 클럭과 동기화되는 방법을 결정하는 데 사용됩니다. offset 속성은 네 가지 값을 사용하므로 게스트 가상 시스템 클럭이 호스트 물리적 시스템과 동기화되는 방법을 세부적으로 제어할 수 있습니다. 하이퍼 바이저는 모든 시간 소스에서 모든 정책을 지원할 필요는 없습니다.
  • UTC - 부팅 시 클럭을 UTC로 동기화합니다. utc 모드는 조정 특성을 사용하여 제어할 수 있는 변수 모드로 변환할 수 있습니다. 값을 재설정 하면 변환이 수행되지 않습니다. 숫자 값은 초기 조정으로 값을 사용하여 변수 모드로 변환을 강제 적용합니다. 기본 조정은 하이퍼바이저에 따라 다릅니다.
  • localtime - 부팅 시 호스트 물리적 시스템의 구성된 시간대와 게스트 가상 시스템 클럭 동기화. adjustment 속성은 utc 모드에서와 동일하게 작동합니다.
  • timezone - 게스트 가상 머신 클럭을 요청된 시간대에 동기화합니다.
  • 변수 - 게스트 가상 시스템 클럭을 basis 특성에 따라 UTC 또는 localtime 에 상대로 적용된 임의의 오프셋을 제공합니다. 조정 속성을 사용하여 UTC(또는 localtime)에 상대적인 델타는 초 단위로 지정됩니다. 게스트 가상 머신은 시간이 지남에 따라 RTC를 자유롭게 조정할 수 있으며 다음 재부팅 시 적용됩니다. 이는 utclocaltime 모드와 대조적입니다(선택적 속성 adjustment='reset'). 여기서 RTC 조정은 각 재부팅 시 손실됩니다. 또한 기본 속성은 utc (기본값) 또는 localtime 일 수 있습니다. clock 요소에는 0 개 이상의 <타이머> 요소가 있을 수 있습니다.
<timer> 참고 자료 보기
<present> 게스트 가상 머신에서 특정 타이머를 사용할 수 있는지 여부를 지정합니다. yes 또는 no 로 설정할 수 있습니다.
참고
<clock> 요소는 하위 항목으로 0 개 이상의 <타이머> 요소를 가질 수 있습니다. <timer> 요소는 게스트 가상 머신 클럭 동기화에 사용되는 시간 소스를 지정합니다.
<timer> 요소에는 이름만 필요하며 다른 모든 속성은 선택 사항입니다.
  • name - 수정 중인 타이머 를 선택합니다. 다음 값을 사용할 수 있습니다. kvmclock,pit 또는 rtc.
  • track - 타이머 경로를 지정합니다. 다음 값을 사용할 수 있습니다. boot,guest 또는 wall.trackname="rtc" 에만 유효합니다.
  • tickpolicy - 게스트 가상 머신에 틱을 삽입하는 데 데드라인이 누락될 때 어떤 일이 발생하는지 결정합니다. 다음 값을 할당할 수 있습니다.
    • delay - 정상적인 속도로 틱을 계속 전달합니다. 늦은 진드로 인해 게스트 가상 머신 시간이 지연됩니다.
    • catchup - 누락된 틱을 캡처하기 위해 더 높은 속도로 사용 중지됩니다. 캡처가 완료되면 게스트 가상 머신 시간이 표시되지 않습니다. 또한 세 가지 선택적 속성이 있을 수 있습니다. 각 정수는 임계값, 슬리어 및 제한입니다.
    • 병합 - 누락된 틱을 하나의 틱에 병합하여 삽입합니다. 병합 수행 방법에 따라 게스트 가상 머신 시간이 지연될 수 있습니다.
    • 삭제 - 누락된 틱을 제거하고 기본 간격 설정에서 향후 삽입을 계속합니다. 손실된 틱을 처리하기 위한 명시적 구문이 없는 한 게스트 가상 머신 시간이 지연될 수 있습니다.
참고
utc는 기본적으로 가상 머신에서 클럭 오프셋으로 설정됩니다. 그러나 게스트 가상 머신 시계를 localtime 값으로 실행하는 경우 게스트 가상 시스템 시계와 게스트 가상 시스템 클럭을 동기화하려면 클럭 오프셋을 다른 값으로 변경해야 합니다.

예 23.1. 항상 UTC와 동기화

<clock offset="utc" />

예 23.2. 항상 호스트 물리적 시스템 시간대와 동기화

<clock offset="localtime" />

예 23.3. 임의의 시간대와 동기화

<clock offset="timezone" timezone="Europe/Paris" />

예 23.4. UTC + 임의의 오프셋과 동기화

<clock offset="variable" adjustment="123456" />

23.16. 타이머 요소 속성

name 요소에는 사용할 시간 소스의 이름이 포함되어 있습니다. 다음 값 중 하나를 사용할 수 있습니다.

표 23.12. name 속성 값

설명
pit 프로그래밍 가능한 간격 타이머 - 주기적인 인터럽트가 있는 타이머입니다. 이 속성을 사용하는 경우 tickpolicy 지연이 기본 설정이 됩니다.
rtc 실시간 시계 - 주기적 인터럽트와 함께 지속적으로 실행되는 타이머입니다. 이 속성은 tickpolicy catchup 하위 요소를 지원합니다.
kvmclock KVM 클럭 - KVM 게스트 가상 머신에 권장되는 클럭 소스입니다. KVM pvclock 또는 kvm-clock을 사용하면 게스트 가상 머신에서 호스트 물리적 시스템의 벽 클럭 시간을 읽을 수 있습니다.
track 속성은 타이머에서 추적되는 항목을 지정하고 rtc이름 값에만 유효합니다.

표 23.13. 특성 값 추적

설명
boot 이전 호스트 물리적 머신 옵션에 해당하며 이는 지원되지 않는 추적 옵션입니다.
guest RTC는 항상 게스트 가상 머신 시간을 추적합니다.
wall RTC는 항상 호스트 시간을 추적합니다.
tickpolicy 속성 및 값은 게스트 가상 시스템에 틱을 전달하는 데 사용되는 정책을 나타냅니다.

표 23.14. tickpolicy 특성 값

설명
delay 정상적인 속도로 계속 전달하십시오 (티크가 지연됨).
catchup 상승하기 위해 더 높은 속도로 전달합니다.
merge 틱이 하나의 틱에 병합되었습니다.
discard 누락된 모든 틱은 삭제됩니다.
present 속성은 게스트 가상 머신에 표시되는 기본 타이머 세트를 덮어쓰는 데 사용됩니다. present 속성은 다음 값을 사용할 수 있습니다.

표 23.15. 존재하는 특성 값

설명
제공됨 게스트 가상 머신에 이 타이머를 강제로 표시합니다.
제공되지 않음 게스트 가상 머신에 이 타이머를 강제로 표시하지 않도록 합니다.

23.17. devices

이 XML 요소 세트는 모두 게스트 가상 머신 도메인에 제공된 장치를 설명하는 데 사용됩니다. 아래 모든 장치는 주요 <장치> 요소의 자식으로 표시됩니다.
다음과 같은 가상 장치가 지원됩니다.
  • virtio-scsi-pci - PCI 버스 스토리지 장치
  • virtio-blk-pci - PCI 버스 스토리지 장치
  • virtio-net-pci - virtio-net이라고도 하는 PCI 버스 네트워크 장치
  • virtio-serial-pci - PCI 버스 입력 장치
  • virtio-balloon-pci - PCI 버스 메모리 balloon 장치
  • virtio-rng-pci - PCI 버스 가상 난수 생성기 장치
중요
벡터 수가 32보다 높은 값으로 설정된 virtio 장치가 생성되는 경우 장치는 Red Hat Enterprise Linux 6에서 0 값으로 설정된 것처럼 작동하지만 Enterprise Linux 7에서는 작동하지 않습니다. 결과 벡터 설정 불일치로 인해 두 플랫폼의 virtio 장치의 벡터 수가 33 이상으로 설정된 경우 마이그레이션 오류가 발생합니다. 따라서 벡터 값을 32보다 크게 설정하지 않는 것이 좋습니다. virtio-balloon-pcivirtio-rng-pci 를 제외한 모든 virtio 장치는 벡터 인수를 허용합니다.

그림 23.26. 장치 - 하위 요소


  ...
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
  </devices>
  ...

<에뮬레이터 요소의 내용은 장치 모델 에뮬레이터> 바이너리에 대한 정규화된 경로를 지정합니다. 기능 XML은 각 특정 도메인 유형 또는 아키텍처 조합에 사용할 권장 기본 에뮬레이터를 지정합니다.

23.17.1. 하드 드라이브, Floppy 디스크 및 CD-ROM

도메인 XML의 이 섹션에서는 디스크 요소에 지정된 하드 디스크, 하드 디스크, CD-ROM 또는 반가상화 드라이버를 포함하여 <디스크> 처럼 보이는 모든 장치를 지정합니다.

그림 23.27. 장치 - 하드 드라이브, 플로피 디스크, CD-ROM 예


    <disk type='network'>
      <driver name="qemu" type="raw" io="threads" ioeventfd="on" event_idx="off"/>
      <source protocol="sheepdog" name="image_name">
        <host name="hostname" port="7000"/>
      </source>
      <target dev="hdb" bus="ide"/>
      <boot order='1'/>
      <transient/>
      <address type='drive' controller='0' bus='1' unit='0'/>
    </disk>

그림 23.28. 장치 - 하드 드라이브, 플로피 디스크, CD-ROM 예 2


    <disk type='network'>
      <driver name="qemu" type="raw"/>
      <source protocol="rbd" name="image_name2">
        <host name="hostname" port="7000"/>
      </source>
      <target dev="hdd" bus="ide"/>
      <auth username='myuser'>
        <secret type='ceph' usage='mypassid'/>
      </auth>
    </disk>

그림 23.29. 장치 - 하드 드라이브, 플로피 디스크, CD-ROM 예 3


    <disk type='block' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <target dev='hdc' bus='ide' tray='open'/>
      <readonly/>
    </disk>
    <disk type='network' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source protocol="http" name="url_path">
        <host name="hostname" port="80"/>
      </source>
      <target dev='hdc' bus='ide' tray='open'/>
      <readonly/>
    </disk>

그림 23.30. 장치 - 하드 드라이브, 플로피 디스크, CD-ROM 예 4


    <disk type='network' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source protocol="https" name="url_path">
        <host name="hostname" port="443"/>
      </source>
      <target dev='hdc' bus='ide' tray='open'/>
      <readonly/>
    </disk>
    <disk type='network' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source protocol="ftp" name="url_path">
        <host name="hostname" port="21"/>
      </source>
      <target dev='hdc' bus='ide' tray='open'/>
      <readonly/>
    </disk>

그림 23.31. 장치 - 하드 드라이브, 플로피 디스크, CD-ROM 예 5


    <disk type='network' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source protocol="ftps" name="url_path">
        <host name="hostname" port="990"/>
      </source>
      <target dev='hdc' bus='ide' tray='open'/>
      <readonly/>
    </disk>
    <disk type='network' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source protocol="tftp" name="url_path">
        <host name="hostname" port="69"/>
      </source>
      <target dev='hdc' bus='ide' tray='open'/>
      <readonly/>
    </disk>
    <disk type='block' device='lun'>
      <driver name='qemu' type='raw'/>
      <source dev='/dev/sda'/>
      <target dev='sda' bus='scsi'/>
      <address type='drive' controller='0' bus='0' target='3' unit='0'/>
    </disk>

그림 23.32. 장치 - 하드 드라이브, 플로피 디스크, CD-ROM 예 6


    <disk type='block' device='disk'>
      <driver name='qemu' type='raw'/>
      <source dev='/dev/sda'/>
      <geometry cyls='16383' heads='16' secs='63' trans='lba'/>
      <blockio logical_block_size='512' physical_block_size='4096'/>
      <target dev='hda' bus='ide'/>
    </disk>
    <disk type='volume' device='disk'>
      <driver name='qemu' type='raw'/>
      <source pool='blk-pool0' volume='blk-pool0-vol0'/>
      <target dev='hda' bus='ide'/>
    </disk>
    <disk type='network' device='disk'>
      <driver name='qemu' type='raw'/>
      <source protocol='iscsi' name='iqn.2013-07.com.example:iscsi-nopool/2'>
        <host name='example.com' port='3260'/>
      </source>
      <auth username='myuser'>
        <secret type='chap' usage='libvirtiscsi'/>
      </auth>
      <target dev='vda' bus='virtio'/>
    </disk>

그림 23.33. 장치 - 하드 드라이브, 플로피 디스크, CD-ROM 예 7


    <disk type='network' device='lun'>
      <driver name='qemu' type='raw'/>
      <source protocol='iscsi' name='iqn.2013-07.com.example:iscsi-nopool/1'>
       iqn.2013-07.com.example:iscsi-pool
        <host name='example.com' port='3260'/>
      </source>
      <auth username='myuser'>
        <secret type='chap' usage='libvirtiscsi'/>
      </auth>
      <target dev='sda' bus='scsi'/>
    </disk>
    <disk type='volume' device='disk'>
      <driver name='qemu' type='raw'/>
      <source pool='iscsi-pool' volume='unit:0:0:1' mode='host'/>
      <auth username='myuser'>
        <secret type='chap' usage='libvirtiscsi'/>
      </auth>
      <target dev='vda' bus='virtio'/>
    </disk>

그림 23.34. 장치 - 하드 드라이브, 플로피 디스크, CD-ROM 예 8


    <disk type='volume' device='disk'>
      <driver name='qemu' type='raw'/>
      <source pool='iscsi-pool' volume='unit:0:0:2' mode='direct'/>
      <auth username='myuser'>
        <secret type='chap' usage='libvirtiscsi'/>
      </auth>
      <target dev='vda' bus='virtio'/>
    </disk>
     <disk type='file' device='disk'>
      <driver name='qemu' type='raw' cache='none'/>
      <source file='/tmp/test.img' startupPolicy='optional'/>
      <target dev='sdb' bus='scsi'/>
      <readonly/>
    </disk>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw' discard='unmap'/>
      <source file='/var/lib/libvirt/images/discard1.img'/>
      <target dev='vdb' bus='virtio'/>
      <alias name='virtio-disk1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
    </disk>
  </devices>
  ...

23.17.1.1. 디스크 요소

<disk> 요소는 디스크를 설명하는 기본 컨테이너입니다. 특성 유형은 <disk> 요소와 함께 사용할 수 있습니다. 다음과 같은 유형이 허용됩니다.
  • file
  • 블록
  • dir
  • network
자세한 내용은 libvirt 업스트림 페이지를 참조하십시오.

23.17.1.2. 소스 요소

디스크 소스를 나타냅니다. 디스크 소스는 다음과 같이 디스크 유형 특성에 따라 다릅니다.
  • <file> 속성은 디스크가 있는 파일의 정규화된 경로를 지정합니다.
  • <block> - dev 속성은 디스크로 사용되는 호스트 장치에 대한 정규화된 경로를 지정합니다.
  • <dir> - dir 특성은 디스크로 사용되는 디렉터리의 정규화된 경로를 지정합니다.
  • <Network> - protocol 속성은 요청된 이미지에 액세스하는 데 사용되는 프로토콜을 지정합니다. 가능한 값은 nbd,isci,rbd,heepdoggluster 입니다.
    • protocol 속성이 rbd, Hepdog, 또는 gluster 인 경우 추가 속성이 필수입니다. 이 속성은 사용할 볼륨과 이미지를 지정합니다.
    • protocol 속성이 nbd 인 경우 name 속성은 선택 사항입니다.
    • protocol 속성이 ci인 경우 name 속성에는 대상의 이름에서 슬래시로 구분된 논리 단위 번호가 포함될 수 있습니다. 예:Consumern.2013-07.com.example:iscsi-pool/1. 지정하지 않으면 기본 LUN이 0입니다.
  • <볼륨> - 기본 디스크 소스는 볼륨 특성으로 표시됩니다.
    • <pool> - 디스크 소스가 상주하는 스토리지 풀의 이름( libvirt)입니다.
    • <volume> - 디스크 소스로 사용되는 스토리지 볼륨( libvirt)의 이름입니다.
      volume 속성의 값은 virsh vol-list [pool-name]의 Name 열에서 출력입니다.
디스크 유형이 네트워크인 경우 소스에 는 연결할 호스트 물리적 시스템을 지정하는 데 사용되는 호스트 하위 요소(예: type='dir'type='network' )가 하나 이상 있을 수 있습니다. CD-ROM 또는 플로피(장치 속성)를 나타내는 파일 디스크 유형의 경우 소스 파일에 액세스할 수 없는 경우 디스크로 수행할 작업을 정의할 수 있습니다. 이 작업은 startupPolicy 특성을 다음 값 중 하나로 설정하여 수행됩니다.
  • 어떠한 이유로든 누락된 경우 필수 로 인해 오류가 발생합니다. 이 설정은 기본 설정입니다.
  • 필수 조건은 부팅 시 누락된 경우 실패하거나 마이그레이션, 복원 또는 복원이 누락된 경우 삭제됩니다.
  • 모든 시작 시도에서 누락된 경우 선택 사항이 감소합니다.

23.17.1.3. mirror 요소

하이퍼바이저가 BlockCopy 작업을 시작한 경우, 여기서 특성 파일의 <미러> 위치는 결국 소스와 동일한 내용을 가지며, 파일 형식(소스의 형식과 다를 수 있음)이 있습니다. ready 속성이 있는 경우 디스크가 피벗할 준비가 된 것으로 알려져 있습니다. 그러지 않으면 디스크가 계속 복사될 수 있습니다. 현재 이 요소는 출력에서만 유효하며 입력 시 무시됩니다.

23.17.1.4. 대상 요소

<target> 요소는 게스트 가상 머신 운영 체제에 디스크가 노출되는 버스 또는 장치를 제어합니다. dev 속성은 논리 장치 이름을 나타냅니다. 지정된 실제 장치 이름은 게스트 가상 머신 운영 체제의 장치 이름에 매핑되지 않습니다. 선택 사항인 bus 속성은 에뮬레이션할 디스크 장치의 유형을 지정합니다. 가능한 값은 드라이버별로이며 일반적인 값은 ide,scsi,virtio,kvm,usb 또는 sata 입니다. 생략하면 장치 이름 스타일에서 버스 유형을 유추합니다. 예를 들어 'sda' 라는 장치는 일반적으로 SCSI 버스를 사용하여 내보냅니다. 선택적 특성 트레이 는 이동식 디스크(예: CD-ROM 또는 Floppy 디스크)의 트레이스 상태를 나타내며 이 값은 열리 거나 닫을 수 있습니다. 기본 설정은 닫힙니다.

23.17.1.5. iotune 요소

선택적 <iotune> 요소는 추가 장치별 I/O 튜닝을 제공할 수 있으며, 각 장치에 대해 다를 수 있는 값을 제공합니다(이 값은 도메인에 전역적으로 적용되는 blkiotune 요소에 따라 다릅니다). 이 요소에는 다음과 같은 선택적 하위 요소(값이 0 으로 지정되거나 지정되지 않은 모든 하위 요소)가 제한이 없습니다.
  • <total_bytes_sec> - 초당 총 처리량 제한(바이트 단위)입니다. 이 요소는 <read_bytes_sec> 또는 <write_bytes_sec> 에는 사용할 수 없습니다.
  • <read_bytes_sec> - 초당 읽기 처리량 제한(바이트)입니다.
  • <write_bytes_sec> - 초당 쓰기 처리량 제한(바이트)입니다.
  • <total_iops_sec> - 초당 총 I/O 작업 수입니다. 이 요소는 <read_iops_sec> 또는 <write_iops_sec> 에는 사용할 수 없습니다.
  • <read_iops_sec> - 초당 읽기 I/O 작업.
  • <write_iops_sec> - 초당 쓰기 I/O 작업.

23.17.1.6. 드라이버 요소

선택적 <드라이버> 요소를 사용하면 디스크를 제공하는 데 사용되는 하이퍼바이저 드라이버와 관련된 추가 세부 정보를 지정할 수 있습니다. 다음 옵션을 사용할 수 있습니다.
  • 하이퍼바이저가 여러 백엔드 드라이버를 지원하는 경우 name 속성은 기본 백엔드 드라이버 이름을 선택하는 반면, 선택 사항인 type 속성은 하위 유형을 제공합니다.
  • 선택적 cache 속성은 캐시 메커니즘을 제어합니다. 가능한 값은 기본값,none,writethrough,writeback,directsync ( writethrough 와 유사함)이며 안전하지 않은 호스트 물리적 머신 페이지 캐시를 바이패스합니다 (호스트 물리적 머신은 모든 디스크 I/O를 캐시하고 게스트 가상 머신의 동기화 요청은 무시)
  • 선택적 error_policy 속성은 하이퍼바이저가 디스크 읽기 또는 쓰기 오류에서 작동하는 방식을 제어합니다. 가능한 값은 stop,report,ignore, enospace 입니다. error_policy 의 기본 설정은 report 입니다. 읽기 오류에 대한 동작만 제어하는 선택적 rerror_policy 도 있습니다. rerror_policy 가 제공되지 않으면 error_policy 가 읽기 및 쓰기 오류에 모두 사용됩니다. rerror_policy 가 지정된 경우 error_policy 에서 읽기 오류가 발생합니다. 또한 enospace 는 읽기 오류에 대한 올바른 정책이 아니므로 error_policyenospace 로 설정되어 있고 rerror_policy 가 지정되지 않은 경우 읽기 오류 기본 설정인 보고서가 사용됩니다.
  • 선택적 io 속성은 I/O의 특정 정책을 제어합니다. kvm 게스트 가상 머신은 스레드네이티브 를 지원합니다. 선택적 ioeventfd 속성을 사용하면 virtio 디스크 장치에 대한 도메인 I/O 비동기 처리를 설정할 수 있습니다. 기본값은 하이퍼바이저에 따라 결정됩니다. 허용되는 값은 설정 및 해제 입니다. 이를 활성화하면 별도의 스레드가 I/O를 처리하는 동안 게스트 가상 머신을 실행할 수 있습니다. 일반적으로 I/O 중 높은 시스템 CPU 사용률이 발생하는 게스트 가상 시스템은 이러한 이점을 활용할 수 있습니다. 반면 과부하된 호스트 물리적 머신은 게스트 가상 머신 I/O 대기 시간을 늘릴 수 있습니다. 그러나 기본 설정은 변경하지 않고 하이퍼바이저에서 설정을 결정하는 것이 좋습니다.
    참고
    ioeventfd 속성은 디스크 XML 섹션의 <드라이버> 요소와 장치 XML 섹션의 <드라이버> 요소에 포함되어 있습니다. 이전 경우 virtIO 디스크 및 후자의 경우 SCSI 디스크에 영향을 미칩니다.
  • 선택적 event_idx 속성은 장치 이벤트 처리의 일부 측면을 제어하며 거나 도록 설정할 수 있습니다. on 으로 설정하면 인터럽트 수를 줄이고 게스트 가상 머신에 대해 종료됩니다. 기본값은 하이퍼바이저에 따라 결정되며 기본 설정은 입니다. 이 동작이 필요하지 않은 경우 기능을 강제로 설정합니다. 그러나 기본 설정을 변경하지 않고 하이퍼바이저에서 설정을 지정하는 것이 좋습니다.
  • 선택 사항인 copy_on_read 속성은 읽기 백업 파일을 이미지 파일에 복사할지 여부를 제어합니다. 허용되는 값은 on 또는 <off> 일 수 있습니다.copy-on-read 는 동일한 백업 파일 섹터에 반복적으로 액세스하지 않으며 백업 파일이 느린 네트워크를 통해 있을 때 유용합니다. 기본적으로 copy-on-readoff 입니다.
  • discard='unmap' 을 설정하여 삭제 지원을 활성화할 수 있습니다. 동일한 행을 disable='ignore'로 교체하여 비활성화할 수 있습니다. discard='ignore' 는 기본 설정입니다.

23.17.1.7. 추가 장치 요소

다음 속성은 장치 요소 내에서 사용할 수 있습니다.
  • <boot> - 디스크를 부팅할 수 있도록 지정합니다.

    추가 부팅 값

    • <order> - 부팅 시퀀스 중에 장치를 시도할 순서를 결정합니다.
    • <장치별> 부팅 요소는 BIOS 부트 로더 섹션의 일반 부팅 요소와 함께 사용할 수 없습니다.
  • <Encryption> - 볼륨의 암호화 방법을 지정합니다.
  • <ReadOnly> - 게스트 가상 머신에서 장치를 수정할 수 없음을 나타냅니다. 이 설정은 <device='cdrom'> 을 가진 디스크의 기본값입니다.
  • <공유할 수 있는> 경우 장치를 도메인 간에 공유할 것으로 예상됩니다(하이퍼 바이저와 운영 체제가 지원하는 경우). shareable 을 사용하는 경우 해당 장치에 cache='no' 를 사용해야 합니다.
  • <transient> - 게스트 가상 머신이 종료될 때 장치 콘텐츠에 대한 변경 사항을 자동으로 되돌려야 함을 나타냅니다. 일부 하이퍼바이저에서 디스크를 일시적으로 표시하면 도메인이 마이그레이션 또는 스냅샷에 참여하지 않습니다.
  • <serial> - 게스트 가상 머신의 하드 드라이브의 일련 번호를 지정합니다. 예를 들어 <직렬>WD-WMAP9A966149</직렬>.
  • <WW> N - 가상 하드 디스크 또는 CD-ROM 드라이브의 WWN( World Wide Name)을 지정합니다. 16진수 16진수로 구성되어야 합니다.
  • <vendor> - 가상 하드 디스크 또는 CD-ROM 장치의 벤더를 지정합니다. 인쇄 가능한 문자가 8자 이상이어야 합니다.
  • <product> - 가상 하드 디스크 또는 CD-ROM 장치의 제품을 지정합니다. 16 인쇄 가능 문자를 초과해서는 안 됩니다.
  • <host> - 다음 특성을 지원합니다.
    • name - 호스트 이름을 지정합니다.
    • port - 포트 번호를 지정합니다.
    • transport - 전송 유형을 지정합니다.
    • socket - 소켓의 경로를 지정합니다.
    이 요소의 의미는 다음과 같이 프로토콜 특성에 따라 달라집니다. 프로토콜을 기반으로 하는 추가 호스트 속성

    프로토콜을 기반으로 하는 추가 호스트 속성

    • NBD - nbd -server 를 실행하는 서버를 지정하고 하나의 호스트 물리적 시스템에 대해서만 사용할 수 있습니다. 이 protcol의 기본 포트는 64 439 입니다.
    • RBD - RBD 유형의 서버를 모니터링하며 하나 이상의 호스트 물리적 시스템에 사용할 수 있습니다.
    • halfepdog - 서버 중 하나를 지정합니다 (기본값은 localhost:7000)와 함께 사용할 수 있는 호스트 물리적 시스템 중 하나 이상에서 사용할 수 있습니다.
    • Gluster - pxe 데몬을 실행하는 서버를 지정하고 하나의 호스트 물리적 시스템에만 사용할 수 있습니다. 전송 특성에 유효한 값은 tcp, rdma또는 unix 입니다. 지정하지 않으면 tcp 로 가정합니다. 전송이 unix 인 경우 socket 속성은 unix 소켓의 경로를 지정합니다.
  • <address> - 지정된 컨트롤러 슬롯에 디스크를 연결합니다. 실제 <컨트롤러> 장치는 을 추측할 수 있지만 명시적으로 지정할 수도 있습니다. type 속성은 필수이며 일반적으로 pci 또는 drive 입니다. pci 컨트롤러의 경우 버스,슬롯함수에 대한 추가 속성이 있어야 하며 선택적 domain 및 multifunction . multifunction 기본값이 있어야 합니다. 드라이브 컨트롤러의 경우 추가 특성 컨트롤러,버스,대상장치를 사용할 수 있으며 각각 기본 설정 0.
  • auth - 소스에 액세스하는 데 필요한 인증 자격 증명을 제공합니다. 여기에는 인증 중에 사용할 사용자 이름을 식별하는 필수 속성 사용자 이름 및 필수 특성 유형이 있는 하위 요소 시크릿 이 포함되어 있습니다.
  • geometry - geometry 설정을 재정의하는 기능을 제공합니다. 이는 주로 S390 DASD-디스크 또는 이전 MacOS-disks에 유용합니다. 다음과 같은 매개 변수를 사용할 수 있습니다.
    • Cyls - 실린더 수를 지정합니다.
    • heads - 헤드 수를 지정합니다.
    • Subjects - 트랙당 섹터 수를 지정합니다.
    • trans - BIOS-Translation-Modes를 지정하고 다음 값을 가질 수 있습니다. none,lba 또는 auto.
  • blockio - 아래 나열된 블록 장치 속성을 사용하여 블록 장치를 재정의할 수 있습니다.

    Blockio 옵션

    • logical_block_size - 게스트 가상 머신 운영 체제에 보고하고 디스크 I/O의 최소 단위를 설명합니다.
    • physical_block_size - 게스트 가상 머신 운영 체제에 보고하고 디스크 데이터 정렬과 관련이 있을 수 있는 디스크의 하드웨어 섹터 크기를 설명합니다.

23.17.2. 장치 주소

많은 장치에는 가상 버스에 배치된 장치가 게스트 가상 머신에 제공되는 위치를 설명하는 선택적 <주소> 하위 요소가 있습니다. 입력 시 주소(또는 주소 내의 선택적 속성)가 생략된 경우 libvirt는 적절한 주소를 생성하지만 레이아웃을 추가로 제어해야 하는 경우 명시적 주소가 필요합니다. address 요소를 포함한 장치 예제는 아래를 참조하십시오.
모든 주소에는 장치가 있는 버스를 설명하는 필수 속성 유형이 있습니다. 지정된 장치에 사용할 주소를 선택하는 것은 장치 및 게스트 가상 머신의 아키텍처로 제한됩니다. 예를 들어 디스크 장치는 type='disk' 을 사용하는 반면 콘솔 장치는 32비트 AMD 및 Intel, AMD64 및 Intel 64, 게스트 가상 머신 또는 Intel 64의papr -vio' on PowerPC64 pseries 게스트 가상 머신에서 type=' pci' 를 사용합니다. 각 주소 <유형에> 는 장치가 배치될 버스의 위치를 제어하는 추가 선택적 속성이 있습니다. 추가 속성은 다음과 같습니다.
  • type='pci' - PCI 주소에는 다음과 같은 추가 속성이 있습니다.
    • domain (현재 KVM에서 사용하지 않는 2바이트 정수)
    • 버스 (포함 0에서 0xff 사이의 16진수 값 포함)
    • 슬롯 (0x0과 0x1f 사이의 16진수 값 포함)
    • 함수 (0에서 7 포함) 사이의 값
    • 또한 사용 가능한 다기능 속성은 PCI 제어 레지스터의 특정 슬롯 또는 함수에 대해 다중 함수 비트를 전환하는 것을 제어합니다. 이 다중 기능 속성은 기본적으로 'off' 로 설정하지만 여러 함수가 사용될 슬롯의 함수 0에 대해 'on' 으로 설정해야 합니다.
  • type=' drive' - 드라이브 주소에는 다음과 같은 추가 속성이 있습니다.
    • Controller - (두 자리 컨트롤러 번호)
    • 버스 - (두 자리 버스 번호)
    • target - (두 자리 버스 번호)
    • 단위 - (버스의 2자리 단위 번호)
  • type='virtio-serial' - 각 virtio-serial 주소에는 다음과 같은 추가 속성이 있습니다.
    • Controller - (두 자리 컨트롤러 번호)
    • 버스 - (두 자리 버스 번호)
    • 슬롯 - (버스 내 2자리 슬롯)
  • type='ccid' - 스마트 카드에 사용되는 CCID 주소에는 다음과 같은 추가 속성이 있습니다.
    • 버스 - (두 자리 버스 번호)
    • 슬롯 - (버스 내 2자리 슬롯)
  • type='usb' - USB 주소에는 다음과 같은 추가 속성이 있습니다.
    • bus - (포함 0에서 0xfff 사이의 16진수 값)
    • port - ( 1.2 또는 2.1.3.1과 같은 최대 4개의 8개의 8진수 표기법)
  • type=의papr-vio' - PowerPC pseries guest 가상 머신에서 장치를 SPAPR-VIO 버스에 할당할 수 있습니다. 여기에는 플랫 64비트 주소 공간이 있습니다. 규칙적으로 장치는 0이 아닌 0개가 아닌 0개로 할당되지만 다른 주소는 libvirt 에서 유효하고 허용됩니다. 시작 레지스터의 16진수 값 주소를 결정하는 추가 reg 속성을 이 속성에 할당할 수 있습니다.

23.17.3. 컨트롤러

게스트 가상 머신 아키텍처에 따라 여러 가상 장치를 단일 버스에 할당할 수 있습니다. 정상적인 상황에서는 libvirt 가 버스에 사용할 컨트롤러를 자동으로 유추할 수 있습니다. 그러나 게스트 가상 머신 XML에서 명시적 <컨트롤러> 요소를 제공해야 할 수 있습니다.

그림 23.35. 컨트롤러 element


  ...
  <devices>
    <controller type='ide' index='0'/>
    <controller type='virtio-serial' index='0' ports='16' vectors='4'/>
    <controller type='virtio-serial' index='1'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
    <controller type='scsi' index='0' model='virtio-scsi' num_queues='8'/>
    </controller>
    ...
  </devices>
  ...

각 컨트롤러에는 필수 특성 유형인, "ide", "fdc", "scsi", "sata", "usb", "ccid", "ccid" 또는 "virtio-serial", 및 버스 컨트롤러가 발생하는 순서로 설명되는 10진수 정수(프로바이터 요소의 속성 사용) 중 하나여야 합니다. "virtio-serial" 컨트롤러에는 컨트롤러를 통해 연결할 수 있는 장치 수를 제어하는 두 가지 추가 선택적 속성인 포트벡터 가 있습니다.
<컨트롤러 type='scsi'> 에는 선택적 특성 모델인 "auto", "buslogic", "ibmvscsi", "lsilogic", "lsias1068", "virtio-scsi 또는 "vmpvscsi". <컨트롤러 type='scsi'> 에는 지정된 큐 수에 다중 큐 지원을 활성화하는 num_queues 속성도 있습니다. 또한 SCSI 디스크에서 컨트롤러가 비동기 처리를 사용해야 하는지 여부를 지정하는 ioeventfd 특성을 사용할 수 있습니다. 허용되는 값은 "on" 및 "off"입니다.
"usb" 컨트롤러에는 선택적 특성 모델, 즉 "piix3-uhci", "piix4-uhci", "ehci", "ich9-ehci1", "ich9-uhci1", "ich9-uhci2", "ich9-uhci3", "ich9-uhci3", "vt82c686b-uhci", "pci-ohci" 또는 "nec-xhci". 또한 게스트 가상 머신에 대해 USB 버스를 명시적으로 비활성화해야 하는 경우 model='none' 을 사용할 수 있습니다. PowerPC64 "spapr-vio" 주소에 연결된 컨트롤러가 없습니다.
PCI 또는 USB 버스에 있는 컨트롤러의 경우, 선택적 하위 element 주소는 위에 지정된 의미와 함께 마스터 버스에 컨트롤러의 정확한 관계를 지정할 수 있습니다.
USB companion 컨트롤러에는 마스터 컨트롤러와의 파트너의 정확한 관계를 지정하는 선택적 하위 요소 마스터가 있습니다. 동반 컨트롤러는 마스터와 동일한 버스에 있으므로 그에 동반되는 인덱스 값이 동일해야 합니다.

그림 23.36. 장치 - 컨트롤러 - USB


  ...
  <devices>
    <controller type='usb' index='0' model='ich9-ehci1'>
      <address type='pci' domain='0' bus='0' slot='4' function='7'/>
    </controller>
    <controller type='usb' index='0' model='ich9-uhci1'>
      <master startport='0'/>
      <address type='pci' domain='0' bus='0' slot='4' function='0' multifunction='on'/>
    </controller>
    ...
  </devices>
  ...

23.17.4. 장치 리스

잠금 관리자를 사용하는 경우 게스트 가상 머신에 대한 장치 리스를 기록하는 옵션이 있습니다. 잠금 관리자는 리스를 취득할 수 없는 한 게스트 가상 머신이 시작되지 않도록 합니다. 기존 관리 툴을 사용하여 구성할 때 도메인 XML의 다음 섹션이 영향을 받습니다.

그림 23.37. 장치 - 장치 리스


  ...
  <devices>
    ...
    <lease>
      <lockspace>somearea</lockspace>
      <key>somekey</key>
      <target path='/some/lease/path' offset='1024'/>
    </lease>
    ...
  </devices>
  ...

lease 섹션에는 다음과 같은 인수가 있을 수 있습니다.
  • lockspace - 키가 유지되는 잠금 공간을 식별하는 임의의 문자열입니다. 잠금 관리자는 잠금 공간 이름 또는 잠금 공간에 추가 제한을 적용할 수 있습니다.
  • Key - 취득할 리스를 고유하게 식별하는 임의의 문자열입니다. 잠금 관리자는 키의 형식 또는 길이에 추가 제한을 적용할 수 있습니다.
  • target - 잠금 공간과 연결된 파일의 정규화된 경로입니다. 오프셋은 리스가 파일 내에 저장되는 위치를 지정합니다. 잠금 관리자가 오프셋이 필요하지 않은 경우 이 값을 0 으로 설정합니다.

23.17.5. 호스트 물리적 시스템 장치 할당

23.17.5.1. USB / PCI 장치

호스트 물리적 시스템의 USB 및 PCI 장치는 관리 툴을 사용하여 호스트 물리적 시스템을 수정하여 hostdev 요소를 사용하여 게스트 가상 시스템으로 전달할 수 있습니다. 도메인 XML 파일의 다음 섹션을 구성합니다.

그림 23.38. 장치 - 호스트 물리적 시스템 장치 할당


  ...
  <devices>
    <hostdev mode='subsystem' type='usb'>
      <source startupPolicy='optional'>
        <vendor id='0x1234'/>
        <product id='0xbeef'/>
      </source>
      <boot order='2'/>
    </hostdev>
  </devices>
  ...

또는 다음을 수행할 수도 있습니다.

그림 23.39. 장치 - 호스트 물리적 시스템 장치 할당 대안


  ...
  <devices>
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <source>
        <address bus='0x06' slot='0x02' function='0x0'/>
      </source>
      <boot order='1'/>
      <rom bar='on' file='/etc/fake/boot.bin'/>
    </hostdev>
  </devices>
  ...

또는 다음을 수행할 수도 있습니다.

그림 23.40. 장치 - 호스트 물리적 시스템 scsi 장치 할당


  ...
  <devices>
    <hostdev mode='subsystem' type='scsi'>
      <source>
        <adapter name='scsi_host0'/>
        <address type='scsi' bus='0' target='0' unit='0'/>
      </source>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </hostdev>
  </devices>
  ..


도메인 XML의 이 섹션의 구성 요소는 다음과 같습니다.

표 23.16. 호스트 물리적 시스템 장치 할당 요소

매개변수 설명
hostdev
이는 호스트 물리적 시스템 장치를 설명하는 주요 요소입니다. 다음 옵션을 허용합니다.
  • mode - 값은 항상 USB 및 PCI 장치의 하위 시스템입니다.
  • 유형 - USB 장치용 USB 및 PCI 장치의 경우 pci 입니다.
  • Managed - 장치의 관리 모드를 전환합니다.
    • PCI 장치에 대해 yes 로 설정하면 게스트 머신에 연결하고 게스트 시스템에서 분리한 후 필요에 따라 호스트 머신에 다시 연결합니다. management ='yes' 는 장치 할당을 일반적으로 사용하는 것이 좋습니다.
    • PCI 및 USB 장치에 대해 no 또는 omitted로 설정된 경우 장치는 게스트에 연결된 상태로 유지됩니다. 호스트에서 장치를 사용할 수 있도록 하려면 게스트를 시작하거나 장치를 핫 플러그하기 전에 virNodeDeviceDettach 인수 또는 virsh nodedev-dettach 명령을 사용해야 합니다. 또한 장치를 핫플러그하거나 게스트를 중지한 후 virNodeDeviceReAttach 또는 virsh nodedev-reattach 를 사용해야 합니다. managed='no' 는 주로 특정 게스트 전용 장치에 권장됩니다.
소스 호스트 물리적 시스템에서 볼 수 있는 장치를 설명합니다. USB 장치는 공급업체 및 제품 요소를 사용하여 공급 업체 또는 제품 ID로 또는 address 요소를 사용하여 호스트 물리적 시스템의 장치 주소로 해결할 수 있습니다. 반면 PCI 장치는 주소별로만 설명할 수 있습니다. USB 장치의 소스 요소에는 지정된 호스트 물리적 시스템 USB 장치를 찾을 수 없는 경우 수행할 작업을 정의하는 데 사용할 수 있는 startupPolicy 속성이 포함될 수 있습니다. 속성은 다음 값을 허용합니다.
  • 필수 - 어떤 이유로 인해 누락된 경우(기본값)
  • 필수 조건 - 부팅 시 누락된 경우 migrate/restore/revert에서 누락된 경우 삭제합니다.
  • 선택 사항 - 시작 시도에서 누락된 경우 삭제합니다.
vendor, product 이러한 요소에는 각각 USB 벤더 및 제품 ID를 지정하는 id 속성이 있습니다. ID는 10진수, 16진수(0x로 시작) 또는 8진수(0으로 시작) 양식으로 지정할 수 있습니다.
boot 장치를 부팅할 수 있도록 지정합니다. 특성의 순서는 부팅 시퀀스 중에 장치를 시도할 순서를 결정합니다. 장치별 부팅 요소는 BIOS 부트 로더 섹션의 일반 부팅 요소와 함께 사용할 수 없습니다.
rom PCI 장치의 RAM이 게스트 가상 머신에 표시되는 방식을 변경하는 데 사용됩니다. 선택 사항인 bar 속성은 on 또는 off 로 설정할 수 있으며, 장치의 RAM이 게스트 가상 머신의 메모리 맵에 표시되는지 여부를 결정합니다. (PC 설명서에서 rom bar 설정은 Romom에 대한 기본 주소 레지스터의 존재를 제어합니다. rom 표시줄 을 지정하지 않으면 기본 설정이 사용됩니다. 선택적 file 속성은 장치의 RAM BIOS로 게스트 가상 머신에 표시되는 바이너리 파일을 가리키는 데 사용됩니다. 예를 들어 SR-IOV 가능 이더넷 장치의 가상 기능을 위해 PXE 부팅ROM을 제공하는 데 유용할 수 있습니다(Vernet에는 VF에 부팅 Makefile이 없음).
address 또한 USB 버스와 장치 번호를 지정하는 버스 및 장치 속성이 있으며, 호스트 물리적 시스템의 장치에 표시됩니다. 이러한 속성의 값은 10진수, 16진수(0x로 시작) 또는 8진수(0으로 시작) 양식으로 지정할 수 있습니다. PCI 장치의 경우 요소는 lspci 또는 virsh nodedev-list 를 사용하여 찾을 수 있는 장치를 지정할 수 있는 세 가지 속성을 제공합니다.

23.17.5.2. 블록 / 문자 장치

호스트 물리적 시스템의 블록 / 문자 장치는 관리 도구를 사용하여 도메인 XML hostdev 요소를 수정하여 게스트 가상 시스템으로 전달할 수 있습니다. 이는 컨테이너 기반 가상화에서만 가능합니다.

그림 23.41. 장치 - 호스트 물리적 시스템 장치 할당 블록 문자 장치


...
<hostdev mode='capabilities' type='storage'>
  <source>
    <block>/dev/sdf1</block>
  </source>
</hostdev>
...
   

대체 방법은 다음과 같습니다.

그림 23.42. 장치 - 호스트 물리적 시스템 장치 할당 블록 장치 대신 1


...
<hostdev mode='capabilities' type='misc'>
  <source>
    <char>/dev/input/event3</char>
  </source>
</hostdev>
...
    

또 다른 방법은 다음과 같습니다.

그림 23.43. 장치 - 호스트 물리적 시스템 장치 할당 블록 장치 대안 2


...
<hostdev mode='capabilities' type='net'>
  <source>
    <interface>eth0</interface>
  </source>
</hostdev>
...



도메인 XML의 이 섹션의 구성 요소는 다음과 같습니다.

표 23.17. 블록 / 문자 장치 요소

매개변수 설명
hostdev 호스트 물리적 시스템 장치를 설명하는 기본 컨테이너입니다. 블록/자기 장치의 경우 패스스루 모드는 항상 기능이며, 문자 장치의 경우 type블록 장치 및 char 에 대한 블록입니다.
소스 이는 호스트 물리적 시스템에서 볼 수 있는 장치를 설명합니다. 블록 장치의 경우 호스트 물리적 시스템 운영 체제의 블록 장치에 대한 경로는 중첩된 블록 요소에서 제공되며, 문자 장치의 경우 char 요소가 사용됩니다.

23.17.6. 리디렉션 장치

문자 장치를 통한 USB 장치 리디렉션은 도메인 XML의 다음 섹션을 수정하여 구성됩니다.

그림 23.44. 장치 - 리디렉션 장치


  ...
  <devices>
    <redirdev bus='usb' type='tcp'>
      <source mode='connect' host='localhost' service='4000'/>
      <boot order='1'/>
    </redirdev>
    <redirfilter>
      <usbdev class='0x08' vendor='0x1234' product='0xbeef' version='2.00' allow='yes'/>
      <usbdev allow='no'/>
    </redirfilter>
  </devices>
  ...

도메인 XML의 이 섹션의 구성 요소는 다음과 같습니다.

표 23.18. 리디렉션된 장치 요소

매개변수 설명
redirdev 리디렉션된 장치를 설명하는 주요 컨테이너입니다. 버스 는 USB 장치용 usb 여야 합니다. 지원되는 직렬 장치 유형 중 하나를 사용하여 터널: type='tcp' 또는 type='spicevmc'( SPICE 그래픽 장치의 usbredir 채널을 사용하는 type='spicevmc' 를 설명하는 지원되는 직렬 장치 유형 중 하나를 지정해야 합니다. redirdev 요소에는 장치를 특정 컨트롤러에 연결할 수 있는 선택적 하위 요소 주소 가 있습니다. 소스 와 같은 추가 하위 요소(예: 소스 )는 특정 유형에 따라 필요할 수 있지만 대상 하위 요소는 필요하지 않지만 대상 하위 요소는 필요하지 않습니다(게스트 가상 머신에 표시되는 장치가 아닌 문자 장치의 소비자는 하이퍼 바이저 자체임).
boot 장치를 부팅할 수 있도록 지정합니다. order 속성은 부팅 시퀀스 중에 장치를 시도할 순서를 결정합니다. 장치별 부팅 요소는 BIOS 부트 로더 섹션의 일반 부팅 요소와 함께 사용할 수 없습니다.
redirfilter 이는 리디렉션에서 특정 장치를 필터링하는 데 필터 규칙을 생성하는 데 사용됩니다. 하위 요소 usbdev 를 사용하여 각 필터 규칙을 정의합니다. class 속성은 USB 클래스 코드입니다.

23.17.7. 스마트 카드 장치

가상 스마트 카드 장치는 스마트 카드 요소를 통해 게스트 가상 머신에 제공할 수 있습니다. 호스트 물리적 머신의 USB 스마트 카드 리더 장치는 장치 패스스루가 있는 게스트 가상 시스템에서 사용할 수 없습니다. 이는 호스트 물리적 시스템과 게스트 가상 시스템에서 모두 사용할 수 없으므로 게스트 가상 시스템에서 제거될 때 호스트 물리적 시스템 컴퓨터를 잠글 수 있기 때문입니다. 따라서 일부 하이퍼바이저는 게스트 가상 머신에 스마트 카드 인터페이스를 제공할 수 있는 특수 가상 장치를 제공하며, 호스트 물리적 시스템에서 또는 타사 스마트 카드 공급자로 생성된 채널에서 인증 정보를 얻는 방법을 설명하는 몇 가지 모드를 제공합니다.
도메인 XML의 다음 섹션을 수정하려면 관리 도구로 문자 장치를 통해 USB 장치 리디렉션을 구성합니다.

그림 23.45. 장치 - 스마트 카드 장치


  ...
  <devices>
    <smartcard mode='host'/>
    <smartcard mode='host-certificates'>
      <certificate>cert1</certificate>
      <certificate>cert2</certificate>
      <certificate>cert3</certificate>
      <database>/etc/pki/nssdb/</database>
    </smartcard>
    <smartcard mode='passthrough' type='tcp'>
      <source mode='bind' host='127.0.0.1' service='2001'/>
      <protocol type='raw'/>
      <address type='ccid' controller='0' slot='0'/>
    </smartcard>
    <smartcard mode='passthrough' type='spicevmc'/>
  </devices>
  ...

smartcard 요소에는 필수 특성 모드가 있습니다. 각 모드에서 게스트 가상 머신은 실제 USB CCID(Chip/Smart Card Interface 장치) 카드처럼 작동하는 USB 버스의 장치를 확인합니다.
모드 속성은 다음과 같습니다.

표 23.19. 스마트 카드 모드 요소

매개변수 설명
mode='host' 이 모드에서 하이퍼바이저는 게스트 가상 머신의 모든 요청을 NSS를 통해 호스트 물리적 시스템의 스마트 카드에 직접 액세스할 수 있도록 릴레이합니다. 다른 속성이나 하위 요소가 필요하지 않습니다. 선택적 주소 하위 요소 사용에 대한 아래를 참조하십시오.
mode='host-certificates' 이 모드를 사용하면 스마트 카드를 호스트 물리적 시스템에 연결해야 하는 대신 호스트 물리적 시스템의 데이터베이스에 있는 세 개의 NSS 인증서 이름을 제공할 수 있습니다. 이러한 인증서는 certutil -d /etc/pki/nssdb -x -tGPU,CT,CT -S -s CN=cert1 -n cert1 명령을 사용하여 생성할 수 있으며 결과 3개의 인증서 이름을 각각 세 개의 인증서 하위 요소 콘텐츠로 제공해야 합니다. 추가 하위 요소 데이터베이스 는 대체 디렉터리의 절대 경로를 지정할 수 있습니다(인증서를 생성할 때 certutil 명령의 -d 플래그 일치)가 존재하지 않는 경우 기본값은 /etc/pki/nssdb 입니다.
mode='passthrough' 이 모드를 사용하면 보조 문자 장치를 통해 모든 요청을 타사 제공자에게 터널링하거나 하이퍼바이저가 호스트 물리적 시스템과 직접 통신하는 대신 3개의 인증서 파일을 사용할 수 있습니다. 이 작업 모드에서는 지원되는 직렬 장치 유형 중 하나와 일치하는 추가 속성 유형이 필요하며 터널의 호스트 물리적 시스템 측면을 설명할 수 있습니다. type='tcp' 또는 type='spicevmc' ( SPICE 그래픽 장치의 스마트 카드 채널을 사용하는)는 일반적입니다. 소스 와 같은 추가 하위 요소(예: 소스 )는 지정된 유형에 따라 필요할 수 있지만 대상 하위 요소(대상 하위 요소 사용자는 게스트 가상 머신에 표시되는 장치가 아닌) 문자 장치의 소비자가 하이퍼바이저 자체임을 가정할 수 있습니다.
각 모드는 스마트 카드와 ccid 버스 컨트롤러 간의 상관관계를 미세 조정하는 선택적 하위 요소 주소. 자세한 내용은 23.17.2절. “장치 주소”을 참조하십시오.

23.17.8. 네트워크 인터페이스

관리 툴을 사용하여 네트워크 인터페이스 장치를 수정하여 도메인 XML의 다음 부분을 구성합니다.

그림 23.46. devices - 네트워크 인터페이스


  ...
  <devices>
    <interface type='direct' trustGuestRxFilters='yes'>
      <source dev='eth0'/>
      <mac address='52:54:00:5d:c7:9e'/>
      <boot order='1'/>
      <rom bar='off'/>
    </interface>
  </devices>
  ...

게스트 가상 머신에 대한 네트워크 인터페이스를 구성할 수 있는 방법은 여러 가지가 있습니다. 이는 값을 interface 요소의 type 속성으로 설정하여 수행됩니다. 다음 값을 사용할 수 있습니다.
  • "direct" - 게스트 가상 머신의 NIC를 호스트 물리적 머신의 물리적 NIC에 연결합니다. 자세한 내용 및 예제는 23.17.8.6절. “물리적 인터페이스에 직접 첨부” 을 참조하십시오.
  • "네트워크" - 동적 또는 무선 네트워킹 구성이 있는 호스트 물리적 머신에서 일반 게스트 가상 머신 연결에 권장되는 구성입니다. 자세한 내용 및 예제는 23.17.8.1절. “가상 네트워크” 을 참조하십시오.
  • "Bridge" - 정적 유선 네트워킹 구성이 있는 호스트 물리적 머신에서 게스트 가상 머신 연결에 권장되는 구성 설정입니다. 자세한 내용 및 예제는 23.17.8.2절. “LAN으로 브리지” 을 참조하십시오.
  • "Ethernet" - 관리자가 게스트 가상 시스템의 네트워크를 LAN에 연결하는 임의의 스크립트를 실행할 수 있는 수단을 제공합니다. 자세한 내용 및 예제는 23.17.8.5절. “일반 이더넷 연결” 을 참조하십시오.
  • "hostdev" - 일반 장치 패스스루를 사용하여 PCI 네트워크 장치를 게스트 가상 머신에 직접 할당할 수 있습니다. 자세한 내용 및 예제는 23.17.8.7절. “PCI 패스스루” 을 참조하십시오.
  • "MCAST" - 멀티 캐스트 그룹을 사용하여 가상 네트워크를 나타낼 수 있습니다. 자세한 내용 및 예제는 23.17.8.8절. “멀티 캐스트 터널” 을 참조하십시오.
  • "user" - user 옵션을 사용하면 사용자 공간 SLIRP 스택 매개 변수를 설정하여 NAT를 사용하는 가상 LAN을 외부 환경에 제공합니다. 자세한 내용 및 예제는 23.17.8.4절. “사용자 공간 SLIRP 스택” 을 참조하십시오.
  • "서버" - 서버 옵션을 사용하면 하나의 게스트 가상 머신이 서버의 서버 엔드를 제공하고 다른 모든 게스트 가상 시스템이 클라이언트로 구성된 가상 네트워크를 제공하기 위해 TCP 클라이언트-서버 아키텍처를 생성합니다. 자세한 내용 및 예제는 23.17.8.9절. “TCP 터널” 을 참조하십시오.
이러한 각 옵션에는 자세한 내용을 확인할 수 있는 링크가 있습니다. 또한 각 <인터페이스> 요소는 선택적 <trustGuestRxFilters> 속성으로 정의될 수 있습니다. 그러면 호스트 물리적 머신이 게스트 가상 머신에서 수신한 보고서를 탐지하고 신뢰할 수 있습니다. 이러한 보고서는 인터페이스가 필터에 대한 변경을 수신할 때마다 전송됩니다. 여기에는 기본 MAC 주소, 장치 주소 필터 또는 vlan 구성의 변경 사항이 포함됩니다. 보안상의 이유로 <trustGuestRxFilters> 속성은 기본적으로 비활성화되어 있습니다. 또한 이 속성에 대한 지원은 게스트 네트워크 장치 모델 및 호스트 물리적 시스템의 연결 유형에 따라 달라집니다. 현재는 호스트 물리적 시스템의 virtio 장치 모델 및 macvtap 연결에 대해서만 지원됩니다. 게스트가 설정한 필터도 호스트에 미러링되므로 게스트가 선택적 매개변수 <trustGuestRxFilters> 를 설정하는 것이 좋습니다. 게스트 가상 머신에 호스트 물리적 머신 사이드 필터를 제어할 수 있는 권한을 부여하려는 경우입니다.
위에 나열된 속성 외에도 각 <인터페이스> 요소에는 type='pci' 속성과 함께 인터페이스를 특정 PCI 슬롯에 연결할 수 있는 선택적 <주소> 하위 요소를 사용할 수 있습니다. 자세한 내용은 23.17.2절. “장치 주소”의 내용을 참조하십시오.

23.17.8.1. 가상 네트워크

동적 또는 무선 네트워킹 구성이 있는 호스트 물리적 머신 연결(또는 <네트워크> 정의에서 별도로 설명된 호스트 물리적 머신 하드웨어 세부 정보)에 대한 일반 게스트 가상 머신 연결에 권장되는 구성입니다. 또한 named 네트워크 정의에서 설명하는 세부 정보와 연결을 제공합니다. 가상 네트워크의 전달 모드 구성에 따라 NAT를 사용하여 명시적 네트워크 장치 또는 기본 경로(전달모드='nat')에 연결하고 NAT를 사용하지 않고 라우팅되거나 MACvtap 네트워크 인터페이스( macvtap 네트워크 인터페이스)를 사용하여 직접 라우팅되거나 MACvtap 브리지를 사용하여 네트워크를 완전히 격리수 있습니다. <>
브리지 의 전달 모드,프라이빗,vepa, 통과 가 있는 네트워크의 경우 호스트 물리적 시스템에 필요한 DNS 및 DHCP 서비스가 이미 libvirt 범위 외부에 설정되어 있는 것으로 가정합니다. 격리된 네트워크, nat 및 라우팅된 네트워크의 경우 DHCP 및 DNS는 libvirt에 의해 가상 네트워크에서 제공되며 IP 범위는 virsh net-dumpxml [networkname] 으로 가상 네트워크 구성을 검사하여 확인할 수 있습니다. 상자에서 설정되는 'default' 가상 네트워크는 NAT를 사용하여 기본 경로에 연결하고 IP 범위가 192.168.122.0/255.255.0입니다. 각 게스트 가상 머신에는 vnetN이라는 이름으로 생성된 관련 tun 장치가 있으며 <대상> 요소( 23.17.8.11절. “대상 요소 덮어쓰기”참조)로 재정의할 수도 있습니다.
인터페이스의 소스가 네트워크인 경우, 포트 그룹을 네트워크 이름과 함께 지정할 수 있습니다. 하나의 네트워크에는 여러 개의 포트 그룹이 정의되어 있고 각 포트 그룹은 서로 다른 네트워크 연결 클래스에 대해 약간 다른 구성 정보가 포함되어 있습니다. 또한 <직접> 네트워크 연결(아래 설명됨)과 유사하게 유형 네트워크의 연결은 802.1Qbg 또는 802.1Qbh 호환 Virtual Ethernet Port Aggregator (VEPA) 스위치 또는 Open vSwitch 가상 스위치로 전달될 구성 데이터를 사용하여 <virtualport> 요소를 지정할 수 있습니다.
스위치 유형은 호스트 물리적 시스템의 <network> 요소의 구성 설정에 따라 달라지므로 <virtualport 유형> 특성을 생략할 수 있습니다. <가상 포트 유형을> 한 번 또는 여러 번 지정해야 합니다. 도메인이 완전한 <virtualport> 요소를 시작하면 정의된 유형 및 속성을 함께 병합하여 구성됩니다. 그러면 새로 구성된 가상 포트가 생성됩니다. 하위 가상 포트의 속성은 상위 가상 포트에 정의된 속성을 변경할 수 없습니다. 인터페이스는 우선 순위가 가장 높은 반면 포트 그룹은 우선 순위가 가장 낮습니다.
예를 들어 802.1Qbh 스위치와 Open vSwitch 스위치를 모두 사용하여 제대로 작동하는 네트워크를 만들려면 유형을 지정하지 않아도 profileidinterfaceid 를 모두 제공해야 합니다. managerid,typeid, profileid 와 같이 가상 포트에서 채울 다른 속성은 선택 사항입니다.
게스트 가상 머신이 특정 유형의 스위치에만 연결되도록 제한하려면 virtualport 유형을 지정할 수 있으며 지정된 포트 유형의 스위치만 연결됩니다. 추가 매개변수를 지정하여 스위치 연결을 추가로 제한할 수도 있습니다. 결과적으로 포트가 지정되고 호스트 물리적 시스템의 네트워크에 다른 유형의 virtualport가 있는 경우 인터페이스의 연결이 실패합니다. 가상 네트워크 매개 변수는 도메인 XML의 다음 부분을 수정하는 관리 툴을 사용하여 정의합니다.

그림 23.47. 장치 - 네트워크 인터페이스- 가상 네트워크


  ...
  <devices>
    <interface type='network'>
      <source network='default'/>
    </interface>
    ...
    <interface type='network'>
      <source network='default' portgroup='engineering'/>
      <target dev='vnet7'/>
      <mac address="00:11:22:33:44:55"/>
      <virtualport>
        <parameters instanceid='09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f'/>
      </virtualport>

    </interface>
  </devices>
  ...

23.17.8.2. LAN으로 브리지

에서 언급한 대로 23.17.8절. “네트워크 인터페이스” 는 정적 유선 네트워킹 구성이 있는 호스트 물리적 머신에서 게스트 가상 머신을 연결하는 데 권장되는 설정입니다.
LAN으로의 브릿지는 게스트 가상 시스템의 브릿지를 LAN으로 직접 제공합니다. 이는 호스트 물리적 시스템 중 하나 이상의 물리적 NIC가 종속된 호스트 물리적 시스템에 브리지 장치가 있다고 가정합니다. 게스트 가상 머신에는 <vnetN> 이라는 이름으로 생성된 관련 tun 장치가 있으며, <대상> 요소( 23.17.8.11절. “대상 요소 덮어쓰기”참조)로 재정의할 수도 있습니다. <tun> 장치는 브리지에 종속됩니다. IP 범위 또는 네트워크 구성은 LAN에서 사용되는 것과 동일합니다. 이렇게 하면 실제 시스템과 마찬가지로 전체 수신 및 발신 네트워크 액세스 권한이 제공됩니다.
Linux 시스템에서 브리지 장치는 일반적으로 표준 Linux 호스트 물리적 시스템 브릿지입니다. Open vSwitch를 지원하는 호스트 물리적 시스템에서는 인터페이스 정의에 virtualport type='openvswitch'/ 를 추가하여 Open vSwitch 브리지 장치에 연결할 수도 있습니다. Open vSwitch 유형 virtualport 는 해당 매개변수 요소에서 두 개의 매개 변수를 허용합니다. interfaceid 는 Open vSwitch에 이 특정 인터페이스를 고유하게 식별하는 데 사용되는 표준 UUID인 interfaceid와 인터페이스를 처음 정의할 때 임의의 interfaceid 가 생성되며, 인터페이스 <포트-profile> 으로 Open vSwitch로 전송되는 선택적 profileid 를 사용할 수 있습니다. 브리지를 LAN 설정으로 설정하려면 도메인 XML의 다음 부분을 구성할 관리 도구를 사용합니다.

그림 23.48. devices - 네트워크 인터페이스- LAN


  ...
  <devices>
    ...
    <interface type='bridge'>
      <source bridge='br0'/>
    </interface>
    <interface type='bridge'>
      <source bridge='br1'/>
      <target dev='vnet7'/>
      <mac address="00:11:22:33:44:55"/>
    </interface>
    <interface type='bridge'>
      <source bridge='ovsbr'/>
      <virtualport type='openvswitch'>
        <parameters profileid='menial' interfaceid='09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f'/>
      </virtualport>
    </interface>
    ...
  </devices>

23.17.8.3. 포트 마스커레이딩 범위 설정

포트 마스커레이딩 범위를 설정하려면 다음과 같이 포트를 설정합니다.

그림 23.49. 포트 마스커레이딩 범위


<forward mode='nat'>
   <address start='1.2.3.4' end='1.2.3.10'/>
</forward>  ...

이러한 값은 에 표시된 대로 iptables 명령을 사용하여 설정해야 합니다. 17.3절. “네트워크 주소 변환”

23.17.8.4. 사용자 공간 SLIRP 스택

사용자 공간 SLIRP 스택 매개 변수를 설정하면 NAT를 사용하는 가상 LAN이 외부 환경에 제공됩니다. 가상 네트워크에는 DHCP 및 DNS 서비스가 있으며 게스트 가상 머신에 10.0.2.15부터 IP 주소를 제공합니다. 기본 라우터는 10.0.2.2이며 DNS 서버는 10.0.2.3입니다. 이 네트워킹은 나가는 액세스 권한이 있는 게스트 가상 머신이 필요한 권한이 없는 사용자에게만 해당됩니다.
사용자 공간 SLIRP 스택 매개변수는 도메인 XML의 다음 부분에서는 정의됩니다.

그림 23.50. 장치 - 네트워크 인터페이스-사용자 공간 SLIRP 스택


  ...
  <devices>
    <interface type='user'/>
    ...
    <interface type='user'>
      <mac address="00:11:22:33:44:55"/>
    </interface>
  </devices>
  ...

23.17.8.5. 일반 이더넷 연결

이를 통해 관리자는 게스트 가상 시스템의 네트워크를 LAN에 연결하는 임의의 스크립트를 실행할 수 있습니다. 게스트 가상 머신에는 vnetN 이라는 이름으로 생성된 <tun> 장치가 있으며, <대상> 요소로도 재정의할 수 있습니다. tun 장치를 만든 후 쉘 스크립트가 실행되고 필요한 호스트 물리적 시스템 네트워크 통합을 완료합니다. 기본적으로 이 스크립트는 /etc/qemu-ifup 이라고 하지만 재정의할 수 있습니다( 23.17.8.11절. “대상 요소 덮어쓰기”참조).
일반 이더넷 연결 매개 변수는 도메인 XML의 다음 부분에서 정의됩니다.

그림 23.51. devices - 네트워크 인터페이스-일반 이더넷 연결


  ...
  <devices>
    <interface type='ethernet'/>
    ...
    <interface type='ethernet'>
      <target dev='vnet7'/>
      <script path='/etc/qemu-ifup-mynet'/>
    </interface>
  </devices>
  ...

23.17.8.6. 물리적 인터페이스에 직접 첨부

물리적 인터페이스가 지정된 경우 게스트 가상 머신의 NIC를 호스트 물리적 시스템의 실제 인터페이스에 직접 연결합니다.
이를 위해서는 Linux macvtap 드라이버를 사용할 수 있어야 합니다. 다음 모드 특성 값 vepa ('Virtual Ethernet Port Aggregator'), bridge 또는 private 중 하나를 macvtap 장치의 작업 모드로 선택할 수 있습니다. vepa 는 기본 모드입니다.
물리적 인터페이스에 직접 첨부 파일을 조작하려면 도메인 XML의 이 섹션에서 다음 매개 변수를 설정합니다.

그림 23.52. 장치 - 네트워크 인터페이스- 물리적 인터페이스에 직접 연결


  ...
  <devices>
    ...
    <interface type='direct'>
      <source dev='eth0' mode='vepa'/>
    </interface>
  </devices>
  ...

개별 모드에서는 표 23.20. “물리적 인터페이스 요소에 직접 첨부” 에 표시된 대로 패킷의 전달이 작동합니다.

표 23.20. 물리적 인터페이스 요소에 직접 첨부

element 설명
VEPA 모든 게스트 가상 머신의 패킷은 외부 브리지로 전송됩니다. 패킷이 생성되는 것과 동일한 호스트 물리적 시스템의 게스트 가상 시스템인 패킷은 VEPA 가능 브릿지(일반적으로 VEPA가 작동하지 않음)에 의해 호스트 물리적 시스템으로 다시 전송됩니다.
bridge 대상이 시작되는 것과 동일한 호스트 물리적 시스템에 있는 패킷은 대상 macvtap 장치로 직접 전달됩니다. 직접 전달하려면 원본 및 대상 장치가 브리지 모드에 있어야 합니다. 둘 중 하나가 비호환 모드이면 VEPA 가능 브릿지가 필요합니다.
private 모든 패킷은 외부 브리지로 전송되며 외부 라우터 또는 게이트웨이를 통해 전송되는 경우에만 동일한 호스트 물리적 시스템의 대상 가상 시스템으로 전송되고 해당 장치는 호스트 물리적 시스템으로 다시 전송됩니다. 다음 절차는 소스 또는 대상 장치가 개인 모드인 경우 수행됩니다.
passthrough 이 기능은 마이그레이션 기능을 손실하지 않고 SR-IOV 가능 NIC의 가상 기능을 게스트 가상 머신에 직접 연결합니다. 모든 패킷은 구성된 네트워크 장치의 VF/IF로 전송됩니다. 장치의 기능에 따라 추가 사전 요구 사항 또는 제한 사항이 적용될 수 있습니다. 예를 들어, 여기에는 커널 2.6.38 이상이 필요합니다.
직접 연결된 가상 시스템의 네트워크 액세스는 호스트 물리적 시스템의 물리적 인터페이스가 연결된 하드웨어 스위치로 관리할 수 있습니다.
이 인터페이스에는 스위치가 IEEE 802.1Qbg 표준을 준수하는 경우 다음과 같은 추가 매개 변수가 있을 수 있습니다. virtualport 요소의 매개 변수는 IEEE 802.1Qbg 표준에 자세히 설명되어 있습니다. 값은 네트워크별로 다르며 네트워크 관리자가 제공해야 합니다. 802.1Qbg 용어에서 VSI(Virtual Group Interface)는 가상 머신의 가상 인터페이스를 나타냅니다.
IEEE 802.1Qbg에는 VLAN ID에 0이 아닌 값이 필요합니다.
조작될 수 있는 추가 요소는 표 23.21. “물리적 인터페이스 추가 요소에 직접 첨부” 에 설명되어 있습니다.

표 23.21. 물리적 인터페이스 추가 요소에 직접 첨부

element 설명
managerid VSI 관리자 ID는 VSI 유형 및 인스턴스 정의가 포함된 데이터베이스를 식별합니다. 이는 정수 값이며 값 0 이 예약되어 있습니다.
typeid VSI 유형 ID는 네트워크 액세스를 문자 지정하는 VSI 유형을 식별합니다. VSI 유형은 일반적으로 네트워크 관리자가 관리합니다. 정수 값입니다.
typeidversion VSI 유형 버전에서는 VSI 유형의 여러 버전을 사용할 수 있습니다. 정수 값입니다.
instanceid VSI 인스턴스(가상 머신의 가상 인터페이스)가 생성되면 VSI 인스턴스 식별자가 생성됩니다. 이는 전역적으로 고유 식별자입니다.
profileid 프로필 ID에는 이 인터페이스에 적용할 포트 프로필 이름이 포함되어 있습니다. 이 이름은 port 프로필 데이터베이스에서 포트 프로필의 네트워크 매개 변수로 확인되고 해당 네트워크 매개 변수가 이 인터페이스에 적용됩니다.
도메인 XML의 추가 매개 변수는 다음과 같습니다.

그림 23.53. devices - 네트워크 인터페이스- 물리적 인터페이스에 직접 연결


  ...
  <devices>
    ...
    <interface type='direct'>
      <source dev='eth0.2' mode='vepa'/>
      <virtualport type="802.1Qbg">
        <parameters managerid="11" typeid="1193047" typeidversion="2" instanceid="09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f"/>
      </virtualport>
    </interface>
  </devices>
  ...

이 인터페이스는 스위치가 IEEE 802.1Qbh 표준을 준수하는 경우와 같이 추가 매개 변수를 가질 수 있습니다. 값은 네트워크별로 다르며 네트워크 관리자가 제공해야 합니다.
도메인 XML의 추가 매개 변수는 다음과 같습니다.

그림 23.54. 장치 - 네트워크 인터페이스 - 물리적 인터페이스에 직접 연결하여 더 많은 추가 매개 변수


  ...
  <devices>
    ...
    <interface type='direct'>
      <source dev='eth0' mode='private'/>
      <virtualport type='802.1Qbh'>
        <parameters profileid='finance'/>
      </virtualport>
    </interface>
  </devices>
  ...

profileid 특성에는 이 인터페이스에 적용할 포트 프로필의 이름이 포함되어 있습니다. 이 이름은 port 프로필 데이터베이스에서 포트 프로필의 네트워크 매개 변수로 확인되고 해당 네트워크 매개 변수가 이 인터페이스에 적용됩니다.

23.17.8.7. PCI 패스스루

PCI 네트워크 장치( 소스 요소로 지정됨)는 먼저 장치의 MAC 주소를 구성된 값으로 설정한 후 일반 장치 패스스루를 사용하여 게스트 가상 시스템에 직접 할당되며, 장치를 선택적으로 지정된 virtualport 요소를 사용하여 연결할 수 있습니다(Type ='direct 네트워크 장치에 대해 제공된 virtualport 예제 참조). 표준 단일 포트 PCI 이더넷 카드 드라이버 설계의 제한으로 인해 SR-IOV(Single Root I/O Virtualization) 가상 기능(VF) 장치만 이러한 방식으로 할당할 수 있습니다. 게스트 가상 머신에 표준 단일 포트 PCI 또는 PCIe 이더넷 카드를 할당하려면 기존 hostdev 장치 정의를 사용합니다.
네트워크 장치의 "intelligent passthrough"은 표준 hostdev 장치의 기능과 매우 유사하며, 이 방법은 통과된 장치에 대한 MAC 주소와 virtualport 를 지정할 수 있다는 점입니다. 이러한 기능이 필요하지 않은 경우 SR-IOV를 지원하지 않는 표준 단일 포트 PCI, PCIe 또는 USB 네트워크 카드가 있는 경우 (따라서 게스트 가상 머신 도메인에 할당되는 동안 구성된 MAC 주소가 손실됨) 또는 0.9.11 이전의 libvirt 버전을 사용하는 경우 표준 hostdev 정의를 사용하여 게스트 가상 머신 인터페이스 유형 대신 장치를 할당합니다.

그림 23.55. 장치 - 네트워크 인터페이스 PCI 패스스루


  ...
  <devices>
    <interface type='hostdev'>
      <driver name='vfio'/>
      <source>
        <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
      </source>
      <mac address='52:54:00:6d:90:02'>
      <virtualport type='802.1Qbh'>
        <parameters profileid='finance'/>
      </virtualport>
    </interface>
  </devices>
  ...

23.17.8.8. 멀티 캐스트 터널

멀티 캐스트 그룹을 사용하여 가상 네트워크를 나타낼 수 있습니다. 동일한 멀티 캐스트 그룹 내에 네트워크 장치가 있는 게스트 가상 머신은 여러 물리적 호스트 물리적 시스템에 상주하는 경우에도 서로 통신합니다. 이 모드는 권한이 없는 사용자로 사용할 수 있습니다. 기본 DNS 또는 DHCP를 지원하지 않으며 발신 네트워크 액세스가 없습니다. 나가는 네트워크 액세스를 제공하려면 게스트 가상 머신 중 하나에 적절한 라우팅을 제공하기 위해 첫 번째 4개의 네트워크 유형 중 하나에 연결된 두 번째 NIC가 있어야 합니다. 멀티 캐스트 프로토콜은 사용자 모드 Linux 게스트 가상 머신에서 사용하는 프로토콜과 호환됩니다. 사용된 소스 주소는 멀티캐스트 주소 블록이어야 합니다. 멀티 캐스트 터널은 관리 툴을 사용하여 인터페이스 유형을 조작하고 이를 mcast 로 설정하고 mac 주소 및 소스 주소를 제공하여 생성됩니다. 예를 들면 다음과 같습니다.

그림 23.56. 장치 - 네트워크 인터페이스 멀티 캐스트 터널


  ...
  <devices>
    <interface type='mcast'>
      <mac address='52:54:00:6d:90:01'>
      <source address='230.0.0.1' port='5558'/>
    </interface>
  </devices>
  ...

23.17.8.9. TCP 터널

TCP 클라이언트-서버 아키텍처를 생성하는 또 다른 방법은 하나의 게스트 가상 시스템이 네트워크 종료를 제공하고 다른 모든 게스트 가상 시스템이 클라이언트로 구성되는 가상 네트워크를 제공하는 또 다른 방법입니다. 게스트 가상 머신 간의 모든 네트워크 트래픽은 서버로 구성된 게스트 가상 머신을 통해 라우팅됩니다. 이 모델은 권한이 없는 사용자에게도 사용할 수 있습니다. 기본 DNS 또는 DHCP를 지원하지 않으며 발신 네트워크 액세스가 없습니다. 발신 네트워크 액세스를 제공하기 위해 게스트 가상 머신 중 하나에 첫 번째 4 네트워크 유형 중 하나에 연결된 두 번째 NIC가 있어야 적절한 라우팅을 제공합니다. TCP 터널은 관리 툴을 사용하여 인터페이스 유형을 조작하고 이를 mcast 로 설정하고 mac 주소 및 소스 주소를 제공하여 생성됩니다. 예를 들면 다음과 같습니다.

그림 23.57. 장치 - 네트워크 인터페이스- TCP 터널


  ...
  <devices>
    <interface type='server'>
      <mac address='52:54:00:22:c9:42'>
      <source address='192.168.0.1' port='5558'/>
    </interface>
    ...
    <interface type='client'>
      <mac address='52:54:00:8b:c9:51'>
      <source address='192.168.0.1' port='5558'/>
    </interface>
  </devices>
  ...

23.17.8.10. NIC 드라이버별 옵션 설정

일부 NIC에는 조정 가능한 드라이버별 옵션이 있을 수 있습니다. 이러한 옵션은 인터페이스 정의의 드라이버 하위 요소의 특성으로 설정됩니다. 이러한 옵션은 관리 도구를 사용하여 도메인 XML의 다음 섹션을 구성하는 방식으로 설정됩니다.

그림 23.58. 장치 - 네트워크 인터페이스 설정 NIC 드라이버별 옵션


  <devices>
    <interface type='network'>
      <source network='default'/>
      <target dev='vnet1'/>
      <model type='virtio'/>
      <driver name='vhost' txmode='iothread' ioeventfd='on' event_idx='off'/>
    </interface>
  </devices>
  ...

"virtio" NIC 드라이버에서 다음 속성을 사용할 수 있습니다.

표 23.22. virtio NIC 드라이버 요소

매개변수 설명
name 선택적 name 속성은 사용할 백엔드 드라이버 유형을 강제 적용합니다. 값은 kvm (사용자 공간 백엔드) 또는 vhost (커널 백엔드)일 수 있습니다. 커널에서 vhost 모듈을 제공해야 합니다. 커널 지원 없이 vhost 드라이버를 요구하려고 합니다. 기본 설정은 vhost 드라이버가 있는 경우 vhost이지만 그렇지 않은 경우 kvm 으로 자동으로 대체됩니다.
txmode 전송 버퍼가 가득 찰 때 패킷의 전송을 처리하는 방법을 지정합니다. 값은 iothread 또는 timer 일 수 있습니다. iothread 로 설정하면 패킷 tx는 모두 드라이버의 하단의 iothread에서 수행됩니다. (이 옵션은 "tx=bh"kvm 명령 줄 "-device" virtio-net-pci 옵션에 추가함). 타이머 로 설정하면 KVM에서 tx 작업이 수행되며 현재 시간에 전송할 수 있는 것보다 더 많은 tx 데이터가 있는 경우 KVM이 다른 작업을 수행하기 전에 타이머가 설정됩니다. 타이머가 실행되면 더 많은 데이터를 전송하려고 시도합니다. 이 값은 변경하지 않는 것이 좋습니다.
ioeventfd 인터페이스 장치에 대한 도메인 I/O 비동기 처리를 설정합니다. 기본값은 하이퍼바이저의 재량에 따라 다릅니다. 허용되는 값은 설정 및 해제 입니다. 이 옵션을 활성화하면 KVM은 별도의 스레드가 I/O를 처리하는 동안 게스트 가상 머신을 실행할 수 있습니다. 일반적으로 I/O 중 높은 시스템 CPU 사용률이 발생하는 게스트 가상 시스템은 이러한 이점을 활용할 수 있습니다. 반면 물리적 호스트 시스템의 과부하는 게스트 가상 머신 I/O 대기 시간을 늘릴 수 있습니다. 이 값은 변경하지 않는 것이 좋습니다.
event_idx event_idx 속성은 장치 이벤트 처리의 일부 측면을 제어합니다. 값이 on 또는 off 중 하나일 수 있습니다. 의 기본값은 인터럽트 수를 줄이고 게스트 가상 머신에 대해 종료됩니다. 이 동작이 하위 선택인 경우 이 속성은 기능을 강제로 해제할 수 있는 방법을 제공합니다. 이 값은 변경하지 않는 것이 좋습니다.

23.17.8.11. 대상 요소 덮어쓰기

대상 요소를 재정의하려면 관리 도구를 사용하여 도메인 XML을 다음과 같이 변경합니다.

그림 23.59. devices - 네트워크 인터페이스-대상 요소를 덮어씁니다.


  ...
  <devices>
    <interface type='network'>
      <source network='default'/>
      <target dev='vnet1'/>
    </interface>
  </devices>
  ...

대상을 지정하지 않으면 특정 하이퍼바이저가 생성된 tun 장치의 이름을 자동으로 생성합니다. 이 이름은 수동으로 지정할 수 있지만 이름은 libvirt 및 특정 하이퍼바이저에서 예약된 접두사인 vnet 또는 vif 로 시작할 수 없습니다. 이러한 접두사를 사용하여 수동으로 지정한 대상은 무시됩니다.

23.17.8.12. 부팅 순서 지정

부팅 순서를 지정하려면 관리 도구를 사용하여 도메인 XML을 다음과 같이 변경합니다.

그림 23.60. 부팅 순서 지정


  ...
  <devices>
    <interface type='network'>
      <source network='default'/>
      <target dev='vnet1'/>
      <boot order='1'/>
    </interface>
  </devices>
  ...
이를 지원하는 하이퍼바이저에서는 네트워크 부팅에 사용할 특정 NIC를 설정할 수 있습니다. 속성 순서는 부팅 시퀀스 중에 장치를 시도하는 순서를 결정합니다. 장치별 부팅 요소는 BIOS 부트 로더 섹션의 일반 부팅 요소와 함께 사용할 수 없습니다.

23.17.8.13. 인터페이스 Makefile BIOS 구성

Makefile BIOS 구성 설정을 지정하려면 관리 도구를 사용하여 도메인 XML을 다음과 같이 변경합니다.

그림 23.61. 인터페이스 Makefile BIOS 구성


  ...
  <devices>
    <interface type='network'>
      <source network='default'/>
      <target dev='vnet1'/>
      <rom bar='on' file='/etc/fake/boot.bin'/>
    </interface>
  </devices>
  ...
이를 지원하는 하이퍼바이저의 경우 게스트 가상 머신에 PCI 네트워크 장치의 RAM이 제공되는 방식을 변경할 수 있습니다. bar 속성은 on 또는 off 로 설정할 수 있으며, 장치의 RAM이 게스트 가상 머신의 메모리 맵에 표시되는지 여부를 결정합니다. (PC 설명서에서 rom bar 설정은 Romom에 대한 기본 주소 레지스터의 존재를 제어합니다. rom 바가지정되지 않은 경우 KVM 기본값(기본 사용된 KVM의 이전 버전)이 사용되며 최신 KVM 하이퍼바이저는 기본적으로 입니다. 선택적 file 속성은 장치의 RAM BIOS로 게스트 가상 머신에 표시되는 바이너리 파일을 가리키는 데 사용됩니다. 이 기능은 네트워크 장치에 대한 대체 부팅ROM을 제공하는 데 유용할 수 있습니다.

23.17.8.14. QoS (Quality of Service)

수신 및 발신 트래픽은 독립적으로 형성되어 QoS(Quality of Service)를 설정할 수 있습니다. bandwidth 요소는 대부분의 인바운드 및 하나의 아웃바운드 자식 요소를 가질 수 있습니다. 이러한 자식 요소를 벗어나면 해당 트래픽 방향에 QoS가 적용되지 않습니다. 따라서 도메인의 들어오는 트래픽만 정렬하려면 인바운드만 사용하고 그 반대의 경우도 마찬가지입니다.
이러한 각 요소에는 필수 특성 평균이 1개(또는 아래에 설명된 대로)가 있습니다. 평균은 형성되는 인터페이스에서 평균 비트 비율을 지정합니다. 또한 다음 두 가지 선택적 속성이 있습니다.
  • peak - 이 속성은 브리지에서 데이터를 보낼 수 있는 최대 속도를 초 단위로 지정합니다. Linux 인그레스 필터가 아직 알 수 없으므로 이 구현의 제한은 아웃바운드 요소에서 이 특성이 무시됩니다.
  • 최대 속도에서 버스트 수 있는 바이트 수를 지정합니다.Specifies the amount of bytes that can be burst at peak speed. 특성에 허용되는 값은 정수 번호입니다.
평균최대 특성의 단위는 초당 킬로바이트이며, burst 는 킬로바이트로만 설정됩니다. 또한 인바운드 트래픽은 선택적으로 플로어 특성을 가질 수 있습니다. 이렇게 하면 셰이핑된 인터페이스에 대해 최소 처리량이 보장됩니다. 플로어 를 사용하면 모든 트래픽이 QoS 결정이 내려질 수 있는 한 지점을 통과해야 합니다. 따라서 인터페이스 type='network'/와 forward type of route,nat, 또는 전혀 전달하지 않는 경우에만 사용할 수 있습니다. 가상 네트워크 내에서 모든 연결된 인터페이스에 적어도 인바운드 QoS 세트(최소평균 )가 있어야 하지만, 플로어 특성은 평균을 지정할 필요가 없습니다. 그러나 최대버스트 속성에는 여전히 평균이 필요합니다. 현재 수신 qdiscs에는 클래스가 없을 수 있으므로 플로어 는 아웃바운드 트래픽만 적용할 수 있습니다.
QoS 구성 설정을 지정하려면 관리 도구를 사용하여 도메인 XML을 다음과 같이 변경합니다.

그림 23.62. 서비스 품질


  ...
  <devices>
    <interface type='network'>
      <source network='default'/>
      <target dev='vnet0'/>
      <bandwidth>
        <inbound average='1000' peak='5000' floor='200' burst='1024'/>
        <outbound average='128' peak='256' burst='256'/>
      </bandwidth>
    </interface>
  <devices>
  ...

23.17.8.15. VLAN 태그 설정(네트워크 유형만 지원)

VLAN 태그 구성 설정을 지정하려면 관리 툴을 사용하여 도메인 XML을 다음과 같이 변경합니다.

그림 23.63. VLAN 태그 설정(네트워크 유형만 지원)


  ...
  <devices>
    <interface type='bridge'>
      <vlan>
        <tag id='42'/>
      </vlan>
      <source bridge='ovsbr0'/>
      <virtualport type='openvswitch'>
        <parameters interfaceid='09b11c53-8b5c-4eeb-8f00-d84eaa0aaa4f'/>
      </virtualport>
    </interface>
  <devices>
  ...
게스트 가상 머신에서 사용하는 네트워크 연결이 게스트 가상 머신에 투명한 VLAN 태그를 지원하는 경우 선택적 vlan 요소는 게스트 가상 시스템의 네트워크 트래픽에 적용하기 위해 하나 이상의 VLAN 태그를 지정할 수 있습니다. OpenvSwitch 및 type='hostdev의 SR-IOV 인터페이스만 게스트 가상 머신 트래픽의 투명 VLAN 태그를 지원합니다. 표준 Linux 브리지 및 libvirt의 자체 가상 네트워크를 포함한 기타 인터페이스는 지원하지 않습니다. 802.1QBH(vn-link) 및 802.1Qbg(VEPA) 스위치는 게스트 가상 시스템 트래픽을 특정 VLAN에 태그하는 고유의 방법을 제공합니다. VLAN 트렁크링의 경우 여러 태그의 사양을 허용하기 위해 태그 하위 요소는 사용할 VLAN 태그(예: tag id='42'/)를 지정합니다. 인터페이스에 두 개 이상의 vlan 요소가 정의되어 있는 경우 사용자가 지정된 모든 태그를 사용하여 VLAN 트렁크를 수행하려는 것으로 가정합니다. 단일 태그가 있는 VLAN 트렁크링이 필요한 경우 선택적 속성 trunk='yes' 를 최상위 vlan 요소에 추가할 수 있습니다.

23.17.9. 입력 장치

입력 장치를 사용하면 게스트 가상 시스템의 그래픽 프레임 버퍼와 상호 작용할 수 있습니다. 프레임 버퍼를 활성화하면 입력 장치가 자동으로 제공됩니다. 예를 들어 절대 커서 이동을 위한 그래픽 시각적 개체를 제공하는 등 장치를 명시적으로 추가할 수 있습니다.
입력 장치 구성 설정을 지정하려면 관리 도구를 사용하여 도메인 XML을 다음과 같이 변경합니다.

그림 23.65. 입력 장치


  ...
  <devices>
    <input type='mouse' bus='usb'/>
  </devices>
  ...
<입력> 요소에는 하나의 필수 특성이 있습니다: type, type , which can be set to mouse or tablet.tablet 은 절대 커서 이동을 제공하는 반면 마우스 는 상대 이동을 사용합니다. 선택적 bus 속성은 정확한 장치 유형을 구체화하는 데 사용할 수 있으며 kvm (paravirtualized), ps2usb 로 설정할 수 있습니다.
입력 요소에는 위에 설명된 대로 장치를 특정 PCI 슬롯에 연결할 수 있는 선택적 하위 요소 <주소가> 있습니다.

23.17.10. Hub 장치

허브는 단일 포트를 여러 포트로 확장하여 장치를 호스트 물리적 시스템 시스템에 연결하는 데 더 많은 포트를 사용할 수 있도록 하는 장치입니다.
허브 장치 구성 설정을 지정하려면 관리 도구를 사용하여 도메인 XML을 다음과 같이 변경합니다.

그림 23.66. hub devices


  ...
  <devices>
    <hub type='usb'/>
  </devices>
  ...
hub 요소에는 usb 로만 설정할 수 있는 하나의 필수 특성 type 이 있습니다. hub 요소에는 장치를 특정 컨트롤러에 연결할 수 있는 type='usb' 가 있는 선택적 하위 요소인 주소 가 있습니다.

23.17.11. 그래픽 프레임 버퍼

그래픽 장치를 사용하면 게스트 가상 머신 운영 체제와 그래픽 상호 작용할 수 있습니다. 게스트 가상 머신에는 일반적으로 사용자와 상호 작용할 수 있도록 구성된 프레임버 또는 텍스트 콘솔이 있습니다.
그래픽 프레임 버퍼 장치 구성 설정을 지정하려면 관리 도구를 사용하여 도메인 XML을 다음과 같이 변경합니다.

그림 23.67. 그래픽 프레임버


  ...
  <devices>
    <graphics type='sdl' display=':0.0'/>
    <graphics type='vnc' port='5904'>
      <listen type='address' address='1.2.3.4'/>
    </graphics>
    <graphics type='rdp' autoport='yes' multiUser='yes' />
    <graphics type='desktop' fullscreen='yes'/>
    <graphics type='spice'>
      <listen type='network' network='rednet'/>
    </graphics>
  </devices>
  ...
graphics 요소에는 필수 유형 속성이 있습니다. 이 속성은 아래 표에 설명된 대로 sdl,vnc,rdp,desktop 또는 spice 값을 사용합니다.

표 23.23. 그래픽 프레임버 기본 요소

매개변수 설명
sdl 호스트 물리적 시스템 데스크탑에 창이 표시됩니다. 다음과 같은 선택적 인수를 허용합니다.
  • 사용할 디스플레이 의 display 속성
  • 인증 식별자의 xauth 속성
  • yes 또는 no값을 허용하는 선택적 fullscreen 속성
vnc VNC 서버를 시작합니다.
  • port 속성은 TCP 포트 번호(자동 할당되어야 함을 나타내는 레거시 구문으로 -1)를 지정합니다.
  • autoport 속성은 사용할 TCP 포트를 자동 할당을 나타내는 기본 구문입니다.
  • listen 속성은 서버가 수신 대기할 IP 주소입니다.
  • passwd 속성은 VNC 암호를 일반 텍스트로 제공합니다.
  • keymap 속성은 사용할 키맵을 지정합니다. 암호의 유효성에 대한 제한을 설정하여 passwdValidTo='2010-04-09T15:51:00의 타임스탬프 를 UTC로 지정할 수 있습니다.
  • connected 속성을 사용하면 암호를 변경하는 동안 연결된 클라이언트를 제어할 수 있습니다. VNC는 keep 값만 허용합니다. 모든 하이퍼바이저에서 지원하지 않을 수 있습니다.
  • KVM은 listen/port를 사용하는 대신 UNIX 도메인 소켓 경로에서 수신 대기를 위한 소켓 속성을 지원합니다.
spice SPICE 서버를 시작합니다.
  • port 속성은 TCP 포트 번호(자동 할당되어야 함을 나타내는 -1을 사용하여)를 지정하고, tlsPort 는 대체 보안 포트 번호를 제공합니다.
  • autoport 속성은 두 포트 번호의 자동 할당을 나타내는 새로운 기본 구문입니다.
  • listen 속성은 서버가 수신 대기할 IP 주소입니다.
  • passwd 속성은 일반 텍스트로 SPICE 암호를 제공합니다.
  • keymap 속성은 사용할 키맵을 지정합니다. 암호의 유효성에 대한 제한을 설정하여 passwdValidTo='2010-04-09T15:51:00의 타임스탬프 를 UTC로 지정할 수 있습니다.
  • 연결된 특성을 사용하면 암호를 변경하는 동안 연결된 클라이언트를 제어할 수 있습니다. SPICE는 클라이언트를 계속 연결하여 클라이언트 연결을 끊고 암호를 변경하지 못하게 합니다. 이는 모든 하이퍼바이저에서 지원되지 않습니다.
  • defaultMode 속성은 기본 채널 보안 정책을 설정합니다. 유효한 값은 보안 ,비보안 및 기본값입니다(가능한 경우 안전하지만 보안 경로를 사용할 수 없는 경우 오류가 아닌 비보안 으로 대체됨).
SPICE에 일반 및 TLS 보안 TCP 포트가 모두 구성된 경우 각 포트에서 실행할 수 있는 채널을 제한하는 것이 좋습니다. 이렇게 하려면 기본 그래픽 요소 내에 하나 이상의 channel 요소를 추가합니다. 유효한 채널 이름에는 main,display,inputs,cursor,playback,record,smartcard, usbredir 등이 있습니다.
SPICE 구성 설정을 지정하려면 관리 도구를 사용하여 도메인 XML을 다음과 같이 변경합니다.

그림 23.68. 샘플 SPICE 구성


  <graphics type='spice' port='-1' tlsPort='-1' autoport='yes'>
    <channel name='main' mode='secure'/>
    <channel name='record' mode='insecure'/>
    <image compression='auto_glz'/>
    <streaming mode='filter'/>
    <clipboard copypaste='no'/>
    <mouse mode='client'/>
  </graphics>
SPICE는 오디오, 이미지 및 스트리밍을 위한 변수 압축 설정을 지원합니다. 이러한 설정은 다음 요소의 압축 속성을 사용하여 구성됩니다.
  • 이미지 압축을 설정하여 이미지 압축을 설정합니다(Auto _glz,auto_lz ,quic, 글z, lz ,off)
  • WAN을 통한 이미지에 대한 username 압축의cs 압축 ( 자동,항상 수락하지 않음)
  • forms 이미지 압축을 구성하기 위한 zlib ( 자동,절대,항상) 및 재생 을 통해 오디오 스트림 압축(사용 가능) 활성화합니다.
streaming 요소는 스트리밍 모드를 설정합니다. mode 특성은all 또는 off필터링 하도록 설정할 수 있습니다.
또한 복사 및 붙여넣기 기능( SPICE 에이전트를 통해)은 클립보드 요소에서 설정합니다. 기본적으로 활성화되어 있으며 copy puts 속성을 no 로 설정하여 비활성화할 수 있습니다.
mouse 요소는 마우스 모드를 설정합니다. mode 속성은 server 또는 client 로 설정할 수 있습니다. 모드가 지정되지 않은 경우 KVM 기본값은클라이언트 모드(클라이언트 모드)입니다.
추가 요소는 다음과 같습니다.

표 23.24. 추가 그래픽 프레임버 요소

매개변수 설명
rdp RDP 서버를 시작합니다.
  • port 속성은 TCP 포트 번호(자동 할당되어야 함을 나타내는 레거시 구문으로 -1)를 지정합니다.
  • autoport 속성은 사용할 TCP 포트를 자동 할당을 나타내는 기본 구문입니다.
  • replaceUser 속성은 가상 머신에 대한 동시 연결이 허용되는지 여부를 결정하는 부울 값입니다.
  • multiUser 속성은 기존 연결을 삭제해야 하는지 여부를 결정하고 새 클라이언트가 단일 연결 모드로 연결할 때 VRDP 서버에서 새 연결을 설정해야 합니다.
desktop 이 값은 현재octets 도메인에 예약되어 있습니다. sdl 과 유사하게 호스트 물리적 머신 데스크탑의 창을 표시하지만 alice 뷰어를 사용합니다. sdl 과 마찬가지로 선택적 특성 표시전체 화면 을 허용합니다.
listen 그래픽 유형 vncspice 에 대한 수신 소켓을 설정하는 데 사용되는 주소 정보를 입력하는 대신 listen 속성은 그래픽 의 별도의 하위 요소인 을 지정할 수 있습니다(위의 예제 참조). listen 는 다음 특성을 허용합니다.
  • type - 주소 또는 네트워크로 설정합니다. 이는 이 listen 요소가 사용할 주소를 직접 지정했는지 또는 네트워크 이름 지정(연결을 위한 적절한 주소를 결정하는 데 사용됨)을 나타냅니다.
  • address - 이 속성에는 수신 대기할 IP 주소 또는 호스트 이름(DNS 쿼리를 통해 IP 주소로 확인됨)이 포함됩니다. 실행 중인 도메인의 "live" XML에서 이 특성은 type='network' 인 경우에도 수신에 사용되는 IP 주소로 설정됩니다.
  • Network - type=' network ' 인 경우 network 속성은 libvirt의 구성된 네트워크 목록에 네트워크 이름이 포함됩니다. 적절한 수신 대기 주소를 결정하기 위해 명명된 네트워크 구성을 검사합니다. 예를 들어, 네트워크에 해당 구성에 IPv4 주소가 있는 경우(예: 경로, NAT 또는 격리된 유형) 네트워크 구성에 나열된 첫 번째 IPv4 주소가 사용됩니다. 네트워크가 호스트 물리적 시스템 브릿지를 설명하는 경우 해당 브리지 장치와 연결된 첫 번째 IPv4 주소가 사용됩니다. 네트워크가 'direct'(macvtap) 모드 중 하나를 설명하는 경우 첫 번째 forward dev의 첫 번째 IPv4 주소가 사용됩니다.

23.17.12. 동영상 장치

비디오 장치 구성 설정을 지정하려면 관리 도구를 사용하여 도메인 XML을 다음과 같이 변경합니다.

그림 23.69. 비디오 장치


  ...
  <devices>
    <video>
      <model type='vga' vram='8192' heads='1'>
        <acceleration accel3d='yes' accel2d='yes'/>
      </model>
    </video>
  </devices>
  ...
graphics 요소에는 아래에 설명된 대로 "sdl", "vnc", "rdp" 또는 "#150" 값을 사용하는 필수 type 속성이 있습니다.

표 23.25. 그래픽 프레임버 요소

매개변수 설명
video video 요소는 비디오 장치를 설명하는 컨테이너입니다. 이전 버전과의 호환성을 위해, 동영상이 설정되지 않았지만 도메인 XML에 그래픽 요소가 있는 경우 libvirt는 게스트 가상 머신 유형에 따라 기본 비디오를 추가합니다. "ram" 또는 "vram"을 제공하지 않으면 기본값이 사용됩니다.
model 여기에는 사용 가능한 하이퍼바이저 기능에 따라 pxea ,cirrus,vmvga,kvm,vbox, qxl 값을 사용하는 필수 유형 속성이 있습니다. 또한 vram 및 헤드와 함께 그림 수를 사용하여 kibibytes (24 바이트 블록)로 비디오 메모리 크기를 제공할 수 있습니다.
가속 가속이 지원되는 경우 가속 요소에서 accel3daccel2d 속성을 사용하여 활성화해야 합니다.
address 선택적 주소 하위 요소를 사용하여 비디오 장치를 특정 PCI 슬롯에 연결할 수 있습니다.

23.17.13. 콘솔, 직렬 및 채널 장치

문자 장치는 가상 머신과 상호 작용하는 방법을 제공합니다. 반가상화 콘솔, 직렬 포트, 및 채널은 모두 문자 장치로 분류되며 동일한 구문을 사용하여 표시됩니다.
콘솔, 채널 및 기타 장치 구성 설정을 지정하려면 관리 도구를 사용하여 도메인 XML을 다음과 같이 변경합니다.

그림 23.70. 콘솔, 직렬 및 채널 장치


  ...
  <devices>
    <serial type='pty'>
      <source path='/dev/pts/3'/>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <source path='/dev/pts/4'/>
      <target port='0'/>
    </console>
    <channel type='unix'>
      <source mode='bind' path='/tmp/guestfwd'/>
      <target type='guestfwd' address='10.0.2.1' port='4600'/>
    </channel>
  </devices>
  ...
이러한 각 지시문에서 최상위 요소 이름(serial,console,channel)은 게스트 가상 머신에 장치가 제공되는 방법을 설명합니다. 게스트 가상 머신 인터페이스는 대상 요소에 의해 구성됩니다. 호스트 물리적 시스템에 제공되는 인터페이스는 최상위 요소의 type 특성에 제공됩니다. 호스트 물리적 시스템 인터페이스는 소스 요소에 의해 구성됩니다. source 요소에는 소켓 경로에서 레이블 지정이 수행되는 방식을 재정의하는 선택적 초라벨 이 포함될 수 있습니다. 이 요소가 없으면 보안 레이블이 도메인별 설정에서 상속됩니다. 각 문자 장치 요소에는 장치를 특정 컨트롤러 또는 PCI 슬롯에 연결할 수 있는 선택적 하위 요소 주소가 있습니다.
참고
병렬 포트 및 isa-parallel 장치는 더 이상 지원되지 않습니다.

23.17.14. 게스트 가상 머신 인터페이스

문자 장치는 다음 유형 중 하나로 게스트 가상 머신에 자체적으로 표시됩니다.
직렬 포트를 설정하려면 관리 도구를 사용하여 도메인 XML을 다음과 같이 변경합니다.

그림 23.71. 게스트 가상 머신 인터페이스 직렬 포트


  ...
  <devices>
    <serial type='pty'>
      <source path='/dev/pts/3'/>
      <target port='0'/>
    </serial>
  </devices>
  ...
<target> 에는 포트 번호를 지정하는 port 속성이 있을 수 있습니다. 포트는 0부터 번호가 매겨집니다. 일반적으로 0, 1 또는 2 개의 직렬 포트가 있습니다. 또한 해당 값에 대한 두 가지 선택 사항인 isa-serial 또는 usb-serial 인 선택적 type 속성이 있습니다. type 이 누락된 경우 isa-serial 는 기본적으로 사용됩니다. usb-serial 의 경우 type='usb' 가 있는 선택적 하위 요소 <주소는> 위에 설명된 특정 컨트롤러에 장치를 연결할 수 있습니다.
<console> 요소는 대화형 콘솔을 표시하는 데 사용됩니다. 사용 중인 게스트 가상 머신 유형에 따라 콘솔은 반가상화 장치이거나 다음 규칙에 따라 직렬 장치의 복제본일 수 있습니다.
  • targetType 특성이 설정되지 않은 경우 기본 장치 유형은 하이퍼바이저의 규칙에 따라 달라집니다. 기본 유형은 XML을 libvirt에 다시 쿼리할 때 추가됩니다. 완전히 가상화된 게스트 가상 머신의 경우 기본 장치 유형은 일반적으로 직렬 포트입니다.
  • targetType 속성이 직렬 이고 <직렬> 요소가 없는 경우 console 요소가 <serial> 요소에 복사됩니다. <serial> 요소가 이미 존재하는 경우 console 요소는 무시됩니다.
  • targetType 속성이 직렬 이 아닌 경우 정상적으로 처리됩니다.
  • 첫 번째 <콘솔> 요소만 serialtargetType 을 사용할 수 있습니다. 보조 콘솔은 모두 반가상화해야 합니다.
  • s390에서 콘솔 요소는 targetTypesclp 또는 sclplm (line mode)을 사용할 수 있습니다. SCLP는 s390의 기본 콘솔 유형입니다. SCLP 콘솔에 연결된 컨트롤러가 없습니다.
아래 예제에서 virtio 콘솔 장치는 /dev/hvc[0-7] 로 게스트 가상 머신에 노출됩니다(자세한 내용은 Fedora 프로젝트의 virtio-serial 페이지참조).

그림 23.72. 게스트 가상 머신 인터페이스 - virtio 콘솔 장치


  ...
  <devices>
    <console type='pty'>
      <source path='/dev/pts/4'/>
      <target port='0'/>
    </console>

    <!-- KVM virtio console -->
    <console type='pty'>
      <source path='/dev/pts/5'/>
      <target type='virtio' port='0'/>
    </console>
  </devices>
  ...

  ...
  <devices>
    <!-- KVM s390 sclp console -->
    <console type='pty'>
      <source path='/dev/pts/1'/>
      <target type='sclp' port='0'/>
    </console>
  </devices>
  ...
콘솔이 직렬 포트로 제공되는 경우 <target> 요소에는 직렬 포트와 동일한 속성이 있습니다. 일반적으로 하나의 콘솔만 있습니다.

23.17.15. 채널

이는 호스트 물리적 시스템과 게스트 가상 시스템 간의 개인 통신 채널을 나타냅니다. 도메인 XML의 다음 섹션을 편집하기 위해 관리 툴을 사용하여 게스트 가상 머신을 변경하여 조작됩니다.

그림 23.73. 채널


  ...
  <devices>
    <channel type='unix'>
      <source mode='bind' path='/tmp/guestfwd'/>
      <target type='guestfwd' address='10.0.2.1' port='4600'/>
    </channel>

    <!-- KVM virtio channel -->
    <channel type='pty'>
      <target type='virtio' name='arbitrary.virtio.serial.port.name'/>
    </channel>
    <channel type='unix'>
      <source mode='bind' path='/var/lib/libvirt/kvm/f16x86_64.agent'/>
      <target type='virtio' name='org.kvm.guest_agent.0'/>
    </channel>
    <channel type='spicevmc'>
      <target type='virtio' name='com.redhat.spice.0'/>
    </channel>
  </devices>
  ...
이는 다양한 방법으로 구현할 수 있습니다. <채널> 의 특정 유형은 <대상> 요소의 type 속성에 제공됩니다. 다른 채널 유형에는 다음과 같이 다른 대상 속성이 있습니다.
  • guestfwd - 게스트 가상 머신에서 지정된 IP 주소로 전송된 TCP 트래픽을 호스트 물리적 시스템의 채널 장치로 전달합니다. target 요소에는 address 및 port 속성이 있어야 합니다.
  • virtio - 반가상화 virtio 채널. <채널>/dev/vport* 아래의 게스트 가상 머신에 노출되며 선택적 요소 이름이 지정된 경우 /dev/virtio-ports/$name (자세한 내용은 Fedora 프로젝트의 virtio-serial 페이지)을 참조하십시오. 선택적 요소 주소는 위에 설명된 특정 type='virtio-serial' 컨트롤러에 채널을 연결할 수 있습니다. KVM을 사용하면 name이 "org.kvm.guest_agent.0"인 경우 libvirt는 게스트 가상 시스템에 설치된 게스트 에이전트와 상호 작용하여 게스트 가상 시스템 종료 또는 파일 시스템 quiescing과 같은 작업을 수행할 수 있습니다.
  • spicevmc - 반가상화 SPICE 채널. 또한 도메인에는 그래픽 장치로 SPICE 서버가 있어야 하며, 이 시점에서 기본 채널에서 호스트 물리적 머신 비열기 메시지도 있어야 합니다. type='virtio' 속성과 함께 target 요소가 있어야 합니다. 선택적 속성 이름은 게스트 가상 머신이 채널에 액세스하는 방법을 제어하며 기본값은 name='com.spice.0' 입니다. 선택적 <address> 요소는 채널을 특정 type='virtio-serial' 컨트롤러에 연결할 수 있습니다.

23.17.16. 호스트 물리적 시스템 인터페이스

문자 장치는 다음 유형 중 하나로 호스트 물리적 머신에 자체적으로 제공합니다.

표 23.26. 문자 장치 요소

매개변수 설명 XML 스니펫
도메인 로그 파일 문자 장치의 모든 입력을 비활성화하고 가상 시스템의 로그 파일로 출력을 보냅니다.
<devices>
   <console type='stdio'>
     <target port='1'/>
   </console>
</devices>
장치 로그 파일 파일이 열리고 문자 장치로 전송된 모든 데이터가 파일에 기록됩니다. 대상 디렉토리에 이 설정이 성공적으로 시작되면 게스트의 virt_log_t SELinux 레이블이 있어야 합니다.
<devices>
   <serial type="file">
      <source path="/var/log/vm/vm-serial.log"/>
      <target port="1"/>
   </serial>
</devices>
가상 콘솔 가상 콘솔의 그래픽 프레임 버퍼에 문자 장치를 연결합니다. 일반적으로 "ctrl+3"과 같은 특수 hotkey 시퀀스를 사용하여 액세스할 수 있습니다.
<devices>
   <serial type='vc'>
      <target port="1"/>
   </serial>
</devices>
null 장치 문자 장치를 void에 연결합니다. 입력에 데이터가 제공되지 않습니다. 기록된 모든 데이터는 삭제됩니다.
<devices>
   <serial type='null'>
      <target port="1"/>
   </serial>
</devices>
Pseudo TTY /dev/ptmx 를 사용하여 Pseudo TTY가 할당됩니다. virsh 콘솔 과 같은 적절한 클라이언트가 직렬 포트와 로컬로 상호 작용할 수 있습니다.
<devices>
   <serial type="pty">
      <source path="/dev/pts/3"/>
      <target port="1"/>
   </serial>
</devices>
NB Special 케이스 NB special case if <console type='pty'>, then the TTY path is also duplicated as an attribute tty='/dev/pts/3' on the top level <console> tag. 이는 <콘솔> 태그에 대한 기존 구문과 유사합니다.  
호스트 물리적 시스템 장치 프록시 문자 장치는 기본 물리적 문자 장치로 전달됩니다. 장치 유형(예: 에뮬레이션된 직렬 포트는 호스트 물리적 시스템 직렬 포트에만 연결됨)과 일치해야 하며 직렬 포트를 병렬 포트에 연결하지 않습니다.
<devices>
   <serial type="dev">
      <source path="/dev/ttyS0"/>
      <target port="1"/>
   </serial>
</devices>
명명된 파이프 문자 장치는 이름이 지정된 파이프에 출력을 씁니다. 자세한 내용은 pipe(7) 도움말 페이지를 참조하십시오.
<devices>
   <serial type="pipe">
      <source path="/tmp/mypipe"/>
      <target port="1"/>
   </serial>
</devices>
TCP 클라이언트-서버 문자 장치는 원격 서버에 연결하는 TCP 클라이언트 역할을 합니다.
<devices>
   <serial type="tcp">
      <source mode="connect" host="0.0.0.0" service="2445"/>
      <protocol type="raw"/>
      <target port="1"/>
   </serial>
</devices>
또는 클라이언트 연결을 기다리는 TCP 서버로서.
<devices>
   <serial type="tcp">
      <source mode="bind" host="127.0.0.1" service="2445"/>
      <protocol type="raw"/>
      <target port="1"/>
   </serial>
</devices>
또는 원시 TCP 대신 telnet을 사용할 수 있습니다. 또한 telnet(보안 telnet) 및 tls를 사용할 수도 있습니다.
<devices>
   <serial type="tcp">
      <source mode="connect" host="0.0.0.0" service="2445"/>
      <protocol type="telnet"/>
      <target port="1"/>
   </serial>
      <serial type="tcp">
      <source mode="bind" host="127.0.0.1" service="2445"/>
      <protocol type="telnet"/>
      <target port="1"/>
   </serial>
</devices>
UDP 네트워크 콘솔 문자 장치는 UDP netconsole 서비스 역할을 하며 패킷을 전송 및 수신합니다. 이것은 손실 된 서비스입니다.
<devices>
   <serial type="udp">
      <source mode="bind" host="0.0.0.0" service="2445"/>
      <source mode="connect" host="0.0.0.0" service="2445"/>
      <target port="1"/>
   </serial>
</devices>
UNIX 도메인 소켓 클라이언트-서버 문자 장치는 로컬 클라이언트의 연결을 수락하는 UNIX 도메인 소켓 서버 역할을 합니다.
<devices>
   <serial type="unix">
      <source mode="bind" path="/tmp/foo"/>
      <target port="1"/>
   </serial>
</devices>

23.17.17. 건전한 장치

가상 음향 카드는 음향 요소를 사용하여 호스트 물리적 시스템에 연결할 수 있습니다.

그림 23.74. 가상 음향 카드


  ...
  <devices>
    <sound model='ac97'/>
  </devices>
  ...
sound 요소에는 하나의 필수 특성인 model 이 있으며, 이는 실제 건전한 장치를 에뮬레이션한 것을 지정합니다. 유효한 값은 기본 하이퍼바이저에 고유하지만 일반적인 선택 사항은 'sb16', 'ac97''ich6' 입니다. 또한, 'ich6' 모델 세트가 있는 음향 요소에는 다양한 오디오 코드 세트를 오디오 장치에 연결하기 위한 선택적 codec 하위 요소를 가질 수 있습니다. 지정하지 않으면 재생 및 레코딩을 허용하기 위해 기본 codec가 연결됩니다. 유효한 값은 'duplex' (선선 및 라인 아웃) 및 '마이크로이드' (인가기와 마이크로폰 전달)입니다.

그림 23.75. 건전한 장치


  ...
  <devices>
    <sound model='ich6'>
      <codec type='micro'/>
    <sound/>
  </devices>
  ...
각 sound 요소에는 위에 설명된 특정 PCI 슬롯에 장치를 연결할 수 있는 선택적 하위 요소 <주소가> 있습니다.
참고
Red Hat Enterprise Linux 7에서 es1370 건 장치가 더 이상 지원되지 않습니다. 대신 ac97을 사용하십시오.

23.17.18. 워치독 장치

워치독 요소를 사용하여 가상 하드웨어 워치독 장치를 게스트 가상 머신에 추가할 수 있습니다. <> 워치독 장치에는 게스트 가상 머신에 추가 드라이버 및 관리 데몬이 필요합니다. 현재 워치독이 실행되는 경우 지원 알림이 없습니다.

그림 23.76. 워치독 장치


  ...
  <devices>
    <watchdog model='i6300esb'/>
  </devices>
  ...

  ...
  <devices>
    <watchdog model='i6300esb' action='poweroff'/>
  </devices>
...
다음 속성은 이 XML에서 선언됩니다.
  • model - 필수 모델 속성은 실제 워치독 장치 에뮬레이션을 지정합니다. 유효한 값은 기본 하이퍼바이저에 따라 다릅니다.
  • model 속성은 다음 값을 사용할 수 있습니다.
    • i6300esb - 권장되는 장치는 PCI Intel 6300databind
    • ib700 - RuntimeClass iBase IB700 에뮬레이션
  • 작업 - 선택적 action 속성은 워치독이 만료될 때 수행할 작업을 설명합니다. 유효한 값은 기본 하이퍼바이저에 따라 다릅니다. action 속성에는 다음 값이 있을 수 있습니다.
    • reset - default setting, guest 가상 머신을 강제로 재설정
    • shutdown - 게스트 가상 머신을 정상적으로 종료(권장하지 않음)
    • poweroff - 게스트 가상 머신의 전원을 강제로 끕니다.
    • pause - 게스트 가상 머신 일시 중지
    • none - 아무 작업도 수행하지 않음
    • dump - 게스트 가상 머신을 자동으로 덤프합니다.
'shutdown' 작업을 수행하려면 게스트 가상 머신이 ACPI 신호에 반응해야 합니다. 워치독이 만료된 상황에서는 게스트 가상 머신이 일반적으로 ACPI 신호에 응답할 수 없습니다. 따라서 'shutdown'을 사용하는 것은 권장되지 않습니다. 또한 /etc/libvirt/kvm.conf 파일의 auto_dump_path를 통해 덤프 파일을 저장할 디렉터리를 구성할 수 있습니다.

23.17.19. Panic Device 설정

Red Hat Enterprise Linux 7 하이퍼바이저는 pvpanic 메커니즘을 사용하여 Linux 게스트 가상 머신 커널 패닉을 감지할 수 있습니다. pvpanic 을 호출하면 libvirtd 데몬에 메시지를 보내 사전 구성된 반응을 시작합니다.
pvpanic 장치를 활성화하려면 다음을 수행합니다.
  • 호스트 시스템의 /etc/libvirt/qemu.conf 파일에 다음 행을 추가하거나 주석 처리를 해제합니다.
    auto_dump_path = "/var/lib/libvirt/qemu/dump"
  • virsh edit 명령을 실행하여 지정된 게스트의 도메인 XML 파일을 편집하고 장치 상위 요소에 패닉 을 추가합니다.
    
    <devices>
      <panic>
        <address type='isa' iobase='0x505'/>
      </panic>
    </devices>
    
    
<address> 요소는 panic의 주소를 지정합니다. 기본 ioport는 0x505입니다. 대부분의 경우 주소를 지정할 필요가 없습니다.
libvirtd 가 충돌에 대응하는 방법은 도메인 XML의 <on_crash> 요소에 의해 결정됩니다. 가능한 작업은 다음과 같습니다.
  • coredump-destroy - 게스트 가상 머신의 코어 덤프를 캡처하고 게스트를 종료합니다.
  • coredump-restart - 게스트 가상 머신의 코어 덤프를 캡처하고 게스트를 다시 시작합니다.
  • preserve - 게스트 가상 머신이 추가 작업을 대기하도록 시간(Halts the guest virtual machine)
참고
kdump 서비스가 활성화된 경우 <on_crash> 설정보다 우선하며 선택한 <on_crash> 작업이 수행되지 않습니다.
pvpanic 에 대한 자세한 내용은 관련 지식 베이스 문서를 참조하십시오.

23.17.20. 메모리 대역폭 장치

풍선 장치는 사용되지 않는 것으로 가상 시스템의 RAM의 일부를 지정할 수 있습니다(Bood라고 하는 프로세스)는 호스트에 대한 메모리를 해제하거나 해당 호스트의 다른 가상 머신에 사용할 수 있습니다. 가상 시스템에 메모리가 다시 필요한 경우 balloon가 해제될 수 있으며 호스트는 RAM을 다시 가상 시스템에 배포할 수 있습니다.
메모리 풍선의 크기는 <currentMemory><메모리> 설정 간의 차이에 따라 결정됩니다. 예를 들어 <메모리> 가 2GiB로 설정되고 <currentMemory> 가 1GiB인 경우 풍선에 1GiB가 포함됩니다. 수동 구성이 필요한 경우 virsh setmem 명령을 사용하여 <currentMemory> 값을 설정할 수 있으며 virsh setmaxmem 명령을 사용하여 <메모리> 값을 설정할 수 있습니다.
주의
<currentMemory> 값을 수정할 경우 게스트 OS가 제대로 작동할 수 있도록 충분한 메모리를 남겨 두어야 합니다. 설정된 값이 너무 작으면 게스트가 불안정해질 수 있습니다.
가상 메모리 풍선 장치가 모든 KVM 게스트 가상 머신에 자동으로 추가됩니다. XML 구성에서 <memballoon> 요소로 표시됩니다. 메모리 증대는 libvirt 서비스에서 관리하며 적절한 경우 자동으로 추가됩니다. 따라서 특정 PCI 슬롯을 할당해야 하지 않는 한 게스트 가상 머신 XML에 이 요소를 명시적으로 추가할 필요는 없습니다. <memballoon> 장치를 명시적으로 비활성화해야 하는 경우 이 용도로 model='none' 을 사용할 수 있습니다.
다음 예제에서는 libvirt 가 자동으로 추가하는 memballoon 장치를 보여줍니다.

그림 23.77. 메모리 풍선 장치


  ...
  <devices>
    <memballoon model='virtio'/>
  </devices>
  ...
다음 예제에서는 요청된 정적 PCI 슬롯 2를 사용하여 수동으로 추가된 장치를 보여줍니다.

그림 23.78. 수동으로 추가된 메모리 풍선 장치


  ...
  <devices>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </memballoon>
  </devices>
...
필수 model 속성은 제공되는 풍선 장치의 유형을 지정합니다. 유효한 값은 가상화 플랫폼에 고유합니다. KVM 하이퍼바이저에서 'virtio' 가 기본 설정입니다.

23.18. 스토리지 풀

모든 스토리지 풀 백엔드는 동일한 공용 API 및 XML 형식을 공유하지만 다양한 수준의 기능이 있습니다. 일부에서는 볼륨 생성을 허용할 수 있으며, 다른 사용자는 기존 볼륨만 사용할 수 있습니다. 일부는 볼륨 크기 또는 배치에 대한 제약 조건이 있을 수 있습니다.
스토리지 풀 문서의 최상위 수준 요소는 <풀> 입니다. dir, fs, netfs, disk, iscsi, logical, scsi, mpath, rbd, Hepdog 또는 gluster 의 값을 사용할 수 있는 단일 속성 유형이 있습니다.

23.18.1. 스토리지 풀에 메타데이터 제공

다음 XML 예제에서는 스토리지 풀에 추가할 수 있는 메타데이터 태그를 보여줍니다. 이 예에서 풀은 iSCSI 스토리지 풀입니다.

그림 23.79. 일반 메타데이터 태그

         
     <pool type="iscsi">
        <name>virtimages</name>
        <uuid>3e3fce45-4f53-4fa7-bb32-11f34168b82b</uuid>
        <allocation>10000000</allocation>
        <capacity>50000000</capacity>
        <available>40000000</available>
        ...
     </pool>
         

이 예에서 사용되는 요소는 표 23.27. “virt-sysprep 명령” 에 설명되어 있습니다.

표 23.27. virt-sysprep 명령

element 설명
<name> 호스트 물리적 시스템에서 고유해야 하는 스토리지 풀의 이름을 제공합니다. 이는 스토리지 풀을 정의할 때 필요합니다.
<uuid> 전 세계적으로 고유해야 하는 스토리지 풀의 식별자를 제공합니다. UUID를 제공하는 것은 선택 사항이지만, 스토리지 풀을 만들 때 UUID를 제공하지 않으면 UUID가 자동으로 생성됩니다.
<allocation> 스토리지 풀에 대한 총 스토리지 할당을 제공합니다. 메타데이터 오버헤드로 인해 모든 스토리지 볼륨에서 총 할당 합계보다 클 수 있습니다. 이 값은 바이트로 표시됩니다. 이 요소는 읽기 전용이며 값은 변경할 수 없습니다.
<용량> 풀에 대한 총 스토리지 용량을 제공합니다. 기본 장치 제약 조건으로 인해 스토리지 볼륨에 전체 용량을 사용할 수 없습니다. 이 값은 바이트 단위입니다. 이 요소는 읽기 전용이며 값은 변경할 수 없습니다.
<Available> 스토리지 풀에서 새 스토리지 볼륨을 할당하는 데 사용할 수 있는 여유 공간을 제공합니다. 기본 장치 제약 조건으로 인해 사용 가능한 모든 공간을 단일 스토리지 볼륨에 할당할 수 없습니다. 이 값은 바이트 단위입니다. 이 요소는 읽기 전용이며 값은 변경할 수 없습니다.

23.18.2. 소스 element

<pool> 요소 내에는 정의된 단일 <소스> 요소(하나만)가 있을 수 있습니다. <소스> 의 하위 요소는 스토리지 풀 유형에 따라 다릅니다. 사용할 수 있는 XML의 예는 다음과 같습니다.

그림 23.80. 소스 요소 옵션 1

         
           ...
        <source>
          <host name="iscsi.example.com"/>
          <device path="demo-target"/>
          <auth type='chap' username='myname'>
            <secret type='iscsi' usage='mycluster_myname'/>
          </auth>
          <vendor name="Acme"/>
          <product name="model"/>
        </source>
        ...
         

그림 23.81. 소스 요소 옵션 2

         
         ...
        <source>
          <adapter type='fc_host' parent='scsi_host5' wwnn='20000000c9831b4b' wwpn='10000000c9831b4b'/>
        </source>
        ...
         

<소스에서> 허용하는 하위 요소는 표 23.28. “소스 하위 요소 명령” 에서 설명합니다.

표 23.28. 소스 하위 요소 명령

element 설명
<device> 호스트 물리적 머신 장치(풀 <유형= 기반)에서 지원하는 스토리지 풀> 의 소스를 제공합니다( 23.18절. “스토리지 풀” ) 백엔드 드라이버에 따라 여러 번 반복될 수 있습니다. 블록 장치 노드의 정규화된 경로인 단일 속성 경로를 포함합니다.
<dir> 디렉터리(<type='dir' 풀)에서 지원하는 스토리지 풀>의 소스를 제공하거나 필요에 따라 파일 시스템을 기반으로 하는 스토리지 풀 내에서 하위 디렉터리를 선택합니다(<type='gluster'>). 이 요소는 풀당 한 번만 발생할 수 있습니다(<풀>). 이 요소는 백업 디렉터리의 전체<경로>인 단일 속성(path )을 허용합니다.
<adapter> SCSI 어댑터(풀<type='scsi' )에서 지원하는 스토리지 풀>의 소스를 제공합니다. 이 요소는 풀당 한 번만 발생할 수 있습니다(<풀>). 특성 이름은 SCSI 어댑터 이름(ex. "scsi_host1")입니다. 이전 버전과의 호환성을 위해 여전히 "host1"이 지원되지만 권장되지 않습니다. 특성 유형은 어댑터 유형을 지정합니다. 유효한 값은 'fc_host'| 'scsi_host' 입니다. 생략된 경우 name 속성이 지정된 경우 기본값은 type='scsi_host' 입니다. 이전 버전과의 호환성을 유지하려면 type ='scsi_host' 어댑터의 경우 속성 유형이 선택 사항이지만 type='fc_host' 어댑터에는 필수입니다. wwnn (Word Wide Node Name) 및 wwpn (Word Wide Port Name)은 type='fc_host' 어댑터에서 장치를 고유하게 식별하는 데 사용됩니다(장치는 HBA 또는 vHBA일 수 있음). wwnnwwpn 을 모두 지정해야 합니다. (v)HBA의 wwnn/wwpn을 얻는 방법에 대한 자세한 내용은 20.27.11절. “장치 설정 수집” 를 참조하십시오. 선택 사항인 속성 부모는 type='fc_host' 어댑터에 대한 상위 장치를 지정합니다.
<호스트> 원격 서버에서 지원하는 스토리지 풀의 소스를 제공합니다(type='netfs'|'iscsi'|'rbd'|'sheepdog'|'gluster'). 이 요소는 <디렉터리> 또는 <장치> 요소와 함께 사용해야 합니다. 서버의 호스트 이름 또는 IP 주소인 속성 이름을 포함합니다. 프로토콜별 포트 번호에 대한 포트 속성을 선택적으로 포함할 수 있습니다.
<auth> 존재하는 경우 <auth> 요소는 type 속성(pool type='iscsi'|'rbd')의 설정을 통해 소스에 액세스하는 데 필요한 인증 자격 증명을 제공합니다. 유형은 type ='chap' 또는 type='ceph' 여야 합니다. Ceph RBD(Rados Block Device) 네트워크 소스에 "ceph"를 사용하고 CHAP(Challenge-Handshake Authentication Protocol) iSCSI 대상에 "iscsi"를 사용합니다. 또한 필수 특성 사용자 이름은 실제 암호 또는 기타 인증 정보를 보유한 libvirt 보안 오브젝트에 다시 연결하기 위해 인증 중에 사용할 사용자 이름과 필수 특성 유형의 하위 요소 시크릿을 식별합니다. 도메인 XML은 의도적으로 암호를 노출하지 않으며 암호를 관리하는 오브젝트에 대한 참조만 공개합니다. secret 요소에는 보안 오브젝트의 UUID가 있는 uuid 속성 또는 secret 오브젝트에 지정된 키와 일치하는 usage 속성이 필요합니다.
<name> (type='logical'|'rbd'|'sheepdog','gluster') 값을 사용할 수 있는 명명된 요소 <유형에서> 지원하는 스토리지 풀에 대한 소스를 제공합니다.
<형식> <type> ='logical'|'fs'|'netfs') 값을 사용할 수 있는 스토리지 풀 유형의 형식에 대한 정보를 제공합니다. 이 값은 백엔드에 따라 다릅니다. 일반적으로 파일 시스템 유형 또는 네트워크 파일 시스템 유형 또는 파티션 테이블 유형 또는 LVM 메타데이터 유형을 나타내는 데 사용됩니다. 모든 드라이버에 이의 기본값이 있어야 하므로 요소는 선택 사항입니다.
<vendor> 스토리지 장치 공급업체에 대한 선택적 정보를 제공합니다. 여기에는 값이 백엔드에 고유한 단일 속성 <이름이> 포함됩니다.
<product> 스토리지 장치의 제품 이름에 대한 선택적 정보를 제공합니다. 여기에는 값이 백엔드에 고유한 단일 속성 <이름이> 포함됩니다.

23.18.3. 대상 요소 생성

단일 <대상> 요소는 다음 유형의 최상위 수준 <풀> 요소에 포함됩니다. (type='dir'|'fs'|'netfs'|'logical'|'disk'|'scsi'|'mpath'). 이 태그는 스토리지 풀의 매핑을 호스트 파일 시스템에 대해 설명하는 데 사용됩니다. 여기에는 다음 하위 요소가 포함될 수 있습니다.

그림 23.82. 대상 요소 XML 예

         
     <pool>
        ...
        <target>
          <path>/dev/disk/by-path</path>
          <permissions>
            <owner>107</owner>
            <group>107</group>
            <mode>0744</mode>
            <label>virt_image_t</label>
          </permissions>
          <timestamps>
            <atime>1341933637.273190990</atime>
            <mtime>1341930622.047245868</mtime>
            <ctime>1341930622.047245868</ctime>
          </timestamps>
          <encryption type='...'>
            ...
          </encryption>
        </target>
      </pool>
         

표(표 23.29. “대상 자식 요소”)은 부모 <대상> 요소에 유효한 자식 요소를 설명합니다.

표 23.29. 대상 자식 요소

element 설명
<path> 스토리지 풀을 로컬 파일 시스템 네임스페이스에 매핑할 위치를 제공합니다. 파일 시스템 또는 디렉터리 기반 스토리지 풀의 경우 스토리지 볼륨이 생성될 디렉터리의 이름입니다. 장치 기반 스토리지 풀의 경우 장치의 노드가 존재하는 디렉터리의 이름입니다. 후자의 경우 /dev/는 논리 선택처럼 보일 수 있지만 장치의 노드는 필요에 따라 할당되므로 재부팅 시 안정적인 것으로 보장되지 않습니다. /dev/disk/by-{path,id,uuid,label} 위치 중 하나와 같은 안정적인 위치를 사용하는 것이 좋습니다.
<권한> 현재 이는 로컬 파일 시스템 네임스페이스에 디렉터리로 매핑되는 디렉터리 또는 파일 시스템 기반 스토리지 풀에만 유용합니다. 스토리지 풀이 빌드될 때 최종 디렉터리에 사용할 권한에 대한 정보를 제공합니다. <mode> 요소에는 8진수 권한 세트가 포함되어 있습니다. <owner> 요소에는 숫자 사용자 ID가 포함됩니다. <group> 요소에는 숫자 그룹 ID가 포함되어 있습니다. <레이블> 요소에는 MAC(예: SELinux) 레이블 문자열이 포함되어 있습니다.
<timestamps> 스토리지 볼륨에 대한 타이밍 정보를 제공합니다. 최대 4개의 하위 요소가 있습니다. 여기서 timestamps ='atime'|'ctime|'mtime'|'mtime' 에는 알려진 스토리지 볼륨의 액세스, 생성, 변경 및 수정 시간이 포함됩니다. 사용된 시간 형식은 epoch의 시작 이후 <초> (<나노> 초)입니다(1년 1월 1일). 나노초 해상도가 0이거나 호스트 운영 체제 또는 파일 시스템에 의해 지원되지 않는 경우 나노초 부분은 생략됩니다. 이는 읽기 전용 속성이며 스토리지 볼륨을 생성할 때 무시됩니다.
<Encryption> 존재하는 경우 스토리지 볼륨을 암호화하는 방법을 지정합니다. 자세한 내용은 libvirt 업스트림 페이지를 참조하십시오.

23.18.4. 장치 Extents 설정

스토리지 풀에서 기본 배치 또는 할당 체계에 대한 정보를 노출하는 경우 <source> 요소 내의 <장치> 요소에는 사용 가능한 확장 영역에 대한 정보가 포함될 수 있습니다. 일부 스토리지 풀에는 스토리지 볼륨을 단일 제약 조건(예: 디스크 파티션 풀) 내에서 전적으로 할당해야 한다는 제약 조건이 있습니다. 따라서 범위 정보를 통해 애플리케이션이 새 스토리지 볼륨의 가능한 최대 크기를 결정할 수 있습니다.
<장치> 요소 내에서 확장 영역 정보를 지원하는 스토리지 풀의 경우 0개 이상의 <freeExtent> 요소가 있습니다. 이러한 각 요소에는 바이트로 측정된 장치에서 범위를 경계를 제공하는 <start><end> 라는 두 가지 특성이 있습니다.

23.19. 스토리지 볼륨

스토리지 볼륨은 일반적으로 파일 또는 장치 노드입니다. 1.2.0부터 선택 옵션으로 output-only 속성 유형은 실제 유형(file, block, dir, network 또는 netdir)을 나열합니다.

23.19.1. 일반 메타데이터

<볼륨> 요소의 상단 섹션에는 다음 XML 예제와 같이 metadata라고 하는 정보가 포함되어 있습니다.

그림 23.83. 스토리지 볼륨에 대한 일반 메타데이터

         
      ...
      <volume type='file'>
        <name>sparse.img</name>
        <key>/var/lib/libvirt/images/sparse.img</key>
        <allocation>0</allocation>
        <capacity unit="T">1</capacity>
        ...
      </volume>
         

테이블(표 23.30. “볼륨 하위 요소”)은 부모 <볼륨> 요소에 유효한 하위 요소를 설명합니다.

표 23.30. 볼륨 하위 요소

element 설명
<name> 스토리지 풀에 고유한 스토리지 볼륨의 이름을 제공합니다. 이는 스토리지 볼륨을 정의할 때 필요합니다.
<key> 단일 스토리지 볼륨을 식별하는 스토리지 볼륨의 식별자를 제공합니다. 경우에 따라 단일 스토리지 볼륨을 식별하는 두 개의 고유 키가 있을 수 있습니다. 이 필드는 항상 생성되는 스토리지 볼륨을 생성할 때 설정할 수 없습니다.
<allocation> 스토리지 볼륨에 대한 총 스토리지 할당을 제공합니다. 스토리지 볼륨이 스파스로 할당된 경우 논리 용량보다 작을 수 있습니다. 스토리지 볼륨에 메타데이터 오버헤드가 많은 경우 논리 용량보다 클 수도 있습니다. 이 값은 바이트 단위입니다. 스토리지 볼륨을 생성할 때 생략하면 스토리지 볼륨이 생성 시 완전히 할당됩니다. 용량보다 작은 값으로 설정하면 스토리지 풀에서 스토리지 볼륨을 스파스적으로 할당할지 여부를 결정할 수 있습니다. 다른 유형의 스토리지 풀은 스파스 스토리지 볼륨을 다르게 취급할 수 있습니다. 예를 들어, 논리 풀은 스토리지 볼륨의 할당을 자동으로 확장하지 않습니다. 사용자는 스토리지 볼륨 할당을 자동으로 확장하거나 구성이 자동으로 수행됩니다. 기본적으로 이 값은 바이트 단위로 지정됩니다. 보기 참고
<용량> 스토리지 볼륨의 논리 용량을 제공합니다. 이 값은 기본적으로 바이트 <단위이지만 참고 에 설명된 <할당> 과 동일한 의미 체계로 단위> 특성을 지정할 수 있습니다. 이는 스토리지 볼륨을 생성할 때 반드시 필요합니다.
<소스> 스토리지 볼륨의 기본 스토리지 할당에 대한 정보를 제공합니다. 일부 스토리지 풀 유형에는 사용할 수 없습니다.
<대상> 로컬 호스트 물리적 시스템에서 스토리지 볼륨의 표현에 대한 정보를 제공합니다.
참고
필요한 경우 전달된 값을 조정하기 위해 선택적 속성 유닛 을 지정할 수 있습니다. 이 속성은 요소 <할당><용량> 과 함께 사용할 수 있습니다. 특성 단위에 허용되는 값은 다음과 같습니다.
  • 바이트의 경우 B 또는 바이트
  • KB (KB)
  • kibibytes의 경우 K 또는 KiB
  • 메가바이트의 경우 MB
  • 메비 바이트의 경우 m 또는 MiB
  • GB (GB)
  • g 또는 GiB for gibibytes
  • 테라바이트의 경우 TB
  • t 또는 TiB for tebibytes
  • PB for페타바이트
  • P 또는 PiB for pebibytes
  • e xabytes 의 경우 ebonbytes
  • E 또는 EiB for exbibytes

23.19.2. 대상 요소 설정

<target> 요소는 <볼륨> 최상위 요소에 배치할 수 있습니다. 스토리지 볼륨에서 수행되는 매핑을 호스트 물리 시스템 파일 시스템으로 설명하는 데 사용됩니다. 이 요소는 다음 자식 요소를 사용할 수 있습니다.

그림 23.84. 대상 자식 요소

         
       <target>
          <path>/var/lib/libvirt/images/sparse.img</path>
          <format type='qcow2'/>
          <permissions>
            <owner>107</owner>
            <group>107</group>
            <mode>0744</mode>
            <label>virt_image_t</label>
          </permissions>
          <compat>1.1</compat>
          <features>
            <lazy_refcounts/>
          </features>
        </target>
         

<대상에> 대한 특정 하위 요소는 표 23.31. “대상 자식 요소” 에 설명되어 있습니다.

표 23.31. 대상 자식 요소

element 설명
<path> 절대 경로로 로컬 파일 시스템에서 스토리지 볼륨에 액세스할 수 있는 위치를 제공합니다. 이는 읽기 전용 속성이며 볼륨을 만들 때 지정할 수 없습니다.
<형식> 풀 특정 볼륨 형식에 대한 정보를 제공합니다. 디스크 기반 스토리지 풀의 경우 파티션 유형을 제공합니다. 파일 시스템 또는 디렉터리 기반 스토리지 풀의 경우 파일 형식 유형(예: 소포, qcow, vmdk, raw)을 제공합니다. 스토리지 볼륨을 생성할 때 생략하면 스토리지 풀의 기본 형식이 사용됩니다. 실제 형식은 type 특성에 의해 지정됩니다. 유효한 값 목록은 13.2절. “스토리지 풀 사용” 의 특정 스토리지 풀 섹션을 참조하십시오.
<권한> 스토리지 볼륨을 생성할 때 사용할 기본 권한에 대한 정보를 제공합니다. 현재는 할당된 스토리지 볼륨이 간단한 파일인 디렉터리 또는 파일 시스템 기반 스토리지 풀에만 유용합니다. 스토리지 볼륨이 장치 노드인 스토리지 풀의 경우 핫플러그 스크립트에서 권한을 결정합니다. 여기에는 4 개의 자식 요소가 있습니다. <mode> 요소에는 8진수 권한 세트가 포함되어 있습니다. <owner> 요소에는 숫자 사용자 ID가 포함됩니다. <group> 요소에는 숫자 그룹 ID가 포함되어 있습니다. <레이블> 요소에는 MAC(예: SELinux) 레이블 문자열이 포함되어 있습니다.
<compat> 호환성 수준을 지정합니다. 지금까지 <type='qcow2> 의 볼륨에만 사용됩니다. 유효한 값은 qcow2(버전 2)용</ <compat>> 0.10 <compat>이고 qcow2(버전 3)에 대한</compat> 1.1 compat입니다. 지금까지는 이미지와 호환되어야 하는 QEMU 버전을 지정하는 데 사용됩니다. <기능> 요소가 있는 경우 <compat>1.1</compat> 이 사용됩니다. 생략하면 qemu-img 기본값이 사용됩니다.
<기능> 형식별 기능. 현재 <type='qcow2'/(버전 3) 형식> 에서만 사용됩니다. 유효한 하위 요소에는 <lazy_refcounts/> 가 포함됩니다. 이렇게 하면 메타데이터 쓰기 및 플러시 횟수가 줄어들어 초기 쓰기 성능이 향상됩니다. 이러한 개선 사항은 특히 충돌 후 이미지를 복구해야 하는 대신 쓰기 캐시 모드의 경우 볼 수 있으며 참조 업데이트가 지연될 수 있습니다. qcow2(버전 3)와 함께 이 기능을 구현하는 것이 더 빠르기 때문에 이 기능을 사용하는 것이 좋습니다.

23.19.3. 백업 저장소 element 설정

단일 <백업Store> 요소는 최상위 <볼륨> 요소에 포함되어 있습니다. 이 태그는 스토리지 볼륨의 선택적 copy-on-write 백업 저장소를 설명하는 데 사용됩니다. 여기에는 다음 하위 요소가 포함될 수 있습니다.

그림 23.85. 백업 저장소 하위 요소

            
        <backingStore>
          <path>/var/lib/libvirt/images/master.img</path>
          <format type='raw'/>
          <permissions>
            <owner>107</owner>
            <group>107</group>
            <mode>0744</mode>
            <label>virt_image_t</label>
          </permissions>
        </backingStore>
            

표 23.32. 백업 저장소 하위 요소

element 설명
<path> 절대 경로로 로컬 파일 시스템에서 백업 저장소에 액세스할 수 있는 위치를 제공합니다. 생략하면 이 스토리지 볼륨의 백업 저장소가 없습니다.
<형식> 풀별 백업 저장소 형식에 대한 정보를 제공합니다. 디스크 기반 스토리지 풀의 경우 파티션 유형을 제공합니다. 파일 시스템 또는 디렉터리 기반 스토리지 풀의 경우 파일 형식 유형(예: 소포, qcow, vmdk, raw)을 제공합니다. 실제 형식은 <type> 특성을 통해 지정됩니다. 유효한 값 목록은 풀별 문서를 참조하십시오. 대부분의 파일 형식에는 동일한 형식의 백업 저장소가 필요하지만 qcow2 형식은 다른 백업 저장소 형식을 사용할 수 있습니다.
<권한> 백업 파일의 권한에 대한 정보를 제공합니다. 여기에는 4 개의 자식 요소가 있습니다. <owner> 요소에는 숫자 사용자 ID가 포함됩니다. <group> 요소에는 숫자 그룹 ID가 포함되어 있습니다. <레이블> 요소에는 MAC(예: SELinux) 레이블 문자열이 포함되어 있습니다.

23.20. 보안 레이블

<seclabel> 요소를 사용하면 보안 드라이버의 작동을 제어할 수 있습니다. 작업 기본 모드는 'dynamic' 이며, libvirt가 고유한 보안 레이블을 자동으로 생성하는 'static', 애플리케이션/관리자가 레이블을 선택하는 '정규(static)' 또는 confinement가 비활성화된 'none' 이 있습니다. libvirt는 동적 레이블 생성을 통해 항상 가상 머신과 관련된 모든 리소스의 레이블을 자동으로 다시 지정합니다. 정적 레이블 할당을 사용하면 기본적으로 관리자 또는 애플리케이션에서 라벨이 모든 리소스에서 올바르게 설정되어 있는지 확인해야 하지만 필요한 경우 자동 레이블 재지정을 활성화할 수 있습니다.
libvirt에서 두 개 이상의 보안 드라이버를 사용하는 경우, 각 드라이버에 대해 여러 SAlabel 태그를 사용할 수 있으며, 각 태그에서 참조하는 보안 드라이버를 특성 모델을 사용하여 정의할 수 있습니다. 최상위 보안 레이블에 유효한 입력 XML 구성은 다음과 같습니다.

그림 23.86. 보안 레이블


  <seclabel type='dynamic' model='selinux'/>

  <seclabel type='dynamic' model='selinux'>
    <baselabel>system_u:system_r:my_svirt_t:s0</baselabel>
  </seclabel>

  <seclabel type='static' model='selinux' relabel='no'>
    <label>system_u:system_r:svirt_t:s0:c392,c662</label>
  </seclabel>

  <seclabel type='static' model='selinux' relabel='yes'>
    <label>system_u:system_r:svirt_t:s0:c392,c662</label>
  </seclabel>

  <seclabel type='none'/>
입력 XML에 'type' 특성이 제공되지 않으면 'none' 또는 'dynamic' 일 수 있는 보안 드라이버 기본 설정이 사용됩니다. <baselabel> 이 설정되었지만 'type' 이 설정되어 있지 않으면 유형이 '동적화'인 것으로 간주됩니다. 자동 리소스 레이블을 다시 지정하여 실행 중인 게스트 가상 머신의 XML을 볼 때 추가 XML 요소인 imagelabel 이 포함됩니다. 이는 출력 전용 요소이므로 사용자가 제공한 XML 문서에서 무시됩니다.
다음 요소를 다음 값으로 조작할 수 있습니다.
  • 유형 - 정적 , 동적 또는 libvirt가 고유한 보안 레이블을 자동으로 생성하는지 여부를 확인할 수 없습니다.
  • 모델 - 현재 활성화된 보안 모델과 일치하는 유효한 보안 모델 이름입니다.
  • 레이블 재지정 - 예 또는 아니오 . 동적 레이블 할당이 사용되는 경우 항상 yes 여야 합니다. 정적 레이블 할당을 사용하면 기본적으로 no 가 설정됩니다.
  • <레이블> - 정적 레이블링이 사용되는 경우 가상 도메인에 할당할 전체 보안 레이블을 지정해야 합니다. 콘텐츠 형식은 사용 중인 보안 드라이버에 따라 다릅니다.
    • selinux: SELinux 컨텍스트.
    • AppArmor: AppArmor 프로필입니다.
    • DAC: 콜론으로 구분된 소유자 및 그룹. 사용자/그룹 이름 또는 UID/GID로 둘 다 정의할 수 있습니다. 드라이버는 먼저 이러한 값을 이름으로 구문 분석하려고 하지만 선행 더하기 기호는 드라이버에서 UID 또는 GID로 구문 분석하도록 강제할 수 있습니다.
  • <baselabel> - 동적 레이블이 사용되는 경우 선택적으로 기본 보안 레이블을 지정하는 데 사용할 수 있습니다. 콘텐츠 형식은 사용 중인 보안 드라이버에 따라 다릅니다.
  • <imagelabel> - 출력 전용 요소이며 가상 도메인과 연결된 리소스에 사용되는 보안 레이블을 표시합니다. 콘텐츠 형식은 사용 중인 보안 드라이버에 따라 다릅니다. 레이블 재지정이 적용되는 경우 레이블을 비활성화하여 특정 소스 파일 이름에 대해 수행되는 레이블을 미세 조정할 수도 있습니다(보안 레이블이 없는 파일이 NFS 또는 기타 파일 시스템에 존재하는 경우 유용함) 관리 애플리케이션에서 특정 도메인 간 공유를 허용하기 위해 특수 레이블을 생성할 때 사용할 수도 있습니다. 보안 주체가 최상위 도메인 할당이 아닌 특정 경로에 연결된 경우 특성 레이블 레이블 또는 하위 요소 레이블만 지원됩니다.

23.21. 샘플 가상 머신 XML 구성

다음 표에서는 도메인 XML이라고도 하는 게스트 VM(가상 머신)의 샘플 XML 구성을 보여주고 구성 내용을 설명합니다.
VM의 XML 구성을 가져오려면 virsh dumpxml 명령을 사용합니다. VM 구성 편집에 대한 자세한 내용은 가상화 시작하기 가이드 를 참조하십시오.

표 23.33. 샘플 도메인 XML 구성

도메인 XML 섹션 설명
								
	<domain type='kvm'>
	<name>Testguest1</name>
	<uuid>ec6fbaa1-3eb4-49da-bf61-bb02fbec4967</uuid>
	<memory unit='KiB'>1048576</memory>
	<currentMemory unit='KiB'>1048576</currentMemory>
	<vcpu placement='static'>1</vcpu>

이 KVM은 1024MiB 할당된 RAM이 있는 Testguest1이라는 KVM입니다. 일반 VM 매개변수 구성에 대한 자세한 내용은 23.1절. “일반 정보 및 메타데이터” 을 참조하십시오.
									
	<vcpu placement='static'>1</vcpu>

게스트 VM에는 1개의 vCPU가 할당되어 있습니다. CPU 할당에 대한 자세한 내용은 23.4절. “CPU 할당” 을 참조하십시오.
					 		
	<os>
		<type arch='x86_64' machine='pc-i440fx-2.9'>hvm</type>
		<boot dev='hd'/>
	</os>

머신 아키텍처는 AMD64 및 Intel 64 아키텍처로 설정되며 Intel 440NetworkPolicy 머신 유형을 사용하여 기능 호환성을 결정합니다. OS는 하드 드라이브에서 부팅됩니다. OS 매개변수 수정에 대한 자세한 내용은 23.2절. “운영 체제 부팅” 을 참조하십시오.
					 		
	<features>
		<acpi/>
		<apic/>
		<vmport state='off'/>
	</features>

하이퍼바이저 기능 acpiapic 는 비활성화되어 VMWare IO 포트가 해제되었습니다. Hypervisor 기능 수정에 대한 자세한 내용은 -23.14절. “하이퍼바이저 기능” 를 참조하십시오.
					 		
	<cpu mode='host-passthrough' check='none'/>

게스트 CPU 기능은 호스트 CPU의 기능과 동일하게 설정되어 있습니다. CPU 기능 수정에 대한 자세한 내용은 -23.12절. “CPU 모델 및 토폴로지” 을 참조하십시오.
							
	<clock offset='utc'>
		<timer name='rtc' tickpolicy='catchup'/>
		<timer name='pit' tickpolicy='delay'/>
		<timer name='hpet' present='no'/>
	</clock>

게스트의 가상 하드웨어 시계는 UTC 시간대를 사용합니다. 또한 QEMU 하이퍼바이저와 동기화되도록 3개의 다른 타이머가 설정됩니다. 시간 유지 설정에 대한 자세한 내용은 -23.15절. “Timekeeping” 을 참조하십시오.
							
	<on_poweroff>destroy</on_poweroff>
	<on_reboot>restart</on_reboot>
	<on_crash>destroy</on_crash>

VM의 전원을 끄거나 OS가 예기치 않게 종료되면 libvirt는 게스트를 종료하고 할당된 모든 리소스를 해제합니다. 게스트가 재부팅되면 동일한 구성으로 다시 시작됩니다. 이러한 설정 구성에 대한 자세한 내용은 -23.13절. “이벤트 구성” 을 참조하십시오.
							
	<pm>
		<suspend-to-mem enabled='no'/>
		<suspend-to-disk enabled='no'/>
	</pm>

이 게스트 VM의 S3 및 S4 ACPI 절전 상태는 비활성화됩니다. "/>.
					 		
	<devices>
		<emulator>/usr/bin/qemu-kvm</emulator>
		<disk type='file' device='disk'>
			<driver name='qemu' type='qcow2'/>
			<source file='/var/lib/libvirt/images/Testguest.qcow2'/>
			<target dev='hda' bus='ide'/>
			<address type='drive' controller='0' bus='0' target='0' unit='0'/>
		</disk>
		<disk type='file' device='cdrom'>
			<driver name='qemu' type='raw'/>
			<target dev='hdb' bus='ide'/>
			<readonly/>
			<address type='drive' controller='0' bus='0' target='0' unit='1'/>
		</disk>

VM은 에뮬레이션에 /usr/bin/qemu-kvm 바이너리 파일을 사용합니다. 또한 두 개의 디스크가 연결되어 있습니다. 첫 번째 디스크는 호스트에 저장된 /var/lib/libvirt/images/Testguest.qcow2 를 기반으로 하는 가상화된 하드 드라이브이며 논리 장치 이름은 hda 로 설정됩니다. 디스크 관리에 대한 자세한 내용은 -23.17.1절. “하드 드라이브, Floppy 디스크 및 CD-ROM” 을 참조하십시오.
							
		<controller type='usb' index='0' model='ich9-ehci1'>
			<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x7'/>
		</controller>
		<controller type='usb' index='0' model='ich9-uhci1'>
			<master startport='0'/>
			<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/>
		</controller>
		<controller type='usb' index='0' model='ich9-uhci2'>
			<master startport='2'/>
			<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/>
		</controller>
		<controller type='usb' index='0' model='ich9-uhci3'>
			<master startport='4'/>
			<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x2'/>
		</controller>
		<controller type='pci' index='0' model='pci-root'/>
		<controller type='ide' index='0'>
			<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
		</controller>
		<controller type='virtio-serial' index='0'>
			<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
		</controller>

VM은 USB 장치를 연결하는 데 네 개의 컨트롤러를 사용하고 PCI(PCIe) 장치에 root 컨트롤러를 사용합니다. 또한 virtio-serial 컨트롤러를 사용하면 VM이 직렬 콘솔과 같은 다양한 방식으로 호스트와 상호 작용할 수 있습니다. 컨트롤러 구성에 대한 자세한 내용은 -23.17.3절. “컨트롤러” 을 참조하십시오.
					 	
		<interface type='network'>
			<mac address='52:54:00:65:29:21'/>
			<source network='default'/>
			<model type='rtl8139'/>
			<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
		</interface>

네트워크 인터페이스는 기본 가상 네트워크와 rtl8139 네트워크 장치 모델을 사용하는 VM에 설정됩니다. 네트워크 인터페이스 구성에 대한 자세한 내용은 -23.17.8절. “네트워크 인터페이스” 을 참조하십시오.
						
		<serial type='pty'>
			<target port='0'/>
		</serial>
		<console type='pty'>
			<target type='serial' port='0'/>
		</console>
		<channel type='spicevmc'>
			<target type='virtio' name='com.redhat.spice.0'/>
			<address type='virtio-serial' controller='0' bus='0' port='1'/>
		</channel>

호스트와의 가장 기본적인 VM 통신을 가능하게 하는 VM에 pty 직렬 콘솔이 설정됩니다. 콘솔은 반가상화 SPICE 채널을 사용합니다. 이 설정은 자동으로 설정되어 있으며 이러한 설정을 변경하는 것은 권장되지 않습니다. 문자 장치에 대한 개요는 -23.17.8절. “네트워크 인터페이스” 를 참조하십시오. 직렬 포트콘솔에 대한 자세한 내용은 23.17.14절. “게스트 가상 머신 인터페이스” 을 참조하십시오. 채널에 대한 자세한 내용은 23.17.15절. “채널” 을 참조하십시오.
					 	
		<input type='mouse' bus='ps2'/>
		<input type='keyboard' bus='ps2'/>

VM은 마우스 및 키보드 입력을 수신하도록 설정된 가상 ps2 포트를 사용합니다. 이 설정은 자동으로 설정되어 있으며 이러한 설정을 변경하는 것은 권장되지 않습니다. 자세한 내용은 23.17.9절. “입력 장치”의 내용을 참조하십시오.
					 	
		<graphics type='spice' autoport='yes'>
			<listen type='address'/>
			<image compression='off'/>
		</graphics>

VM은 자동 할당된 포트 번호 및 이미지 압축을 해제하여 그래픽 출력을 렌더링하는 데 SPICE 프로토콜을 사용합니다. 그래픽 장치 구성에 대한 자세한 내용은 23.17.11절. “그래픽 프레임 버퍼” 을 참조하십시오.
					 		
		<sound model='ich6'>
			<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
		</sound>
		<video>
			<model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
			<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
		</video>

ICH6 HDA 음향 장치는 VM용으로 설정되고 QEMU QXL 반가상화 프레임buffer 장치가 비디오 가속기로 설정됩니다. 이 설정은 자동으로 설정되어 있으며 이러한 설정을 변경하는 것은 권장되지 않습니다. 건전한 장치 구성에 대한 자세한 내용은 23.17.17절. “건전한 장치” 을 참조하십시오. 비디오 장치 구성은 23.17.12절. “동영상 장치” 에서 참조하십시오.
							
		<redirdev bus='usb' type='spicevmc'>
				<address type='usb' bus='0' port='1'/>
		</redirdev>
		<redirdev bus='usb' type='spicevmc'>
				<address type='usb' bus='0' port='2'/>
		</redirdev>
		<memballoon model='virtio'>
				<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
		</memballoon>
	</devices>
</domain>

VM에는 USB 장치를 원격으로 연결하기 위한 리디렉션기 두 개가 있으며 메모리 증대 가 켜집니다. 이 설정은 자동으로 설정되어 있으며 이러한 설정을 변경하는 것은 권장되지 않습니다. 자세한 내용은 다음을 참조하십시오. 23.17.6절. “리디렉션 장치”

III 부. 부록

이 부분에서는 가상화 문제의 일반적인 문제와 해결 방법에 대해 설명하고, 여러 아키텍처에서 KVM 가상화를 사용하는 방법 및 IOMMU 그룹 작업을 수행하는 방법에 대한 지침을 제공합니다. 또한 가상화 패키지의 추가 지원 및 제품 제한에 대한 정보도 포함되어 있습니다.

부록 A. 문제 해결

이 장에서는 Red Hat Enterprise Linux 7 가상화 문제의 일반적인 문제와 솔루션에 대해 설명합니다.
이 장에서는 가상화 기술과 관련된 몇 가지 일반적인 문제에 대해 설명합니다. 문제 해결 기술을 개발하기 위해 Red Hat Enterprise Linux 7에서 가상화를 실험하고 테스트하는 것이 좋습니다.
이 문서에서 답변을 찾을 수 없는 경우 가상화 커뮤니티의 온라인 응답이 있을 수 있습니다. Linux 가상화 웹 사이트 목록은 D.1절. “온라인 리소스” 를 참조하십시오.
또한 RHEL 7의 가상화 문제 해결에 대한 자세한 내용은 Red Hat 지식베이스 에서 확인할 수 있습니다.

A.1. 디버깅 및 문제 해결 툴

이 섹션에서는 시스템 관리자 애플리케이션, 네트워킹 유틸리티 및 디버깅 툴을 요약합니다. 이러한 표준 시스템 관리 툴 및 로그를 사용하여 문제 해결을 지원할 수 있습니다.
이러한 네트워킹 유틸리티는 가상화 네트워킹 문제를 해결하는 데 도움이 될 수 있습니다.
  • IP addr,ip route, ip monitor
  • tcpdump - 네트워크에서 패킷 트래픽을 진단합니다. 이 명령은 네트워크 비정상적인 상태 및 네트워크 인증 문제를 찾는 데 유용합니다. tcpdump 라는 이름의 그래픽 버전이 있습니다.
  • brctl - Linux 커널에서 이더넷 브리지 구성을 검사하고 구성하는 네트워킹 유틸리티입니다. 예를 들면 다음과 같습니다.
    $ brctl show
    bridge-name    bridge-id          STP  enabled  interfaces
    -----------------------------------------------------------------------------
    virtbr0             8000.feffffff       yes        eth0
    
    $ brctl showmacs virtbr0
    port-no           mac-addr                  local?       aging timer
    1                 fe:ff:ff:ff:ff:           yes            0.00
    2                 fe:ff:ff:fe:ff:           yes            0.00
    $ brctl showstp virtbr0
    virtbr0
    bridge-id              8000.fefffffffff
    designated-root        8000.fefffffffff
    root-port              0                   path-cost             0
    max-age                20.00               bridge-max-age        20.00
    hello-time             2.00                bridge-hello-time     2.00
    forward-delay          0.00                bridge-forward-delay  0.00
    aging-time            300.01
    hello-timer            1.43                tcn-timer             0.00
    topology-change-timer  0.00                gc-timer              0.02
    
다음은 가상화 문제 해결을 위한 몇 가지 유용한 명령입니다.
  • strace 는 다른 프로세스에서 수신하고 사용하는 시스템 호출 및 이벤트를 추적하는 명령입니다.
  • vncviewer 는 서버 또는 가상 시스템에서 실행 중인 VNC 서버에 연결합니다. yum install tigervnc 명령을 사용하여 vncviewer 를 설치합니다.
  • vncserver 는 서버에서 원격 데스크탑을 시작합니다. 원격 세션을 사용하여 virt-manager와 같은 그래픽 사용자 인터페이스를 실행할 수 있는 기능을 제공합니다. yum install tigervnc-server 명령을 사용하여 vncserver 를 설치합니다.
위에 나열된 모든 명령 외에도 가상화 로그를 검사하는 것이 도움이 될 수 있습니다. 자세한 내용은 A.6절. “가상화 로그”의 내용을 참조하십시오.

A.2. 덤프 파일 생성

가상 머신의 코어의 덤프를 파일에 요청할 수 있으므로 가상 머신의 오류를 진단할 수 있습니다(예: crash 유틸리티 ).
주의
Red Hat Enterprise Linux 7.5 이상에서는 KASLR(커널 주소 공간 Randomization) 기능을 사용하면 충돌 시 게스트 덤프 파일을 읽을 수 없습니다. 이 문제를 해결하려면 게스트의 XML 구성 파일의 <features> 섹션에 <vmcoreinfo/> 요소를 추가합니다.
그러나 대상 호스트에서 <vmcoreinfo/> 를 지원하지 않는 OS를 사용하는 경우 <vmcoreinfo/> 를 사용하여 게스트 마이그레이션 은 실패합니다. 여기에는 Red Hat Enterprise Linux 7.4 및 Red Hat Enterprise Linux 6.9 및 이전 버전이 포함됩니다.

A.2.1. virsh Dump 파일 생성

virsh dump 명령을 실행하면 게스트 가상 시스템의 코어를 파일에 덤프하도록 요청을 보내 가상 머신의 오류를 진단할 수 있습니다. 이 명령을 실행하려면 corefilepath 인수에서 지정한 파일 및 경로에 대한 적절한 권한을 수동으로 확인해야 합니다. virsh dump 명령은 코어 덤프(또는 크래시 유틸리티)와 유사합니다.
자세한 내용은 게스트 가상 머신 코어의 덤프 파일 생성 을 참조하십시오.

A.2.2. Python 스크립트를 사용하여 코어 덤프 저장

dump-guest-memory.py python 스크립트는 qemu-kvm 프로세스가 호스트에 충돌한 후 코어 덤프에서 게스트 가상 머신의 메모리를 추출 및 저장하는 GDB(GNU Debugger) 확장을 구현합니다. 호스트 측 QEMU 프로세스 충돌이 게스트 작업과 관련된 경우 QEMU 프로세스 충돌 시 게스트 상태를 조사하는 것이 유용할 수 있습니다.
python 스크립트는 GDB 확장을 구현합니다. GDB에 대한 새로운 명령입니다. GDB를 사용하여 원본(crashed) QEMU 프로세스의 코어 덤프 파일을 연 후 GDB로 python 스크립트를 로드할 수 있습니다. 그런 다음 GDB 프롬프트에서 새 명령을 실행할 수 있습니다. 이를 통해 QEMU 코어에서 새 로컬 파일을 덤프하는 게스트 메모리 덤프가 추출됩니다.
dump-guest-memory.py python 스크립트를 사용하려면 다음을 수행합니다.
  1. 시스템에 qemu-kvm-debuginfo 패키지를 설치합니다.
  2. GDB를 시작하여 크래시된 /usr/libexec/qemu-kvm 바이너리에 대해 저장된 코어 덤프 파일을 엽니다. 디버그 기호가 자동으로 로드됩니다.
  3. GDB에서 새 명령을 로드합니다.
    # source /usr/share/qemu-kvm/dump-guest-memory.py
    참고
    python 스크립트를 로드한 후 built-in GDB help 명령은 dump-guest-memory 확장에 대한 자세한 정보를 제공할 수 있습니다.
  4. GDB에서 명령을 실행합니다. 예를 들면 다음과 같습니다.
    # dump-guest-memory /home/user/extracted-vmcore X86_64
  5. 게스트 커널 분석을 위한 크래시 유틸리티를 사용하여 /home/user/extracted-vmcore 를 엽니다.
크래시 유틸리티에 사용할 QEMU 코어 파일에서 게스트 가상 머신 코어를 추출하는 방법에 대한 자세한 내용은 ' crash' 유틸리티에서 사용할 수 있도록 'gcore'에서 ELF 코어를 추출하는 방법을 참조하십시오.

A.3. Systemtap Flight Recorder를 사용하여 Constant Basis에서 추적 데이터 캡처

qemu-kvm 패키지에 제공된 systemtap initscript를 사용하여 항상 QEMU 추적 데이터를 캡처할 수 있습니다. 이 패키지는 SystemTap의 초보 레코더 모드를 사용하여 실행 중인 모든 게스트 가상 머신을 추적하고 호스트의 고정 크기 버퍼에 결과를 저장합니다. 이전 추적 항목은 버퍼가 채워지면 새 항목으로 덮어씁니다.

절차 A.1. systemtap 구성 및 실행

  1. 패키지를 설치합니다.

    다음 명령을 실행하여 systemtap-initscript 패키지를 설치합니다.
    # yum install systemtap-initscript
  2. 구성 파일 복사

    다음 명령을 실행하여 systemtap 스크립트 및 구성 파일을 systemtap 디렉터리에 복사합니다.
    # cp /usr/share/qemu-kvm/systemtap/script.d/qemu_kvm.stp /etc/systemtap/script.d/
    # cp /usr/share/qemu-kvm/systemtap/conf.d/qemu_kvm.conf /etc/systemtap/conf.d/
    활성화할 추적 이벤트 세트는 qemu_kvm.stp에 제공됩니다. 이 SystemTap 스크립트는 /usr/share/systemtap/tapset/qemu-kvm-simpletrace.stp 에 제공된 추적 이벤트를 추가 또는 제거하도록 사용자 지정할 수 있습니다.
    qemu_kvm.conf 에서 flight recorder 버퍼 크기 및 메모리에 추적 저장 여부를 제어하도록 qemu_kvm.conf를 만들 수 있습니다.
  3. 서비스 시작

    다음 명령을 실행하여 systemtap 서비스를 시작합니다.
    # systemctl start systemtap qemu_kvm
  4. 부팅 시 systemtap을 사용하도록 설정

    다음 명령을 실행하여 부팅 시 systemtap 서비스가 실행되도록 활성화합니다.
    # systemctl enable systemtap qemu_kvm
  5. 서비스가 실행 중인지 확인

    다음 명령을 실행하여 서비스가 작동하는지 확인합니다.
    # systemctl status systemtap qemu_kvm
    qemu_kvm is running...
    

절차 A.2. 추적 버퍼 검사

  1. 추적 버퍼 덤프 파일 생성

    trace.log라는 추적 버퍼 덤프 파일을 생성하고 다음 명령을 실행하여 tmp 디렉터리에 배치합니다.
    # staprun -A qemu_kvm >/tmp/trace.log
    파일 이름과 위치를 다른 이름으로 변경할 수 있습니다.
  2. 서비스 시작

    이전 단계에서 서비스를 중지하면 다음 명령을 실행하여 서비스를 다시 시작합니다.
    # systemctl start systemtap qemu_kvm
  3. 추적 내용을 읽을 수 있는 형식으로 변환

    추적 파일 내용을 보다 읽기 쉬운 형식으로 변환하려면 다음 명령을 입력합니다.
    # /usr/share/qemu-kvm/simpletrace.py --no-header /usr/share/qemu-kvm/trace-events /tmp/trace.log
참고
다음 노트 및 제한 사항에 유의하십시오.
  • systemtap 서비스는 기본적으로 비활성화되어 있습니다.
  • 이 서비스를 활성화하면 작은 성능 저하가 있지만 총 사용 가능한 이벤트에 따라 달라집니다.
  • /usr/share/doc/qemu-kvm-*/README.systemtap 에 README 파일이 있습니다.

A.4. kvm_stat

kvm_stat 명령은 kvm 커널 모듈에서 런타임 통계를 검색하는 python 스크립트입니다. kvm_stat 명령을 사용하여 kvm 에 표시되는 게스트 동작을 진단할 수 있습니다. 특히 게스트와 관련된 성능 관련 문제가 있습니다. 현재 보고된 통계는 전체 시스템에 적용됩니다. 실행 중인 모든 게스트의 동작이 보고됩니다. 이 스크립트를 실행하려면 qemu-kvm-tools 패키지를 설치해야 합니다. 자세한 내용은 2.2절. “기존 Red Hat Enterprise Linux 시스템에 가상화 패키지 설치”의 내용을 참조하십시오.
kvm_stat 명령을 사용하려면 kvm 커널 모듈이 로드되고 debugfs 가 마운트됩니다. 이러한 기능 중 하나가 활성화되지 않은 경우 명령은 debugfs 또는 kvm 모듈을 활성화하는 데 필요한 단계를 출력합니다. 예를 들면 다음과 같습니다.
# kvm_stat
Please mount debugfs ('mount -t debugfs debugfs /sys/kernel/debug')
and ensure the kvm modules are loaded
필요한 경우 debugfs 를 마운트합니다.
# mount -t debugfs debugfs /sys/kernel/debug

kvm_stat Output

kvm_stat 명령은 모든 게스트 및 호스트에 대한 통계를 출력합니다. Ctrl+c 또는 q 키를 사용하여 명령이 종료될 때까지 출력이 업데이트됩니다. 화면에 표시되는 출력은 다를 수 있습니다. 출력 요소에 대한 설명을 보려면 용어 중 하나를 클릭하여 조각 모음에 연결합니다.

  # kvm_stat

  kvm statistics
   kvm_exit                      17724        66
    Individual exit reasons follow, see kvm_exit (NAME) for more information. 
   kvm_exit(CLGI)                    0         0
   kvm_exit(CPUID)                   0         0
   kvm_exit(CR0_SEL_WRITE)           0         0
   kvm_exit(EXCP_BASE)               0         0
   kvm_exit(FERR_FREEZE)             0         0
   kvm_exit(GDTR_READ)               0         0
   kvm_exit(GDTR_WRITE)              0         0
   kvm_exit(HLT)                    11        11
   kvm_exit(ICEBP)                   0         0
   kvm_exit(IDTR_READ)               0         0
   kvm_exit(IDTR_WRITE)              0         0
   kvm_exit(INIT)                    0         0
   kvm_exit(INTR)                    0         0
   kvm_exit(INVD)                    0         0
   kvm_exit(INVLPG)                  0         0
   kvm_exit(INVLPGA)                 0         0
   kvm_exit(IOIO)                    0         0
   kvm_exit(IRET)                    0         0
   kvm_exit(LDTR_READ)               0         0
   kvm_exit(LDTR_WRITE)              0         0
   kvm_exit(MONITOR)                 0         0
   kvm_exit(MSR)                    40        40
   kvm_exit(MWAIT)                   0         0
   kvm_exit(MWAIT_COND)              0         0
   kvm_exit(NMI)                     0         0
   kvm_exit(NPF)                     0         0
   kvm_exit(PAUSE)                   0         0
   kvm_exit(POPF)                    0         0
   kvm_exit(PUSHF)                   0         0
   kvm_exit(RDPMC)                   0         0
   kvm_exit(RDTSC)                   0         0
   kvm_exit(RDTSCP)                  0         0
   kvm_exit(READ_CR0)                0         0
   kvm_exit(READ_CR3)                0         0
   kvm_exit(READ_CR4)                0         0
   kvm_exit(READ_CR8)                0         0
   kvm_exit(READ_DR0)                0         0
   kvm_exit(READ_DR1)                0         0
   kvm_exit(READ_DR2)                0         0
   kvm_exit(READ_DR3)                0         0
   kvm_exit(READ_DR4)                0         0
   kvm_exit(READ_DR5)                0         0
   kvm_exit(READ_DR6)                0         0
   kvm_exit(READ_DR7)                0         0
   kvm_exit(RSM)                     0         0
   kvm_exit(SHUTDOWN)                0         0
   kvm_exit(SKINIT)                  0         0
   kvm_exit(SMI)                     0         0
   kvm_exit(STGI)                    0         0
   kvm_exit(SWINT)                   0         0
   kvm_exit(TASK_SWITCH)             0         0
   kvm_exit(TR_READ)                 0         0
   kvm_exit(TR_WRITE)                0         0
   kvm_exit(VINTR)                   1         1
   kvm_exit(VMLOAD)                  0         0
   kvm_exit(VMMCALL)                 0         0
   kvm_exit(VMRUN)                   0         0
   kvm_exit(VMSAVE)                  0         0
   kvm_exit(WBINVD)                  0         0
   kvm_exit(WRITE_CR0)               2         2
   kvm_exit(WRITE_CR3)               0         0
   kvm_exit(WRITE_CR4)               0         0
   kvm_exit(WRITE_CR8)               0         0
   kvm_exit(WRITE_DR0)               0         0
   kvm_exit(WRITE_DR1)               0         0
   kvm_exit(WRITE_DR2)               0         0
   kvm_exit(WRITE_DR3)               0         0
   kvm_exit(WRITE_DR4)               0         0
   kvm_exit(WRITE_DR5)               0         0
   kvm_exit(WRITE_DR6)               0         0
   kvm_exit(WRITE_DR7)               0         0
   kvm_entry                     17724        66
   kvm_apic                      13935        51
   kvm_emulate_insn              13924        51
   kvm_mmio                      13897        50
   varl-kvm_eoi                   3222        12
   kvm_inj_virq                   3222        12
   kvm_apic_accept_irq            3222        12
   kvm_pv_eoi                     3184        12
   kvm_fpu                         376         2
   kvm_cr                          177         1
   kvm_apic_ipi                    278         1
   kvm_msi_set_irq                 295         0
   kvm_pio                          79         0
   kvm_userspace_exit               52         0
   kvm_set_irq                      50         0
   kvm_pic_set_irq                  50         0
   kvm_ioapic_set_irq               50         0
   kvm_ack_irq                      25         0
   kvm_cpuid                        90         0
   kvm_msr                          12         0

변수에 대한 설명:

  • kvm_ack_irq - 인터럽트 컨트롤러 (PIC/IOAPIC) 인터럽트 승인 수
  • kvm_age_page - 메모리 관리 장치(MMU) 알림에 의한 페이지 사용 기간 반복 수입니다.
  • kvm_apic - APIC 레지스터 액세스 수입니다.
  • kvm_apic_accept_irq - 로컬 APIC에 허용되는 인터럽트 수입니다.
  • kvm_apic_ipi - 프로세서 인터럽트 수입니다.
  • kvm_async_pf_completed - 비동기 페이지 폴트 수입니다.
  • kvm_async_pf_doublefault - 비동기 페이지 폴트 수가 중단됩니다.
  • kvm_async_pf_not_present - 비동기 페이지 폴트의 초기화 횟수입니다.
  • kvm_async_pf_ready - 비동기 페이지 폴트 수입니다.
  • kvm_cpuid - 실행되는 CPUID 명령 수입니다.
  • kvm_cr - 묶기 및 에뮬레이션된 컨트롤 레지스터(CR) 액세스 수(CR0, CR3, CR4, CR8)
  • kvm_emulate_insn - 에뮬레이션된 명령 수입니다.
  • kvm_entry - 에뮬레이션된 명령 수입니다.
  • kvm_eoi - EOI(Advanced Programmable Interrupt Controller) 알림 종료입니다.
  • kvm_exit - VM-exits 수입니다.
  • kvm_exit(NAME) - 프로세서에 고유한 개별 종료입니다. 자세한 내용은 프로세서의 설명서를 참조하십시오.
  • kvm_fpu - KVM 부동 소수점 단위(FPU) 수를 다시 로드합니다.
  • kvm_hv_hypercall - 하이퍼 V 하이퍼 호출 수입니다.
  • kvm_hypercall - Hyper-V 하이퍼 호출 수입니다.
  • kvm_inj_exception - 게스트에 삽입된 예외 수입니다.
  • kvm_inj_virq - 게스트에 삽입된 인터럽트 수입니다.
  • kvm_invlpga - INVLPGA 명령의 수가 차단되었습니다.
  • kvm_ioapic_set_irq - 인터럽트 수준 수가 가상 IOAPIC 컨트롤러에 변경됨
  • kvm_mmio - 에뮬레이션된 메모리 매핑된 I/O(MMIO) 작업 수입니다.
  • kvm_msi_set_irq - MSI(메시지 서명 인터럽트) 수입니다.
  • kvm_msr - 모델별 레지스터(MSR) 액세스 수입니다.
  • kvm_nested_intercepts - L1의 L1 중첩된 SVM 스위치 수입니다.
  • kvm_nested_vmrun - L1의 중첩된 SVM 스위치 수입니다.
  • kvm_nested_intr_vmexit - 인터럽트 윈도우로 인해 중첩된 VM-exit 삽입 수입니다.
  • kvm_nested_vmexit - 중첩(L2) 게스트를 실행하는 동안 하이퍼바이저로 종료됩니다.
  • kvm_nested_vmexit_inject - L2의 L1 중첩된 스위치 수.
  • kvm_page_fault - 하이퍼바이저에서 처리하는 페이지 폴트 수입니다.
  • kvm_pic_set_irq - 인터럽트 수준 수가 가상 프로그래밍 가능 인터럽트 컨트롤러(PIC)로 변경됩니다.
  • kvm_pio - 에뮬레이션된 I/O(PIO) 작업 수입니다.
  • kvm_pv_eoi - EOI(Input of input) 이벤트 수입니다.
  • kvm_set_irq - 일반 IRQ 컨트롤러 레벨 (국가 PIC, IOAPIC 및 rootfs)의 인터럽트 수준 변경 수입니다.
  • kvm_skinit - SVM SKINIT이 종료됩니다.
  • kvm_track_tsc - 타임스탬프 카운터(TSC) 쓰기 수입니다.
  • kvm_try_async_get_page - 비동기 페이지 폴트 횟수입니다.
  • kvm_update_master_clock - pvclock 업데이트 번호입니다.
  • kvm_userspace_exit - 사용자 공간에 대한 종료 횟수입니다.
  • kvm_write_tsc_offset - TSC 오프셋 쓰기 수입니다.
  • vcpu_match_mmio - 캐시된 SPTE 메모리 매핑 I/O (MMIO)가 충돌했습니다.
kvm_stat 명령의 출력 정보는 KVM 하이퍼바이저에 의해 /sys/kernel/debug/tracing/events/kvm/ 디렉터리에 있는 의사 파일로 내보냅니다.

A.5. 직렬 콘솔 문제 해결

Linux 커널은 정보를 직렬 포트로 출력할 수 있습니다. 이는 비디오 장치 또는 헤드리스 서버의 커널 패닉 및 하드웨어 문제를 디버깅하는 데 유용합니다.
KVM 게스트에 대해 직렬 콘솔 출력을 활성화하려면 다음을 수행합니다.
  1. 게스트의 도메인 XML 파일에 직렬 콘솔의 구성이 포함되어 있는지 확인합니다. 예를 들면 다음과 같습니다.
              
      <console type='pty'>
        <source path='/dev/pts/16'/>
        <target type='virtio' port='1'/>
        <alias name='console1'/>
      </console>
    
    
  2. 게스트에서 Red Hat 지식베이스에 대한 직렬 콘솔을 활성화하려면 How can I enable serial console for Red Hat Enterprise Linux 7? 문서를 참조하십시오.
그런 다음 호스트에서 다음 명령을 사용하여 직렬 콘솔에 액세스할 수 있습니다. 여기서 guestname 은 게스트 가상 머신의 이름입니다.
# virsh console guestname
virt-manager 를 사용하여 가상 텍스트 콘솔을 표시할 수도 있습니다. 게스트 콘솔 창의 보기 메뉴에서 텍스트 콘솔의 직렬 1 을 선택합니다.

A.6. 가상화 로그

다음 방법을 사용하여 하이퍼바이저 및 게스트의 이벤트에 대한 로그 데이터에 액세스할 수 있습니다. 이는 시스템에서 가상화 문제를 해결할 때 유용할 수 있습니다.
  • 각 게스트에는 /var/log/libvirt/qemu/ 디렉터리에 저장된 로그가 있습니다. 로그의 이름은 GuestName.log이며 크기 제한에 도달하면 주기적으로 압축됩니다.
  • systemd journal 에서 libvirt 이벤트를 보려면 다음 명령을 사용합니다.
    # journalctl _SYSTEMD_UNIT=libvirtd.service
  • auvirt 명령은 하이퍼바이저의 게스트와 관련된 감사 결과를 표시합니다. 표시된 데이터는 특정 게스트, 시간 프레임 및 정보 형식을 선택하여 좁힐 수 있습니다. 예를 들어 다음 명령은 현재 날짜의 testguest 가상 시스템에 대한 이벤트 요약을 제공합니다.
    # auvirt --start today --vm testguest --summary
    Range of time for report:       Mon Sep  4 16:44 - Mon Sep  4 17:04
    Number of guest starts:         2
    Number of guest stops:          1
    Number of resource assignments: 14
    Number of related AVCs:         0
    Number of related anomalies:    0
    Number of host shutdowns:       0
    Number of failed operations:    0
    
    systemd journal에 auvirt 정보가 자동으로 포함되도록 구성할 수도 있습니다. 이를 위해 /etc/libvirt/libvirtd.conf 파일을 편집하고 audit_logging 매개 변수 값을 1 로 설정합니다.
    자세한 내용은 auvirt 매뉴얼 페이지를 참조하십시오.
  • Virtual Machine Manager에 오류가 발생하면 $HOME/.virt-manager/ 디렉토리의 virt-manager.log 파일에서 생성된 데이터를 검토할 수 있습니다.
  • 하이퍼바이저 시스템의 감사 로그는 /var/log/audit/audit.log 파일을 참조하십시오.
  • 게스트 운영 체제에 따라 다양한 시스템 로그 파일도 게스트에 저장될 수 있습니다.
Red Hat Enterprise Linux 로그인에 대한 자세한 내용은 System Administrator's Guide 를 참조하십시오.

A.7. 루프 장치 오류

파일 기반 게스트 이미지를 사용하는 경우 구성된 루프 장치 수를 늘려야 할 수 있습니다. 기본 구성은 최대 8개의 활성 루프 장치를 허용합니다. 8개 이상의 파일 기반 게스트 또는 루프 장치가 필요한 경우 /etc/modprobe.d/디렉토리에서 구성된 루프 장치 수를 조정할 수 있습니다. 다음 행을 추가합니다.
options loop max_loop=64
이 예제에서는 64를 사용하지만 다른 번호를 지정하여 최대 루프 값을 설정할 수 있습니다. 시스템에서 루프 장치 백업 게스트를 구현해야 할 수도 있습니다. 전체 가상화 시스템에 반복문 장치 백업 게스트를 사용하려면 phy : 장치 또는 file: file 명령을 사용하십시오.

A.8. 실시간 마이그레이션 오류

게스트가 메모리를 너무 빠르게 변경하는 경우가 있을 수 있으며 실시간 마이그레이션 프로세스에서는 반복적으로 전송해야 하며 완료될 수 없는 경우도 있습니다.
현재 실시간 마이그레이션 구현에는 기본 마이그레이션 시간이 30ms로 설정되어 있습니다. 이 값은 왼쪽을 전송하기 위해 마이그레이션 종료 시 게스트 일시 중지 시간을 결정합니다. 값이 높으면 실시간 마이그레이션이 수월할 확률이 높아집니다.

A.9. BIOS에서 Intel VT-x 및 AMD-V 가상화 하드웨어 확장 활성화

참고
전문 지식을 확장하려면 Red Hat Virtualization(RH318) 교육 과정에도 관심이 있을 수 있습니다.
이 섹션에서는 하드웨어 가상화 확장 기능을 식별하고 BIOS에서 비활성화한 경우 이를 활성화하는 방법에 대해 설명합니다.
BIOS에서 Intel VT-x 확장을 비활성화할 수 있습니다. 특정 랩탑 벤더는 CPU에서 기본적으로 Intel VT-x 확장을 비활성화했습니다.
AMD-V용 BIOS에서 가상화 확장을 비활성화할 수 없습니다.
비활성화된 가상화 확장 활성화에 대한 지침은 다음 섹션을 참조하십시오.
BIOS에서 가상화 확장 기능이 활성화되어 있는지 확인합니다. Intel VT 또는 AMD-V의 BIOS 설정은 일반적으로 Chipset 또는 Processor 메뉴에 있습니다. 메뉴 이름은 이 가이드와 다를 수 있으며, 가상화 확장 설정은 보안 설정 또는 기타 표준 메뉴 이름에서 확인할 수 있습니다.

절차 A.3. BIOS에서 가상화 확장 활성화

  1. 컴퓨터를 재부팅하고 시스템의 BIOS 메뉴를 엽니다. 일반적으로 시스템에 따라 삭제 키, F1 키 또는 AltF4 키를 눌러 수행할 수 있습니다.
  2. BIOS에서 가상화 확장 활성화

    참고
    아래의 많은 단계는 마더보드, 프로세서 유형, 칩셋 및 OEM에 따라 달라질 수 있습니다. 시스템 구성에 대한 올바른 정보는 시스템 관련 문서를 참조하십시오.
    1. Processor 하위 메뉴에서 프로세서 설정 메뉴가 Chipset,Advanced CPU Configuration 또는 Northbridge 에서 숨겨질 수 있습니다.
    2. Intel Virtualization Technology (Intel VT-x라고도 함)를 활성화합니다. AMD-V 확장은 BIOS에서 비활성화할 수 없으며 이미 활성화되어 있어야 합니다. 가상화 확장 기능은 OEM 및 시스템 BIOS에 따라 가상화 확장 기능,Vanderpool 또는 기타 다양한 이름으로 레이블이 지정될 수 있습니다.
    3. 옵션을 사용할 수 있는 경우 Intel VT-d 또는 AMD IOMMU를 활성화합니다. Intel VT-d 및 AMD IOMMU는 PCI 장치 할당에 사용됩니다.
    4. 저장 및 종료를 선택합니다.
  3. 시스템을 재부팅합니다.
  4. 머신이 부팅되면 grep -E "vmx|svm" /proc/cpuinfo 를 실행합니다. --color 를 지정하는 것은 선택 사항이지만 검색어가 강조 표시된 경우 유용합니다. 명령이 출력되면 가상화 확장이 활성화됩니다. 출력이 없는 경우 시스템에 가상화 확장 기능이 없거나 올바른 BIOS 설정이 활성화되어 있지 않을 수 있습니다.

A.10. Red Hat Enterprise Linux 7 호스트에서 Red Hat Enterprise Linux 6 게스트 종료

Minimal 설치 옵션을 사용하여 Red Hat Enterprise Linux 6 게스트 가상 머신을 설치해도 acpid (acpi 데몬)를 설치하지 않습니다. Red Hat Enterprise Linux 7은 systemd 에서 인수했기 때문에 이 패키지가 더 이상 필요하지 않습니다. 그러나 Red Hat Enterprise Linux 7 호스트에서 실행되는 Red Hat Enterprise Linux 6 게스트 가상 머신에는 여전히 필요합니다.
acpid 패키지가 없으면 virsh shutdown 명령을 실행하면 Red Hat Enterprise Linux 6 게스트 가상 머신이 종료되지 않습니다. virsh shutdown 명령은 게스트 가상 머신을 정상적으로 종료하도록 설계되었습니다.
virsh shutdown 명령을 사용하면 시스템 관리가 더 쉽고 안전합니다. virsh shutdown 명령을 정상적으로 종료하지 않으면 시스템 관리자가 수동으로 게스트 가상 시스템에 로그인하거나 Ctrl-Alt-Del 키 조합을 각 게스트 가상 시스템에 보내야 합니다.
참고
다른 가상화된 운영 체제는 이 문제의 영향을 받을 수 있습니다. virsh shutdown 명령을 실행하려면 guest 가상 머신 운영 체제가 ACPI 종료 요청을 처리하도록 구성되어 있어야 합니다. 대부분의 운영 체제에는 ACPI 종료 요청을 수락하려면 게스트 가상 머신 운영 체제의 추가 구성이 필요합니다.

절차 A.4. Red Hat Enterprise Linux 6 게스트의 해결방법

  1. acpid 패키지 설치

    acpid 서비스는 ACPI 요청을 수신하고 처리합니다.
    게스트 가상 머신에 로그인하고 게스트 가상 머신에 acpid 패키지를 설치합니다.
    # yum install acpid
  2. 게스트에서 acpid 서비스 활성화

    게스트 가상 머신 부팅 시퀀스 중에 acpid 서비스가 시작되도록 설정하고 서비스를 시작합니다.
    # chkconfig acpid on
    # service acpid start
  3. 게스트 도메인 XML 준비

    다음 요소를 포함하도록 도메인 XML 파일을 편집합니다. virtio 직렬 포트를 org.qemu.guest_agent.0 으로 바꾸고 표시된 포트 대신 게스트 이름을 사용합니다. 이 예에서 게스트는 guest1입니다. 파일을 저장해야 합니다.

    그림 A.1. 게스트 XML 교체

    
    <channel type='unix'>
       <source mode='bind' path='/var/lib/libvirt/qemu/guest1.agent'/>
       <target type='virtio' name='org.qemu.guest_agent.0'/>
    </channel>
        
    
    
  4. QEMU 게스트 에이전트 설치

    QEMU 게스트 에이전트(QEMU-GA)를 설치하고 Red Hat Enterprise Linux 6 Virtualization 관리 가이드에서 지시된 대로 서비스를 시작합니다.
  5. 게스트 종료

    1. 종료하려는 게스트 가상 시스템의 이름을 검색할 수 있도록 알려진 게스트 가상 시스템을 나열합니다.
      # virsh list --all
         Id Name              State
      ----------------------------------
        14 guest1             running
      
    2. 게스트 가상 머신을 종료합니다.
      # virsh shutdown guest1
      
      guest virtual machine guest1 is being shutdown
      
    3. 게스트 가상 머신이 종료될 때까지 몇 초 정도 기다립니다. 서비스가 종료되었는지 확인합니다.
      # virsh list --all
       Id Name                 State
      ----------------------------------
       14 guest1               shut off
      
    4. 편집한 XML 파일을 사용하여 guest1 이라는 게스트 가상 머신을 시작합니다.
      # virsh start guest1
    5. guest1 게스트 가상 머신에서 acpi를 종료합니다.
      # virsh shutdown --mode acpi guest1
    6. 모든 게스트 가상 머신을 다시 나열하며 guest1 은 계속 목록에 있어야 하며, 종료되었음을 나타내야 합니다.
      #  virsh list --all
         Id Name                 State
      ----------------------------------
         14 guest1               shut off
      
    7. 편집한 XML 파일을 사용하여 guest1 이라는 게스트 가상 머신을 시작합니다.
      # virsh start guest1
    8. guest1 게스트 가상 머신 게스트 에이전트를 종료합니다.
      # virsh shutdown --mode agent guest1
    9. 게스트 가상 머신을 나열합니다. guest1 은 여전히 목록에 있어야 하며, 종료되었음을 나타내야 합니다.
      # virsh list --all
         Id Name                 State
      ----------------------------------
         guest1                shut off
      
게스트 가상 시스템은 위에 설명된 해결 방법을 사용하지 않고 연속 종료를 위해 virsh shutdown 명령을 사용하여 종료됩니다.
위에 설명된 방법 외에도 libvirt-guests 서비스를 중지하여 게스트를 자동으로 종료할 수 있습니다. 이 방법에 대한 자세한 내용은 A.11절. “중요한 종료를 허용하는 선택적 작업 방법” 을 참조하십시오.

A.11. 중요한 종료를 허용하는 선택적 작업 방법

libvirt-guests 서비스에는 게스트가 올바르게 종료될 수 있도록 구성할 수 있는 매개 변수 설정이 있습니다. 이 패키지는 libvirt 설치의 일부이며 기본적으로 설치됩니다. 이 서비스는 호스트가 종료되면 자동으로 디스크에 게스트를 저장하고, 호스트를 재부팅할 때 사전 종료 상태로 복원합니다. 기본적으로 이 설정은 게스트를 일시 중지하도록 설정되어 있습니다. 게스트를 정상적으로 종료하려면 libvirt-guests 구성 파일의 매개 변수 중 하나를 변경해야 합니다.

절차 A.5. 게스트의 정상 종료를 허용하도록 libvirt-guests 서비스 매개 변수 변경

여기에 설명된 절차를 통해 호스트 물리적 시스템이 고정되거나 전원이 꺼지거나 다시 시작해야 하는 경우 게스트 가상 시스템을 정상적으로 종료할 수 있습니다.
  1. 구성 파일을 엽니다.

    구성 파일은 /etc/sysconfig/libvirt-guests 에 있습니다. 파일을 편집하고 주석 표시(#)를 제거하고 ON_SHUTDOWN=suspendON_SHUTDOWN=shutdown 로 변경합니다. 변경 사항을 저장해야 합니다.
    $ vi /etc/sysconfig/libvirt-guests
    
    # URIs to check for running guests
    # example: URIS='default xen:/// vbox+tcp://host/system lxc:///'
    #URIS=default
    
    # action taken on host boot
    # - start   all guests which were running on shutdown are started on boot
    #           regardless on their autostart settings
    # - ignore  libvirt-guests init script won't start any guest on boot, however,
    #           guests marked as autostart will still be automatically started by
    #           libvirtd
    #ON_BOOT=start
    
    # Number of seconds to wait between each guest start. Set to 0 to allow
    # parallel startup.
    #START_DELAY=0
    
    # action taken on host shutdown
    # - suspend   all running guests are suspended using virsh managedsave
    # - shutdown  all running guests are asked to shutdown. Please be careful with
    #             this settings since there is no way to distinguish between a
    #             guest which is stuck or ignores shutdown requests and a guest
    #             which just needs a long time to shutdown. When setting
    #             ON_SHUTDOWN=shutdown, you must also set SHUTDOWN_TIMEOUT to a
    #             value suitable for your guests.
    ON_SHUTDOWN=shutdown
    
    # If set to non-zero, shutdown will suspend guests concurrently. Number of
    # guests on shutdown at any time will not exceed number set in this variable.
    #PARALLEL_SHUTDOWN=0
    
    # Number of seconds we're willing to wait for a guest to shut down. If parallel
    # shutdown is enabled, this timeout applies as a timeout for shutting down all
    # guests on a single URI defined in the variable URIS. If this is 0, then there
    # is no time out (use with caution, as guests might not respond to a shutdown
    # request). The default value is 300 seconds (5 minutes).
    #SHUTDOWN_TIMEOUT=300
    
    # If non-zero, try to bypass the file system cache when saving and
    # restoring guests, even though this may give slower operation for
    # some file systems.
    #BYPASS_CACHE=0
    ???
    URIS - checks the specified connections for a running guest. The Default setting functions in the same manner as virsh does when no explicit URI is set In addition, one can explicitly set the URI from /etc/libvirt/libvirt.conf. Note that when using the libvirt configuration file default setting, no probing will be used.
    ???
    ON_BOOT - specifies the action to be done to / on the guests when the host boots. The start option starts all guests that were running prior to shutdown regardless on their autostart settings. The ignore option will not start the formally running guest on boot, however, any guest marked as autostart will still be automatically started by libvirtd.
    ???
    The START_DELAY - sets a delay interval in between starting up the guests. This time period is set in seconds. Use the 0 time setting to make sure there is no delay and that all guests are started simultaneously.
    ???
    ON_SHUTDOWN - specifies the action taken when a host shuts down. Options that can be set include: suspend which suspends all running guests using virsh managedsave and shutdown which shuts down all running guests. It is best to be careful with using the shutdown option as there is no way to distinguish between a guest which is stuck or ignores shutdown requests and a guest that just needs a longer time to shutdown. When setting the ON_SHUTDOWN=shutdown, you must also set SHUTDOWN_TIMEOUT to a value suitable for the guests.
    ???
    PARALLEL_SHUTDOWN Dictates that the number of guests on shutdown at any time will not exceed number set in this variable and the guests will be suspended concurrently. If set to 0, then guests are not shutdown concurrently.
    ???
    Number of seconds to wait for a guest to shut down. If SHUTDOWN_TIMEOUT is enabled, this timeout applies as a timeout for shutting down all guests on a single URI defined in the variable URIS. If SHUTDOWN_TIMEOUT is set to 0, then there is no timeout (use with caution, as guests might not respond to a shutdown request). The default value is 300 seconds (5 minutes).
    ???
    BYPASS_CACHE can have 2 values, 0 to disable and 1 to enable. If enabled it will by-pass the file system cache when guests are restored. Note that setting this may effect performance and may cause slower operation for some file systems.
  2. libvirt-guests 서비스 시작

    서비스를 시작하지 않은 경우 libvirt-guests 서비스를 시작합니다. 이렇게 하면 실행 중인 모든 게스트 가상 시스템이 종료되므로 서비스를 재시작하지 마십시오.

A.12. KVM 네트워킹 성능

기본적으로 KVM 가상 머신에는 가상 Realtek 8139(rtl8139) NIC(네트워크 인터페이스 컨트롤러)가 할당됩니다.
rtl8139 가상화된 NIC는 대부분의 환경에서 제대로 작동하지만 이 장치는 10GBbit 이더넷과 같은 일부 네트워크에서 성능 저하 문제가 발생할 수 있습니다.
성능을 개선하기 위해 반가상화 네트워크 드라이버로 전환할 수 있습니다.
참고
가상화된 Intel PRO/1000(e1000) 드라이버도 에뮬레이션 드라이버 선택으로 지원됩니다. e1000 드라이버를 사용하려면 아래 절차의 virtioe1000 으로 교체합니다. 최적의 성능을 위해서는 virtio 드라이버를 사용하는 것이 좋습니다.

절차 A.6. virtio 드라이버로 전환

  1. 게스트 운영 체제를 종료합니다.
  2. virsh 명령을 사용하여 게스트 구성 파일을 편집합니다(여기서 GUEST 는 게스트의 이름임).
    # virsh edit GUEST
    virsh edit 명령은 $EDITOR 쉘 변수를 사용하여 사용할 편집기를 결정합니다.
  3. 구성의 네트워크 인터페이스 섹션을 찾습니다. 이 섹션은 아래 코드 조각과 유사합니다.
    <interface type='network'>
      [output truncated]
      <model type='rtl8139' />
    </interface>
    
  4. model 요소의 type 속성을 'rtl8139' 에서 'virtio' 로 변경합니다. 이렇게 하면 드라이버가 rtl8139 드라이버에서 virtio 드라이버로 변경됩니다.
    <interface type='network'>
      [output truncated]
      <model type='virtio' />
    </interface>
    
  5. 변경 사항을 저장하고 텍스트 편집기를 종료합니다.
  6. 게스트 운영 체제를 다시 시작합니다.

기타 네트워크 드라이버를 사용하여 새 게스트 생성

또는 다른 네트워크 드라이버를 사용하여 새 게스트를 만들 수 있습니다. 네트워크 연결을 통해 게스트를 설치하는 데 어려움이 있는 경우 이 작업이 필요할 수 있습니다. 이 방법을 사용하려면 하나 이상의 게스트가 이미 생성(CD 또는 DVD에서 설치될 수 있음)이 템플릿으로 사용해야 합니다.

  1. 기존 게스트(이 예에서는 Guest1라는 이름의 XML 템플릿)를 만듭니다.
    # virsh dumpxml Guest1 > /tmp/guest-template.xml
  2. XML 파일을 복사하고 편집하고 가상 머신 이름, UUID, 디스크 이미지, MAC 주소 및 기타 고유한 매개 변수 등의 고유한 필드를 업데이트합니다. UUID 및 MAC 주소 행을 삭제할 수 있으며 virsh는 UUID와 MAC 주소를 생성합니다.
    # cp /tmp/guest-template.xml /tmp/new-guest.xml
    # vi /tmp/new-guest.xml
    네트워크 인터페이스 섹션에 model 행을 추가합니다.
     <interface type='network'>
      [output truncated]
      <model type='virtio' />
    </interface>
    
  3. 새 가상 머신을 생성합니다.
    # virsh define /tmp/new-guest.xml
    # virsh start new-guest

A.13. libvirt를 사용하여 외부 스냅샷 생성을 위한 해결방법

KVM 게스트용 스냅샷 클래스에는 다음 두 가지 클래스가 있습니다.
  • 내부 스냅샷 은 qcow2 파일에 완전히 포함되어 있으며 libvirt 에서 완전히 지원하므로 스냅샷을 생성, 삭제 및 되돌릴 수 있습니다. 이 설정은 특히 옵션을 지정하지 않은 경우 스냅샷을 만들 때 libvirt 에서 사용하는 기본 설정입니다. 이 파일 유형은 스냅샷을 생성하는 데 다른 파일 유형보다 약간 더 오래 걸리며 qcow2 디스크가 필요한 단점도 있습니다.
    중요
    내부 스냅샷은 적극적으로 개발되지 않고 있으며 Red Hat은 그 사용을 권장하지 않습니다.
  • 외부 스냅샷 은 모든 유형의 원래 디스크 이미지로 작업하고 게스트 다운타임 없이 수행할 수 있으며 더 안정적이고 안정적입니다. 따라서 KVM 게스트 가상 머신에서 외부 스냅샷을 사용하는 것이 좋습니다. 그러나 외부 스냅샷은 현재 Red Hat Enterprise Linux 7에서 완전히 구현되지 않으며 virt-manager 를 사용할 때 사용할 수 없습니다.
    외부 스냅샷을 생성하려면 --diskspec vda,snapshot=external 옵션과 함께 snapshot-create-as 를 사용하거나 스냅샷 XML 파일에서 다음 디스크 행을 사용합니다.
    <disk name=’vda’ snapshot=’external’>
      <source file=’/path/to,new’/>
    </disk>
    
    현재 외부 스냅샷은 libvirt 에서 생성할 수 있는 한방향 작업이지만 해당 스냅샷은 더 이상 수행할 수 없습니다. 해결방법은 libvirt 업스트림 페이지에 설명되어 있습니다.

A.14. Japanese cursor가 있는 게스트 콘솔에서 문자 누락된 문자

Red Hat Enterprise Linux 7 호스트에서 일본어 키보드를 시스템에 로컬로 연결하면 밑줄( _ 문자)과 같은 입력 문자가 게스트 콘솔에 올바르게 표시되지 않을 수 있습니다. 이는 필수 keymap이 기본적으로 올바르게 설정되지 않았기 때문에 발생합니다.
Red Hat Enterprise Linux 6 및 Red Hat Enterprise Linux 7 게스트에서는 일반적으로 관련 키를 누를 때 생성되는 오류 메시지가 없습니다. 그러나 Red Hat Enterprise Linux 4 및 Red Hat Enterprise Linux 5 게스트에서는 다음과 같은 오류가 표시될 수 있습니다.
atkdb.c: Unknown key pressed (translated set 2, code 0x0 on isa0060/serio0).
atkbd.c: Use 'setkeycodes 00 <keycode>' to make it known.
virt-manager 에서 이 문제를 해결하려면 다음 단계를 수행합니다.
  • virt-manager 에서 영향을 받는 게스트를 엽니다.
  • 세부 정보+보기를 클릭합니다.
  • 목록에서 VNC 표시를 선택합니다.
  • Keymap 풀다운 메뉴에서 Autoja 로 변경합니다.
  • Apply 버튼을 클릭합니다.
또는 대상 게스트에서 virsh edit 명령을 사용하여 이 문제를 해결하려면 다음을 수행합니다.
  • virsh edit guestname을 실행합니다.
  • <graphics> 태그에 다음 특성을 추가합니다. keymap='ja'. 예를 들면 다음과 같습니다.
     <graphics type='vnc' port='-1' autoport='yes' keymap='ja'/>
    

A.15. 시스템 종료에 대해 게스트 가상 머신 오류

일반적으로 virsh shutdown 명령을 실행하면 전원 버튼 ACPI 이벤트가 전송되어 사용자가 실제 시스템에서 전원 버튼을 누를 때와 동일한 작업을 복사합니다. 모든 물리적 시스템 내에서 이 이벤트를 처리할 OS는 OS입니다. 이전 운영 체제에서는 자동으로 종료됩니다. 현재 가장 일반적인 작업은 수행해야 하는 작업을 묻는 대화 상자를 표시하는 것입니다. 일부 운영 체제는 특히 로그인되어 있지 않은 경우 이 이벤트를 완전히 무시합니다. 이러한 운영 체제가 게스트 가상 시스템에 설치된 경우 virsh shutdown 은 작동하지 않습니다(가상 디스플레이에 표시되거나 대화 상자가 표시됨). 그러나 qemu-guest-agent 채널이 게스트 가상 머신에 추가되고 이 에이전트가 게스트 가상 시스템의 OS 내에서 실행중인 경우 virsh shutdown 명령은 에이전트에 ACPI 이벤트를 전송하는 대신 게스트 OS를 종료하도록 요청합니다. 에이전트는 게스트 가상 시스템 OS 내부에서 종료를 호출하고 모든 작업이 예상대로 작동합니다.

절차 A.7. 게스트 가상 머신에서 게스트 에이전트 채널 구성

  1. 게스트 가상 머신을 중지합니다.
  2. 게스트 가상 머신의 도메인 XML을 열고 다음 스니펫을 추가합니다.

    그림 A.2. 게스트 에이전트 채널 구성

    
    <channel type='unix'>
        <source mode='bind'/>
        <target type='virtio' name='org.qemu.guest_agent.0'/>
    </channel>
    
  3. virsh start [domain] 을 실행하여 guest 가상 시스템을 시작합니다.
  4. 게스트 가상 머신(yum install qemu-guest-agent )에 qemu-guest-agent를 설치하고 서비스(qemu-guest-agent.service)로 부팅할 때마다 자동으로 실행되도록 합니다.

A.16. 게스트 가상 머신에 대해 SMART 디스크 모니터링 비활성화

가상 디스크로 SMART 디스크 모니터링을 안전하게 비활성화할 수 있으며 물리적 스토리지 장치는 호스트 물리적 시스템에서 관리합니다.
# service smartd stop
# systemctl --del smartd

A.17. libguestfs 문제 해결

libguestfs가 작동하는지 확인하는 테스트 도구를 사용할 수 있습니다. 일반 작업을 테스트하기 위해 libguestfs(root 액세스 not required)를 설치한 후 다음 명령을 입력합니다.
$ libguestfs-test-tool
이 툴은 libguestfs 작업을 테스트하기 위해 많은 양의 텍스트를 출력합니다. 테스트에 성공하면 출력 끝에 다음 텍스트가 표시됩니다.
===== TEST FINISHED OK =====

A.18. SR-IOV 문제 해결

이 섹션에는 SR-IOV에 영향을 줄 수 있는 문제에 대한 솔루션이 포함되어 있습니다. 추가 도움이 필요한 경우 16.2.4절. “SR-IOV 가상 함수 풀에서 PCI 장치 할당 설정” 를 참조하십시오.
게스트 시작 오류
구성된 가상 머신을 시작할 때 다음과 같이 오류가 발생합니다.
# virsh start test
error: Failed to start domain test
error: Requested operation is not valid: PCI device 0000:03:10.1 is in use by domain rhel7
이 오류는 종종 다른 게스트 또는 호스트 자체에 이미 할당된 장치로 인해 발생합니다.
게스트 마이그레이션, 저장 또는 덤프 오류
가상 머신을 마이그레이션 및 덤프하려고 하면 다음과 유사한 오류가 발생합니다.
# virsh dump rhel7/tmp/rhel7.dump

error: Failed to core dump domain rhel7 to /tmp/rhel7.dump
error: internal error: unable to execute QEMU command 'migrate': State blocked by non-migratable device '0000:00:03.0/vfio-pci'
장치 할당은 가상 머신이 시작된 특정 호스트의 하드웨어를 사용하므로 장치 할당이 사용 중일 때 게스트 마이그레이션 및 저장이 지원되지 않습니다. 현재 게스트의 코어 덤프에도 동일한 제한 사항이 적용됩니다. 이는 향후 변경될 수 있습니다. --memory-only 옵션을 지정하지 않는 한 QEMU는 PCI 장치가 연결된 게스트 가상 머신에서 현재 마이그레이션, 저장, 덤프 작업을 지원하지 않습니다. 현재 USB 장치에서만 이러한 작업을 지원할 수 있습니다. 향후 이를 개선하기 위한 작업이 진행 중입니다.

A.19. 일반 libvirt 오류 및 문제 해결

이 부록은 일반적인 libvirt문서 - 관련 문제 및 오류를 다루는 방법과 함께 설명합니다.
아래 표에서 오류를 찾아 솔루션 아래의 해당 링크를 따라 자세한 문제 해결 정보를 확인하십시오.

표 A.1. 공통 libvirt 오류

오류 문제에 대한 설명 해결책
libvirtd 를 시작하지 못했습니다. libvirt 데몬을 시작하지 못했습니다. 그러나 /var/log/ message에 이 오류에 대한 정보는 없습니다. A.19.1절. “libvirtd 를 시작하지 못했습니다.”
CA 인증서를 읽을 수 없음 URI가 하이퍼바이저에 연결하지 못하는 경우 발생하는 몇 가지 오류 중 하나입니다. A.19.2절. “URI가 Hypervisor에 연결하지 못했습니다.”
기타 연결 오류 URI가 하이퍼바이저에 연결하지 못하는 경우 발생하는 기타 오류입니다. A.19.2절. “URI가 Hypervisor에 연결하지 못했습니다.”
게스트의 PXE 부팅(또는 DHCP)이 실패했습니다. 게스트 가상 머신이 성공적으로 시작되지만 DHCP에서 IP 주소를 가져오거나 PXE 프로토콜을 사용하여 부팅하거나 둘 다 가져올 수 없습니다. 이는 종종 브리지에 설정된 긴 지연 시간 또는 iptables 패키지 및 커널에서 규칙 체크섬을 지원하지 않는 경우 발생합니다. A.19.3절. “게스트의 PXE 부팅(또는 DHCP) 실패”
게스트는 외부 네트워크에 연결할 수 있지만 macvtap 인터페이스를 사용하는 경우에는 호스트에 연결할 수 없습니다.
게스트는 다른 게스트와 통신할 수 있지만 macvtap(또는 type='direct') 네트워크 인터페이스를 사용하도록 구성된 후에는 호스트 시스템에 연결할 수 없습니다.
이것은 실제로 오류가 아니며 macvtap의 정의된 동작입니다.
A.19.4절. “게스트는 외부 네트워크를 변경할 수 있지만 macvtap 인터페이스를 사용하는 경우 Reach Host는 사용할 수 없습니다.”
네트워크 'default'에서 DHCP 응답 체크섬을 수정하는 규칙을 추가할 수 없습니다. 이 경고 메시지는 거의 항상 무해하지만 문제의 증거로 실수로 표시됩니다. A.19.5절. “네트워크 'default'에서 DHCP 응답 체크섬을 수정하는 규칙을 추가할 수 없습니다.”
브리지 br0 포트 vnet0을 추가할 수 없습니다. 해당 장치가 없습니다. 이 오류 메시지 또는 유사한 Failed to add interface to bridge 'br0': 이러한 장치 는 게스트의(또는 도메인) <interface> 정의에 지정된 브리지 장치가 없음을 나타냅니다. A.19.6절. “브리지 br0 포트 vnet0을 추가할 수 없습니다. 해당 장치가 없습니다.”
name_of_host 서비스 '49155' 주소를 확인할 수 없습니다. 알 수 없는 이름 또는 서비스 QEMU 게스트 마이그레이션이 실패하고 이 오류 메시지는 익숙하지 않은 호스트 이름과 함께 표시됩니다. A.19.7절. “Migration Fails with error: unable to resolve address
디스크 경로 /var/lib/libvirt/images/qemu.img에 대한 액세스를 허용할 수 없습니다. 이러한 파일 또는 디렉터리 없음 libvirt 가 디스크 이미지에 액세스할 수 없기 때문에 게스트 가상 머신을 마이그레이션할 수 없습니다. A.19.8절. “디스크 경로에 대한 액세스를 허용하기 위해 Unable이 있는 마이그레이션 Fails: 이러한 파일 또는 디렉터리 없음
libvirtd 가 시작될 때 게스트 가상 시스템이 존재하지 않습니다. libvirt 데몬이 성공적으로 시작되었지만 virsh list --all 을 실행할 때 게스트 가상 머신이 존재하지 않습니다. A.19.9절. “libvirtd 가 시작될 때 게스트 가상 머신이 준비되지 않습니다.”
일반적인 XML 오류 libvirt 는 XML 문서를 사용하여 구조화된 데이터를 저장합니다. API를 통해 libvirt 에 전달될 때 XML 문서에서 몇 가지 일반적인 오류가 발생합니다. 이 항목에서는 게스트 XML 정의 편집과 XML 구문 및 구성의 일반적인 오류에 대한 지침을 제공합니다. A.19.10절. “일반적인 XML 오류”

A.19.1. libvirtd 를 시작하지 못했습니다.

증상
libvirt 데몬이 자동으로 시작되지 않습니다. libvirt 데몬을 수동으로 시작하면 다음 작업도 실패합니다.
# systemctl start libvirtd.service
* Caching service dependencies ...                                                                                             [ ok ]
* Starting libvirtd ...
/usr/sbin/libvirtd: error: Unable to initialize network sockets. Check /var/log/messages or run without --daemon for more info.
* start-stop-daemon: failed to start `/usr/sbin/libvirtd'                                                                      [ !! ]
* ERROR: libvirtd failed to start
또한 /var/log/ message에 이 오류에 대한 'more info' 가 없습니다.
조사
아래 행 을 활성화하여 /etc/libvirt/libvirtd.conf 에서 libvirt 의 로깅을 변경합니다. 설정을 활성화하려면 텍스트 편집기에서 /etc/libvirt/libvirtd.conf 파일을 열고 다음 줄에서 해시(또는 #) 기호를 제거하고 변경 사항을 저장합니다.
log_outputs="3:syslog:libvirtd"
참고
이 행은 libvirt 에서 과도한 로그 메시지를 생성하지 않도록 기본적으로 주석 처리됩니다. 문제를 진단한 후 /etc/libvirt/libvirtd.conf 파일에서 이 행을 다시 주석 처리하는 것이 좋습니다.
libvirt 를 다시 시작하여 이 문제가 해결되었는지 확인합니다.
libvirtd 가 여전히 시작되지 않으면 다음과 같은 오류가 출력됩니다.
# systemctl restart libvirtd
Job for libvirtd.service failed because the control process exited with error code. See "systemctl status libvirtd.service" and "journalctl -xe" for details.

Sep 19 16:06:02 jsrh libvirtd[30708]: 2017-09-19 14:06:02.097+0000: 30708: info : libvirt version: 3.7.0, package: 1.el7 (Unknown, 2017-09-06-09:01:55, js
Sep 19 16:06:02 jsrh libvirtd[30708]: 2017-09-19 14:06:02.097+0000: 30708: info : hostname: jsrh
Sep 19 16:06:02 jsrh libvirtd[30708]: 2017-09-19 14:06:02.097+0000: 30708: error : daemonSetupNetworking:502 : unsupported configuration: No server certif
Sep 19 16:06:02 jsrh systemd[1]: libvirtd.service: main process exited, code=exited, status=6/NOTCONFIGURED
Sep 19 16:06:02 jsrh systemd[1]: Failed to start Virtualization daemon.

-- Subject: Unit libvirtd.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit libvirtd.service has failed.
--
-- The result is failed.
libvirtd 도움말 페이지에는 libvirtTCP/IP 연결 모드에 대해 Listen 에서 실행될 때 누락된 cacert.pem 파일이 TLS 기관으로 사용됩니다. 즉 --listen 매개변수가 전달되고 있습니다.
해결책
다음 방법 중 하나로 libvirt 데몬 설정을 구성합니다.
  • CA 인증서를 설치합니다.
    참고
    CA 인증서 및 시스템 인증 구성에 대한 자세한 내용은 Red Hat Enterprise Linux 7 도메인 ID, 인증 및 정책 가이드의 인증서 및 인증 기관 관리 장을 참조하십시오.
  • TLS를 사용하지 마십시오. 대신 베어 TCP를 사용합니다. /etc/libvirt/libvirtd.conf 에서 listen_tls = 0listen_tcp = 1 을 설정합니다. 기본값은 listen_tls = 1listen_tcp = 0 입니다.
  • --listen 매개변수를 전달하지 마십시오. /etc/sysconfig/libvirtd.conf 에서 LIBVIRTD_ARGS 변수를 변경합니다.

A.19.2. URI가 Hypervisor에 연결하지 못했습니다.

서버에 연결할 때 다양한 오류가 발생할 수 있습니다(예: virsh).

A.19.2.1. CA 인증서를 읽을 수 없음

증상
명령을 실행하면 다음과 같은 오류(또는 유사한)가 표시됩니다.
$ virsh -c qemu://$hostname/system_list
error: failed to connect to the hypervisor
error: Cannot read CA certificate '/etc/pki/CA/cacert.pem': No such file or directory
조사
오류 메시지는 실제 원인에 대해 잘못된 것입니다. 이 오류는 잘못 지정된 URI 또는 구성되지 않은 연결과 같은 다양한 요인으로 인해 발생할 수 있습니다.
해결책
URI를 잘못 지정했습니다.
qemu://system 또는 qemu://session 을 연결 URI로 지정할 때 virsh 는 호스트 이름의 시스템 또는 세션에 각각 연결을 시도합니다. virsh 는 두 번째 슬래시 뒤에 있는 텍스트를 호스트로 인식하기 때문입니다.
세 개의 슬래시를 사용하여 로컬 호스트에 연결합니다. 예를 들어 qemu:///system 을 지정하면 virsh 가 로컬 호스트에서 libvirtd시스템 인스턴스에 연결하도록 지시합니다.
호스트 이름을 지정하면 QEMU 전송의 기본값은 TLS 로 설정됩니다. 이로 인해 인증서가 생성됩니다.
연결이 구성되지 않음
URI는 정확하지만 (예: qemu[+tls]://server/system)는 시스템에 올바르게 설정되지 않습니다. TLS 구성에 대한 자세한 내용은 업스트림 libvirt 웹 사이트를 참조하십시오.

A.19.2.2. 'host:16509'에서 서버에 연결할 수 없습니다. 연결이 거부됨

증상
libvirtd 는 TCP 포트에서 연결을 수신 대기해야 하지만 연결에 실패합니다.
# virsh -c qemu+tcp://host/system
error: failed to connect to the hypervisor
error: unable to connect to server at 'host:16509': Connection refused
/etc/libvirt/libvirtd.conf 에서 구성을 변경한 후에도 libvirt 데몬이 TCP 포트에서 수신 대기하지 않습니다.
# grep listen_ /etc/libvirt/libvirtd.conf
listen_tls = 1
listen_tcp = 1
listen_addr = "0.0.0.0"
그러나 구성을 변경한 후에도 libvirt 의 TCP 포트가 열려 있지 않습니다.
# netstat -lntp | grep libvirtd
#
조사
libvirt 데몬은 --listen 옵션 없이 시작되었습니다. 이 명령을 실행하여 확인합니다.
# ps aux | grep libvirtd
root     10749  0.1  0.2 558276 18280 ?        Ssl  23:21   0:00 /usr/sbin/libvirtd
출력에 --listen 옵션이 포함되어 있지 않습니다.
해결책
--listen 옵션을 사용하여 데몬을 시작합니다.
이 작업을 수행하려면 /etc/sysconfig/libvirtd 파일을 수정하고 다음 행의 주석을 제거합니다.
# LIBVIRTD_ARGS="--listen"
그런 다음 다음 명령을 사용하여 libvirtd 서비스를 다시 시작합니다.
# /bin/systemctl restart libvirtd.service

A.19.2.3. 인증 실패

증상
명령을 실행하면 다음과 같은 오류(또는 유사한)가 표시됩니다.
$ virsh -c qemu://$hostname/system_list
error: failed to connect to the hypervisor
error: authentication failed: authentication failed
조사
올바른 자격 증명을 사용하는 경우에도 인증이 실패하면 SASL 인증이 구성되지 않을 수 있습니다.
해결책
  1. /etc/libvirt/libvirtd.conf 파일을 편집하고 auth_tcp 매개 변수의 값을 sasl로 설정합니다. 확인하려면 다음을 수행하십시오.
    # cat /etc/libvirt/libvirtd.conf | grep auth_tcp
    auth_tcp = "sasl"
    
  2. /etc/sasl2/libvirt.conf 파일을 편집하고 다음 행을 파일에 추가합니다.
    mech_list: digest-md5
    sasldb_path: /etc/libvirt/passwd.db
    
  3. cyrus-sasl-md5 패키지가 설치되어 있는지 확인합니다.
    # yum install cyrus-sasl-md5
  4. libvirtd 서비스를 다시 시작합니다.
    # systemctl restart libvirtd
  5. libvirt SASL의 사용자 이름 및 암호를 설정합니다.
    # saslpasswd2 -a libvirt 1

A.19.2.4. 권한 거부

증상
root가 아닌 사용자로 virsh 명령을 실행하면 다음과 같은 오류(또는 이와 유사한)가 표시됩니다.
$ virsh -c qemu://$hostname/system_list
error: Failed to connect socket to '/var/run/libvirt/libvirt-sock': Permission denied
error: failed to connect to the hypervisor
해결책
  1. /etc/libvirt/libvirt.conf 파일을 편집하고 다음 행을 파일에 추가합니다.
    #unix_sock_group = "libvirt"
    #unix_sock_ro_perms = "0777"
    #unix_sock_rw_perms = "0770"
    
  2. libvirtd 서비스를 다시 시작합니다.
    # systemctl restart libvirtd

A.19.3. 게스트의 PXE 부팅(또는 DHCP) 실패

증상
게스트 가상 머신이 성공적으로 시작되지만 DHCP에서 IP 주소를 가져오거나 PXE 프로토콜을 사용하여 부팅할 수 없습니다. 이 오류의 일반적인 원인은 브리지에 긴 지연 시간을 설정하고 iptables 패키지 및 커널에서 체크섬 조작을 지원하지 않는 경우의 두 가지 일반적인 원인이 있습니다.
브리지의 긴 전달 지연 시간
조사
이는 이 오류의 가장 일반적인 원인입니다. 게스트 네트워크 인터페이스가 STP(Spanning Tree Protocol)가 활성화된 브릿지 장치에 연결되어 있고 장기적인 지연이 설정된 브릿지 장치에 연결된 경우 브릿지는 게스트 가상 머신의 네트워크 패킷을 브릿지로 전달하지 않습니다. 브리지는 게스트가 브릿지에 연결된 이후 해당 수의 전달 지연 시간 간격이 경과한 때까지 브리지에서 네트워크 패킷을 브릿지로 전달하지 않습니다. 이 지연을 사용하면 브리지 시간이 인터페이스에서 트래픽을 감시하고 뒤에 있는 MAC 주소를 확인하고 네트워크 토폴로지에서 전달 루프를 방지할 수 있습니다.
전달 지연이 게스트 PXE 또는 DHCP 클라이언트의 시간 초과보다 길면 클라이언트의 작업이 실패하고 게스트가 부팅하지 못하거나 (DHCP의 경우 DHCP의 경우) IP 주소를 얻지 못합니다.
해결책
이 경우 브리지의 전달 지연을 0으로 변경합니다. 브리지에서 STP를 비활성화하거나 둘 다 비활성화합니다.
참고
이 솔루션은 브리지를 여러 네트워크를 연결하는 데 사용되지 않지만 여러 끝점을 단일 네트워크에 연결하는 데만 적용됩니다( libvirt에서 사용하는 브리지의 가장 일반적인 사용 사례).
게스트에 libvirt-managed 가상 네트워크에 연결된 인터페이스가 있는 경우 네트워크의 정의를 편집한 후 다시 시작합니다. 예를 들어 다음 명령을 사용하여 기본 네트워크를 편집합니다.
# virsh net-edit default
<bridge> 요소에 다음 속성을 추가합니다.
<name_of_bridge='virbr0' delay='0' stp='on'/>
참고
delay='0'stp='on' 은 가상 네트워크의 기본 설정이므로 이 단계는 기본값에서 구성을 수정한 경우에만 필요합니다.
게스트 인터페이스가 libvirt 외부에서 구성된 호스트 브리지에 연결된 경우 지연 설정을 변경합니다.
/etc/sysconfig/network-scripts/ifcfg-name_of_bridge 파일에서 다음 행을 추가하거나 편집하여 STP를 0초 지연으로 설정합니다.
STP=on DELAY=0
구성 파일을 변경한 후 브리지 장치를 다시 시작합니다.
/usr/sbin/ifdown name_of_bridge
/usr/sbin/ifup name_of_bridge
참고
name_of_bridge 가 네트워크의 루트 브릿지가 아닌 경우 해당 브리지의 지연이 결국 root 브리지에 대해 구성된 지연 시간으로 재설정됩니다. 이 문제가 발생하지 않도록 하려면 name_of_bridge 에서 STP를 비활성화합니다.
iptables 패키지 및 커널에서 체크섬 조작 규칙을 지원하지 않습니다.
조사
이 메시지는 다음 조건 중 4개 모두 충족되는 경우에만 문제가 됩니다.
  • 게스트는 virtio 네트워크 장치를 사용하고 있습니다.
    이렇게 하면 구성 파일에 다음이 포함됩니다. model type='virtio'
  • 호스트에는 vhost-net 모듈이 로드되었습니다.
    ls /dev/vhost-net 에서 빈 결과를 반환하지 않는 경우 해당합니다.
  • 게스트는 호스트에서 직접 실행 중인 DHCP 서버에서 IP 주소를 가져오려고 합니다.
  • 호스트의 iptables 버전은 1.4.10 미만입니다.
    iptables 1.4.10은 libxt_CHECKSUM 확장을 추가하는 첫 번째 버전입니다. libvirtd 로그에 다음 메시지가 표시되는 경우입니다.
    warning: Could not add rule to fixup DHCP response checksums on network default
    warning: May need to update iptables package and kernel to support CHECKSUM rule.
    중요
    이 목록에 있는 다른 세 가지 조건 모두 true인 경우를 제외하고 위의 경고 메시지는 무시될 수 있으며 다른 문제의 표시가 아닙니다.
이러한 조건이 발생하면 호스트에서 게스트로 전송된 UDP 패킷의 계산되지 않은 체크섬이 있습니다. 이로 인해 호스트의 UDP 패킷이 게스트의 네트워크 스택에 유효하지 않은 것처럼 보일 수 있습니다.
해결책
이 문제를 해결하려면 위의 네 가지 점을 무효화합니다. 가장 좋은 해결책은 호스트 iptables 및 커널을 iptables-1.4.10 이상으로 업데이트하는 것입니다. 그렇지 않으면 가장 구체적인 수정 사항은 이 특정 게스트에 대해 vhost-net 드라이버를 비활성화하는 것입니다. 이 작업을 수행하려면 다음 명령을 사용하여 게스트 구성을 편집합니다.
virsh edit name_of_guest
<driver> 행을 변경 또는 <interface> 섹션에 추가합니다.
<interface type='network'>
  <model type='virtio'/>
  <driver name='qemu'/>
  ...
</interface>
변경 사항을 저장하고 게스트를 종료한 다음 다시 시작합니다.
이 문제가 여전히 해결되지 않으면 firewalld 와 기본 libvirt 네트워크 간의 충돌로 인해 문제가 발생할 수 있습니다.
이 문제를 해결하려면 service firewalld stop 명령을 사용하여 firewalld를 중지한 다음 service libvirtd restart 명령을 사용하여 libvirt 를 다시 시작합니다.
참고
또한 /etc/sysconfig/network-scripts/ifcfg-network_name 파일이 올바르게 구성된 경우 게스트에서 dhclient 명령을 게스트에서 root로 사용하여 IP 주소를 가져올 수 있습니다.

A.19.4. 게스트는 외부 네트워크를 변경할 수 있지만 macvtap 인터페이스를 사용하는 경우 Reach Host는 사용할 수 없습니다.

증상
게스트 가상 머신은 다른 게스트와 통신할 수 있지만 macvtap( type='direct') 네트워크 인터페이스를 사용하도록 구성된 후에는 호스트 시스템에 연결할 수 없습니다.
조사
가상 이더넷 Port Aggregator(VEPA) 또는 VN-Link 가능 스위치에 연결하지 않아도 macvtap 인터페이스가 유용할 수 있습니다. 브리지로 이러한 인터페이스의 모드를 설정하면 기존 호스트 브리지 장치를 사용할 수 있는 설정 문제(또는 NetworkManager 와 호환되지 않음) 없이 매우 간단한 방식으로 게스트를 물리적 네트워크에 직접 연결할 수 있습니다.
그러나 게스트 가상 시스템이 macvtap과 같은 type='direct' 네트워크 인터페이스를 사용하도록 설정된 경우, 네트워크에서 다른 게스트 및 기타 외부 호스트와 통신할 수 있는 경우에도 게스트가 자체 호스트와 통신할 수 없습니다.
이 상황은 실제로 오류가 아니며 macvtap의 정의된 동작입니다. 호스트의 물리적 이더넷이 macvtap 브리지에 연결된 방식으로 인해 물리적 인터페이스로 전달되는 게스트의 해당 브리지로 들어오는 트래픽이 호스트의 IP 스택으로 이동될 수 없습니다. 또한 물리적 인터페이스로 전송되는 호스트의 IP 스택의 트래픽은 게스트로 전달하기 위해 macvtap 브리지로 복구할 수 없습니다.
해결책
libvirt 를 사용하여 격리된 네트워크를 만들고 이 네트워크에 연결된 각 게스트 가상 시스템에 대해 두 번째 인터페이스를 만듭니다. 그러면 호스트와 게스트가 이 격리된 네트워크를 통해 직접 통신할 수 있지만 NetworkManager 와의 호환성도 유지됩니다.

절차 A.8. libvirt를 사용하여 격리된 네트워크 생성

  1. /tmp/isolated.xml 파일에 다음 XML을 추가하고 저장합니다. 192.168.254.0/24 네트워크가 이미 네트워크의 다른 위치에서 사용 중인 경우 다른 네트워크를 선택할 수 있습니다.

    그림 A.3. 격리된 네트워크 XML

    
    ...
    <network>
      <name>isolated</name>
      <ip address='192.168.254.1' netmask='255.255.255.0'>
        <dhcp>
          <range start='192.168.254.2' end='192.168.254.254'/>
        </dhcp>
      </ip>
    </network>
    ...
    
  2. 다음 명령을 사용하여 네트워크 생성: virsh net-define /tmp/isolated.xml
  3. virsh net-autostart isolated 명령을 사용하여 네트워크를 autostart로 설정합니다.
  4. virsh net-start isolated 명령을 사용하여 네트워크를 시작합니다.
  5. virsh edit name_of_guest 를 사용하여 네트워크 연결에 macvtap를 사용하는 각 게스트의 구성을 편집하고 다음과 유사한 <devices> 섹션에 새 <인터페이스를> 추가합니다(포함할 <모델 type='virtio'/> 행은 선택 사항임).

    그림 A.4. 인터페이스 장치 XML

    
    ...
    <interface type='network' trustGuestRxFilters='yes'>
      <source network='isolated'/>
      <model type='virtio'/>
    </interface>
    
  6. 를 종료한 다음 각 게스트를 다시 시작합니다.
이제 게스트가 주소 192.168.254.1에서 호스트에 도달할 수 있으며 호스트는 DHCP에서 수집한 IP 주소에서 게스트에 연결할 수 있습니다(실제로 게스트의 IP 주소를 수동으로 구성할 수 있음). 이 새 네트워크는 호스트와 게스트로만 격리되므로 게스트의 다른 모든 통신에서는 macvtap 인터페이스를 사용합니다. 자세한 내용은 23.17.8절. “네트워크 인터페이스”의 내용을 참조하십시오.

A.19.5. 네트워크 'default'에서 DHCP 응답 체크섬을 수정하는 규칙을 추가할 수 없습니다.

증상
이 메시지가 나타납니다.
Could not add rule to fixup DHCP response checksums on network 'default'
조사
이 메시지는 오류의 증거인 것처럼 보이지만 거의 항상 무해합니다.
해결책
문제가 발생하지 않는 한 게스트 가상 머신이 DHCP를 통해 IP 주소를 가져올 수 없다는 것입니다. 이 메시지는 무시할 수 있습니다.
이 경우 이 상황에 대한 자세한 내용은 A.19.3절. “게스트의 PXE 부팅(또는 DHCP) 실패” 을 참조하십시오.

A.19.6. 브리지 br0 포트 vnet0을 추가할 수 없습니다. 해당 장치가 없습니다.

증상
다음과 같은 오류 메시지가 표시됩니다.
Unable to add bridge name_of_bridge port vnet0: No such device
예를 들어 브리지 이름이 br0 인 경우 오류 메시지가 다음과 같이 표시됩니다.
Unable to add bridge br0 port vnet0: No such device
libvirt 버전 0.9.6 및 이전 버전에서는 다음과 같은 오류가 나타납니다.
Failed to add tap interface to bridge name_of_bridge: No such device
예를 들어 브리지 이름이 br0 인 경우 다음을 실행합니다.
Failed to add tap interface to bridge 'br0': No such device
조사
두 오류 메시지 모두 게스트의 (또는 도메인) <interface> 정의에 지정된 브리지 장치가 없음을 나타냅니다.
오류 메시지에 나열된 브리지 장치가 없는지 확인하려면 쉘 명령 ip addr show br0.
이와 유사한 메시지는 호스트에 해당 이름의 브리지가 없음을 확인합니다.
br0: error fetching interface information: Device not found
이 경우 해결 방법으로 계속 진행하십시오.
그러나 결과 메시지가 다음과 유사한 경우 문제가 다른 곳에 있습니다.
br0        Link encap:Ethernet  HWaddr 00:00:5A:11:70:48
           inet addr:10.22.1.5  Bcast:10.255.255.255  Mask:255.0.0.0
           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
           RX packets:249841 errors:0 dropped:0 overruns:0 frame:0
           TX packets:281948 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:0
	   RX bytes:106327234 (101.4 MiB)  TX bytes:21182634 (20.2 MiB)
해결책
기존 브리지를 편집하거나 virsh를 사용하여 새 브리지 만들기
virsh 를 사용하여 기존 브리지 또는 네트워크의 설정을 편집하거나 호스트 시스템 구성에 브리지 장치를 추가합니다.
virsh를 사용하여 기존 브리지 설정 편집
virsh edit name_of_guest 를 사용하여 이미 존재하는 브리지 또는 네트워크를 사용하도록 <interface> 정의를 변경합니다.
예를 들어 type='bridge'type='network' 로, <source bridge='br0'/><source network='default'/> 로 변경합니다.
virsh를 사용하여 호스트 브리지 만들기
libvirt 버전 0.9.8 이상의 경우 virsh iface-bridge 명령을 사용하여 브리지 장치를 만들 수 있습니다. 이렇게 하면 eth0 의 브리지 장치 br0 이 생성되고 연결된 브리지의 일부로 설정된 물리적 네트워크 인터페이스가 생성됩니다.
virsh iface-bridge eth0 br0
선택 사항: 필요한 경우 이 브리지를 제거하고 다음 명령을 사용하여 원래 eth0 구성을 복원합니다.
virsh iface-unbridge br0
호스트 브릿지를 수동으로 생성
이전 버전의 libvirt 의 경우 호스트에 브리지 장치를 수동으로 만들 수 있습니다. 자세한 내용은 6.4.3절. “libvirt를 사용한 브리지 네트워킹”에서 참조하십시오.

A.19.7. Migration Fails with error: unable to resolve address

증상
QEMU 게스트 마이그레이션이 실패하고 이 오류 메시지가 표시됩니다.
# virsh migrate qemu qemu+tcp://192.168.122.12/system
  error: Unable to resolve address name_of_host service '49155': Name or service not known
예를 들어 대상 호스트 이름이 newyork 인 경우 오류 메시지가 다음과 같이 표시됩니다.
# virsh migrate qemu qemu+tcp://192.168.122.12/system
error: Unable to resolve address 'newyork' service '49155': Name or service not known
그러나 이 오류는 어디에서도 newyork 호스트 이름을 사용하지 않았기 때문에 이상하게 보입니다.
조사
마이그레이션 중에 대상 호스트에서 실행되는 libvirtd 는 마이그레이션 데이터를 수신할 것으로 예상되는 주소 및 포트에서 URI를 생성하고 소스 호스트에서 실행 중인 libvirtd 로 다시 보냅니다.
이 경우 대상 호스트(192.168.122.12)의 이름이 'newyork' 로 설정되어 있습니다. 어떤 이유로 해당 호스트에서 실행 중인 libvirtd 는 이름을 다시 보낼 수 있는 IP 주소로 확인할 수 없으며 계속 유용합니다. 따라서 소스 libvirtd 가 이름을 확인하는 데 성공해야 하는 'newyork' 호스트 이름을 반환했습니다. DNS가 올바르게 구성되지 않았거나 /etc/hosts 에 로컬 루프백 주소(127.0.0.1)와 연결된 호스트 이름이 있는 경우 이 문제가 발생할 수 있습니다.
마이그레이션 데이터에 사용되는 주소는 대상 libvirtd 연결에 사용되는 주소에서 자동으로 확인할 수 없습니다(예: qemu+tcp://192.168.122.12/system). 이는 대상 libvirtd 와 통신하기 때문에 소스 libvirtdvirsh 가 요구하는 유형의 네트워크 인프라를 사용해야 할 수 있습니다.
해결책
마이그레이션에 관련된 모든 호스트가 모든 호스트 이름을 확인할 수 있도록 DNS를 올바르게 구성하는 것이 가장 좋습니다.
DNS를 이 작업을 수행하도록 구성할 수 없는 경우 마이그레이션에 사용되는 모든 호스트 목록을 각 호스트의 /etc/hosts 파일에 수동으로 추가할 수 있습니다. 그러나 이러한 목록을 동적 환경에서 일관되게 유지하기는 어렵습니다.
어떤 방법으로도 호스트 이름을 확인할 수 없는 경우 virsh migrate 는 마이그레이션 호스트 지정을 지원합니다.
# virsh migrate qemu qemu+tcp://192.168.122.12/system tcp://192.168.122.12
대상 libvirtdtcp://192.168.122.12 URI를 사용하고 자동으로 생성된 포트 번호를 추가합니다. 방화벽 구성(예: 방화벽 구성)이 적합하지 않은 경우 다음 명령에 포트 번호를 지정할 수 있습니다.
# virsh migrate qemu qemu+tcp://192.168.122.12/system tcp://192.168.122.12:12345
또 다른 옵션은 터널링된 마이그레이션을 사용하는 것입니다. 터널링 마이그레이션은 마이그레이션 데이터에 대한 별도의 연결을 생성하지 않지만 대상 libvirtd 와의 통신에 사용되는 연결을 통해 데이터를 터널링하지 않습니다(예: qemu+tcp://192.168.122.12/system).
# virsh migrate qemu qemu+tcp://192.168.122.12/system --p2p --tunnelled

A.19.8. 디스크 경로에 대한 액세스를 허용하기 위해 Unable이 있는 마이그레이션 Fails: 이러한 파일 또는 디렉터리 없음

증상
libvirt 가 디스크 이미지에 액세스할 수 없기 때문에 게스트 가상 머신(또는 도메인)을 마이그레이션할 수 없습니다.
# virsh migrate qemu qemu+tcp://name_of_host/system
error: Unable to allow access for disk path /var/lib/libvirt/images/qemu.img: No such file or directory
예를 들어 대상 호스트 이름이 newyork 인 경우 오류 메시지가 다음과 같이 표시됩니다.
# virsh migrate qemu qemu+tcp://newyork/system
error: Unable to allow access for disk path /var/lib/libvirt/images/qemu.img: No such file or directory
조사
기본적으로 마이그레이션은 실행 중인 게스트(예: 메모리 또는 CPU 상태)의 메모리 내 상태만 전송합니다. 마이그레이션 중에 디스크 이미지를 전송하지는 않지만 두 호스트 모두에서 동일한 경로에서 액세스할 수 있어야 합니다.
해결책
두 호스트 모두에서 동일한 위치에 공유 스토리지를 설정하고 마운트합니다. 가장 간단한 방법은 NFS를 사용하는 것입니다.

절차 A.9. 공유 스토리지 설정

  1. 공유 스토리지 역할을 하는 호스트에서 NFS 서버를 설정합니다. NFS 서버는 NFS를 통해 공유 스토리지에 액세스하는 경우 마이그레이션과 관련된 모든 호스트 중 하나일 수 있습니다.
    # mkdir -p /exports/images
    # cat >>/etc/exports <<EOF
    /exports/images    192.168.122.0/24(rw,no_root_squash)
    EOF
  2. libvirt 를 실행하는 모든 호스트의 공통 위치에 내보낸 디렉터리를 마운트합니다. 예를 들어 NFS 서버의 IP 주소가 192.168.122.1인 경우 다음 명령을 사용하여 디렉터리를 마운트합니다.
    # cat >>/etc/fstab <<EOF
    192.168.122.1:/exports/images  /var/lib/libvirt/images  nfs  auto  0 0
    EOF
    # mount /var/lib/libvirt/images
참고
NFS를 사용하여 한 호스트에서 로컬 디렉터리를 내보내고 다른 호스트의 동일한 경로에 마운트할 수 없습니다. 디스크 이미지를 저장하는 데 사용되는 디렉터리는 두 호스트의 공유 스토리지에서 마운트해야 합니다. 이 값이 올바르게 구성되지 않으면 소스 호스트의 libvirt 데몬이 게스트를 대상으로 마이그레이션한 후 디스크 이미지의 소유자, 권한 및 SELinux 레이블을 변경할 수 있으므로 마이그레이션 중에 디스크 이미지에 대한 액세스 권한이 손실될 수 있습니다.
libvirt 가 공유 스토리지 위치에서 디스크 이미지가 마운트되었음을 탐지하면 이러한 변경 사항이 적용되지 않습니다.

A.19.9. libvirtd 가 시작될 때 게스트 가상 머신이 준비되지 않습니다.

증상
libvirt 데몬이 성공적으로 시작되었지만 게스트 가상 머신이 존재하지 않습니다.
# virsh list --all
 Id    Name                           State
----------------------------------------------------

조사
이 문제의 원인에는 여러 가지가 있습니다. 이러한 테스트를 수행하면 이 문제의 원인을 파악하는 데 도움이 됩니다.
KVM 커널 모듈 확인
KVM 커널 모듈이 커널에 삽입되었는지 확인합니다.
# lsmod | grep kvm
kvm_intel             121346  0
kvm                   328927  1 kvm_intel
AMD 시스템을 사용하는 경우 root 쉘에서 lsmod | grep kvm_amd 명령을 사용하여 kvm_amd 커널 모듈이 커널에 삽입되었는지 확인합니다.
모듈이 없으면 modprobe <modulename> 명령을 사용하여 삽입합니다.
참고
드문 경우지만 KVM 가상화 지원은 커널로 컴파일될 수 있습니다. 이 경우에는 모듈이 필요하지 않습니다.
가상화 확장 확인
호스트에서 가상화 확장 기능이 지원 및 활성화되어 있는지 확인합니다.
# egrep "(vmx|svm)" /proc/cpuinfo
flags		: fpu vme de pse tsc ... svm ... skinit wdt npt lbrv svm_lock nrip_save
flags		: fpu vme de pse tsc ... svm ... skinit wdt npt lbrv svm_lock nrip_save
BIOS 설정에서 하드웨어 펌웨어 설정에서 가상화 확장 기능을 활성화합니다. 이에 대한 자세한 내용은 하드웨어 설명서를 참조하십시오.
클라이언트 URI 구성 확인
클라이언트의 URI가 의도한 대로 구성되었는지 확인합니다.
# virsh uri
vbox:///system
예를 들어, 이 메시지는 URI가 QEMU 가 아닌 RWO 하이퍼바이저에 연결되어 있음을 표시하고 QEMU 하이퍼바이저에 연결하도록 설정된 URI에 대한 구성 오류를 표시합니다. URI가 QEMU 에 올바르게 연결된 경우 다음과 같은 메시지가 표시됩니다.
# virsh uri
qemu:///system
이 상황은 libvirt 가 기본적으로 사용할 수 있는 다른 하이퍼바이저가 있는 경우 발생합니다.
해결책
이러한 테스트를 수행한 후 다음 명령을 사용하여 게스트 가상 머신 목록을 확인합니다.
# virsh list --all

A.19.10. 일반적인 XML 오류

libvirt 도구는 XML 문서를 사용하여 구조화된 데이터를 저장합니다. XML 문서를 API를 통해 libvirt 에 전달할 때 다양한 일반적인 오류가 발생합니다. 잘못된 XML 태그, 부적절한 값 및 누락된 요소를 포함한 몇 가지 일반적인 XML 오류는 다음과 같습니다.

A.19.10.1. 도메인 정의 편집

권장되지는 않지만 게스트 가상 시스템의 (또는 도메인) XML 파일을 수동으로 편집해야 하는 경우가 있습니다. 편집을 위해 게스트의 XML에 액세스하려면 다음 명령을 사용합니다.
# virsh edit name_of_guest.xml
이 명령은 게스트 가상 시스템의 현재 정의와 함께 텍스트 편집기에서 파일을 엽니다. 편집을 완료하고 변경 사항을 저장하면 XML이 libvirt 에 의해 다시 로드되고 구문 분석됩니다. XML이 올바르면 다음 메시지가 표시됩니다.
# virsh edit name_of_guest.xml

Domain name_of_guest.xml XML configuration edited.
중요
virsh 에서 edit 명령을 사용하여 XML 문서를 편집할 때 편집기를 종료하기 전에 모든 변경 사항을 저장합니다.
XML 파일을 저장한 후 xmllint 명령을 사용하여 XML이 올바르게 작성되었는지 확인하거나 virt-xml-validate 명령을 사용하여 사용 문제를 확인합니다.
# xmllint --noout config.xml
# virt-xml-validate config.xml
오류가 반환되지 않으면 XML 설명이 올바르게 작성되고 libvirt 스키마와 일치합니다. 스키마에서 모든 제약 조건을 catch하지는 않지만 보고된 오류를 수정하면 추가 문제 해결이 발생합니다.
libvirt에 의해 저장된 XML 문서
이 문서에는 게스트에 대한 상태 및 구성 정의가 포함되어 있습니다. 이러한 문서는 자동으로 생성되며 수동으로 편집해서는 안 됩니다. 이러한 문서에는 손상된 문서의 파일 이름이 포함되어 있습니다. 파일 이름은 URI에서 정의한 호스트 시스템에서만 유효하며, 이 경우 명령이 실행된 시스템을 볼 수 있습니다.
libvirt 에서 생성한 파일의 오류는 드물다. 그러나 이러한 오류의 가능한 소스 중 하나는 libvirt 의 다운그레이드이며 최신 버전의 libvirt 는 항상 이전 버전에서 생성된 XML을 읽을 수 있지만 이전 버전의 libvirt 는 최신 버전에 추가된 XML 요소에 의해 혼동될 수 있습니다.

A.19.10.2. XML 구문 오류

구문 오류는 XML 구문 분석기에 의해 catch됩니다. 오류 메시지에는 문제를 확인하는 데 필요한 정보가 포함되어 있습니다.
XML 구문 분석에서 이 예제 오류 메시지는 세 줄로 구성되어 있습니다. 첫 번째 줄은 오류 메시지를 나타내고, 다음 두 줄에는 오류가 포함된 XML 코드의 컨텍스트와 위치가 포함됩니다. 세 번째 줄에는 오류가 위의 줄에 있는 위치를 보여주는 표시기가 포함되어 있습니다.
error: (name_of_guest.xml):6: StartTag: invalid element name
<vcpu>2</vcpu><
-----------------^
이 메시지에 포함된 정보:
(name_of_guest.xml)
오류가 포함된 문서의 파일 이름입니다. 괄호 안에 있는 파일 이름은 메모리에서 구문 분석되는 XML 문서를 설명하는 심볼릭 이름이며 디스크의 파일에 직접 일치하지 않습니다. 괄호 안에 포함되지 않은 파일 이름은 연결의 대상에 있는 로컬 파일입니다.
6
오류가 포함된 XML 파일의 줄 번호입니다.
StartTag: 잘못된 요소 이름
이는 특정 XML 오류를 설명하는 libxml2 구문 분석기의 오류 메시지입니다.
A.19.10.2.1. 스프레이 < 문서에서
증상
다음과 같은 오류가 발생합니다.
error: (name_of_guest.xml):6: StartTag: invalid element name
<vcpu>2</vcpu><
-----------------^
조사
이 오류 메시지는 구문 분석기에서 게스트 XML 파일의 6행에서 < 기호 뒤에 새 요소 이름을 예상한다는 것을 보여줍니다.
텍스트 편집기에서 줄 번호 표시가 활성화되어 있는지 확인합니다. XML 파일을 열고 6행에서 텍스트를 찾습니다.
<domain type='kvm'>
   <name>name_of_guest</name>
<memory>524288</memory>
<vcpu>2</vcpu><
게스트의 XML 파일에 대한 이 조각에는 추가 < 가 포함되어 있습니다.
해결책
추가 < 를 제거하거나 새 요소를 완료합니다.
A.19.10.2.2. Unterminated 속성
증상
다음과 같은 오류가 발생합니다.
error: (name_of_guest.xml):2: Unescaped '<' not allowed in attributes values
<name>name_of_guest</name>
--^
조사
게스트의 XML 파일의 스니펫에는 정의되지 않은 element 특성 값이 포함되어 있습니다.
<domain type='kvm>
<name>name_of_guest</name>
이 경우 'kvm' 에 두 번째 따옴표가 없습니다. 특성 값은 XML start 및 end 태그와 유사하게 따옴표 또는 게시rophes로 열고 닫아야 합니다.
해결책
모든 속성 값 문자열을 올바르게 열고 닫습니다.
A.19.10.2.3. 열기 및 종료 태그 불일치
증상
다음과 같은 오류가 발생합니다.
error: (name_of_guest.xml):61: Opening and ending tag mismatch: clock line 16 and domain
</domain>
---------^
조사
위의 오류 메시지에는ending 태그를 식별하는 세 가지 결과가 포함되어 있습니다.
마지막 콜론, 클럭 라인 16 및 도메인 뒤에 오는 메시지는 <clock> 에 문서의 16 라인에 일치하지 않는 태그가 있음을 보여줍니다. 마지막 힌트는 메시지의 컨텍스트 부분에 있는 포인터로, 두 번째 오름차림 태그를 식별합니다.
연결되지 않은 태그는 /> 로 닫아야 합니다. 다음 스니펫에서는 이 규칙을 따르지 않으며 위에 표시된 오류 메시지가 생성되었습니다.
<domain type='kvm'>
  ...
    <clock offset='utc'>
이 오류는 파일의 일치하지 않는 XML 태그로 인해 발생합니다. 모든 XML 태그에는 일치하는 start 및 end 태그가 있어야 합니다.
일치하지 않는 XML 태그의 다른 예
다음 예제에서는 유사한 오류 메시지를 생성하고 일치하지 않는 XML 태그의 변형을 보여줍니다.
이 스니펫에는 최종 태그가 없기 때문에 <features> 에 대한 불일치 오류가 포함되어 있습니다(</name>):
<domain type='kvm'>
 ...
 <features>
   <acpi/>
   <pae/>
 ...
 </domain>
이 스니펫에는 해당 시작 태그가 없는 엔드 태그(</name>)가 포함되어 있습니다.
<domain type='kvm'>
  </name>
  ...
</domain>
해결책
모든 XML 태그가 올바르게 시작되고 종료되는지 확인합니다.
A.19.10.2.4. 태그의 오타 오류
증상
다음과 같은 오류 메시지가 표시됩니다.
error: (name_of_guest.xml):1: Specification mandate value for attribute ty
<domain ty pe='kvm'>
-----------^
조사
XML 오류는 간단한 오타 오류로 인해 쉽게 발생할 수 있습니다. 이 오류 메시지는 XML 오류를 강조 표시합니다.이 경우 포인터와 함께 word type 내의 추가 공백을 나타냅니다.
<domain ty pe='kvm'>
이러한 XML 예제는 누락된 특수 문자 또는 추가 문자와 같은 오타 오류로 인해 올바르게 구문 분석되지 않습니다.
<domain type 'kvm'>
<dom#ain type='kvm'>
해결책
문제가 있는 태그를 식별하려면 파일 컨텍스트에 대한 오류 메시지를 읽고 포인터를 사용하여 오류를 찾습니다. XML을 수정하고 변경 사항을 저장합니다.

A.19.10.3. 논리 및 구성 오류

잘 포맷된 XML 문서에는 구문에 올바른 오류가 포함될 수 있지만 libvirt 는 구문에서 구문 분석할 수 없습니다. 이러한 오류는 대부분 존재하며 아래에 설명된 가장 일반적인 두 가지 경우가 있습니다.
A.19.10.3.1. vanishing parts
증상
변경 사항의 일부는 표시되지 않으며 도메인을 편집하거나 정의한 후에는 적용되지 않습니다. define 또는 edit 명령이 작동하지만 XML을 다시 덤프하면 변경 사항이 사라집니다.
조사
이 오류는 libvirt가 구문 분석하지 않는 구문 또는 구문으로 인해 발생할 수 있습니다. libvirt 툴은 일반적으로 이를 알고 있는 구문만 찾고 다른 모든 것은 무시하므로 libvirt 가 입력을 구문 분석한 후 일부 XML 변경 사항이 발생합니다.
해결책
편집 으로 전달하거나 명령을 정의하기 전에 XML 입력을 검증합니다. libvirt 개발자는 libvirt 에서 사용하는 XML 문서에 허용되는 대부분의 구문을 정의하는 libvirt 와 함께 번들된 XML 스키마 집합을 유지합니다.
다음 명령을 사용하여 libvirt XML 파일을 검증합니다.
# virt-xml-validate libvirt.xml
이 명령이 통과하면 libvirt 는 스키마가 지정된 하이퍼바이저에 대해서만 유효한 옵션을 탐지할 수 없는 경우를 제외하고 XML의 모든 구문을 이해할 수 있습니다. 예를 들어 virsh dump 명령의 결과로 libvirt 에서 생성한 모든 XML은 오류 없이 유효성을 검사해야 합니다.
A.19.10.3.2. 잘못된 드라이브 장치 유형
증상
CD-ROM 가상 드라이브의 소스 이미지에 대한 정의는 추가되지 않았습니다.
# virsh dumpxml domain
<domain type='kvm'>
  ...
  <disk type='block' device='cdrom'>
    <driver name='qemu' type='raw'/>
    <target dev='hdc' bus='ide'/>
    <readonly/>
  </disk>
  ...
</domain>
해결책
다음과 같이 누락된 <source> 매개변수를 추가하여 XML을 수정합니다.
<disk type='block' device='cdrom'>
  <driver name='qemu' type='raw'/>
  <source file='/path/to/image.iso'/>
  <target dev='hdc' bus='ide'/>
  <readonly/>
</disk>
type='block' 디스크 장치는 소스가 물리적 장치여야 합니다. 이미지 파일이 있는 디스크를 사용하려면 대신 type='file' 을 사용합니다.

부록 B. 여러 아키텍처에서 KVM 가상화 사용

기본적으로 Red Hat Enterprise Linux 7의 KVM 가상화는 AMD64 및 Intel 64 아키텍처와 호환됩니다. 그러나 Red Hat Enterprise Linux 7.5부터는 kernel-alt 패키지가 도입되었기 때문에 KVM 가상화도 다음 아키텍처에서 지원됩니다.
이러한 아키텍처에서 가상화를 사용하는 경우 설치, 사용 및 기능 지원은 특정 면에서 AMD64 및 Intel 64와 다릅니다. 자세한 내용은 다음 섹션을 참조하십시오.

B.1. IBM POWER Systems에서 KVM 가상화 사용

Red Hat Enterprise Linux 7.5부터는 IBM POWER8 Systems 및 IBM POWER9 시스템에서 KVM 가상화가 지원됩니다. 그러나 IBM POWER8은 kernel-alt 를 사용하지 않으므로 이 두 아키텍처는 특정 측면에서 다릅니다.

설치

IBM POWER 8 및 POWER9 Systems용 Red Hat Enterprise Linux 7에 KVM 가상화를 설치하려면 다음을 수행합니다.
  1. 고객 포털의 부팅 가능한 이미지에서 호스트 시스템을 설치합니다.
    자세한 내용은 Red Hat Enterprise Linux 7 설치 가이드 를 참조하십시오.
  2. 호스트 시스템이 하이퍼바이저 요구 사항을 충족하는지 확인합니다.
    • 시스템 유형이 올바른지 확인합니다.
      # grep ^platform /proc/cpuinfo
      이 명령의 출력에는 지원되는 PowerNV 머신 유형에서 실행 중임을 나타내는 PowerNV 항목이 포함되어야 합니다.
      platform        : PowerNV
      
    • KVM-HV 커널 모듈을 로드합니다.
      # modprobe kvm_hv
    • KVM-HV 커널 모듈이 로드되었는지 확인합니다.
      # lsmod | grep kvm
      KVM-HV가 성공적으로 로드되면 이 명령의 출력에 kvm_hv 가 포함됩니다.
  3. 2장. 가상화 패키지 설치 에 설명된 다른 가상화 패키지 외에도 qemu-kvm-ma 패키지를 설치합니다.

아키텍처별

IBM POWER용 Red Hat Enterprise Linux 7.5의 KVM 가상화는 다음과 같이 AMD64 및 Intel 64 시스템의 KVM과 다릅니다.
  • IBM POWER 호스트에서 게스트의 최소 메모리 할당은 2GB RAM 입니다.
  • IBM POWER 시스템에서 SPICE 프로토콜은 지원되지 않습니다. 게스트의 그래픽 출력을 표시하려면 VNC 프로토콜을 사용합니다. 또한 다음과 같은 가상 그래픽 카드 장치 만 지원됩니다.
    • VGA - -vga std 모드에서만 지원되며 -vga cirrus 모드에서는 지원되지 않음
    • virtio-vga
    • virtio-gpu
  • 다음 가상화 기능은 AMD64 및 Intel 64 호스트에서 비활성화되어 있지만 IBM POWER에서 작동합니다. 그러나 Red Hat에서는 지원되지 않으므로 다음을 사용하지 않는 것이 좋습니다.
    • I/O 스레드
  • SMBIOS 구성을 사용할 수 없습니다.
  • 호환성 모드 게스트를 포함한 POWER8 게스트는 다음과 같은 오류로 인해 시작되지 않을 수 있습니다.
    qemu-kvm: Failed to allocate KVM HPT of order 33 (try smaller maxmem?): Cannot allocate memory
    이는 Red Hat Enterprise Linux 7.3 또는 이전 버전을 사용하는 게스트에서 훨씬 더 발생할 가능성이 높습니다.
    이 문제를 해결하려면 kvm_cma_resv_ratio= 메모리를 호스트의 커널 명령줄에 추가하여 게스트의 해시된 페이지 테이블(HPT)에 사용할 수 있는 CMA 메모리 풀을 늘립니다. 여기서 메모리는 CMA 풀에 예약해야 하는 호스트 메모리의 백분율입니다(기본값: 5).
  • THP(Transparent Huge Page)는 현재 IBM POWER8 게스트에서 주목할 만한 성능 이점을 제공하지 않습니다.
    또한 IBM POWER8 시스템의 정적 대규모 페이지 크기는 16MiB 및 16GiB이며 AMD64 및 Intel 64 및 IBM POWER9에서는 1GiB입니다. 결과적으로 게스트가 정적 대규모 페이지로 구성된 경우 IBM POWER8 호스트에서 IBM POWER9 호스트로 게스트를 마이그레이션할 수 없습니다.
  • AMD64 및 Intel 64 시스템에서 지원되는 여러 가상 주변 장치는 IBM POWER 시스템에서 지원되지 않거나 교체로 다른 장치가 지원됩니다.
    • ioh3420xio3130-downstream 장치를 포함한 PCI-E 계층에 사용되는 장치는 지원되지 않습니다. 이 기능은 스파pr-pci-host-bridge 장치에서 제공되는 여러 개의 독립적인 PCI 루트 브리지로 교체됩니다.
    • UHCI 및 EHCI PCI 컨트롤러는 지원되지 않습니다. 대신 OHCI 및 XHCI 컨트롤러를 사용합니다.
    • 가상 IDE CD-ROM(ide-cd) 및 가상 IDE 디스크(ide-hd)를 포함한 IDE 장치는 지원되지 않습니다. 대신 virtio-scsivirtio-blk 장치를 사용합니다.
    • 에뮬레이션된 PCI NIC(rtl8139)는 지원되지 않습니다. 대신 virtio-net 장치를 사용합니다.
    • intel-hda,hda-output, AC97 을 포함한 건전한 장치는 지원되지 않습니다.
    • usb-redirusb-tablet 를 포함한 USB 리디렉션 장치는 지원되지 않습니다.
  • kvm-clock 서비스 는 IBM POWER 시스템에서 시간 관리를 위해 구성할 필요가 없습니다.
  • pvpanic 장치는 IBM POWER 시스템에서 지원되지 않습니다. 그러나 기본적으로 이 아키텍처에서 동등한 기능을 사용할 수 있습니다. 게스트에서 활성화하려면 preserve 값과 함께 <on_crash> 구성 요소를 사용합니다. 또한 게스트가 IBM POWER 시스템에서 부팅하지 못할 수 있으므로 <devices> 섹션에서 <panic> 요소를 제거해야 합니다.
  • IBM POWER8 시스템에서는 게스트를 지원하기 위해 호스트 시스템을 단일 스레드 모드로 실행해야 합니다. qemu-kvm-ma 패키지가 설치된 경우 자동으로 구성됩니다. 그러나 단일 스레드 호스트에서 실행되는 게스트는 여전히 여러 스레드를 사용할 수 있습니다.
  • RHEL 7 호스트에서 실행되는 IBM POWER 가상 머신(VM)이 제로 메모리(memory='0')를 사용하는 NUMA 노드로 구성된 경우 VM이 제대로 작동하지 않습니다. 결과적으로 Red Hat은 RHEL 7에서 제로 메모리 NUMA 노드가 있는 IBM POWER VM을 지원하지 않습니다.

B.2. IBM Z에서 KVM 가상화 사용

설치

IBM Z 호스트에서 KVM 하이퍼바이저를 전용 논리 파티션(LPAR)에 설치해야 합니다. z/VM OS에서 KVM 실행은 지원되지 않습니다. 또한 LPAR은 SIE( Start-interpretive execution ) 가상화 확장 기능을 지원해야 합니다.
IBM Z용 Red Hat Enterprise Linux 7에 KVM Virtualization을 설치하려면 다음을 수행합니다.
  1. 고객 포털의 부팅 가능한 이미지에서 호스트 시스템을 설치합니다. 자세한 내용은 설치 가이드 를 참조하십시오.
  2. 시스템이 하이퍼바이저 요구 사항을 충족하는지 확인합니다.
    • CPU 가상화 확장을 사용할 수 있는지 확인합니다.
      # grep sie /proc/cpuinfo
      이 명령의 출력에는 프로세서에 필요한 가상화 확장이 있음을 나타내는 sie 항목이 포함되어야 합니다.
      features        : esan3 zarch stfle msa ldisp eimm dfp edat etf3eh highgprs te sie
      
    • KVM 커널 모듈을 로드합니다.
      # modprobe kvm
    • KVM 커널 모듈이 로드되었는지 확인합니다.
      # lsmod | grep kvm
      KVM이 성공적으로 로드되면 이 명령의 출력에 kvm 이 포함됩니다. 그렇지 않은 경우 Red Hat Enterprise Linux 7에 커널의 kernel-alt 버전을 사용하고 있는지 확인하십시오.
  3. 2장. 가상화 패키지 설치 에 설명된 다른 가상화 패키지 외에도 qemu-kvm-ma 패키지를 설치합니다.
  4. 게스트를 설정할 때 "Spectre" 취약점으로부터 게스트 를 보호하는 다음 방법 중 하나로 CPU 를 설정하는 것이 좋습니다.
    • 예를 들면 다음과 같이 호스트 CPU 모델을 사용합니다.
      
      <cpu mode='host-model' check='partial'>
        <model fallback='allow'/>
      </cpu>
      
      
      이렇게 하면 호스트가 지원하는 경우 ppa15bpb 기능을 게스트에서 사용할 수 있습니다.
    • 특정 호스트 모델을 사용하는 경우 ppa15bpb 기능을 추가합니다. 다음 예에서는 zEC12 CPU 모델을 사용합니다.
      
      <cpu mode='custom' match='exact' check='partial'>
          <model fallback='allow'>zEC12</model>
          <feature policy='force' name='ppa15'/>
          <feature policy='force' name='bpb'/>
      </cpu>
      
      
    참고
    z12 호스트 시스템에서 z114z196 CPU 모델에 ppa15 기능을 사용하는 경우 최신 마이크로 코드 수준(bundle 95 이상)을 사용해야 합니다.

아키텍처별

IBM Z용 Red Hat Enterprise Linux 7.5의 KVM 가상화는 다음과 같이 AMD64 및 Intel 64 시스템의 KVM과 다릅니다.
  • SPICE 및 VNC 프로토콜을 사용할 수 없으며 가상 그래픽 카드 장치는 IBM Z에서 지원되지 않습니다. 따라서 게스트 그래픽 출력을 표시할 수 없습니다.
  • 가상 PCIUSB 장치는 IBM Z에서 지원되지 않습니다. 즉, virtio-*-pci 장치는 지원되지 않으며 virtio-*-ccw 장치를 대신 사용해야 합니다. 예를 들어 virtio-net-pci 대신 virtio-net-ccw 를 사용합니다.
  • <boot dev='장치'/> XML 구성 요소는 IBM Z에서 지원되지 않습니다. 장치 부팅 순서를 정의하려면 <devices> 섹션에 <boot order='번호'/> 요소를 사용합니다. 예를 들어 업스트림 libvirt 문서를 참조하십시오.
    참고
    부팅 순서 관리에 <boot order='번호'/>를 사용하는 것이 AMD64 및 Intel 64 호스트에서도 선호됩니다.
  • SMBIOS 구성을 사용할 수 없습니다.
  • IBM Z에서 사용되는 워치독 장치 모델은 diag 288 여야 합니다.
  • IBM Z에서 중첩된 가상화 기능을 활성화하려면 다음을 수행하십시오. AMD64 및 Intel 64 시스템에서와 마찬가지로 중첩된 가상화는 IBM Z에서 기술 프리뷰 로 제공되므로 프로덕션 환경에서 사용하지 않는 것이 좋습니다.
    1. 시스템에서 중첩된 가상화가 이미 활성화되어 있는지 확인합니다.
      $ cat /sys/module/kvm/parameters/nested
      이 명령이 1 을 반환하면 해당 기능이 이미 활성화되어 있습니다.
      명령에서 0 을 반환하는 경우 다음 단계를 사용하여 활성화합니다.
    2. kvm 모듈을 언로드합니다.
      # modprobe -r kvm
    3. 중첩 기능을 활성화합니다.
      # modprobe kvm nested=1
    4. 이제 다음 호스트를 재부팅할 때까지만 중첩 기능이 활성화됩니다. 영구적으로 활성화하려면 /etc/modprobe.d/kvm.conf 파일에 다음 행을 추가합니다.
      options kvm nested=1
  • kvm-clock 서비스는 AMD64 및 Intel 64 시스템에 고유하며 IBM Z에서 시간 관리를 위해 구성할 필요가 없습니다.

B.3. ARM 시스템에서 KVM 가상화 사용

중요
KVM 가상화는 Red Hat Enterprise Linux 7.5 이상 64비트 ARM 아키텍처를 위해 제공됩니다. 따라서 KVM 가상화는 Red Hat에서 지원되지 않으며 프로덕션 환경에서 사용하기 위한 것이 아니며 알려진 보안 취약점을 해결할 수 없습니다. 또한 ARM의 KVM 가상화는 여전히 빠르게 개발되기 때문에 아래 정보는 정확하거나 완전하지 않을 수 있습니다.

설치

Red Hat Enterprise Linux 7.5 for ARM에 설치 가상화를 사용하려면 다음을 수행하십시오.
  1. 고객 포털의 부팅 가능한 이미지에서 호스트 시스템을 설치합니다.
  2. 시스템이 설치되면 다음 명령을 사용하여 시스템에 가상화 스택을 설치합니다.
    # yum install qemu-kvm-ma libvirt libvirt-client virt-install AAVMF
    설치에 대해 선택적 채널이 활성화되어 있는지 확인합니다.

아키텍처별

64비트 ARM 아키텍처용 Red Hat Enterprise Linux 7.5의 KVM 가상화는 다음과 같이 AMD64 및 Intel 64 시스템의 KVM과 다릅니다.
  • PXE 부팅은 virtio-net-devicevirtio-net-pci NIC(네트워크 인터페이스 컨트롤러)에서만 지원됩니다. 또한 ARM 아키텍처 가상 머신 펌웨어(AAVMF)의 내장 VirtioNetDxe 드라이버를 PXE 부팅에 사용해야 합니다. iPXE 옵션 Roms는 지원되지 않습니다.
  • 최대 123개의 가상 CPU(vCPU)만 단일 게스트에 할당할 수 있습니다.

부록 C. 가상화 제한 사항

본 부록에서는 Red Hat Enterprise Linux 7의 가상화 패키지에 대한 추가 지원 및 제품 제한 사항을 다룹니다.

C.1. 시스템 제한 사항

호스트 시스템
KVM이 포함된 Red Hat Enterprise Linux는 다음 호스트 아키텍처에서만 지원됩니다.
  • AMD64 및 Intel 64
  • IBM Z
  • IBM POWER8
  • IBM POWER9
이 문서에서는 AMD64 및 Intel 64 기능 및 기능을 설명하지만 다른 지원되는 아키텍처는 매우 유사합니다. 자세한 내용은 부록 B. 여러 아키텍처에서 KVM 가상화 사용의 내용을 참조하십시오.
게스트 시스템
Red Hat Enterprise Linux 7에서 Microsoft Windows 게스트 가상 머신은 AMQP(Advanced mission Critical)와 같은 특정 서브스크립션 프로그램에서만 지원됩니다. 서브스크립션 모델에 Windows 게스트에 대한 지원이 포함되어 있는지 확실하지 않은 경우 고객 지원에 문의하십시오.
Red Hat Enterprise Linux 7의 Windows 게스트 가상 머신에 대한 자세한 내용은 Red Hat Enterprise Linux 7 지식 베이스에서 Windows 게스트 가상 머신 을 참조하십시오.

C.2. 기능 제한

Red Hat Enterprise Linux에 포함된 하이퍼바이저 패키지는 qemu-kvm 입니다. 이는 RHV(Red Hat Virtualization) 및 RHOS(Red Hat OpenStack) 제품에 포함된 qemu-kvm-rhev 패키지와 다릅니다. qemu-kvm에 적용되는 많은 제한 사항은 qemu-kvm -rhev 에는 적용되지 않습니다.
qemu-kvmqemu-kvm-rhev 패키지의 차이점에 대한 자세한 내용은 qemu-kvm과 qemu-kvm-rhev의 차이점 및 모든 하위패키지를 참조하십시오.
Red Hat Enterprise Linux에 포함된 KVM 하이퍼바이저에는 다음과 같은 제한 사항이 적용됩니다.
게스트당 최대 vCPU 수
Red Hat Enterprise Linux 7.2 이상에서는 Red Hat Enterprise Linux 7.0의160부터 게스트당240개의 vCPU를 지원합니다.
중첩된 가상화
중첩된 가상화는 Red Hat Enterprise Linux 7.2 이상에서 기술 프리뷰 로 제공됩니다. 이 기능을 통해 KVM은 하이퍼바이저로 작동하고 자체 게스트를 생성할 수 있는 게스트를 시작할 수 있습니다.
DomainMappingG 지원
QEMU 및 libvirt 에는 QEMU Tiny Code Generator(DEVG)를 사용하는 동적 변환 모드가 포함되어 있습니다. 이 모드에서는 하드웨어 가상화 지원이 필요하지 않습니다. 그러나 ProcessG는 Red Hat에서 지원하지 않습니다.
qemu-kvm 패키지가 가상 머신에 중첩된 게스트를 생성하는 데 사용되는 경우 상위 가상 머신에서 중첩된 가상화가 활성화되지 않는 한 ProcessG를 사용합니다. 중첩된 가상화는 현재 기술 프리뷰입니다. 자세한 내용은 12장. 중첩된 가상화의 내용을 참조하십시오.
ProcessG 기반 게스트는 다음을 사용하여 인식할 수 있습니다.
  • 게스트의 도메인 XML 파일에는 <domain type='qemu'> 행이 포함된 반면 KVM 게스트에는 <domain type='kvm'> 이 포함되어 있습니다.
  • 가상 하드웨어 세부 정보 보기의 개요 창에서 virt-managerKVM 대신 가상 머신 유형을 QEMU-02- G 로 표시합니다.
상수 TSC 비트
Constant Time Stampredentials(TSC)가 없는 시스템에는 추가 구성이 필요합니다. 관련 문제를 해결하기 위한 지속적인 TSC 및 구성 단계가 있는지 확인하는 방법에 대한 자세한 내용은 8장. KVM 게스트 타이밍 관리 을 참조하십시오.
에뮬레이션된 SCSI 어댑터
SCSI 장치 에뮬레이션은 virtio-scsi 반가상화 호스트 버스 어댑터(HBA)에서만 지원됩니다. 에뮬레이션된 SCSI HBA는 Red Hat Enterprise Linux의 KVM에서 지원되지 않습니다.
에뮬레이션된 IDE 장치
KVM은 가상 머신당 최대 4개의 가상화된 (emulated) IDE 장치로 제한됩니다.
반가상화 장치
반가상화 장치는 VirtIO 장치라고도 합니다. 가상 머신에서 최적으로 작동하도록 설계된 순수한 가상 장치입니다.
Red Hat Enterprise Linux 7은 가상 머신 버스당 32개의 PCI 장치 슬롯과 장치 슬롯당 8개의 PCI 기능을 지원합니다. 이를 통해 가상 머신에서 다중 기능 기능이 활성화되고 PCI 브리지가 사용되는 경우 버스당 최대 256개의 PCI 기능을 사용할 수 있습니다. 각 PCI 브릿지는 새로운 버스를 추가하여 잠재적으로 다른 256개의 장치 주소를 가능하게 합니다. 그러나 일부 버스는 사용자가 256 장치 주소를 모두 사용할 수 있도록 하지 않습니다; 예를 들어 루트 버스에는 슬롯을 차지하는 여러 개의 내장 장치가 있습니다.
PCI 브리지에 대한 자세한 내용은 16장. 게스트 가상 머신 장치 구성 을 참조하십시오. 16.1.5절. “PCI 브리지”
마이그레이션 제한 사항
장치 할당은 해당 가상 머신을 독점적으로 사용하기 위해 가상 머신에 노출된 물리적 장치를 나타냅니다. 장치 할당은 가상 머신이 실행되는 특정 호스트의 하드웨어를 사용하므로 장치 할당이 사용 중일 때 마이그레이션 및 저장/복원이 지원되지 않습니다. 게스트 운영 체제가 핫 플러그를 지원하는 경우 이 기능을 활성화하기 위해 마이그레이션 전에 할당된 장치를 제거하거나 저장/복원 작업을 수행할 수 있습니다.
실시간 마이그레이션은 동일한 CPU 유형의 호스트 (즉 Intel에서 Intel 또는 AMD에서 AMD로만)를 사용하는 호스트 사이에서만 가능합니다.
실시간 마이그레이션의 경우 두 호스트 모두 NX(No eXecution) 비트에 대해 설정된 것과 동일한 값이 있어야 합니다.
마이그레이션이 작동하려면 쓰기 모드에서 열린 모든 블록 장치에 대해 cache=none 을 지정해야 합니다.
주의
cache=none 옵션을 포함하지 않으면 디스크 손상이 발생할 수 있습니다.
스토리지 제한 사항
게스트 가상 머신은 전체 디스크 또는 블록 장치(예: /dev/sdb)에 대한 쓰기 액세스 권한을 부여하는 것과 관련된 위험이 있습니다. 게스트 가상 머신이 전체 블록 장치에 액세스할 수 있는 경우 모든 볼륨 레이블 또는 파티션 테이블을 호스트 시스템과 공유할 수 있습니다. 호스트 시스템의 파티션 인식 코드에 버그가 있는 경우 보안 위험이 발생할 수 있습니다. 게스트 가상 머신에 할당된 장치를 무시하도록 호스트 시스템을 구성하여 이러한 위험을 방지합니다.
주의
스토리지 제한 사항을 준수하지 않으면 보안에 위험이 발생할 수 있습니다.
실시간 스냅샷
Red Hat Enterprise Linux의 KVM의 백업 및 복원 API는 실시간 스냅샷을 지원하지 않습니다.
스트리밍, 미러링 및 라이브 병합
streaming, mirroring 및 live-merge는 지원되지 않습니다. 이렇게 하면 block-jobs가 방지됩니다.
I/O 제한
Red Hat Enterprise Linux는 가상 디스크의 작업에 대한 최대 입력 및 출력 레벨 구성을 지원하지 않습니다.
I/O 스레드
Red Hat Enterprise Linux는 VirtIO 인터페이스가 있는 디스크에서 입력 및 출력 작업을 위해 별도의 스레드 생성을 지원하지 않습니다.
메모리 핫 플러그 및 핫 언플러그
Red Hat Enterprise Linux는 가상 머신에서 메모리를 핫 플러그 또는 핫 플러그 해제를 지원하지 않습니다.
vhost-user
Red Hat Enterprise Linux는 사용자 공간 가상호스트 인터페이스의 구현을 지원하지 않습니다.
CPU 핫 언플러그
Red Hat Enterprise Linux는 가상 머신에서 CPU 핫 플러그를 지원하지 않습니다.
PCIe의 NUMA 게스트 지역성
Red Hat Enterprise Linux는 가상 PCIe 장치 바인딩을 특정 NUMA 노드에 바인딩하는 것을 지원하지 않습니다.
코어 덤프 제한 사항
현재 코어 덤프가 마이그레이션 시 구현되므로 장치 할당이 사용 중일 때 지원되지 않습니다.
실시간 커널
KVM은 현재 실시간 커널을 지원하지 않으므로 Red Hat Enterprise Linux for Real Time에서 사용할 수 없습니다.

C.3. 애플리케이션 제한

가상화는 특정 유형의 애플리케이션에 적합하지 않게 만드는 측면이 있습니다.
높은 I/O 처리량 요구 사항이 있는 애플리케이션에서는 완전히 가상화된 게스트에 KVM의 반가상화 드라이버(virtio 드라이버)를 사용해야 합니다. virtio 드라이버가 없으면 특정 애플리케이션의 I/O 로드가 많은 경우 예측할 수 없습니다.
높은 I/O 요구 사항으로 인해 다음 애플리케이션을 사용하지 않아야 합니다.
  • kdump 서버
  • netdump 서버
I/O 또는 실시간 성능이 필요한 애플리케이션 및 도구를 신중하게 평가해야 합니다. I/O 성능 향상을 위해 virtio 드라이버 또는 PCI 장치 할당을 고려하십시오. 완전 가상화된 게스트의 virtio 드라이버에 대한 자세한 내용은 5장. KVM Paravirtualized (virtio) 드라이버 를 참조하십시오. PCI 장치 할당에 대한 자세한 내용은 16장. 게스트 가상 머신 장치 구성 을 참조하십시오.
애플리케이션은 가상화된 환경에서 실행으로 인한 작은 성능 저하로 인해 발생합니다. 가상화 사용과 관련된 잠재적인 애플리케이션 성능 문제에 대해 최신 하드웨어와 더 빠른 하드웨어 도입을 통해 가상화의 성능 이점을 평가해야 합니다.

C.4. 기타 제한 사항

가상화에 영향을 미치는 기타 모든 제한 사항 및 문제 목록은 Red Hat Enterprise Linux 7 릴리스 노트 를 참조하십시오. Red Hat Enterprise Linux 7 릴리스 노트 에서는 새로운 기능, 알려진 문제, 업데이트 또는 검색되는 제한 사항을 다룹니다.

C.5. 스토리지 지원

가상 머신에 지원되는 스토리지 방법은 다음과 같습니다.
  • 로컬 스토리지의 파일
  • 물리 디스크 파티션
  • 로컬로 연결된 물리적 LUN
  • LVM 파티션
  • NFS 공유 파일 시스템
  • iSCSI
  • GFS2 클러스터형 파일 시스템
  • 파이버 채널 기반 LUN
  • FCoE(Fibre Channel over Ethernet)

C.6. USB 3 / xHCI 지원

Red Hat Enterprise Linux 7.2 이상에서 USB 3(xHCI) USB 호스트 어댑터 에뮬레이션이 지원됩니다. 모든 USB 속도를 사용할 수 있습니다. 즉, 모든 세대의 USB 장치를 xHCI 버스에 연결할 수 있습니다. 또한 동반 컨트롤러( USB 1 장치용)가 필요하지 않습니다. 그러나 USB 3 대량 스트림은 지원되지 않습니다.
xHCI의 이점:
  • 가상화 호환 하드웨어 설계는 xHCI 에뮬레이션에 폴링 오버헤드 감소로 인해 이전 버전보다 적은 CPU 리소스가 필요합니다.
  • USB 3 장치의 USB 패스스루를 사용할 수 있습니다.
xHCI의 제한 사항:
  • Red Hat Enterprise Linux 5 게스트는 지원되지 않습니다.
xHCI 장치에 대한 도메인 XML 장치 예제는 그림 16.19. “USB3/xHCI 장치의 도메인 XML 예” 을 참조하십시오.

부록 D. 추가 리소스

가상화 및 Red Hat Enterprise Linux에 대한 자세한 내용은 다음 리소스를 참조하십시오.

D.1. 온라인 리소스

  • http://www.libvirt.org/libvirt 가상화 API의 공식 업스트림 웹 사이트입니다.
  • https://virt-manager.org/ 는 가상 머신 관리를 위한 그래픽 애플리케이션인 Virtual Machine Manager (virt-manager)의 업스트림 프로젝트 웹 사이트입니다.

D.2. 설치된 문서

  • man virsh/usr/share/doc/libvirt-version-number - virsh 가상 머신 관리 유틸리티에 대한 하위 명령 및 옵션을 비롯하여 libvirt 가상화 라이브러리 API에 대한 포괄적인 정보가 포함되어 있습니다.
  • /usr/share/doc/gnome-applet-vm-version-number - 로컬 실행 가상 머신을 모니터링하고 관리하는 GNOME 그래픽 패널 장치 문서에 대한 설명서입니다.
  • /usr/share/doc/libvirt-python-version-number - libvirt 라이브러리의 Python 바인딩에 대한 세부 정보를 제공합니다. libvirt-python 패키지를 사용하면 python 개발자가 libvirt 가상화 관리 라이브러리와 인터페이스하는 프로그램을 생성할 수 있습니다.
  • /usr/share/doc/virt-install-version-number - 가상 머신 내부에 Fedora 및 Red Hat Enterprise Linux 관련 배포 설치를 시작하는 데 도움이 되는 virt-install 명령에 대한 설명서를 제공합니다.
  • /usr/share/doc/virt-manager-version-number - 가상 머신을 관리하는 그래픽 도구를 제공하는 가상 머신 관리자에 대한 설명서를 제공합니다.
  • 참고
    다른 Red Hat Enterprise Linux 구성 요소에 대한 자세한 내용은 usr/share/doc/.에서 해당 man 페이지 또는 파일을 참조하십시오.

부록 E. IOMMU 그룹 작업[1]

Red Hat Enterprise Linux 7에서 도입된VFIO(Virtual Function I/O)는 사용자 공간 드라이버 프레임워크를 제공하는 Linux 커널 모듈 세트입니다. 이 프레임워크는 IOMMU(Input-output Memory Management Unit) 보호 기능을 사용하여 사용자 공간 드라이버에 대한 보안 장치 액세스를 가능하게 합니다. VFIO는 DPDK(Data Plane Development Kit) 와 더 일반적인 PCI 장치 할당 과 같은 사용자 공간 드라이버를 활성화합니다.
VFIO는 IOMMU 그룹을 사용하여 장치를 분리하고 동일한 호스트 물리적 시스템에서 실행되는 두 장치 간에 의도하지 않은 DMA(Direct Memory Access) 를 방지하여 호스트와 게스트 기능에 영향을 미칠 수 있습니다. IOMMU 그룹은 Red Hat Enterprise Linux 7에서 사용할 수 있으며, 이는 Red Hat Enterprise Linux 6에서 제공되는 레거시 KVM 장치 할당에 비해 상당한 개선 사항입니다. 이 부록은 다음을 강조 표시합니다.
  • IOMMU 그룹의 개요
  • 장치 분리의 중요
  • VFIO 이점

E.1. IOMMU 개요

IOMMU는 장치에 대한 가상 주소 공간을 생성하며, 각 I/O 가상 주소(IOVA)는 실제 시스템 메모리의 다른 주소로 변환될 수 있습니다. 변환이 완료되면 장치는 실제 시스템의 메모리 내의 다른 주소에 연결됩니다. IOMMU가 없으면 모든 장치에는 메모리 주소 변환이 없기 때문에 실제 메모리에 대한 공유 플랫 보기가 있습니다. IOMMU를 사용하면 장치는 장치 할당에 유용한 새 주소 공간으로 IOVA 공간을 받습니다.
다른 IOMMU에는 다양한 수준의 기능이 있습니다. 이전에는 IOMMUs가 제한되어 변환만 제공되었으며 종종 주소 공간의 작은 창 만 제공했습니다. 예를 들어 IOMMU는 낮은 메모리에 있는 IOVA 공간의 작은 창(1GB 이하)만 예약하며, 이는 여러 장치에서 공유되었습니다. 일반 목적 IOMMU로 사용되는 AMD 그래픽 주소 remapping 테이블(GART)은 이 모델의 예입니다. 이러한 클래식 IOMMUs는 대부분 소진 버퍼주소 병합 이라는 두 가지 기능을 제공했습니다.
  • 흐름 버퍼 는 장치의 주소 지정 기능이 플랫폼의 기능보다 작은 경우 필요합니다. 예를 들어, 장치의 주소 공간이 메모리의 4GB(32비트)로 제한되고 드라이버는 4GB 이상의 버퍼에 할당하는 경우 장치는 버퍼에 직접 액세스할 수 없습니다. 이러한 상황은 소진 버퍼를 사용하는 상황이 필요합니다. 더 낮은 메모리에 위치한 버퍼 공간은 장치가 Makefile 작업을 수행할 수 있습니다. 버퍼의 데이터는 작업 완료 시 드라이버의 할당된 버퍼에만 복사됩니다. 즉, 하위 메모리 주소에서 더 높은 메모리 주소로 버퍼가 소진됩니다. IOMMUs는 장치의 주소 공간 내에 IOVA 변환을 제공하여 버퍼링을 피합니다. 그러면 버퍼가 장치의 실제 주소 공간을 초과하여 확장되는 경우에도 장치가 버퍼로 직접 수행할 수 있습니다. 이전에는 이 IOMMU 기능이 IOMMU의 배타적 사용 사례이지만 PCI (PCIe) 채택을 통해 4GB 이상의 주소 지정을 지원할 수 있는 기능이 기존이 아닌 모든 끝점에 필요합니다.
  • 기존 메모리 할당에서는 애플리케이션의 필요에 따라 메모리 블록이 할당되고 해제됩니다. 이 방법을 사용하면 실제 주소 공간 전체에 메모리 부족이 발생합니다. 메모리 간격을 더 효율적으로 사용하거나 메모리 간격을 함께 수집할 경우 기본 용어가 더 적합할 경우 더 좋습니다. IOMMU는 IOVA 공간을 통해 이러한 분산된 메모리 목록을 병합하고, 경우에 따라 spread-gather 목록이라고 합니다. 이를 통해 IOMMU는 연속된 ImageStreamTag 작업을 생성하고 궁극적으로 I/O 성능의 효율성을 높입니다. 가장 간단한 예에서 드라이버는 실제 메모리 공간에 연속되지 않은 두 개의 4KB 버퍼를 할당할 수 있습니다. IOMMU는 이러한 버퍼에 연속된 범위를 할당할 수 있으므로 I/O 장치가 두 개의 별도의 4KBReplicass가 아니라 단일 8KBReplicas를 수행할 수 있습니다.
메모리 병합 및 소환 버퍼링이 호스트에서 고성능 I/O에 중요하지만 가상화 환경에 중요한 IOMMU 기능은 최신 IOMMU의 격리 기능입니다. 기존 PCI PCI가 요청 장치(requester ID)의 ID로 트랜잭션을 태그하지 않기 때문에 PCI-Express 이전의 광범위한 격리를 수행할 수 없었습니다. PCI-X에는 일정 수준의 요청자 ID가 포함되어 있지만 트랜잭션 소유권을 갖는 장치 상호 연결 규칙은 장치 격리에 대한 완전한 지원을 제공하지 않았습니다.
PCIe를 사용하면 각 장치의 트랜잭션에 고유 한 요청자 ID가 태그됩니다( PCI 버스/디바이스 번호, 종종 BDF로 축약됨)는 해당 장치의 고유한 IOVA 테이블을 참조하는 데 사용됩니다. 이제 격리가 가능하므로 IOVA 공간은 연결할 수 없는 메모리 오프로드 및 집적 메모리와 같은 변환 작업에만 사용할 수 없지만 장치로부터 Makefile 액세스를 제한하는 데 사용할 수도 있습니다. 이를 통해 장치를 서로 분리하여 메모리 공간의 중복 할당을 방지할 수 있으며 적절한 게스트 가상 머신 장치 관리에 필요합니다. 게스트 가상 머신에서 이러한 기능을 사용하려면 할당된 장치의 IOVA 공간을 가상 머신에 대한 guest-physical-to-host-physical 메모리 매핑으로 채워야 합니다. 이 작업이 완료되면 장치는 게스트 가상 머신의 주소 공간에서 Makefile 작업을 투명하게 수행합니다.

E.2. IOMMU 그룹에 대한 Deep-dive

IOMMU 그룹은 IOMMU의 관점에서 분리된 것으로 간주될 수 있는 가장 작은 장치 세트로 정의됩니다. 격리를 달성하는 첫 번째 단계는 세분성입니다. IOMMU에서 장치를 별도의 IOVA 공백으로 구분할 수 없는 경우 분리되지 않습니다. 예를 들어, 여러 장치가 동일한 IOVA 공간을 별칭하려고 하면 IOMMU는 이를 구분할 수 없습니다. 이는 일반적인 x86 PC가 모든 기존 PCI 장치를 함께 그룹화할 것이며, 모두 동일한 요청자 ID인 PCIe-to-PCI 브릿지로 별칭이 지정된 이유입니다. 레거시 KVM 장치 할당을 통해 사용자는 이러한 기존 PCI 장치를 별도로 할당할 수 있지만 IOMMU가 장치를 구분할 수 없기 때문에 구성이 실패합니다. VFIO는 IOMMU 그룹에 의해 관리되므로 IOMMU 세분성의 이러한 가장 기본적인 요구 사항을 위반하는 구성이 방지됩니다.
다음 단계는 장치의 트랜잭션이 실제로 IOMMU에 도달하는지 여부를 결정하는 것입니다. PCIe 사양을 사용하면 상호 연결 패브릭에서 트랜잭션을 다시 라우팅할 수 있습니다. PCIe 다운스트림 포트는 하나의 다운스트림 장치에서 다른 장치로 트랜잭션을 다시 라우팅할 수 있습니다. PCIe 스위치의 다운스트림 포트는 한 포트에서 다른 포트로 다시 라우팅할 수 있도록 상호 연결될 수 있습니다. 다중 기능 엔드포인트 장치 내에서도 한 함수의 트랜잭션이 다른 함수로 직접 전달될 수 있습니다. 한 장치에서 다른 장치로의 이러한 트랜잭션은 피어 투 피어 트랜잭션이라고 하며 별도의 IOVA 스페이스에서 작동하는 장치 격리를 제거할 수 있습니다. 예를 들어 게스트 가상 머신에 할당된 네트워크 인터페이스 카드가 있는 경우 해당 IOVA 공간 내의 가상 주소에 대해 Makefile 쓰기 작업을 시도합니다. 그러나 실제 공간에서는 동일한 주소가 호스트가 소유한 피어 디스크 컨트롤러에 속합니다. 장치의 물리적 변환에 대한 IOVA가 IOMMU에서만 수행되므로 해당 트랜잭션의 데이터 경로를 최적화하려고 하는 모든 상호 연결은 변환을 위해 IOMMU로 이동하기 전에 CoreDNS 쓰기 작업을 디스크 컨트롤러로 잘못 리디렉션할 수 있습니다.
이 문제를 해결하기 위해 PCI Express 사양에는 이러한 리디렉션을 가시성과 제어 기능을 제공하는 PCIe(Access Control Services) 지원이 포함됩니다. 이는 상호 간에 장치를 분리하는 데 중요한 구성 요소이며, 상호 연결 및 다중 기능 끝점에서 누락되는 경우가 많습니다. 장치에서 IOMMU로의 모든 수준에서 ACS를 지원하지 않으면 리디렉션이 가능한 것으로 가정해야 합니다. 따라서 PCI 토폴로지에서 ACS 지원이 부족한 지점 아래의 모든 장치의 분리가 중단됩니다. PCI 환경의 IOMMU 그룹은 이러한 격리를 고려하여, 번역되지 않은 피어-투-피어 Makefile을 수행할 수 있는 장치를 함께 그룹화합니다.
요약하면 IOMMU 그룹은 IOMMU가 가시성을 가지며 다른 그룹과 분리된 최소 장치 집합을 나타냅니다. VFIO는 이 정보를 사용하여 사용자 공간을 위해 장치의 안전한 소유권을 적용합니다. 브리지, 루트 포트, 스위치(모든 상호 연결 패브릭 예제)를 제외하고 IOMMU 그룹 내의 모든 장치는 VFIO 장치 드라이버 또는 알려진 안전한 스텁 드라이버에 바인딩되어야 합니다. PCI의 경우 이러한 드라이버는 vfio-pci 및 pci-stub입니다. pci-stub는 호스트가 이 드라이버를 통해 장치와 상호 작용하지 않는 것으로 알려져 있기 때문에 간단히 허용됩니다.[2]. VFIO를 사용할 때 그룹이 실행 가능한지를 나타내는 오류가 발생하면 그룹의 모든 장치를 적절한 호스트 드라이버에 바인딩해야 합니다. virsh nodedev-dumpxml 을 사용하여 장치를 VFIO 호환 드라이버에 바인딩하기 위해 IOMMU 그룹 및 virsh nodedev-detach 의 구성을 탐색하면 이러한 문제를 해결하는 데 도움이 됩니다.


[2] 예외는 레거시 KVM 장치 할당으로, 종종 pci-stub 드라이버에 바인딩된 상태에서 장치와 상호 작용합니다. Red Hat Enterprise Linux 7에는 레거시 KVM 장치 할당이 포함되어 있지 않으므로 이러한 상호 작용과 잠재적인 충돌이 발생하지 않습니다. 따라서 동일한 IO 그룹 내에서 VFIO 및 레거시 KVM 장치 할당을 혼합하는 것은 권장되지 않습니다.

E.3. IOMMU 그룹 식별 및 할당 방법

이 예에서는 대상 시스템에 있는 PCI 장치를 식별하고 할당하는 방법을 보여줍니다. 예제 및 자세한 내용은 16.7절. “GPU 장치 할당” 을 참조하십시오.

절차 E.1. IOMMU 그룹

  1. 장치 나열

    virsh nodev-list device-type명령을 실행하여 시스템의 장치를 식별합니다. 이 예제에서는 PCI 장치를 찾는 방법을 보여줍니다. 출력은 간결성을 위해 잘립니다.
    # virsh nodedev-list pci
    
    pci_0000_00_00_0
    pci_0000_00_01_0
    pci_0000_00_03_0
    pci_0000_00_07_0
    [...]
    pci_0000_00_1c_0
    pci_0000_00_1c_4
    [...]
    pci_0000_01_00_0
    pci_0000_01_00_1
    [...]
    pci_0000_03_00_0
    pci_0000_03_00_1
    pci_0000_04_00_0
    pci_0000_05_00_0
    pci_0000_06_0d_0
    
  2. 장치의 IOMMU 그룹화 찾기

    나열된 각 장치에 대해 IOMMU 그룹화를 포함한 장치에 대한 자세한 정보는 virsh nodedev-dumpxml name-of-device 명령을 사용하여 확인할 수 있습니다. 예를 들어 pci_0000_04_00_0(PCI 주소 0000:04:00.0)이라는 PCI 장치의 IOMMU 그룹화를 찾으려면 다음 명령을 사용합니다.
    # virsh nodedev-dumpxml pci_0000_04_00_0
    이 명령은 표시된 것과 유사한 XML 덤프를 생성합니다.

    그림 E.1. IOMMU 그룹 XML

    
    <device>
      <name>pci_0000_04_00_0</name>
      <path>/sys/devices/pci0000:00/0000:00:1c.0/0000:04:00.0</path>
      <parent>pci_0000_00_1c_0</parent>
      <capability type='pci'>
        <domain>0</domain>
        <bus>4</bus>
        <slot>0</slot>
        <function>0</function>
        <product id='0x10d3'>82574L Gigabit Network Connection</product>
        <vendor id='0x8086'>Intel Corporation</vendor>
        <iommuGroup number='8'>   <!--This is the element block you will need to use-->
          <address domain='0x0000' bus='0x00' slot='0x1c' function='0x0'/>
          <address domain='0x0000' bus='0x00' slot='0x1c' function='0x4'/>
          <address domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
          <address domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
        </iommuGroup>
        <pci-express>
          <link validity='cap' port='0' speed='2.5' width='1'/>
          <link validity='sta' speed='2.5' width='1'/>
        </pci-express>
      </capability>
    </device>
  3. PCI 데이터 보기

    위에서 수집된 출력에는 4개의 장치가 있는 IOMMU 그룹이 있습니다. 이는 ACS를 지원하지 않는 다중 기능 PCIe 루트 포트의 예입니다. 슬롯 0x1c의 두 가지 기능은 lspci 명령을 실행하여 식별할 수 있는 PCIe 루트 포트입니다( pciutils 패키지의 경우).
    # lspci -s 1c
    
    00:1c.0 PCI bridge: Intel Corporation 82801JI (ICH10 Family) PCI Express Root Port 1
    00:1c.4 PCI bridge: Intel Corporation 82801JI (ICH10 Family) PCI Express Root Port 5
    
    
    버스 0x04 및 0x05에서 엔드포인트 장치인 2개의 PCIe 장치에 대해 이 단계를 반복합니다.
    # lspci -s 4
    04:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection This is used in the next step and is called 04:00.0
    # lspci -s 5 This is used in the next step and is called 05:00.0
    05:00.0 Ethernet controller: Broadcom Corporation NetXtreme BCM5755 Gigabit Ethernet PCI Express (rev 02)
    
  4. 게스트 가상 머신에 끝점 할당

    끝점 중 하나를 가상 머신에 할당하려면 현재 할당하지 않는 끝점을 VFIO 호환 드라이버에 바인딩해야 하므로 IOMMU 그룹이 사용자와 호스트 드라이버 간에 분할되지 않도록 해야 합니다. 예를 들어, 위에서 수신한 출력을 사용하는 경우 04:00.0만 사용하여 가상 시스템을 구성하는 것입니다. 가상 시스템은 호스트 드라이버에서 05:00.0을 분리하지 않는 한 가상 머신을 시작할 수 없습니다. 05:00.0을 분리하려면 virsh nodedev-detach 명령을 root로 실행합니다.
    # virsh nodedev-detach pci_0000_05_00_0
    Device pci_0000_05_00_0 detached
    
    이 문제를 해결하기 위한 또 다른 옵션은 가상 머신에 두 끝점을 모두 할당하는 것입니다. libvirt<hostdev> 요소 내의 managed 속성의 yes 값을 사용할 때 연결된 장치에 대해 이 작업을 자동으로 수행합니다. 예: <hostdev mode='subsystem' type='pci' managed='yes'>. 자세한 내용은 참고를 참조하십시오.
참고
libvirt 에는 PCI 장치를 처리하는 두 가지 방법이 있습니다. 관리하거나 관리되지 않을 수 있습니다. 이는 <hostdev> 요소 내의 관리 특성에 지정된 값에 의해 결정됩니다. 장치를 관리하면 libvirt 는 기존 드라이버에서 장치를 자동으로 분리한 다음 부팅 시 vfio-pci(가상 머신의 경우)에 바인딩하여 가상 머신에 할당합니다. 가상 머신이 종료되거나 삭제되거나 PCI 장치가 가상 머신에서 분리되면 libvirt는 vfio-pci에서 장치를 바인딩 해제하고 원래 드라이버로 다시 바인딩합니다. 장치가 관리되지 않는 경우 libvirt 는 프로세스를 자동화하지 않으며, 가상 머신에 장치를 할당하기 전에 설명된 관리 측면을 모두 수행해야 하며, 가상 머신에서 장치를 더 이상 사용하지 않으면 장치를 다시 할당해야 합니다. 관리되지 않는 장치에서 이러한 작업을 수행하지 않으면 가상 머신이 실패합니다. 따라서 libvirt 에서 장치를 관리하는 것이 더 쉬워질 수 있습니다.

E.4. IOMMU 전략 및 사용 사례

의도한 것보다 더 많은 장치를 포함하는 IOMMU 그룹을 처리하는 방법에는 여러 가지가 있습니다. 플러그인 카드의 경우 첫 번째 옵션은 다른 슬롯에 카드를 설치할지 여부를 결정하는 것입니다. 일반적인 Intel 칩셋에서 PCIe 루트 포트는 프로세서 및 PCH(Platform Controller Hub)를 통해 제공됩니다. 이러한 루트 포트의 기능은 매우 다를 수 있습니다. Red Hat Enterprise Linux 7은 많은 사용자가 기본 PCIe ACS를 지원하지 않더라도 다양한 PCH 루트 포트의 격리를 지원합니다. 따라서 이러한 루트 포트는 더 작은 IOMMU 그룹을 만드는 데 적합합니다. Intel® Xeon® 클래스 프로세서(E5 시리즈 이상) 및 "High End Desktop Processors"의 경우 프로세서 기반 PCIe 루트 포트는 일반적으로 PCIe ACS에 대한 기본 지원을 제공하지만, 더 낮은 엔드 클라이언트 프로세서(예: Core™ i3, i5, i7 및 Xeon E3 프로세서)는 그렇지 않습니다. 이러한 시스템의 경우 PCH 루트 포트는 일반적으로 가장 유연한 격리 구성을 제공합니다.
또 다른 옵션은 하드웨어 공급 업체와 협력하여 분리가 있는지 여부를 확인하고 이 분리를 인식할 수 있도록 커널을 정지하는 것입니다. 이는 일반적으로 함수 간에 내부 피어 투 피어가 가능한지 또는 다운스트림 포트의 경우 리디렉션이 가능한지 여부를 결정하는 것이 중요합니다. Red Hat Enterprise Linux 7 커널에는 이러한 장치에 대한 다양한 quirks가 포함되어 있으며 Red Hat 고객 지원은 하드웨어 공급 업체와 ACS-equivalent 격리를 사용할 수 있는지 여부를 확인하고 이러한 격리를 공개하기 위해 유사한 quirks를 커널에 통합하는 것이 가장 좋은지 확인할 수 있습니다. 하드웨어 공급 업체의 경우 피어 투 피어를 지원하지 않는 다중 함수 끝점은 구성 공간의 단일 정적 ACS 테이블을 사용하여 이를 노출하여 기능을 노출하지 않습니다. 하드웨어에 이러한 기능을 추가하면 커널이 기능을 분리된 상태로 자동으로 감지할 수 있으며 하드웨어의 모든 사용자에게 이 문제가 제거됩니다.
위의 제안을 사용할 수 없는 경우 일반적인 반응은 커널이 사용자가 지정한 특정 장치 또는 특정 유형의 장치에 대해 이러한 격리 검사를 비활성화하는 옵션을 제공해야 한다는 것입니다. 종종 이전 기술이 이러한 범위에 격리를 적용하지 않고 모든 것이 잘 수행되도록 주장하는 경우가 종종 있습니다. 이러한 격리 기능을 우회하면 지원되지 않는 환경이 발생합니다. 분리가 존재하는지를 모르는 것은 장치가 실제로 격리되었는지 여부를 모르는데 재해가 공격하기 전에 발견하는 것이 가장 좋습니다. 장치의 분리 기능의 간격은 트리거하기가 매우 어려울 수 있으며 원인에 따라 장치 격리로 다시 추적하기가 더 어려울 수 있습니다. VFIO의 작업은 먼저 사용자 소유 장치 및 IOMMU 그룹에서 호스트 커널을 보호하는 것이 분리를 위해 VFIO에서 사용하는 메커니즘입니다.
요약하면 IOMMU 그룹을 기반으로 구축된 VFIO는 레거시 KVM 장치 할당을 사용하여 가능한 것보다 장치 간에 향상된 보안 및 격리 수준을 제공할 수 있습니다. 이러한 격리는 이제 Linux 커널 수준에서 적용되므로 커널이 자신을 보호하고 사용자에게 위험한 구성을 방지할 수 있습니다. 또한 하드웨어 공급 업체는 멀티 기능 끝점 장치뿐만 아니라 칩 세트 및 상호 연결 장치에서도 PCIe ACS 지원을 지원하는 것이 좋습니다. 이러한 지원이 없는 기존 장치의 경우 Red Hat은 하드웨어 벤더와 협력하여 격리가 사용 가능한지 확인하고 Linux 커널 지원을 추가하여 이러한 격리를 제공할 수 있습니다.


[1] 이 부록의 원본 내용은 RuntimeClass Williamson, principal Software engineer에서 제공했습니다.

부록 F. 개정 내역

고친 과정
고침 2-42Thu August 9 2019Jiri Herrmann
7.7의 버전 GA 게시
고침 2-40Thu May 23 2019Jiri Herrmann
7.7 베타 게시 버전
고침 2-39Thu Oct 25 2018Jiri Herrmann
7.6 GA 게시 버전
고침 2-37Thu Aug 14 2018Jiri Herrmann
7.6 베타 게시 버전
고침 2-36Thu Aug 14 2018Jiri Herrmann
가상 스토리지 장 재작업 추가
고침 2-35Thu Apr 5 2018Jiri Herrmann
7.5 GA 발행 버전
고침 2-32Thu Jul 27 2017Jiri Herrmann
7.4 GA 게시 버전
고침 2-32Thu Jul 27 2017Jiri Herrmann
7.4 GA 게시 버전
고침 2-29Mon Oct 17 2016Jiri Herrmann
7.3 GA 게시 버전
고침 2-24Thu Dec 17 2015Laura Novich
재게시된 가이드 및 여러 문제 해결
고침 2-23Sun Nov 22 2015Laura Novich
재게시된 가이드
고침 2-21Thu Nov 12 2015Laura Novich
7.2에 대한 여러 콘텐츠 업데이트
고침 2-19Thu Oct 08 2015Jiri Herrmann
버전 내역 정리
고침 2-17Thu Aug 27 2015Dayle Parker
7.2 베타 릴리스 업데이트