验证是否支持 kvm

awk
1
egrep -c '(svm|vmx)' /proc/cpuinfo

结果不为 0 即可。

安装 kvm

livecodeserver
1
apt-get install  qemu-kvm libvirt-daemon-system libvirt-clients virtinst bridge-utils

设置网络

NAT 网络

dos
1
2
3
virsh net-list --all
virsh net-autostart default
virsh net-start default

查看 default 网络信息

maxima
1
2
3
4
5
6
7
$ sudo virsh net-info default
Name: default
UUID: 1d8b5c10-54ed-4408-85b0-e6c3c722320b
Active: yes
Persistent: yes
Autostart: yes
Bridge: virbr0

从输出中可以看到它桥接自网卡 virbr0。

查看 virbr0 的信息:

mipsasm
1
2
3
$ brctl show virbr0
bridge name bridge id STP enabled interfaces
virbr0 8000.5254006842c2 yes virbr0-nic

通过 brctl 可以查看所有桥接网卡信息:

mipsasm
1
2
3
4
5
$ sudo brctl show
bridge name bridge id STP enabled interfaces
br0 8000.4ccc6a695b5e no eno1
vnet0
virbr0 8000.5254006842c2 yes

Bridge 网络

配置过程如下:

  1. 首先备份网络配置,以便出错时恢复:
awk
1
cp /etc/network/interfaces /etc/network/interfaces.bakup
  1. 编辑网络配置,将 eth0 映射到 br0,这里假设你电脑的物理网卡名称为 eth0,注意不要随意修改网卡名称,如果你的网卡配置文件中 auto 后面的那个就是你的网卡名,只需要将下面的 eth0 换成你自己的网卡名就可以了:
angelscript
1
vi /etc/network/interfaces

假如原有的网卡是 eth0,且通过 dhcp 自动获取 ip(即电脑连接路由器自动上网),注释或删除掉其他所有 eth0 相关的设置,其他内容不变,在文件最后添加如下内容:

mipsasm
1
2
3
4
5
6
auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0

如果原有是手动配置的静态 ip,则修改配置类似如下:

apache
1
2
3
4
5
6
7
8
9
10
auto br0
iface br0 inet static
address 192.168.1.30
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 192.168.1.1 223.5.5.5
bridge_ports enp3s0
bridge_stp off
bridge_fd 0
bridge_maxwait 0

带 ipv6

apache
1
2
3
4
5
6
7
8
9
10
11
12
auto br0
iface br0 inet static
address 192.168.1.30
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 192.168.1.1 223.5.5.5
bridge_ports enp3s0
bridge_stp off
bridge_fd 0
bridge_maxwait 0

iface br0 inet6 dhcp

ip 信息换成你自己的 IP 信息就可以了,关于注释中的那 2 句,从国外网站看到的,由于我是 DHCP,不清楚是否有用,没有测试。
发现上面的内容中其实就是添加了四句内容,其中 bridge_ports 很明显后面跟的是你的物理网卡,也就是要桥接的网卡,如果你有多个网卡想要桥接,可以以逗号分隔多个网卡名。

  1. 重启网络:
ebnf
1
systemctl restart networking

如果是 ubuntu14.04 及之前系统,或者 debian 中不是以 systemd 管理,则使用命令:

swift
1
/etc/init.d/networking restart

如果该命令也失败,或不能运行,就直接重启系统试试。

现在通过 brctl 命令查看网络桥接情况,里面会多一个 br0:

mipsasm
1
2
3
4
5
$ sudo brctl show
bridge name bridge id STP enabled interfaces
br0 8000.4ccc6a695b5e no eno1
vnet0
virbr0 8000.5254006842c2 yes virbr0-nic

各种虚拟机的创建

  1. centos

镜像下载地址:

http://mirrors.aliyun.com/centos-vault/centos/7.2.1511/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso

http://ftp.iij.ad.jp/pub/linux/centos-vault/7.2.1511/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso

命令:

jboss-cli
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mkdir /home/vhost && cd /home/vhost

wget http://mirrors.aliyun.com/centos-vault/centos/7.2.1511/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso

virt-install \
--virt-type=kvm \
--name=centos7 \
--ram=1024 \
--vcpus=1 \
--os-variant=rhel7 \
--hvm \
--cdrom=/home/vhost/CentOS-7-x86_64-Minimal-1511.iso \
--network bridge=br0,model=virtio \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole \
--disk path=/home/vhost/centos7.qcow2,size=20,bus=virtio,format=qcow2
  1. debian

镜像下载地址:

https://cdimage.debian.org/debian-cd/current/amd64/iso-dvd/debian-12.0.0-amd64-DVD-1.iso

命令:

jboss-cli
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mkdir /home/vhost && cd /home/vhost

wget https://cdimage.debian.org/debian-cd/current/amd64/iso-dvd/debian-12.0.0-amd64-DVD-1.iso

virt-install \
--virt-type kvm \
--name debian12 \
--ram 2048 \
--vcpus=2 \
--hvm \
--cdrom=/home/vhost/debian-12.0.0-amd64-DVD-1.iso \
--network network=default,model=virtio \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole \
--os-type=linux \
--disk path=/home/vhost/debian12.qcow2,size=20,bus=virtio,format=qcow2
  1. windows

镜像下载地址:

Google Drive:

https://drive.google.com/drive/folders/1uLcbELSSrNZbh2lz-1rdZu9TE0QrlZKK?usp=sharing

命令:

routeros
1
2
3
4
5
6
7
8
9
10
virt-install \
--name win10-ltsc \
--os-type=windows \
--memory 2048 \
--vcpus=2 \
--disk path=/home/vhost/win10-ltsc.qcow2,bus=virtio,size=30 \
--cdrom=/home/vhost/guajibao-win10-ent-ltsc-2021-x64-cn.iso \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole \
--network bridge=br0,model=virtio

无需 virtio 镜像。

  1. truenas-scale

镜像下载地址:

https://www.truenas.com/download-truenas-scale/

命令:

routeros
1
2
3
4
5
6
7
8
9
10
11
virt-install \
--virt-type=kvm \
--name=truenas-scale \
--ram=4096 \
--vcpus=2 \
--hvm \
--cdrom=/home/vhost/TrueNAS-SCALE-22.12.3.iso \
--network bridge=br0,model=virtio \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole \
--disk path=/home/vhost/truenas-scale.qcow2,size=20,bus=virtio,format=qcow2
  1. 群晖

N5105 未成功。

引导镜像及安装文件下载地址:

https://pan.gxnas.com:1443/GXNAS 网盘 - OneDrive / 黑群晖

命令:

stylus
1
2
3
4
5
6
7
8
9
10
11
qemu-img convert -f raw -O qcow2 synoboot.img syno-ds918-qcow2.img

qemu-img create -f qcow2 syno-data.qcow2 20G

virt-install --name ds918 --memory 2048 --vcpus=2 \
--os-variant ubuntu20.04 --graphics vnc,password=000000,listen=::,port=5914 \
--network bridge=br0,model=virtio, \
--disk /home/vhost/syno-ds918-qcow2.img,bus=usb \
--disk /home/vhost/syno-data.qcow2,bus=sata \
--noautoconsole \
--boot hd

KVM 虚拟机常用管理命令

KVM 虚拟机默认配置文件位置: /etc/libvirt/qemu/,该目录下存放了所有创建过的虚拟机配置文件。

查看正在运行的虚拟主机列表:

ebnf
1
virsh list

查看所有虚拟机列表:

ada
1
virsh list --all

查看虚拟机信息:

nginx
1
virsh dominfo centos7

启动虚拟机:

crmsh
1
virsh start centos7

关闭虚拟机:

arduino
1
virsh shutdown centos7

暂停 / 挂起虚拟主机:

autohotkey
1
virsh suspend centos7

恢复暂停状态的虚拟机:

gcode
1
virsh resume centos7

软重启(安全重启,相当于在虚拟机内部点击重启选项)虚拟机:

gcode
1
virsh reboot centos7

硬重启虚拟机(不安全,有可能数据丢失,相当于强制按主机上的重启按钮):

gcode
1
virsh reset centos7

设置虚拟机随着宿主主机开机自动启动:

angelscript
1
virsh autostart centos7

开机自动启动的虚拟机配置文件会自动在目录 /etc/libvirt/qemu/autostart/ 目录下生成。
用开机自动启动:

routeros
1
virsh autostart --disable centos7

移除虚拟机定义,即从虚拟机列表中移除虚拟机:

makefile
1
virsh undefine centos7

该命令只是删除 /etc/libvirt/qemu/ 目录下名为 centos7.xml 的配置文件,并不会删除虚拟机磁盘文件

通过虚拟机配置文件重新定义虚拟机:

puppet
1
virsh define centos7.xml

强制关闭虚拟机电源:

gcode
1
virsh destroy centos7

编辑虚拟机配置文件:

routeros
1
virsh edit centos7

该命令会调用本地编辑器编辑虚拟机配置文件,虽然也可以手动使用 vim 去编辑 /etc/libvirt/qemu/centos7.xml 下的虚拟机配置文件,但不建议,最好还是通过 virsh edit 调用编辑器来编辑虚拟机配置文件

查看 virsh 的所有命令或指定的命令:

ada
1
virsh --help

查看当前主机上 hypervisor 的连接路径:

ebnf
1
virsh uri

创建虚拟机硬盘(格式为 qcow2,该格式创建后不会立即占用 10G 空间,而是在使用中动态增长;也可以是 raw 格式,会立即分配空间。大小为 10G):

stylus
1
qemu-img create -f qcow2 test.qcow2 10G

调整容量大小

css
1
qemu-img resize /home/vhost/win10-ltsc.qcow2 +5G

查看磁盘信息:

routeros
1
qemu-img info test.img

qcow2 格式文件的快照管理命令:

stylus
1
2
3
创建快照:qemu-img snapshot -c <标签> test.qcow2
恢复快照:qemu-img snapshot -a <标签> test.qcow2
删除快照:qemu-img snapshot -d <标签> test.qcow2

进入 virsh 管理程序:

ebnf
1
virsh

出现 virsh 提示符后,你就可以使用任何 virsh 命令了。

上面的命令对应的非 root 管理用户命令,即没有将当前用户组加入到管理组,且没有 root 权限的用户,可以通过加入–connect qemu:///system 的方式实现虚拟机的管理,如创建和移除虚拟机的命令:

arduino
1
2
$ virsh --connect qemu:///system create centos7.xml
$ virsh --connect qemu:///system destroy centos7.xml

感觉还是设置好用户组之后直接使用 virsh 管理 KVM 虚拟机更加方便

KVM 虚拟机克隆

即可以使用 virt-clone 命令来进行虚拟机的克隆,也可以通过手动拷贝磁盘文件及原虚拟机的配置文件来完成克隆,注意如果使用拷贝的方式需要手动修改克隆后的虚拟机的 host 名称、mac 信息以及配置文件中的 uuid 和名称,否则会冲突,当然克隆生成的虚拟机中的 hostname 也是一样的,同样建议修改国,但 virt-clone 会自动随机生成 uuid、mac 等信息。
通过 virt-clone 命令克隆命令如下,克隆虚拟机时需要确保被克隆的虚拟机处于关闭或者挂起状态。

crmsh
1
2
3
virt-clone --original=vm-to-clone \
--name=cloned-vm \
--file=/home/vm/cloned-vm.img
  • –original 后面需要是被克隆的虚拟机名,–name 后面是你克隆后的虚拟机名,–file 后面是克隆虚拟机的磁盘映像需要存放的位置,可以使用 - o,-n,-f 来简写,当原虚拟机有多个硬盘文件时,后面需要跟多个–file。注意 virt-clone 无法指定静态网络参数

  • virt-clone 还可以指定 uuid,mac 等信息,省略的信息表示由 virt 自动生成。

  • virt-clone 后面也可以只接–original 参数,然后再接个–auto-clone 参数,就是由 virt-clone 自动进行克隆:
    自动克隆之后的输出如下:

    pgsql
    1
    2
    3
    4
    5
    Original name        : MyVM
    Generated clone name : MyVM-clone

    Original disk path : /home/user/foobar.img
    Generated disk path : /home/user/foobar-clone.img

也可以通过 man virt-clone 查看更详细的参数,

如果需要手动克隆,其实就是复制一份导出的原虚拟机配置文件到 xml,将修改其中需要修改的内容,然后复制一份原虚拟机的磁盘映像文件,并在 xml 文件中修改相应文件,再使用 virsh define 定义新虚拟机的配置文件即可。
其实 vrit-clone 的克隆也就是复制一份原虚拟机的磁盘及配置文件,然后会在克隆时修改配置文件中的 mac 地址,其他原虚拟机中的所有内容都不会变化,因为 virt-clone 并不会修改虚拟机内容。如果想创建一个不包含个人信息及网络配置的虚拟机镜像,则需要使用 virt-sysprep 进行虚拟机部署镜像制作。

直通 pci 设备

arduino
1
2
3
4
virsh nodedev-detach pci_0000_05_00_0
virsh nodedev-reattach pci_0000_05_00_0
virsh attach-device openwrt /home/vhost/enp5s0.xml --config
virsh detach-device openwrt /home/vhost/enp5s0.xml --config