This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| computing:virtmanagerhell [2022/08/08 06:41] – oemb1905 | computing:virtmanagerhell [2026/04/05 00:45] (current) – oemb1905 | ||
|---|---|---|---|
| Line 7: | Line 7: | ||
| ------------------------------------------- | ------------------------------------------- | ||
| - | Alright, I am completely re-writing this as the old notes were just out of date and incomplete. | + | To make a VM from the command line, do the following. Note that this recipe assumes you have already created your virtual switch, br0. It also presumes you have already created your virtual disk, and if you have not, simply run '' |
| - | sudo nano /etc/network/interfaces | + | sudo virt-install --name=new.img \ |
| + | --os-type=Linux \ | ||
| + | --os-variant=debian10 \ | ||
| + | --vcpu=1 \ | ||
| + | --ram=2048 \ | ||
| + | --disk path=/mnt/vms/students/ | ||
| + | --graphics spice \ | ||
| + | --location=/ | ||
| + | --network bridge:br0 | ||
| - | That file should look like this (adjust | + | Here's a more complex block, that enables trim on vdd, uses a preseed.cfg |
| + | |||
| + | virt-install --name=domain.com.qcow2 \ | ||
| + | --os-variant=debian12 \ | ||
| + | --vcpu=2 \ | ||
| + | --memory 4096 \ | ||
| + | --disk path=/ | ||
| + | --check path_in_use=off \ | ||
| + | --graphics none \ | ||
| + | --location=/ | ||
| + | --network bridge:br0, | ||
| + | --channel unix, | ||
| + | --initrd-inject=/ | ||
| + | --extra-args=" | ||
| + | |||
| + | To clone an existing image, do the following: | ||
| + | |||
| + | virt-clone \ | ||
| + | --original=clean \ | ||
| + | --name=sequoia \ | ||
| + | --file=/ | ||
| + | |||
| + | If you have a legacy image that needs to be larger, then install a few tools and the proceed to expand the virtual hard disk as follows: | ||
| + | |||
| + | apt install qemu-img kpartx | ||
| + | qemu-img resize debian10.img +50G | ||
| | | ||
| - | #eth0 (alt name ent8s0g) physical host base-connection | + | After expanding the virtual hard disk, open gparted in X passthrough / command line and expand the existing partition into as much of the the new space as you prefer. And to rename a VM (domain), do the following: |
| - | | + | |
| - | | + | |
| - | address 8.25.76.160 | + | |
| - | netmask 255.255.255.0 | + | |
| - | gateway 8.25.76.1 | + | To delete a domain, virt-manager uses the undefine command. To remove the accompanying storage with it, parse the command as follows: |
| - | nameserver 8.8.8.8 | + | |
| - | | + | |
| - | | + | |
| - | iface enp8s0g1 inet manual | + | |
| - | auto br0 | + | |
| - | iface br0 inet static | + | |
| - | address 8.25.76.159 | + | |
| - | netmask 255.255.255.0 | + | |
| - | gateway 8.25.76.1 | + | |
| - | bridge_ports enp8s0g1 | + | |
| - | nameserver 8.8.8.8 | + | |
| - | Once that's done, run '' | + | virsh undefine guest1 --remove-all-storage |
| + | |||
| + | If you need to force stop a machine, virt-manager uses the destroy command, as follows: | ||
| - | | + | |
| + | |||
| + | I prefer the raw format (.img) but if I change my mind later, perhaps because I want snapshots, then I can easily shutdown the machine and convert the image as follows. If I change my mind, I can also go in reverse back to raw. | ||
| + | |||
| + | qemu-img convert -p -f raw -O qcow2 guest1.img guest1.qcow2 | ||
| + | qemu-img convert -p -f qcow2 -O raw guest1.qcow2 guest1.raw | ||
| | | ||
| - | Reboot the host and ping 8.8.8.8 and google.com to ensure | + | If you do end up using this, then you will need to edit the virtual |
| - | | + | |
| + | <driver name=' | ||
| + | <source file='/mnt/vms/ | ||
| + | |||
| + | Another essential tool is the ability to create snapshots and, when necessary, revert to them. Here are the commands to create snapshot1 and then later revert to that specific snapshot. | ||
| - | This file should look like this (adjust to your use-case - and again, this is **inside | + | virsh snapshot-create-as guest1 snapshot1 --description "first snapshot 11-13-22" |
| + | virsh snapshot-revert guest1 snapshot1 | ||
| + | |||
| + | If you don't care about naming | ||
| - | | + | |
| - | | + | |
| - | | + | To create an external snapshot, append the following arguments: |
| - | netmask 255.255.255.0 | + | |
| - | gateway 8.25.76.1 | + | |
| - | nameservers 8.8.8.8 | + | |
| - | The VM interface is listed inside the guest/ | + | virsh snapshot-create-as guest1 snapshot1 |
| + | |||
| + | If you want to revert | ||
| - | | + | |
| - | ip a | + | |
| - | sudo apt install resolvconf | + | |
| - | sudo nano / | + | |
| | | ||
| - | Enter the name server as follows: | + | If you need to delete a particular snapshot, or delete all children of a snapshot, execute: |
| | | ||
| - | | + | |
| + | virsh snapshot-delete guest1 --current --children-only | ||
| - | At this point, I would probably reboot and then from within the VM, ping 8.8.8.8, and then ping google.com to ensure you have link and upstream DNS. Everything should be rosy ;> | + | |
| + | To list all snapshots for a particular guestOS, execute | ||
| - | -- Below, are notes from when I shrunk | + | virsh snapshot-list guest1 |
| + | |||
| + | To get information about the snapshot, these commands help: | ||
| + | |||
| + | virsh snapshot-info guest1 snapshot | ||
| + | virsh snapshot-dumpxml guest1 snapshot1 | ||
| + | |||
| + | If you need to make a live backup, do the following (Note: make sure that '' | ||
| + | |||
| + | |||
| + | virsh domfsfreeze guest1.qcow2 | ||
| + | qemu-img create -f qcow2 -b guest1.qcow2 snapshot.qcow2 | ||
| + | virsh domfsthaw guest1.qcow2 | ||
| + | |||
| + | |||
| + | At times you may need to resize or gather information about a particular virtual disk. If they are in the qcow2 format, gather information as follows: | ||
| + | |||
| + | qemu-img info disk.qcow2 | ||
| + | |||
| + | To regain space that is being used needlessly, you can sparsify the qcow2 disk. Note that you must install virt-sparsify separately with '' | ||
| + | |||
| + | virt-sparsify --in-place disk.qcow2 | ||
| + | |||
| + | Most importantly, | ||
| + | |||
| + | cp -ar --sparse=always disk.qcow2 disk.bk.qcow2 | ||
| + | qemu-img resize disk.qcow2 1000G | ||
| + | qemu-img resize disk.qcow2 +10G | ||
| + | |||
| + | Okay, so another big issue with qcow2 images is them growing over time from writes/deletes and then those blocks taking up space on the hypervisor while not actually being used on the guestOS any longer. To stop this, enable unmap on the virtIO disk in virsh, and then schedule a timer within the guest OS to trim those underlying blocks. | ||
| + | |||
| + | sudo systemctl enable fstrim.timer | ||
| + | sudo systemctl start fstrim.timer | ||
| + | |||
| + | You can also manually run fstrim and then power down the qcow2 image and convert it. You may optionally use compression to save more space, but it takes very long. | ||
| + | |||
| + | fstrim -v / | ||
| + | qemu-img convert -O qcow2 guest.qcow2 guest-trimmed.qcow2 | ||
| + | qemu-img convert -O qcow2 -c guest.qcow2 guest-trimmed.qcow2 | ||
| + | |||
| + | To test trimming functionality, | ||
| + | |||
| + | dd if=/ | ||
| + | |||
| + | To create a backup volume inside a guest you create the volume, attach it, and then shell into the guest and format, mount, and create an fstab entry. First, on the hostOS: | ||
| + | |||
| + | cd / | ||
| + | qemu-img create -f qcow2 vm1-backup.qcow2 32G | ||
| + | virsh attach-disk guestOS.qcow2 \ | ||
| + | --source / | ||
| + | --target vdb \ | ||
| + | --persistent | ||
| + | |||
| + | Then, on the guestOS: | ||
| + | |||
| + | mkdir / | ||
| + | mkfs.ext4 /dev/vdb | ||
| + | mount -t auto /dev/vdb / | ||
| + | nano / | ||
| + | /dev/vdb /mnt/backup ext4 defaults, 0 0 | ||
| - | Resize | + | The rest from here on out is my attempt at resizing |
| | | ||
| sudo apt install libguestfs-tools | sudo apt install libguestfs-tools | ||
| Line 143: | Line 236: | ||
| kpartx -d debian10.img | kpartx -d debian10.img | ||
| | | ||
| - | After messing around with this, and succeeding | + | User and group perms: |
| + | |||
| + | adduser libvirt-qemu kvm | ||
| + | adduser cockpit-ws kvm | ||
| + | newgrp kvm | ||
| + | |||
| + | Add network interface as custom name for easy tracking: | ||
| + | |||
| + | < | ||
| + | virsh edit domain.com.qcow2 | ||
| + | |||
| + | < | ||
| + | <mac address=' | ||
| + | <source bridge=' | ||
| + | <target dev=' | ||
| + | <model type=' | ||
| + | <address type=' | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Make sure that Cockpit can access a terminal: | ||
| + | |||
| + | < | ||
| + | virsh edit domain.com.qcow2 | ||
| + | < | ||
| + | <listen type=' | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | If you don't have video enabled, do the following (also needed for Cockpit Terminal rendering): | ||
| + | |||
| + | Option 1 (cirrus): | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Option 2 (qxl) | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Option 3 (use commands) | ||
| + | virt-xml domain.com.qcow2 --add-device --graphics vnc, | ||
| + | virt-xml domain.com.qcow2 --add-device --video qxl | ||
| + | virsh reboot domain.com.qcow2 | ||
| + | |||
| + | Add virtiofs mount point. Here's two, note the staggered bus entry of '' | ||
| + | |||
| + | < | ||
| + | < | ||
| + | <driver type=' | ||
| + | <source dir='/ | ||
| + | <target dir=' | ||
| + | <address type=' | ||
| + | </ | ||
| + | < | ||
| + | <driver type=' | ||
| + | <source dir='/ | ||
| + | <target dir=' | ||
| + | <address type=' | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Then, inside | ||
| + | |||
| + | mkdir -p / | ||
| + | mkdir -p / | ||
| + | nano / | ||
| + | support1 | ||
| + | support2 | ||
| + | |||
| + | If you find ''virsh console domain.com.qcow2'' | ||
| + | |||
| + | sudo systemctl enable serial-getty@ttyS0.service | ||
| + | sudo systemctl start serial-getty@ttyS0.service | ||
| + | |||
| + | Migrating an existing VDD and virsh instance ... just dump or copy paste the .xml with '' | ||
| + | |||
| + | virsh define host.com.xml | ||
| + | virsh start host.com | ||
| + | |||
| + | You should for sure check the network interface and MAC address, the storage location directory, and obviously run through anything else that might be different on the target migration host. | ||
| - | --- //[[jonathan@haacksnetworking.org|oemb1905]] | + | --- //[[alerts@haacksnetworking.org|oemb1905]] |