unix:virtualization:kvm:server
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| unix:virtualization:kvm:server [2020/10/16 23:19] – created rodolico | unix:virtualization:kvm:server [2026/04/14 16:15] (current) – rodolico | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== | + | ====== libvirt |
| **This is a work in progress, 20201015** | **This is a work in progress, 20201015** | ||
| + | |||
| + | ===== Location of Files ===== | ||
| + | |||
| + | Just a note, the files created by virsh and virt-install are stored in **/ | ||
| ===== Install and Configure ===== | ===== Install and Configure ===== | ||
| Line 13: | Line 17: | ||
| You should see either vmx or svm in the output. | You should see either vmx or svm in the output. | ||
| - | Now, install the basic packages needed, and nothing else | + | Now, install the basic packages needed, |
| <code bash> | <code bash> | ||
| - | apt install -y --no-install-recommends qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils libguestfs-tools genisoimage virtinst libosinfo-bin virt-top | + | apt install -y --no-install-recommends qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils libguestfs-tools genisoimage virtinst libosinfo-bin virt-top |
| reboot # brings libraries online | reboot # brings libraries online | ||
| </ | </ | ||
| Line 39: | Line 43: | ||
| ===== Defining Network ===== | ===== Defining Network ===== | ||
| + | |||
| + | ==== Setting up bridges ==== | ||
| + | |||
| + | For your network, you need bridges for the outside world. | ||
| + | |||
| + | === Simple === | ||
| + | |||
| + | This is a basic setup that will work for a single interface as per the Debian documentation. It sets up one bridge off of eth0 and gives it a static IP. | ||
| + | |||
| + | <code bash interfaces> | ||
| + | auto lo | ||
| + | iface lo inet loopback | ||
| + | |||
| + | # The primary network interface | ||
| + | auto eth0 | ||
| + | |||
| + | #make sure we don't get addresses on our raw device | ||
| + | iface eth0 inet manual | ||
| + | iface eth0 inet6 manual | ||
| + | |||
| + | #set up bridge and give it a static ip | ||
| + | auto br0 | ||
| + | iface br0 inet static | ||
| + | address 192.168.1.2 | ||
| + | netmask 255.255.255.0 | ||
| + | network 192.168.1.0 | ||
| + | broadcast 192.168.1.255 | ||
| + | gateway 192.168.1.1 | ||
| + | bridge_ports eth0 | ||
| + | bridge_stp off | ||
| + | bridge_fd 0 | ||
| + | bridge_maxwait 0 | ||
| + | dns-nameservers 8.8.8.8 | ||
| + | |||
| + | </ | ||
| + | |||
| + | === Real World === | ||
| + | |||
| + | I'm hoping, if you're reading this article, you know how to set up bonding and vlans. The following | ||
| <code bash interfaces> | <code bash interfaces> | ||
| Line 74: | Line 117: | ||
| | | ||
| + | # the public interface on vlan 10 | ||
| auto br_wan | auto br_wan | ||
| iface br_wan inet static | iface br_wan inet static | ||
| Line 83: | Line 127: | ||
| | | ||
| + | # the DMZ on vlan 20 | ||
| auto br_dmz | auto br_dmz | ||
| iface br_dmz inet static | iface br_dmz inet static | ||
| Line 92: | Line 137: | ||
| bridge_maxwait 0 | bridge_maxwait 0 | ||
| + | # the private (LAN) interface on vlan 30 | ||
| auto br_lan | auto br_lan | ||
| iface br_lan inet dhcp | iface br_lan inet dhcp | ||
| Line 100: | Line 146: | ||
| </ | </ | ||
| + | |||
| + | ==== Adding network to virt-lib ==== | ||
| + | |||
| + | In order to use a network with vir-lib, you need to define it. The best way is to create a few XML files, then use virsh to define them into the system. | ||
| + | |||
| + | === One at a time === | ||
| + | Create one XML file per interface as follows: | ||
| + | |||
| + | <code xml br_wan.xml> | ||
| + | < | ||
| + | < | ||
| + | <forward mode=" | ||
| + | <bridge name=" | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Then, import it into the system with virsh, then set it to autostart on boot | ||
| + | <code bash> | ||
| + | # import the network xml file | ||
| + | virsh net-define --file br_wan.xml | ||
| + | # set to autostart on boot | ||
| + | virsh net-autostart br_wan | ||
| + | </ | ||
| + | |||
| + | === Lazy Approach === | ||
| + | |||
| + | I'm lazy, so I just created all three, then imported them all at one time. | ||
| + | |||
| + | <code bash import_bridge.sh> | ||
| + | #! / | ||
| + | |||
| + | # create the xml definitions. The br is prepended. | ||
| + | # Add/remove interfaces if needed | ||
| + | for interface in wan lan dmz | ||
| + | do | ||
| + | cat << EOF > br_$interface.xml | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | EOF | ||
| + | done | ||
| + | # uncomment this if you want to view your xml files but | ||
| + | # not process them | ||
| + | # exit | ||
| + | |||
| + | |||
| + | # find all xml files and do the net-define | ||
| + | for interface in `ls *.xml` | ||
| + | do | ||
| + | virsh net-define --file $interface | ||
| + | done | ||
| + | |||
| + | # since the bridge name is followed by xml, simply remove that | ||
| + | # and set to autostart and start it | ||
| + | for interface in `ls *.xml | cut -d' | ||
| + | do | ||
| + | virsh net-autostart $interface | ||
| + | virsh net-start $interface | ||
| + | done | ||
| + | # show me the list of network names | ||
| + | virsh net-list | ||
| + | </ | ||
| + | |||
| + | This script assumes your network names are of the form br_// | ||
| + | |||
| + | The last loop assumes there are no periods in the network name. Be warned. | ||
| + | |||
| + | ===== Using Storage ===== | ||
| + | |||
| + | In our example, we are going to use LVM2 to grab a piece of the disk for a new virtual. You can also use a file (File Backed Device, or FBD) by running // | ||
| + | |||
| + | ==== File Backed Device ===== | ||
| + | |||
| + | By default, libvirt uses File Backed Devices (FBD' | ||
| + | < | ||
| + | and use that when you create the virtual. However, it is better (easier) if you define a pool (or use the default). I have not researched this; see //man virt-install// | ||
| + | |||
| + | ==== LVM2 ==== | ||
| + | |||
| + | Just create an LV the way you always do. | ||
| + | |||
| + | <code bash> | ||
| + | |||
| + | |||
| + | ==== iSCSI ==== | ||
| + | |||
| + | Ok, if you're using iSCSI, I'm guessing you know how to set it up. Just make sure it is available, then use the correct path when you create the image. | ||
| + | |||
| + | ===== Doing the Install ===== | ||
| + | |||
| + | You can probably create a virtual by manually creating the XML file, but why do that when virt-install is your friend. Sure, there are a bunch of parameters, but they are very, very well documented, and will create your system for your rapidly | ||
| + | |||
| + | This example creates a virtual installing the opnSense firewall/ | ||
| + | |||
| + | <code bash> | ||
| + | virt-install \ | ||
| + | --hvm \ | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | |||
| + | Other useful options are | ||
| + | * --dry-run # don't really do it | ||
| + | * --print-xml # this will dump the XML file instead of running the command. This is very useful when installing virtuals that will need more than one CDROM drive as you can then edit the XML file to add it. **Note**: the resulting XML is doubled, ie has two copies of the XML in it and must be edited before use. | ||
| + | * --controller virtio-scsi # this is specific to KVM, but faster there | ||
| + | * osinfo-query os # this shows the OS's available for the --os-variant flag | ||
| + | |||
| + | |||
| + | most of the parameters are self evident, but I'll quickly talk about why I did some of them. | ||
| + | |||
| + | * --graphics vnc, | ||
| + | * --noautoconsole - When starting the virtual, virt-lib tries to bring up a GUI for virtviewer to take over, or run virsh console to bring up a serial console. Since I don't want either, I disable it here | ||
| + | * --os-variant freebsd11.1 - By defining this, virt-install can set up some defaults that work well with the known OS. | ||
| + | * --metadata uuid=d9510e01-e461-461f-9aa8-3cee223cb4a0, | ||
| + | * title, name and description will show up in some reports. | ||
| + | * uuid is good so the virtual does not get a new, randomly generated UUID every time it runs. Use the uuidgen command to get a randomly generated one for each new machine | ||
| + | |||
| + | ===== Performing Installation ===== | ||
| + | |||
| + | For most systems, I use VNC to do the install. Since I'm remote, I use the following ssh command: | ||
| + | <code bash>ssh -L localhost: | ||
| + | where | ||
| + | * 5910 is the local VNC port I'll attach to (ie, localhost: | ||
| + | * 5901 is the VNC port I told virt-install to use | ||
| + | * server is the name of the hypervisor | ||
| + | |||
| + | Then, when I run the virt-install command, I simply make a VNC connection to localhost: | ||
| + | |||
| + | ===== Setting other parameters ===== | ||
| + | |||
| + | If you want the domain to come up automatically when the hypervisor is turned on, the autostart flag needs to be set. Do this with <code bash> | ||
| + | |||
| + | ===== Links ===== | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | |||
| + | |||
unix/virtualization/kvm/server.1602908385.txt.gz · Last modified: by rodolico
