2018-02-10 23:31:16 -08:00
<!DOCTYPE html>
<!-- [if IE 8]><html class="no - js lt - ie9" lang="en" > <![endif] -->
<!-- [if gt IE 8]><! --> < html class = "no-js" lang = "en" > <!-- <![endif] -->
< head >
< meta charset = "utf-8" >
< meta http-equiv = "X-UA-Compatible" content = "IE=edge" >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
< link rel = "shortcut icon" href = "../img/favicon.ico" >
< title > Stupid KVM Tricks - Trent Docs< / title >
< link href = 'https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel = 'stylesheet' type = 'text/css' >
< link rel = "stylesheet" href = "../css/theme.css" type = "text/css" / >
< link rel = "stylesheet" href = "../css/theme_extra.css" type = "text/css" / >
< link rel = "stylesheet" href = "../css/highlight.css" >
< script >
// Current page data
var mkdocs_page_name = "Stupid KVM Tricks";
var mkdocs_page_input_path = "stupid_kvm_tricks.md";
var mkdocs_page_url = "/stupid_kvm_tricks/";
< / script >
< script src = "../js/jquery-2.1.1.min.js" > < / script >
< script src = "../js/modernizr-2.8.3.min.js" > < / script >
< script type = "text/javascript" src = "../js/highlight.pack.js" > < / script >
< / head >
< body class = "wy-body-for-nav" role = "document" >
< div class = "wy-grid-for-nav" >
< nav data-toggle = "wy-nav-shift" class = "wy-nav-side stickynav" >
< div class = "wy-side-nav-search" >
< a href = ".." class = "icon icon-home" > Trent Docs< / a >
< div role = "search" >
< form id = "rtd-search-form" class = "wy-form" action = "../search.html" method = "get" >
< input type = "text" name = "q" placeholder = "Search docs" / >
< / form >
< / div >
< / div >
< div class = "wy-menu wy-menu-vertical" data-spy = "affix" role = "navigation" aria-label = "main navigation" >
< ul class = "current" >
< li class = "toctree-l1" >
< a class = "" href = ".." > Home< / a >
< / li >
< li class = "toctree-l1" >
< a class = "" href = "../apt_pinning_artful_aardvark_packages_in_xenial_xerus/" > Apt Pinning Artful Aardvark Packages in Xenial Xerus< / a >
< / li >
< li class = "toctree-l1" >
< a class = "" href = "../lxd_container_home_server_networking_for_dummies/" > LXD Container Home Server Networking For Dummies< / a >
< / li >
< li class = "toctree-l1" >
< a class = "" href = "../lxd_container_foo/" > LXD Container Foo< / a >
< / li >
< li class = "toctree-l1" >
< a class = "" href = "../how_to_reassign_a_static_ip_address_with_dnsmasq/" > How To Reassign A Static Ip Address with dnsmasq< / a >
< / li >
< li class = "toctree-l1" >
< a class = "" href = "../serve_and_share_apps_from_your_phone_with_fdroid/" > Serve And Share Apps From Your Phone With Fdroid< / a >
< / li >
< li class = "toctree-l1" >
< a class = "" href = "../nspawn/" > Nspawn< / a >
< / li >
< li class = "toctree-l1" >
< a class = "" href = "../gentoo_lxd_container/" > Gentoo LXD Container< / a >
< / li >
< li class = "toctree-l1" >
< a class = "" href = "../mastodon_on_arch/" > Mastodon on Arch< / a >
< / li >
< li class = "toctree-l1" >
< a class = "" href = "../debian_nspawn_container_on_arch_for_testing_apache_configurations/" > Debian Nspawn Container On Arch For Testing Apache Configurations< / a >
< / li >
< li class = "toctree-l1" >
< a class = "" href = "../dynamic_cacheing_nginx_reverse_proxy_for_pacman/" > Dynamic Cacheing Nginx Reverse Proxy For Pacman< / a >
< / li >
< li class = "toctree-l1" >
< a class = "" href = "../freebsd_jails_on_freenas/" > FreeBSD Jails on FreeNAS< / a >
< / li >
< li class = "toctree-l1" >
< a class = "" href = "../arch_redis_nspawn/" > Quick Dirty Redis Nspawn Container on Arch Linux< / a >
< / li >
< li class = "toctree-l1" >
< a class = "" href = "../arch_postgresql_nspawn/" > Quick Dirty Postgresql Nspawn Container on Arch Linux< / a >
< / li >
< li class = "toctree-l1" >
< a class = "" href = "../misc_tips_troubleshooting/" > Misc Tips, Trouble Shooting< / a >
< / li >
< li class = "toctree-l1" >
< a class = "" href = "../self_signed_certs/" > Self Signed Certs< / a >
< / li >
< li class = "toctree-l1" >
< a class = "" href = "../selfoss_on_centos7/" > Selfoss on Centos7< / a >
< / li >
< li class = "toctree-l1" >
< a class = "" href = "../stupid_package_manager_tricks/" > Stupid Package Manager Tricks< / a >
< / li >
< li class = "toctree-l1 current" >
< a class = "current" href = "./" > Stupid KVM Tricks< / a >
< ul class = "subnav" >
< li class = "toctree-l2" > < a href = "#stupid-kvm-tricks" > Stupid KVM Tricks< / a > < / li >
< ul >
< li > < a class = "toctree-l3" href = "#virt-install-ubuntu1604" > virt-install ubuntu16.04< / a > < / li >
2018-02-13 04:50:57 -08:00
< li > < a class = "toctree-l3" href = "#virt-install-arch-linux" > virt-install Arch Linux< / a > < / li >
2018-02-10 23:31:16 -08:00
< li > < a class = "toctree-l3" href = "#change-the-network-interface" > Change the Network Interface< / a > < / li >
< li > < a class = "toctree-l3" href = "#clone-the-vm" > Clone the VM< / a > < / li >
< li > < a class = "toctree-l3" href = "#clone-the-vm-to-another-machine" > Clone the VM to another Machine< / a > < / li >
< li > < a class = "toctree-l3" href = "#what-is-the-os-type-and-os-variant-type-names" > What is the os-type and os-variant type names?< / a > < / li >
< li > < a class = "toctree-l3" href = "#misc" > misc< / a > < / li >
< li > < a class = "toctree-l3" href = "#virsh-help" > virsh help< / a > < / li >
2018-02-11 08:33:05 -08:00
< li > < a class = "toctree-l3" href = "#snapshots" > Snapshots< / a > < / li >
2018-02-10 23:31:16 -08:00
< / ul >
< / ul >
< / li >
< / ul >
< / div >
< / nav >
< section data-toggle = "wy-nav-shift" class = "wy-nav-content-wrap" >
< nav class = "wy-nav-top" role = "navigation" aria-label = "top navigation" >
< i data-toggle = "wy-nav-top" class = "fa fa-bars" > < / i >
< a href = ".." > Trent Docs< / a >
< / nav >
< div class = "wy-nav-content" >
< div class = "rst-content" >
< div role = "navigation" aria-label = "breadcrumbs navigation" >
< ul class = "wy-breadcrumbs" >
< li > < a href = ".." > Docs< / a > » < / li >
< li > Stupid KVM Tricks< / li >
< li class = "wy-breadcrumbs-aside" >
< / li >
< / ul >
< hr / >
< / div >
< div role = "main" >
< div class = "section" >
< h1 id = "stupid-kvm-tricks" > Stupid KVM Tricks< / h1 >
< h2 id = "virt-install-ubuntu1604" > virt-install ubuntu16.04< / h2 >
< p > Create the disk image< / p >
< p > < code > qemu-img create -f qcow2 /var/lib/libvirt/images/xenial.qcow2 20G< / code > < / p >
< p > Command to run the install< / p >
< pre > < code class = "bash" > virt-install \
--name xenial \
--ram 4096 \
--disk path=/var/lib/libvirt/images/xenial.qcow2,size=20 \
--vcpus 4 \
--os-type linux \
--os-variant ubuntu16.04 \
--network bridge=br0 \
--graphics none \
--console pty,target_type=serial \
--location ./ubuntu-16.04.3-server-amd64.iso \
--extra-args 'console=ttyS0,115200n8 serial'
< / code > < / pre >
2018-02-13 04:50:57 -08:00
< h2 id = "virt-install-arch-linux" > virt-install Arch Linux< / h2 >
< p > The < code > --extra-args< / code > option lets you use a serial console. But the
< code > --extra-args< / code > option only works if you also use an < code > --location< / code >
option. But the < code > --location< / code > option can only be used with certain isos.
So use < code > --cdrom< / code > instead of < code > --location< / code > , drop the < code > --extra-args< / code > ,
and instruct the kernel to boot with a serial console with a parameter
at the boot splash screen.< / p >
< pre > < code class = "bash" > qemu-img create -f qcow2 /var/lib/libvirt/images/arch.qcow2 20G
virt-install --name arch --ram 4096 \
--disk path=/var/lib/libvirt/images/arch.qcow2,size=20 \
--vcpus 2 \
--os-type linux \
--os-variant ubuntu16.04 \
--network bridge=virbr0 \
--graphics none \
--console pty,target_type=serial \
--cdrom /var/lib/libvirt/images/archlinux-2018.02.01-x86_64.iso
< / code > < / pre >
< p > the arch boot splash screen will appear in your terminal and you can
tap the "tab" key to edit boot parameters< / p >
< p > add "console=ttyS0" to kernel command line parameters< / p >
< p > before< / p >
< pre > < code class = "bash" > > .linux boot/x86_64/vmlinuz archisobasedir=arch archisolabel=ARCH_201802 initrd=boot/intel_ucode.img,boot/x86_64/archiso.img
< / code > < / pre >
< p > after< / p >
< pre > < code class = "bash" > > .linux boot/x86_64/vmlinuz archisobasedir=arch archisolabel=ARCH_201802 initrd=boot/intel_ucode.img,boot/x86_64/archiso.img console=ttyS0
< / code > < / pre >
< pre > < code class = "bash" >
arch boots ...
...
...
...
root@archiso ~ # lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 432M 1 loop /run/archiso/sfs/airootfs
sr0 11:0 1 539M 0 rom /run/archiso/bootmnt
vda 254:0 0 20G 0 disk
root@archiso ~ #
< / code > < / pre >
2018-02-10 23:31:16 -08:00
< h2 id = "change-the-network-interface" > Change the Network Interface< / h2 >
< p > br0 gets addresses from the network router, but what if you want
your vm to have be on the virbr0 192.168.122.0/24 subnet?< / p >
< p > < code > virsh edit xenial< / code > < / p >
< p > And then 'J' all the way down to the bottom, change the interface name from br0 to
virbr0, < / p >
< p > < code > virsh start xenial< / code > < / p >
< p > and then look for the machine with nmap< / p >
< p > < code > nmap -sn 192.168.122.0/24< / code > < / p >
< h2 id = "clone-the-vm" > Clone the VM< / h2 >
< p > In this case we don't have to pre-allocate the disk image because virt-clone will do that
for us.< / p >
< pre > < code class = "bash" > virt-clone --original xenial --name xenial-clone \
--file /var/lib/libvirt/images/xenial-clone.qcow2
< / code > < / pre >
< h2 id = "clone-the-vm-to-another-machine" > Clone the VM to another Machine< / h2 >
< p > First dump the xml that defines the virtual machine.< / p >
< pre > < code class = "bash" > virsh dumpxml xenial > xenial.xml
< / code > < / pre >
< p > Then copy both < code > xenial.xml< / code > and < code > xenial.qcow2< / code > to the new host machine. On the new kvm
host you'll want to at least make sure your vm has the correct CPU architecture.
The command to get a list of supported kvm cpu architectures is:< / p >
< pre > < code class = "bash" > virsh cpu-models < arch>
# i.e.
virsh cpu-models x86_64
< / code > < / pre >
< p > After you edit < code > xenial.xml< / code > and update the correct cpu architecture, mv < code > xenial.qcow2< / code >
to < code > /var/lib/libvirt/images/< / code > , clone it. < code > virt-clone< / code > will handle generating new
mac addresses for the network interfaces.< / p >
< pre > < code class = "xml" > < cpu mode='custom' match='exact'>
< model fallback='allow'> Haswell-noTSX< /model>
< /cpu>
# i.e. change to above to
< cpu mode='custom' match='exact'>
< model fallback='allow'> SandyBridge< /model>
< /cpu>
< / code > < / pre >
< pre > < code class = "bash" > virt-clone --original-xml xenial.xml --name xenial-clone \
--file /var/lib/libvirt/images/xenial-clone.qcow2
< / code > < / pre >
< h2 id = "what-is-the-os-type-and-os-variant-type-names" > What is the os-type and os-variant type names?< / h2 >
< p > < code > osinfo-query os< / code > < / p >
< h2 id = "misc" > misc< / h2 >
< ul >
< li > Start the vm < code > virsh start xenial< / code > < / li >
< li > List all the vms < code > virsh list --all< / code > < / li >
< li > Stop the vm < code > virsh destroy xenial< / code > < / li >
< li > Delete the vm < code > virsh undefine xenial< / code > < / li >
< / ul >
< h2 id = "virsh-help" > virsh help< / h2 >
< p > The < code > virsh help< / code > command returns a long chart of help information. But each section has
a keyword.< / p >
< p > Take for instance the command < code > virsh help monitor< / code > . From this we
see the < code > domiflist< / code > subcommand (among others). Unfortunately < code > domifaddr< / code > doesn't seem to
work on the Ubuntu:16.04 host, but there are other ways to find the ip address of
a virtual machine.< / p >
< p > So now if you want to see what host interface the vm < code > xenial< / code > is attached to,
type. < / p >
< pre > < code class = "bash" > virsh domiflist xenial
< / code > < / pre >
< p > which returns:< / p >
< pre > < code class = "bash" > Interface Type Source Model MAC
-------------------------------------------------------
vnet1 bridge virbr0 virtio 52:54:00:58:bf:75
< / code > < / pre >
< p > So now we can find the address of virbr0 on the host machine.< / p >
< pre > < code class = "bash" > ifconfig virbr0
< / code > < / pre >
< p > which returns:< / p >
< pre > < code class = "bash" > virbr0 Link encap:Ethernet HWaddr 52:54:00:38:87:38
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1351 errors:0 dropped:0 overruns:0 frame:0
TX packets:3037 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:232346 (232.3 KB) TX bytes:502916 (502.9 KB)
< / code > < / pre >
< p > and thus we know what subnet to scan with nmap to find the ip address of the vm< / p >
< pre > < code class = "bash" > nmap -sn 192.168.122.0/24
2018-02-11 08:33:05 -08:00
< / code > < / pre >
< h2 id = "snapshots" > Snapshots< / h2 >
< p > Create snapshot of vm < code > dcing< / code > < / p >
< pre > < code class = "bash" > virsh snapshot-create-as --domain dcing --name dcing-snap0
< / code > < / pre >
< p > But you don't need to name your snapshots because they are listed by time.< / p >
< pre > < code class = "bash" > virsh snapshot-create --domain dcing
< / code > < / pre >
< p > List snapshots for vm < code > dcing< / code > < / p >
< pre > < code class = "bash" > virsh snapshot-list --domain dcing
Name Creation Time State
------------------------------------------------------------
1518366561 2018-02-11 08:29:21 -0800 shutoff
dcing-snap0 2018-02-11 08:22:57 -0800 shutoff
< / code > < / pre >
< p > Revert dcing to snap0< / p >
< pre > < code class = "bash" > virsh snapshot-revert --domain dcing --snapshotname dcing-snap0
< / code > < / pre >
< p > Delete snapshot< / p >
< pre > < code class = "bash" > virsh snapshot-delete --domain dcing --snapshotname dcing-snap0
2018-02-10 23:31:16 -08:00
< / code > < / pre >
< / div >
< / div >
< footer >
< div class = "rst-footer-buttons" role = "navigation" aria-label = "footer navigation" >
< a href = "../stupid_package_manager_tricks/" class = "btn btn-neutral" title = "Stupid Package Manager Tricks" > < span class = "icon icon-circle-arrow-left" > < / span > Previous< / a >
< / div >
< hr / >
< div role = "contentinfo" >
<!-- Copyright etc -->
< / div >
Built with < a href = "http://www.mkdocs.org" > MkDocs< / a > using a < a href = "https://github.com/snide/sphinx_rtd_theme" > theme< / a > provided by < a href = "https://readthedocs.org" > Read the Docs< / a > .
< / footer >
< / div >
< / div >
< / section >
< / div >
< div class = "rst-versions" role = "note" style = "cursor: pointer" >
< span class = "rst-current-version" data-toggle = "rst-current-version" >
< span > < a href = "../stupid_package_manager_tricks/" style = "color: #fcfcfc;" > « Previous< / a > < / span >
< / span >
< / div >
< script > var base _url = '..' ; < / script >
< script src = "../js/theme.js" > < / script >
< script src = "../search/require.js" > < / script >
< script src = "../search/search.js" > < / script >
< / body >
< / html >