Kvm: Difference between revisions
Jump to navigation
Jump to search
(56 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
=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) | |||
=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 | =Install software= | ||
yum install -y qemu kvm SDL bridge-utils tunctl | 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 | 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 | 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 | 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 | # 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= | |||
# Create snapshot | # Create snapshot | ||
virsh snapshot-create SL_63 | virsh snapshot-create SL_63 | ||
Line 34: | 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= | |||
# 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 | |||
[[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