KVM CentOS7 安装

关闭防火墙, 修改selinux

1
2
systemctl stop firewalld
setenforce 0

检查 CPU 虚拟化

1
cat /proc/cpuinfo | egrep 'vmx|svm'

KVM 模块是否加载

1
lsmod | grep kvm

安装 KVM 并启动

1
2
3
yum install -y qemu-kvm libvirt virt-install net-tools
systemctl start libvirtd
systemctl enable libvirtd

创建虚拟硬盘

1
2
# qemu-img create -f [硬盘类型] 硬盘保存目录及文件名 [大小]
qemu-img create -f qcow2 /opt/test.qcow2 50G

配置网络

先暂时关闭 NetworkManager

1
systemctl stop NetworkManager

配置 br0

/etc/sysconfig/network-scripts/ifcfg-br0
1
2
3
4
5
6
7
8
9
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=
NETMASK=
GATEWAY=
DNS1=119.29.29.29

配置物理网卡

/etc/sysconfig/network-scripts/ifcfg-enp2s0f0
1
2
3
4
5
6
7
DEVICE="enp2s0f0"
NM_CONTROLLED=no
ONBOOT="yes"
TYPE=Ethernet
BOOTPROTO=none
BRIDGE="br0"
NAME="enp2s0f0"

重启网卡:service network restart

创建虚拟机

1
virt-install --virt-type kvm --name [虚拟机名] --ram [内存大小 MB] --cdrom=[安装镜像位置] --disk path=[虚拟硬盘位置] --network bridge=br0 --graphics vnc,listen=0.0.0.0,port=[开放端口] --noautoconsole

其他命令

1
2
3
virsh list  # 列出所有运行中的虚拟机
virsh start # 启动一台虚拟机
...

添加硬盘

1
2
3
4
5
6
7
virsh attach-disk [虚拟机名] --source [虚拟磁盘位置] --target [磁盘标识 vdb] --subdriver qcow2 --persistent

# 查看磁盘
virsh domblklist [虚拟机名]

# 删除磁盘
virsh detach-disk [虚拟机名] [磁盘标识]

创建虚拟网络

创建配置文件

1
2
# vi /etc/libvirt/qemu/networks/[name].xml
vi /etc/libvirt/qemu/networks/hostonly1.xml
点击查看示例配置文件
nat: 所有连接到该虚拟网络的虚拟的网络都会经过物理机器的网卡,并转换成物理网卡的地址。
1
2
3
4
5
6
7
8
9
10
11
<network>
<name>default</name>
<bridge name="virbr0" />
<forward mode="nat"/>
<ip address="192.168.122.1" netmask="255.255.255.0">
<dhcp>
<range start="192.168.122.2" end="192.168.122.254" />
</dhcp>
</ip>
<ip family="ipv6" address="2001:db8:ca2:2::1" prefix="64" />
</network>
route: 类似于 NAT,但是不使用NAT,而是使用routing table。
1
2
3
4
5
6
7
8
9
10
11
12
<network>
<name>hostonly1</name>
<uuid>4f6b1b65-3991-4742-ad8e-6c08df197955</uuid> # 这个自己生成
<forward mode='route'/>
<bridge name='hostonly1' stp='on' delay='0'/>
<mac address='52:54:00:09:57:fc'/>
<ip address='192.168.100.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.100.2' end='192.168.100.254'/>
</dhcp>
</ip>
</network>
bridge: 使用不受libvirt管理的bridge,比如主机上已有的bridge;open vswitch bridge;使用 macvtap's "bridge" 模式
1
2
3
4
5
<network>
<name>host-bridge</name>
<forward mode="bridge"/>
<bridge name="br0"/>
</network>
passthrough: 使用 a macvtap "direct" connection in "passthrough" mode 指定主机上的特定网卡用于虚拟网络
1
2
3
4
5
6
7
<forward mode='passthrough'>
<interface dev='eth10'/>
<interface dev='eth11'/>
<interface dev='eth12'/>
<interface dev='eth13'/>
<interface dev='eth14'/>
</forward>
hostdev: 直接分配主机上的网络设备。
1
2
3
4
5
6
<forward mode='hostdev' managed='yes'>
<driver name='vfio'/>
<address type='pci' domain='0' bus='4' slot='0' function='1'/>
<address type='pci' domain='0' bus='4' slot='0' function='2'/>
<address type='pci' domain='0' bus='4' slot='0' function='3'/>
</forward>

启动网络并验证

1
2
3
4
virsh net-define /etc/libvirt/qemu/networks/hostonly1.xml  #定义 hostonly1 虚拟网络,用绝对路径定义
virsh net-start hostonly1 # 启动 hostonly1 网络
ip addr # 验证 hostonly1
virsh net-autostart hostonly1 # 自动启动 hostonly1

virsh 虚拟网络管理命令

1
2
3
4
5
6
7
virsh net-list [–all] 列出虚拟网络
virsh net-start 启动虚拟交换机
virsh net-destroy 强制停止虚拟交换机
virsh net-define 根据xml文件创建虚拟网络,要用绝对路径定义
virsh net-undefine 删除一个虚拟网络设备
virsh net-edit 修改虚拟机交换机配置
virsh net-autostart 设置虚拟交换机开机自启动

增加虚拟网卡

临时增加

1
virsh attach-interface controller --type bridge --source virbr0

永久增加

1
2
3
virsh attach-interface controller --type bridge --source virbr0 --config
virsh define /etc/libvirt/qemu/controller.xml
# 然后启动虚拟机 在虚拟机里查看 永久增加需重启虚拟机后使用