Kvm: Difference between revisions

From Halfface
Jump to navigation Jump to search
 
(50 intermediate revisions by the same user not shown)
Line 1: Line 1:
==prepare environment==
=prepare environment=
  # Is environment prepared for viritutalization.
  # Is environment prepared for viritutalization.
  egrep '(vmx|svm)' /proc/cpuinfo
  egrep '(vmx|svm)' /proc/cpuinfo
  vmx - (intel) svm - (amd)
  vmx - (intel) svm - (amd)


==Create disk image.==
=Create disk image.=
  qemu-img create -f qcow2 fedora20.halfface.se.qcow 50G
  qemu-img create -f qcow2 fedora20.halfface.se.qcow2 50G
=mount qcow2=
qemu-img info $machine.qcow2
qemu-img info $machine.qcow2 --force-share
=mount qcow2 image=
# Create /dev/nbd devices if they do not exist.
modprobe nbd max_part=8
# Connect qcow2 file to nbd device.
qemu-nbd --connect=/dev/nbd0 ./img_output/Rocky-8.6-x86_64-dvd1/rocky8.qcow2
# Sanity check disk device.
gdisk -l /dev/nbd0
Number  Start (sector)    End (sector)  Size      Code  Name
  1            2048        2099199  1024.0 MiB  8300  Linux filesystem
  2        2099200        41943039  19.0 GiB    8E00  Linux LVM
# List device to mount
ls -la /dev/mapper/
total 0
drwxr-xr-x  2 root root    100 2022-08-25 12:13:50 .
drwxr-xr-x 22 root root    5220 2022-08-25 12:13:50 ..
lrwxrwxrwx  1 root root      7 2022-08-25 12:13:50 vg0-root -> ../dm-1
# Mount device
mount /dev/mapper/vg0-root /mnt/


  # Install software.
=list all domain blocks=
  virsh domblklist $vm
=list info about block device=
virsh domblkstat $vm vda --human
=List short info about vm=
virsh dominfo $vm
=add ram on the fly=
virsh setmem --domain $VM --size 1500M --current
 
=Install software=
  yum install -y qemu kvm SDL bridge-utils tunctl
  yum install -y qemu kvm SDL bridge-utils tunctl


==install virtual machine.==
=install virtual machine.=
  virt-install --connect qemu:///system --name Fedora_16 --ram 2048 --vcpus=1 -f /ssd/libvirt/Fedora_16.qcow2 -s 30 -c /install/system/linux/fedora/16/Fedora-16-x86_64-netinst.iso --vnc --noautoconsole --hvm
  virt-install --connect qemu:///system --name Fedora_16 --ram 2048 --vcpus=1 -f /ssd/libvirt/Fedora_16.qcow2 -s 30 -c /install/system/linux/fedora/16/Fedora-16-x86_64-netinst.iso --vnc --noautoconsole --hvm
==delete virtual machine.==
=delete virtual machine.=
  virsh undefine kvm_1
  virsh undefine kvm_1
=list libvirt storage pools=
virsh pool-list --all
=list content of pools=
virsh pool-list --name | grep -v '^$' | while read POOL ; do POOL_DIR=$(virsh pool-dumpxml "${POOL}" | xmllint --format - | awk -F '<path>|</path>' '/<path>/ {print $2}') ; echo '#' "${POOL} ${POOL_DIR}" ; (cd "${POOL_DIR}/"; ls -la *.iso *.ISO *.qcow2 *.QCOW2 *.ima *.IMA *.img *.IMG 2>/dev/null ); done


==connect to virtual machine.==
=connect to virtual machine.=
  virt-viewer Fedora_16
  virt-viewer Fedora_16
On remote machine over ssh
virt-viewer --connect qemu+ssh://root@anden.halfface.se/system win8


==convert file format==
=convert file format=
  # img to qcow2
  # img to qcow2
  qemu-img convert -cp -O qcow2 kvm_1.img kvm_1.qcow2
  qemu-img convert -cp -O qcow2 kvm_1.img kvm_1.qcow2
  # vmdk to qcow2
  # vmdk to qcow2
  qemu-img convert disk0.vmdk -O qcow2 bigbluebutton.qcow2
  qemu-img convert disk0.vmdk -O qcow2 bigbluebutton.qcow2
FILE=costest-ph9l4-rhcos.vmdk ; qemu-img convert ${FILE} -O qcow2 ${FILE%.*}.qcow2


==snapshot==
=snapshot=
  # Create snapshot
  # Create snapshot
  virsh snapshot-create SL_63
  virsh snapshot-create SL_63
Line 33: Line 70:
  # Revert to snapshot
  # Revert to snapshot
  snapshot-revert
  snapshot-revert
virsh snapshot-revert fedora20_2.halfface.se 1414336149
List info about qcow2 image.
qemu-img info sms-app02.qcow2 --force-share
image: sms-app02.qcow2
file format: qcow2
virtual size: 100G (107374182400 bytes)
disk size: 107G
cluster_size: 65536
Snapshot list:
ID        TAG                VM SIZE                DATE      VM CLOCK
2        snapshot1                0 2018-04-23 18:50:15  00:00:00.000
4        pre-patch                0 2018-04-24 10:34:05  00:00:00.000
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false
Delete snapshot
qemu-img snapshot -d 4 sms-app02.qcow2


==list information==
=list information=
  # Simple information about domain.
  # Simple information about domain.
  virsh dominfo fedora_20_raid1
  virsh dominfo fedora_20_raid1
Line 40: Line 96:
  # View information about domain.
  # View information about domain.
  virsh dumpxml fedora_20_raid1 | less
  virsh dumpxml fedora_20_raid1 | less
==disk handling==
=change value of virtual machine=
virsh autostart virtual_machine_name
 
=disk handling=
  # Detach one of the disks.
  # Detach one of the disks.
  virsh detach-disk fedora_20_raid1 vda
  virsh detach-disk fedora_20_raid1 vda
virsh detach-disk rhel8.5 vda --persistent


  # Attach disk
  # Attach disk
  virsh attach-disk fedora_20_raid1 /ssd/libvirt/fedora20_1.qcow2 vda --sourcetype file --subdriver qcow2
  virsh attach-disk fedora_20_raid1 /ssd/libvirt/fedora20_1.qcow2 vda --sourcetype file --subdriver qcow2
virsh attach-disk host /var/lib/libvirt/images/host-#.qcow2 vdb --driver qemu --subdriver qcow2 --targetbus virtio --persistent


  # Copy kvm machine.
  # Copy kvm machine.
Line 55: Line 116:
  virsh change-media www.halfface.se hda --eject
  virsh change-media www.halfface.se hda --eject


=duplicate move machine=
# You cannot "clone" a running vm, stop it.  suspend and destroy
# are also valid options for less graceful cloning
virsh shutdown this.vm
# copy the storage.
cp /var/lib/libvirt/images/{this-vm,that-vm}.img
# dump the xml for the original
virsh dumpxml this-vm > /tmp/that-vm.xml
# hardware addresses need to be removed, libvirt will assign
# new addresses automatically
sed -i /uuid/d /tmp/that-vm.xml
sed -i '/mac address/d' /tmp/that-vm.xml
# and actually rename the vm: (this also updates the storage path)
sed -i 's/this-vm/that-vm/g' /tmp/that-vm.xml
# finally, create the new vm
virsh define /tmp/that-vm.xml
virsh start this-vm
virsh start that-vm
=virt-convert=
Convert vmware image to kvm.
virt-convert . --disk-format qcow2 --destination .
=drivers=
Drivers for other os and enhancements.
https://www.spice-space.org/download.html
=access via spice=
remote-viewer spice://10.151.105.122:5900
=virsh capabilities=
currently supported machine types.
virsh capabilities
=extend qcow2 image=
Inspect storage
virsh domblklist almalinux8.4
Inspect storage
virsh domblkinfo almalinux8.4 /var/lib/libvirt/images/almalinux8.4.qcow2
Make storage to new size.
virsh blockresize almalinux8.4 /var/lib/libvirt/images/almalinux8.4.qcow2 64G
Inspect storage
qemu-img info almalinux8.4.qcow2 --force-share
Create partition from free space.
fdisk /dev/vda
pvcreate /dev/vda3
vgextend almalinux /dev/vda3
lvextend -l +100%FREE /dev/mapper/almalinux-root
resize2fs /dev/mapper/almalinux-root
xfs_growfs /dev/mapper/almalinux-root
=resize qcow2=
qemu-img resize Fedora-38-Silverblue.qcow2 60G
=rename vm=
virsh stop foo
virsh domrename foo bar
cd /var/lib/libvirt/images
mv foo.qcow2 bar.qcow2
# replace foo with bar
virsh edit bar
[[Category:Applications]]
[[Category:Unix]]
[[Category:Virtualization]]
=rename vm=
virsh domrename foo bar
=dhcp leases=
virsh net-list
virsh net-dhcp-leases okd01-dwb8v
List networks
virsh net-list
virsh net-info default
View leases
virsh net-dhcp-leases default
=ip address=
Which ip does vm have
virsh domifaddr <vm>
==Get ip from vm==
nmap -sn -n 10.111.222.* ; export VM=<vm> ; MAC=$(virsh domiflist $VM | grep -oE '([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})') ; arp -a | grep $MAC
=stop running vm:s=
virsh list --state-running --name | grep -v ^$ | while read VM ; do virsh shutdown $VM ; done
=execute command via agent=
virsh -c qemu:///system qemu-agent-command <vm> '{"execute": "guest-exec", "arguments": { "path": "/usr/bin/ls", "arg": [ "/" ], "capture-output": true }}'
virsh -c qemu:///system qemu-agent-command <vm> '{"execute": "guest-exec-status", "arguments": { "pid": <pid> }}'
base64 -d on output.
==all in one==
export KVM=pm-app02 ; KVM_PID=$(virsh -c qemu:///system qemu-agent-command ${KVM} '{"execute": "guest-exec", "arguments": { "path": "id", "arg": [ "-a","-a" ], "capture-output": true }}' --pretty | jq -r .return.pid) ; virsh -c qemu:///system qemu-agent-command "${KVM}" "{\"execute\": \"guest-exec-status\", \"arguments\": { \"pid\": ${KVM_PID} }}" | jq -r '.return."out-data"' | base64 -d
=virsh console <vm>=
Connect to vm serial
virsh console <vm>
=socat console=
VM=terraform_test ; sudo socat -,echo=0 $(virsh dumpxml $VM | xq | grep "console type" | awk -F\" '{print $4}')
=set password on user=
virsh set-user-password <vm> root password
=Which version of libvirtd=
virsh -c qemu+ssh://root@hdplex.halfface.se/system version
=send keyboard to vm=
https://libvirt.org/manpages/virkeycode-xtkbd.html
virsh send-key terraform_vm --codeset linux KEY_LEFTALT KEY_TAB KEY_TAB
=nested virualization and virt-install=
<pre>
# Enable nested virtualization.
cat <<'EOF' > /etc/modprobe.d/kvm.conf
options kvm_amd nested=1
options kvm ignore_msrs=1 report_ignored_msrs=0
EOF
# Install dependecies.
systemctl enable autofs --now ; ln -s /net/10.111.222.1/storage/install /install ; ln -s /net/10.111.222.1/storage/temp /temp
dnf install -y virt-install libvirt qemu-kvm git stow vim-enhanced
systemctl enable libvirtd --now
# Setup cloud-os
cp /install/system/linux/fedora/40/Fedora-Cloud-Base-Generic.x86_64-40-1.14.qcow2 /var/lib/libvirt/images/fedora-cloud-base-generic.qcow2
qemu-img info /var/lib/libvirt/images/fedora-cloud-base-generic.qcow2
qemu-img resize  /var/lib/libvirt/images/fedora-cloud-base-generic.qcow2  +195G
virt-install  --name fedora-cloud-base-generic \
    --cpu host-passthrough,cache.mode=passthrough \
    --memory 19456 --vcpus 10 --graphics none\
    --os-variant centos-stream9\
    --import  \
    --disk /var/lib/libvirt/images/fedora-cloud-base-generic.qcow2,format=qcow2,bus=virtio \
    --network bridge=br0,model=virtio  \
    --cloud-init \
    --console pty,target_type=serial
# Setup Fedora Server.
cp /install/system/linux/fedora/40/Fedora-Server-KVM-40-1.14.x86_64.qcow2 /var/lib/libvirt/images/fedora-server-kvm.qcow2
qemu-img info /var/lib/libvirt/images/fedora-server-kvm.qcow2
qemu-img resize /var/lib/libvirt/images/fedora-server-kvm.qcow2 +195G
virt-install  --name fedora-server-kvm \
    --cpu host-passthrough,cache.mode=passthrough \
    --memory 19456 --vcpus 10 --graphics none\
    --os-variant centos-stream9\
    --import  \
    --disk /var/lib/libvirt/images/fedora-server-kvm.qcow2,format=qcow2,bus=virtio \
    --network bridge=br0,model=virtio  \
    --cloud-init \
    --console pty,target_type=serial
</pre>
[[Category:Applications]]
[[Category:Applications]]
[[Category:Unix]]
[[Category:Unix]]
[[Category:Virtualization]]
[[Category:Virtualization]]

Latest revision as of 10:15, 7 June 2024

prepare environment

# Is environment prepared for viritutalization.
egrep '(vmx|svm)' /proc/cpuinfo
vmx - (intel) svm - (amd)

Create disk image.

qemu-img create -f qcow2 fedora20.halfface.se.qcow2 50G

mount qcow2

qemu-img info $machine.qcow2
qemu-img info $machine.qcow2 --force-share

mount qcow2 image

# Create /dev/nbd devices if they do not exist.
modprobe nbd max_part=8
# Connect qcow2 file to nbd device.
qemu-nbd --connect=/dev/nbd0 ./img_output/Rocky-8.6-x86_64-dvd1/rocky8.qcow2
# Sanity check disk device.
gdisk -l /dev/nbd0
Number  Start (sector)    End (sector)  Size       Code  Name
  1            2048         2099199   1024.0 MiB  8300  Linux filesystem
  2         2099200        41943039   19.0 GiB    8E00  Linux LVM
# List device to mount
ls -la /dev/mapper/
total 0
drwxr-xr-x  2 root root     100 2022-08-25 12:13:50 .
drwxr-xr-x 22 root root    5220 2022-08-25 12:13:50 ..
lrwxrwxrwx  1 root root       7 2022-08-25 12:13:50 vg0-root -> ../dm-1
# Mount device
mount /dev/mapper/vg0-root /mnt/

list all domain blocks

virsh domblklist $vm

list info about block device

virsh domblkstat $vm vda --human

List short info about vm

virsh dominfo $vm

add ram on the fly

virsh setmem --domain $VM --size 1500M --current

Install software

yum install -y qemu kvm SDL bridge-utils tunctl

install virtual machine.

virt-install --connect qemu:///system --name Fedora_16 --ram 2048 --vcpus=1 -f /ssd/libvirt/Fedora_16.qcow2 -s 30 -c /install/system/linux/fedora/16/Fedora-16-x86_64-netinst.iso --vnc --noautoconsole --hvm

delete virtual machine.

virsh undefine kvm_1

list libvirt storage pools

virsh pool-list --all

list content of pools

virsh pool-list --name | grep -v '^$' | while read POOL ; do POOL_DIR=$(virsh pool-dumpxml "${POOL}" | xmllint --format - | awk -F '<path>|</path>' '/<path>/ {print $2}') ; echo '#' "${POOL} ${POOL_DIR}" ; (cd "${POOL_DIR}/"; ls -la *.iso *.ISO *.qcow2 *.QCOW2 *.ima *.IMA *.img *.IMG 2>/dev/null ); done

connect to virtual machine.

virt-viewer Fedora_16

On remote machine over ssh

virt-viewer --connect qemu+ssh://root@anden.halfface.se/system win8

convert file format

# img to qcow2
qemu-img convert -cp -O qcow2 kvm_1.img kvm_1.qcow2
# vmdk to qcow2
qemu-img convert disk0.vmdk -O qcow2 bigbluebutton.qcow2
FILE=costest-ph9l4-rhcos.vmdk ; qemu-img convert ${FILE} -O qcow2 ${FILE%.*}.qcow2

snapshot

# Create snapshot
virsh snapshot-create SL_63
# List snapshots
virsh snapshot-list SL_63
# Delete snapshot
virsh snapshot-delete SL_63 1346734871
# Revert to snapshot
snapshot-revert
virsh snapshot-revert fedora20_2.halfface.se 1414336149

List info about qcow2 image.

qemu-img info sms-app02.qcow2 --force-share
image: sms-app02.qcow2
file format: qcow2
virtual size: 100G (107374182400 bytes)
disk size: 107G
cluster_size: 65536
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
2         snapshot1                 0 2018-04-23 18:50:15   00:00:00.000
4         pre-patch                 0 2018-04-24 10:34:05   00:00:00.000
Format specific information:
   compat: 1.1
   lazy refcounts: false
   refcount bits: 16
   corrupt: false

Delete snapshot

qemu-img snapshot -d 4 sms-app02.qcow2

list information

# Simple information about domain.
virsh dominfo fedora_20_raid1
# View information about domain.
virsh dumpxml fedora_20_raid1 | less

change value of virtual machine

virsh autostart virtual_machine_name

disk handling

# Detach one of the disks.
virsh detach-disk fedora_20_raid1 vda
virsh detach-disk rhel8.5 vda --persistent
# Attach disk
virsh attach-disk fedora_20_raid1 /ssd/libvirt/fedora20_1.qcow2 vda --sourcetype file --subdriver qcow2
virsh attach-disk host /var/lib/libvirt/images/host-#.qcow2 vdb --driver qemu --subdriver qcow2 --targetbus virtio --persistent
# Copy kvm machine.
virsh dumpxml <domain> > domain.xml
vi domain.xml
virsh create domain.xml
# Eject cdrom.
virsh change-media www.halfface.se hda --eject

duplicate move machine

# You cannot "clone" a running vm, stop it.  suspend and destroy
# are also valid options for less graceful cloning
virsh shutdown this.vm

# copy the storage.
cp /var/lib/libvirt/images/{this-vm,that-vm}.img

# dump the xml for the original
virsh dumpxml this-vm > /tmp/that-vm.xml

# hardware addresses need to be removed, libvirt will assign
# new addresses automatically
sed -i /uuid/d /tmp/that-vm.xml
sed -i '/mac address/d' /tmp/that-vm.xml

# and actually rename the vm: (this also updates the storage path)
sed -i 's/this-vm/that-vm/g' /tmp/that-vm.xml

# finally, create the new vm
virsh define /tmp/that-vm.xml
virsh start this-vm
virsh start that-vm

virt-convert

Convert vmware image to kvm.

virt-convert . --disk-format qcow2 --destination .

drivers

Drivers for other os and enhancements.

https://www.spice-space.org/download.html

access via spice

remote-viewer spice://10.151.105.122:5900

virsh capabilities

currently supported machine types.

virsh capabilities

extend qcow2 image

Inspect storage

virsh domblklist almalinux8.4

Inspect storage

virsh domblkinfo almalinux8.4 /var/lib/libvirt/images/almalinux8.4.qcow2

Make storage to new size.

virsh blockresize almalinux8.4 /var/lib/libvirt/images/almalinux8.4.qcow2 64G

Inspect storage

qemu-img info almalinux8.4.qcow2 --force-share

Create partition from free space.

fdisk /dev/vda
pvcreate /dev/vda3
vgextend almalinux /dev/vda3
lvextend -l +100%FREE /dev/mapper/almalinux-root
resize2fs /dev/mapper/almalinux-root
xfs_growfs /dev/mapper/almalinux-root

resize qcow2

qemu-img resize Fedora-38-Silverblue.qcow2 60G

rename vm

virsh stop foo
virsh domrename foo bar
cd /var/lib/libvirt/images
mv foo.qcow2 bar.qcow2 
# replace foo with bar
virsh edit bar

rename vm

virsh domrename foo bar

dhcp leases

virsh net-list
virsh net-dhcp-leases okd01-dwb8v

List networks

virsh net-list
virsh net-info default

View leases

virsh net-dhcp-leases default

ip address

Which ip does vm have

virsh domifaddr <vm>

Get ip from vm

nmap -sn -n 10.111.222.* ; export VM=<vm> ; MAC=$(virsh domiflist $VM | grep -oE '([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})') ; arp -a | grep $MAC

stop running vm:s

virsh list --state-running --name | grep -v ^$ | while read VM ; do virsh shutdown $VM ; done

execute command via agent

virsh -c qemu:///system qemu-agent-command <vm> '{"execute": "guest-exec", "arguments": { "path": "/usr/bin/ls", "arg": [ "/" ], "capture-output": true }}'
virsh -c qemu:///system qemu-agent-command <vm> '{"execute": "guest-exec-status", "arguments": { "pid": <pid> }}'
base64 -d on output.

all in one

export KVM=pm-app02 ; KVM_PID=$(virsh -c qemu:///system qemu-agent-command ${KVM} '{"execute": "guest-exec", "arguments": { "path": "id", "arg": [ "-a","-a" ], "capture-output": true }}' --pretty | jq -r .return.pid) ; virsh -c qemu:///system qemu-agent-command "${KVM}" "{\"execute\": \"guest-exec-status\", \"arguments\": { \"pid\": ${KVM_PID} }}" | jq -r '.return."out-data"' | base64 -d

virsh console <vm>

Connect to vm serial

virsh console <vm>

socat console

VM=terraform_test ; sudo socat -,echo=0 $(virsh dumpxml $VM | xq | grep "console type" | awk -F\" '{print $4}')

set password on user

virsh set-user-password <vm> root password

Which version of libvirtd

virsh -c qemu+ssh://root@hdplex.halfface.se/system version

send keyboard to vm

https://libvirt.org/manpages/virkeycode-xtkbd.html

virsh send-key terraform_vm --codeset linux KEY_LEFTALT KEY_TAB KEY_TAB

nested virualization and virt-install

# Enable nested virtualization.
cat <<'EOF' > /etc/modprobe.d/kvm.conf
options kvm_amd nested=1
options kvm ignore_msrs=1 report_ignored_msrs=0
EOF
# Install dependecies.
systemctl enable autofs --now ; ln -s /net/10.111.222.1/storage/install /install ; ln -s /net/10.111.222.1/storage/temp /temp
dnf install -y virt-install libvirt qemu-kvm git stow vim-enhanced
systemctl enable libvirtd --now
# Setup cloud-os
cp /install/system/linux/fedora/40/Fedora-Cloud-Base-Generic.x86_64-40-1.14.qcow2 /var/lib/libvirt/images/fedora-cloud-base-generic.qcow2
qemu-img info /var/lib/libvirt/images/fedora-cloud-base-generic.qcow2
qemu-img resize  /var/lib/libvirt/images/fedora-cloud-base-generic.qcow2  +195G
virt-install  --name fedora-cloud-base-generic \
     --cpu host-passthrough,cache.mode=passthrough \
     --memory 19456 --vcpus 10 --graphics none\
     --os-variant centos-stream9\
     --import  \
     --disk /var/lib/libvirt/images/fedora-cloud-base-generic.qcow2,format=qcow2,bus=virtio \
     --network bridge=br0,model=virtio  \
     --cloud-init \
     --console pty,target_type=serial
# Setup Fedora Server.
cp /install/system/linux/fedora/40/Fedora-Server-KVM-40-1.14.x86_64.qcow2 /var/lib/libvirt/images/fedora-server-kvm.qcow2
qemu-img info /var/lib/libvirt/images/fedora-server-kvm.qcow2
qemu-img resize /var/lib/libvirt/images/fedora-server-kvm.qcow2 +195G
virt-install  --name fedora-server-kvm \
     --cpu host-passthrough,cache.mode=passthrough \
     --memory 19456 --vcpus 10 --graphics none\
     --os-variant centos-stream9\
     --import  \
     --disk /var/lib/libvirt/images/fedora-server-kvm.qcow2,format=qcow2,bus=virtio \
     --network bridge=br0,model=virtio  \
     --cloud-init \
     --console pty,target_type=serial