๊ฐ€์ƒํ™” (KVM)

๊ฐ€์ƒํ™” (KVM)

ํ•™์Šต ๋ชฉํ‘œ

์ด ๋ฌธ์„œ๋ฅผ ํ†ตํ•ด ๋‹ค์Œ์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค:

  • KVM/QEMU ๊ฐ€์ƒํ™” ๊ฐœ๋…๊ณผ ์•„ํ‚คํ…์ฒ˜
  • libvirt์™€ virsh๋ฅผ ์ด์šฉํ•œ VM ๊ด€๋ฆฌ
  • ๊ฐ€์ƒ ๋„คํŠธ์›Œํฌ ์„ค์ •
  • ์Šค๋ƒ…์ƒท๊ณผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

๋‚œ์ด๋„: โญโญโญโญ (๊ณ ๊ธ‰)


๋ชฉ์ฐจ

  1. KVM/QEMU ๊ฐœ์š”
  2. ์„ค์น˜ ๋ฐ ์„ค์ •
  3. VM ์ƒ์„ฑ
  4. virsh ๋ช…๋ น์–ด
  5. ๋„คํŠธ์›Œํฌ ์„ค์ •
  6. ์Šคํ† ๋ฆฌ์ง€ ๊ด€๋ฆฌ
  7. ์Šค๋ƒ…์ƒท๊ณผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

1. KVM/QEMU ๊ฐœ์š”

๊ฐ€์ƒํ™” ์œ ํ˜•

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  Type 1 (Bare-metal)          Type 2 (Hosted)               โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”          โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”          โ”‚
โ”‚  โ”‚ VM โ”‚ VM โ”‚ VM   โ”‚          โ”‚ VM โ”‚ VM โ”‚ VM   โ”‚          โ”‚
โ”‚  โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค          โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค          โ”‚
โ”‚  โ”‚   Hypervisor    โ”‚          โ”‚   Hypervisor    โ”‚          โ”‚
โ”‚  โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค          โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค          โ”‚
โ”‚  โ”‚    Hardware     โ”‚          โ”‚   Host OS       โ”‚          โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜          โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค          โ”‚
โ”‚  ESXi, Xen, Hyper-V           โ”‚    Hardware     โ”‚          โ”‚
โ”‚                               โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜          โ”‚
โ”‚                               VirtualBox, VMware Workstationโ”‚
โ”‚                                                             โ”‚
โ”‚  KVM์€ Linux ์ปค๋„์ด Hypervisor ์—ญํ•  (Type 1์— ๊ฐ€๊นŒ์›€)       โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

KVM/QEMU ์•„ํ‚คํ…์ฒ˜

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                       ๊ฐ€์ƒ ๋จธ์‹                               โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚  Guest OS (Linux, Windows, etc.)                     โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  QEMU: ์žฅ์น˜ ์—๋ฎฌ๋ ˆ์ด์…˜ (I/O, ๋„คํŠธ์›Œํฌ, ๋””์Šคํฌ)              โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  KVM ์ปค๋„ ๋ชจ๋“ˆ: CPU/๋ฉ”๋ชจ๋ฆฌ ๊ฐ€์ƒํ™” (ํ•˜๋“œ์›จ์–ด ์ง€์›)           โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Linux ์ปค๋„                                                  โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  ํ•˜๋“œ์›จ์–ด (VT-x/AMD-V, VT-d)                                โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

libvirt ๊ด€๋ฆฌ ์Šคํƒ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  ๊ด€๋ฆฌ ๋„๊ตฌ                                                   โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚ virsh    โ”‚  โ”‚virt-managerโ”‚ โ”‚Cockpit   โ”‚  โ”‚ API      โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚       โ”‚             โ”‚             โ”‚             โ”‚          โ”‚
โ”‚       โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜          โ”‚
โ”‚                           โ”‚                                 โ”‚
โ”‚                    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”                         โ”‚
โ”‚                    โ”‚   libvirt   โ”‚                         โ”‚
โ”‚                    โ”‚ (libvirtd)  โ”‚                         โ”‚
โ”‚                    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜                         โ”‚
โ”‚                           โ”‚                                 โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”       โ”‚
โ”‚  โ”‚            โ”‚           โ”‚           โ”‚            โ”‚       โ”‚
โ”‚  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”   โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”  โ”‚       โ”‚
โ”‚  โ”‚  โ”‚ KVM โ”‚   โ”‚   โ”‚ QEMUโ”‚โ”‚   โ”‚ LXC โ”‚โ”‚   โ”‚ Xen โ”‚  โ”‚       โ”‚
โ”‚  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”˜โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”˜โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚       โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜       โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

2. ์„ค์น˜ ๋ฐ ์„ค์ •

ํ•˜๋“œ์›จ์–ด ๊ฐ€์ƒํ™” ์ง€์› ํ™•์ธ

# CPU ๊ฐ€์ƒํ™” ์ง€์› ํ™•์ธ
grep -E '(vmx|svm)' /proc/cpuinfo

# vmx: Intel VT-x
# svm: AMD-V

# ๋˜๋Š”
lscpu | grep Virtualization

# KVM ๋ชจ๋“ˆ ํ™•์ธ
lsmod | grep kvm

ํŒจํ‚ค์ง€ ์„ค์น˜

# Ubuntu/Debian
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients \
    bridge-utils virt-manager virtinst

# RHEL/CentOS
sudo yum install qemu-kvm libvirt libvirt-python \
    libguestfs-tools virt-install virt-manager

# Fedora
sudo dnf install @virtualization

์„œ๋น„์Šค ์‹œ์ž‘

# libvirtd ์‹œ์ž‘
sudo systemctl enable --now libvirtd

# ์ƒํƒœ ํ™•์ธ
sudo systemctl status libvirtd

# ์‚ฌ์šฉ์ž๋ฅผ libvirt ๊ทธ๋ฃน์— ์ถ”๊ฐ€ (์žฌ๋กœ๊ทธ์ธ ํ•„์š”)
sudo usermod -aG libvirt $USER
sudo usermod -aG kvm $USER

์—ฐ๊ฒฐ ํ™•์ธ

# ๋กœ์ปฌ ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ
virsh -c qemu:///system list --all

# ๋˜๋Š” sudo ์—†์ด
virsh list --all

# ์‹œ์Šคํ…œ ์ •๋ณด
virsh nodeinfo

3. VM ์ƒ์„ฑ

virt-install์„ ์ด์šฉํ•œ VM ์ƒ์„ฑ

# ๊ธฐ๋ณธ VM ์ƒ์„ฑ
virt-install \
    --name ubuntu-vm \
    --ram 2048 \
    --vcpus 2 \
    --disk path=/var/lib/libvirt/images/ubuntu-vm.qcow2,size=20 \
    --os-variant ubuntu22.04 \
    --network bridge=virbr0 \
    --graphics vnc,listen=0.0.0.0 \
    --cdrom /path/to/ubuntu-22.04.iso \
    --boot cdrom,hd

์ƒ์„ธ ์˜ต์…˜

virt-install \
    --name centos-vm \
    --memory 4096 \
    --vcpus 4,maxvcpus=8 \
    --cpu host-passthrough \
    --disk path=/var/lib/libvirt/images/centos-vm.qcow2,size=40,format=qcow2,bus=virtio \
    --disk path=/var/lib/libvirt/images/centos-data.qcow2,size=100,format=qcow2 \
    --os-variant centos-stream9 \
    --network network=default,model=virtio \
    --graphics spice,listen=0.0.0.0 \
    --video qxl \
    --channel spicevmc \
    --location /path/to/CentOS-Stream-9.iso \
    --extra-args "console=ttyS0,115200n8 serial" \
    --initrd-inject /path/to/kickstart.cfg \
    --extra-args "ks=file:/kickstart.cfg" \
    --noautoconsole

OS ๋ณ€ํ˜• ๋ชฉ๋ก ํ™•์ธ

# ์ง€์›ํ•˜๋Š” OS ๋ชฉ๋ก
osinfo-query os

# ํŠน์ • OS ๊ฒ€์ƒ‰
osinfo-query os | grep -i ubuntu
osinfo-query os | grep -i centos

XML ์ •์˜๋กœ VM ์ƒ์„ฑ

# VM ์ •์˜ XML ์˜ˆ์‹œ (/tmp/vm-definition.xml)
virsh define /tmp/vm-definition.xml

# ๊ธฐ์กด VM์˜ XML ๋คํ”„
virsh dumpxml ubuntu-vm > ubuntu-vm.xml
<!-- vm-definition.xml ์˜ˆ์‹œ -->
<domain type='kvm'>
  <name>test-vm</name>
  <memory unit='GiB'>2</memory>
  <vcpu placement='static'>2</vcpu>
  <os>
    <type arch='x86_64' machine='pc-q35-6.2'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
  </features>
  <cpu mode='host-passthrough'/>
  <devices>
    <emulator>/usr/bin/qemu-system-x86_64</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/test-vm.qcow2'/>
      <target dev='vda' bus='virtio'/>
    </disk>
    <interface type='network'>
      <source network='default'/>
      <model type='virtio'/>
    </interface>
    <graphics type='vnc' port='-1' autoport='yes'/>
    <console type='pty'/>
  </devices>
</domain>

4. virsh ๋ช…๋ น์–ด

VM ์ƒํƒœ ๊ด€๋ฆฌ

# VM ๋ชฉ๋ก
virsh list             # ์‹คํ–‰ ์ค‘์ธ VM
virsh list --all       # ๋ชจ๋“  VM
virsh list --inactive  # ์ค‘์ง€๋œ VM

# VM ์‹œ์ž‘/์ค‘์ง€
virsh start vm-name
virsh shutdown vm-name     # ์ •์ƒ ์ข…๋ฃŒ
virsh destroy vm-name      # ๊ฐ•์ œ ์ข…๋ฃŒ (์ „์› ์ฐจ๋‹จ)
virsh reboot vm-name

# VM ์ผ์‹œ ์ •์ง€/์žฌ๊ฐœ
virsh suspend vm-name
virsh resume vm-name

# ์ž๋™ ์‹œ์ž‘ ์„ค์ •
virsh autostart vm-name
virsh autostart --disable vm-name

VM ์ •๋ณด ์กฐํšŒ

# ๊ธฐ๋ณธ ์ •๋ณด
virsh dominfo vm-name

# ์ƒ์„ธ ์„ค์ • (XML)
virsh dumpxml vm-name

# CPU ์ •๋ณด
virsh vcpuinfo vm-name

# ๋ฉ”๋ชจ๋ฆฌ ์ •๋ณด
virsh dommemstat vm-name

# ๋ธ”๋ก ์žฅ์น˜ ์ •๋ณด
virsh domblklist vm-name
virsh domblkinfo vm-name vda

# ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค
virsh domiflist vm-name
virsh domifstat vm-name vnet0

VM ์ฝ˜์†” ์ ‘์†

# ์‹œ๋ฆฌ์–ผ ์ฝ˜์†” (๊ฒŒ์ŠคํŠธ ์„ค์ • ํ•„์š”)
virsh console vm-name

# VNC/SPICE ํฌํŠธ ํ™•์ธ
virsh domdisplay vm-name
virsh vncdisplay vm-name

# virt-viewer๋กœ ์ ‘์†
virt-viewer vm-name

VM ๋ฆฌ์†Œ์Šค ๋ณ€๊ฒฝ

# CPU ์ˆ˜ ๋ณ€๊ฒฝ (์˜จ๋ผ์ธ)
virsh setvcpus vm-name 4 --live

# ๋ฉ”๋ชจ๋ฆฌ ๋ณ€๊ฒฝ (์˜จ๋ผ์ธ, ์‚ฌ์ „ ์„ค์ • ํ•„์š”)
virsh setmem vm-name 4G --live

# ์ตœ๋Œ€๊ฐ’ ์„ค์ • (์˜คํ”„๋ผ์ธ)
virsh setmaxmem vm-name 8G --config
virsh setvcpus vm-name 8 --maximum --config

# XML ์ง์ ‘ ํŽธ์ง‘
virsh edit vm-name

VM ์‚ญ์ œ

# VM ์ •์˜ ์‚ญ์ œ (๋””์Šคํฌ ์œ ์ง€)
virsh undefine vm-name

# VM๊ณผ ๊ด€๋ จ ์Šคํ† ๋ฆฌ์ง€ ์‚ญ์ œ
virsh undefine vm-name --remove-all-storage

# NVRAM ํฌํ•จ ์‚ญ์ œ (UEFI)
virsh undefine vm-name --nvram

5. ๋„คํŠธ์›Œํฌ ์„ค์ •

๊ธฐ๋ณธ NAT ๋„คํŠธ์›Œํฌ

# ๊ธฐ๋ณธ ๋„คํŠธ์›Œํฌ ํ™•์ธ
virsh net-list --all

# ๊ธฐ๋ณธ ๋„คํŠธ์›Œํฌ ์‹œ์ž‘
virsh net-start default
virsh net-autostart default

# ๋„คํŠธ์›Œํฌ ์ •๋ณด
virsh net-info default
virsh net-dumpxml default

๋ธŒ๋ฆฟ์ง€ ๋„คํŠธ์›Œํฌ ์„ค์ •

# Ubuntu: netplan ์„ค์ •
# /etc/netplan/01-bridge.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    enp3s0:
      dhcp4: no
  bridges:
    br0:
      interfaces:
        - enp3s0
      dhcp4: yes
      parameters:
        stp: false
        forward-delay: 0
# ์ ์šฉ
sudo netplan apply
# RHEL/CentOS: NetworkManager
sudo nmcli connection add type bridge con-name br0 ifname br0
sudo nmcli connection add type ethernet con-name br0-slave-enp3s0 ifname enp3s0 master br0
sudo nmcli connection modify br0 ipv4.method auto
sudo nmcli connection up br0

libvirt ๋ธŒ๋ฆฟ์ง€ ๋„คํŠธ์›Œํฌ ์ •์˜

<!-- /tmp/bridge-network.xml -->
<network>
  <name>host-bridge</name>
  <forward mode='bridge'/>
  <bridge name='br0'/>
</network>
# ๋„คํŠธ์›Œํฌ ์ƒ์„ฑ
virsh net-define /tmp/bridge-network.xml
virsh net-start host-bridge
virsh net-autostart host-bridge

๊ฒฉ๋ฆฌ๋œ ๋„คํŠธ์›Œํฌ

<!-- /tmp/isolated-network.xml -->
<network>
  <name>isolated</name>
  <bridge name='virbr1'/>
  <ip address='192.168.100.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.100.10' end='192.168.100.254'/>
    </dhcp>
  </ip>
</network>

VM์— ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค ์ถ”๊ฐ€

# ์ธํ„ฐํŽ˜์ด์Šค ์ถ”๊ฐ€ (์˜จ๋ผ์ธ)
virsh attach-interface vm-name network default --model virtio --live --config

# ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ฑฐ
virsh detach-interface vm-name network --mac 52:54:00:xx:xx:xx --live --config

# ์ธํ„ฐํŽ˜์ด์Šค ๋ชฉ๋ก
virsh domiflist vm-name

6. ์Šคํ† ๋ฆฌ์ง€ ๊ด€๋ฆฌ

์Šคํ† ๋ฆฌ์ง€ ํ’€

# ๊ธฐ๋ณธ ํ’€ (๋””๋ ‰ํ† ๋ฆฌ ๊ธฐ๋ฐ˜)
virsh pool-list --all

# ํ’€ ์ƒ์„ฑ (๋””๋ ‰ํ† ๋ฆฌ)
virsh pool-define-as mypool dir --target /var/lib/libvirt/images/mypool
virsh pool-build mypool
virsh pool-start mypool
virsh pool-autostart mypool

# LVM ํ’€
virsh pool-define-as lvm-pool logical --source-name vg_vms --target /dev/vg_vms

# ํ’€ ์ •๋ณด
virsh pool-info default

๋ณผ๋ฅจ ๊ด€๋ฆฌ

# ๋ณผ๋ฅจ ๋ชฉ๋ก
virsh vol-list default

# ๋ณผ๋ฅจ ์ƒ์„ฑ
virsh vol-create-as default disk1.qcow2 20G --format qcow2

# ๋ณผ๋ฅจ ์ •๋ณด
virsh vol-info disk1.qcow2 --pool default
virsh vol-dumpxml disk1.qcow2 --pool default

# ๋ณผ๋ฅจ ์‚ญ์ œ
virsh vol-delete disk1.qcow2 --pool default

# ๋ณผ๋ฅจ ๋ณต์ œ
virsh vol-clone disk1.qcow2 disk1-clone.qcow2 --pool default

# ๋ณผ๋ฅจ ๋ฆฌ์‚ฌ์ด์ฆˆ
virsh vol-resize disk1.qcow2 30G --pool default

๋””์Šคํฌ ์ด๋ฏธ์ง€ ๊ด€๋ฆฌ (qemu-img)

# ์ด๋ฏธ์ง€ ์ƒ์„ฑ
qemu-img create -f qcow2 disk.qcow2 20G

# ์ด๋ฏธ์ง€ ์ •๋ณด
qemu-img info disk.qcow2

# ์ด๋ฏธ์ง€ ๋ณ€ํ™˜
qemu-img convert -f raw -O qcow2 disk.raw disk.qcow2
qemu-img convert -f vmdk -O qcow2 disk.vmdk disk.qcow2

# ์ด๋ฏธ์ง€ ๋ฆฌ์‚ฌ์ด์ฆˆ
qemu-img resize disk.qcow2 +10G

# ์ŠคํŒŒ์Šค ์ด๋ฏธ์ง€ ์••์ถ•
qemu-img convert -O qcow2 -c disk.qcow2 disk-compressed.qcow2

VM์— ๋””์Šคํฌ ์ถ”๊ฐ€

# ๋””์Šคํฌ ์ถ”๊ฐ€ (์˜จ๋ผ์ธ)
virsh attach-disk vm-name /var/lib/libvirt/images/extra.qcow2 vdb \
    --driver qemu --subdriver qcow2 --live --config

# ๋””์Šคํฌ ์ œ๊ฑฐ
virsh detach-disk vm-name vdb --live --config

# ๋ธ”๋ก ์žฅ์น˜ ๋ชฉ๋ก
virsh domblklist vm-name

7. ์Šค๋ƒ…์ƒท๊ณผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

์Šค๋ƒ…์ƒท ๊ด€๋ฆฌ

# ์Šค๋ƒ…์ƒท ์ƒ์„ฑ
virsh snapshot-create-as vm-name snap1 "First snapshot" --atomic

# ๋””์Šคํฌ๋งŒ ์Šค๋ƒ…์ƒท (๋ฉ”๋ชจ๋ฆฌ ์ œ์™ธ)
virsh snapshot-create-as vm-name snap-disk --disk-only --atomic

# ์Šค๋ƒ…์ƒท ๋ชฉ๋ก
virsh snapshot-list vm-name

# ์Šค๋ƒ…์ƒท ์ •๋ณด
virsh snapshot-info vm-name snap1

# ์Šค๋ƒ…์ƒท์œผ๋กœ ๋ณต์›
virsh snapshot-revert vm-name snap1

# ์Šค๋ƒ…์ƒท ์‚ญ์ œ
virsh snapshot-delete vm-name snap1

# ํ˜„์žฌ ์Šค๋ƒ…์ƒท ํ™•์ธ
virsh snapshot-current vm-name

์™ธ๋ถ€ ์Šค๋ƒ…์ƒท

# ์™ธ๋ถ€ ์Šค๋ƒ…์ƒท ์ƒ์„ฑ (์šด์˜ ํ™˜๊ฒฝ ๊ถŒ์žฅ)
virsh snapshot-create-as vm-name snap-external \
    --diskspec vda,snapshot=external \
    --disk-only --atomic

# ์™ธ๋ถ€ ์Šค๋ƒ…์ƒท ์ปค๋ฐ‹ (๋ณ‘ํ•ฉ)
virsh blockcommit vm-name vda --active --pivot

# ๋ธ”๋ก ์ž‘์—… ์ •๋ณด
virsh blockjob vm-name vda --info

๋ผ์ด๋ธŒ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

# ๋Œ€์ƒ ํ˜ธ์ŠคํŠธ ์ค€๋น„
# - ๋™์ผํ•œ libvirt ๋ฒ„์ „
# - ๊ณต์œ  ์Šคํ† ๋ฆฌ์ง€ (NFS, GlusterFS, Ceph ๋“ฑ)
# - ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ

# ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹คํ–‰
virsh migrate --live vm-name qemu+ssh://target-host/system

# ์˜ต์…˜๊ณผ ํ•จ๊ป˜
virsh migrate --live --persistent --undefinesource \
    --copy-storage-all \
    vm-name qemu+ssh://target-host/system

# ํ„ฐ๋„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ (NAT ํ™˜๊ฒฝ)
virsh migrate --live --p2p --tunnelled \
    vm-name qemu+ssh://target-host/system

# ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ƒํƒœ ํ™•์ธ
virsh domjobinfo vm-name

์˜คํ”„๋ผ์ธ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

# ์›๋ณธ์—์„œ XML ๋คํ”„
virsh dumpxml vm-name > vm.xml

# ๋””์Šคํฌ ์ด๋ฏธ์ง€ ๋ณต์‚ฌ
rsync -av /var/lib/libvirt/images/vm-disk.qcow2 target-host:/var/lib/libvirt/images/

# ๋Œ€์ƒ์—์„œ ์ •์˜
virsh define vm.xml

# ์›๋ณธ์—์„œ ์‚ญ์ œ
virsh undefine vm-name

์—ฐ์Šต ๋ฌธ์ œ

๋ฌธ์ œ 1: VM ์ƒ์„ฑ

virt-install์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ ์‚ฌ์–‘์˜ VM์„ ์ƒ์„ฑํ•˜์„ธ์š”: - ์ด๋ฆ„: test-server - ๋ฉ”๋ชจ๋ฆฌ: 2GB - CPU: 2๊ฐœ - ๋””์Šคํฌ: 20GB (qcow2) - ๋„คํŠธ์›Œํฌ: default (NAT) - ๊ทธ๋ž˜ํ”ฝ: VNC

๋ฌธ์ œ 2: ๋„คํŠธ์›Œํฌ ์„ค์ •

๊ฒฉ๋ฆฌ๋œ ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”: - ์ด๋ฆ„: internal - ๋Œ€์—ญ: 10.10.10.0/24 - DHCP: 10.10.10.100-200 - NAT ์—†์Œ

๋ฌธ์ œ 3: ์Šค๋ƒ…์ƒท ๊ด€๋ฆฌ

  1. VM์˜ ์Šค๋ƒ…์ƒท์„ ์ƒ์„ฑํ•˜์„ธ์š”
  2. VM์— ๋ณ€๊ฒฝ์„ ๊ฐ€ํ•˜์„ธ์š” (ํŒŒ์ผ ์ƒ์„ฑ ๋“ฑ)
  3. ์Šค๋ƒ…์ƒท์œผ๋กœ ๋ณต์›ํ•˜์„ธ์š”
  4. ๋ณ€๊ฒฝ์ด ์ทจ์†Œ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”

์ •๋‹ต

๋ฌธ์ œ 1 ์ •๋‹ต

virt-install \
    --name test-server \
    --memory 2048 \
    --vcpus 2 \
    --disk path=/var/lib/libvirt/images/test-server.qcow2,size=20,format=qcow2 \
    --os-variant generic \
    --network network=default \
    --graphics vnc,listen=0.0.0.0 \
    --cdrom /path/to/installer.iso \
    --boot cdrom,hd

๋ฌธ์ œ 2 ์ •๋‹ต

<!-- /tmp/internal-net.xml -->
<network>
  <name>internal</name>
  <bridge name='virbr-int'/>
  <ip address='10.10.10.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='10.10.10.100' end='10.10.10.200'/>
    </dhcp>
  </ip>
</network>
virsh net-define /tmp/internal-net.xml
virsh net-start internal
virsh net-autostart internal

๋ฌธ์ œ 3 ์ •๋‹ต

# 1. ์Šค๋ƒ…์ƒท ์ƒ์„ฑ
virsh snapshot-create-as vm-name before-change "Before changes"

# 2. VM ๋‚ด์—์„œ ๋ณ€๊ฒฝ
virsh console vm-name
# (๊ฒŒ์ŠคํŠธ ๋‚ด์—์„œ) touch /tmp/test-file

# 3. ์Šค๋ƒ…์ƒท์œผ๋กœ ๋ณต์›
virsh snapshot-revert vm-name before-change

# 4. ํ™•์ธ (ํŒŒ์ผ์ด ์—†์–ด์•ผ ํ•จ)
virsh console vm-name
# (๊ฒŒ์ŠคํŠธ ๋‚ด์—์„œ) ls /tmp/test-file  # ํŒŒ์ผ ์—†์Œ

๋‹ค์Œ ๋‹จ๊ณ„


์ฐธ๊ณ  ์ž๋ฃŒ

to navigate between lessons