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 [2024/03/30 00:04] (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 | ||
+ | * --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: 2020/10/16 23:19 by rodolico