在CentOS 8服务器中安装和配置KVM

时间:2020-03-21 11:45:13  来源:igfitidea点击:

基于内核虚拟机的KVM,是一个FreeBSD和Linux内核模块,允许内核充当虚拟机管理程序。
从内核版本2.6.20开始,KVM合并为Linux内核主线。
使用KVM,我们可以轻松地在Linux机器中设置虚拟化环境,并部署各种客户操作系统,包括Linux,Windows,BSD,Mac OS和许多。
在本教程中,我们将研究如何在CentOS 8 Server Edition中安装和配置KVM。

准备工作

在安装KVM之前,请首先确保系统支持硬件虚拟化。

如果系统支持硬件虚拟化,请继续执行以下步骤。

在CentOS 8服务器中安装和配置KVM

出于本教程的目的,我将使用以下系统:

KVM Virtualization Server:

  • OS - CentOS 8最小服务器(无GUI)
  • IP地址:192.168.225.53/24

即使它在CentOS 8上测试,本教程也应该在RHEL 8上罚款。

在CentOS 8中安装KVM

注意:通过外出本教程给出的所有命令都应作为"root"用户运行。
如果我们以普通用户身份登录,请在以下所有命令的所有命令的前面添加"sudo"。

安装KVM和所有必需的依赖项,使用命令作为"root"用户在CentOS 8 SECT上设置虚拟化环境:

# dnf install qemu-kvm libvirt virt-install

其中

  • EMU-KVM - QEMU Metapackage用于KVM支持(即QEMU在X86硬件上完全虚拟化),
  • libvirt - LibVirt库的程序,
  • right-install - 创建和克隆虚拟机的程序。

安装KVM后,启用和启动LibvertD服务(如果尚未启动):

# systemctl enable libvirtd
# systemctl start libvirtd

我们还可以组合两个命令并将它们运行为如下面的单线:

# systemctl enable --now libvirtd

使用命令检查libvirtd service的状态:

# systemctl status libvirtd

示例输出:

● libvirtd.service - Virtualization daemon
   Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enable>
   Active: active (running) since Wed 2017-07-15 14:27:32 IST; 5s ago
     Docs: man:libvirtd(8)
           https://libvirt.org
 Main PID: 1097 (libvirtd)
    Tasks: 17 (limit: 32768)
   Memory: 57.0M
   CGroup: /system.slice/libvirtd.service
           └─1097 /usr/sbin/libvirtd
May 15 14:27:28 centos8.theitroad.lan systemd[1]: Starting Virtualization daemon...
May 15 14:27:32 centos8.theitroad.lan systemd[1]: Started Virtualization daemon.

libvertd服务已启动并运行!

验证是否已加载KVM模块:

# lsmod | grep kvm

示例输出:

kvm_intel             294912  0
kvm                   786432  1 kvm_intel
irqbypass              16384  1 kvm

伟大的!加载KVM模块。
让我们现在创建一个网络桥梁。

设置桥联网与kvm在centos

桥接网络与其他VM共享主计算机的真实网络接口以连接到外部网络。
因此,每个VM都可以直接绑定到任何可用的IPv4或者IPv6地址,就像物理计算机一样。

默认情况下,kvm设置私有虚拟桥,使所有VM可以在主机中彼此通信。
它提供了自己的子网和DHCP来配置Guest网络,并使用NAT访问主机网络。

使用"IP"命令查看KVM默认虚拟接口的IP地址:

# ip a

示例输出:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:b7:3a:84 brd ff:ff:ff:ff:ff:ff
    inet 192.168.225.52/24 brd 192.168.225.255 scope global dynamic noprefixroute enp0s3
       valid_lft 42217sec preferred_lft 42217sec
    inet6 2409:4072:918:98cf:ad3b:b969:8ec8:f9c7/64 scope global noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::b404:4d52:8bee:18bf/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:2a:be:53 brd ff:ff:ff:ff:ff:ff
4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:41:91:4d brd ff:ff:ff:ff:ff:ff
5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:5b:a4:cd brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
6: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN group default qlen 1000
    link/ether 52:54:00:5b:a4:cd brd ff:ff:ff:ff:ff:ff

如我们所见,KVM默认网络Virbr0使用192.168.122.1/24 IP地址。
所有VM都将在192.168.122.0/24 IP范围内使用IP地址,并且在192.168.122.1中将可以访问主机操作系统。
我们应该能够从客户机操作系统内部(192.168.122.1)中的主机操作系统(在192.168.122.1)中,并使用SCP来回复制文件。

如果我们只访问主机本身内部的VMS,则可以。
但是,我们无法从网络中的其他远程系统访问VM。
因为他们在我的情况下使用不同的IP范围:192.168.225.0/24.
要从其他远程主机访问VM,必须设置在主机网络上运行的公用桥,并使用主机网络上的外部DHCP服务器。
要将其放在Layman条款中,我们将使所有VMS使用主机系统使用的相同IP系列。

在设置公共桥接网络之前,我们应该禁用NetFilter以获得性能和安全原因。

默认情况下,目前在桥梁上启用NetFilter。

要禁用NetFilter,请创建一个名为/etc/sysctl.d/bridge.conf的文件:

# vi /etc/sysctl.d/bridge.conf

添加以下行:

net.bridge.bridge-nf-call-ip6tables=0
net.bridge.bridge-nf-call-iptables=0
net.bridge.bridge-nf-call-arptables=0

保存并关闭文件。

然后创建一个名为/etc/udev/rules.d/99-bridge.rules的文件:

# vi /etc/udev/rules.d/99-bridge.rules

添加以下行:

ACTION=="add", SUBSYSTEM=="module", KERNEL=="br_netfilter", RUN+="/sbin/sysctl -p /etc/sysctl.d/bridge.conf"

这将设置必要的标志,以在系统启动中适当的位置禁用网桥上的NetFilter。
保存并关闭文件。
重新启动系统以生效这些更改。

接下来,我们应该禁用KVM为其安装的默认网络。

使用"IP链接"命令查找KVM默认网络接口的名称:

# ip link

示例输出:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:b7:3a:84 brd ff:ff:ff:ff:ff:ff
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:2a:be:53 brd ff:ff:ff:ff:ff:ff
4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:41:91:4d brd ff:ff:ff:ff:ff:ff
5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
    link/ether 52:54:00:5b:a4:cd brd ff:ff:ff:ff:ff:ff
6: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN mode DEFAULT group default qlen 1000
    link/ether 52:54:00:5b:a4:cd brd ff:ff:ff:ff:ff:ff

正如我们在上面的输出中看到的,条目"Virbr0"和"Virbr0-NIC"是KVM网络。

让我们使用命令删除默认的KVM网络:

# virsh net-destroy default

示例输出:

Network default destroyed

unefine使用命令的默认网络:

# virsh net-undefine default

示例输出:

Network default has been undefined

如果上面的命令没有任何原因工作,则可以使用这些命令禁用和拒绝kvm默认网络:

# ip link delete virbr0 type bridge
# ip link delete virbr0-nic

现在再次运行"IP链接"以验证virbr0和virbr0-nic接口是否实际删除:

# ip link

示例输出:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:b7:3a:84 brd ff:ff:ff:ff:ff:ff
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:2a:be:53 brd ff:ff:ff:ff:ff:ff
4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:41:91:4d brd ff:ff:ff:ff:ff:ff

嗯,KVM默认网络已经消失。

现在,让我们在创建新VM时设置KVM公共桥使用。

使用"nmcli"命令创建名为"br0"的新桥接界面:

# nmcli connection add type bridge autoconnect yes con-name br0 ifname br0

设置桥接界面的IP地址:

# nmcli connection modify br0 ipv4.addresses 192.168.225.53/24 ipv4.method manual

设置桥接界面的网关:

# nmcli connection modify br0 ipv4.gateway 192.168.225.1

为桥接接口设置DNS:

# nmcli connection modify br0 ipv4.dns 192.168.225.1

接下来,我们需要删除一个网络接口卡并将其添加为桥接器。

请注意,如果服务器只有一个NIC并且我们正在通过SSH访问服务器,则在删除NIC后将终止连接。
我建议我们在服务器的控制台中执行以下步骤。

例如,我将添加"ENP0S8"接口作为从站到桥接接口BR0。

要删除网络接口"ENP0S8",请运行:

# nmcli connection del enp0s8

用自己的网卡替换"ENP0S8"。

说明:

不要为桥使用无线网络接口卡。
大多数无线互通都不支持桥接。
始终使用有线网络接口进行无缝连接!

接下来,使用命令将"enp0s8"添加到桥梁:

# nmcli connection add type bridge-slave autoconnect yes con-name enp0s8 ifname enp0s8 master br0

其中桥接网络接口"BR0"添加到主机的网络接口"ENP0S8"。
替换与网络匹配的上述网络接口名称。

重新启动网络管理器以生效更改:

# systemctl restart NetworkManager

如果可能,最好重新启动系统:

# reboot

登录服务器并检查IP地址是否已分配给桥接界面:

$ip a

示例输出:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
    link/ether 08:00:27:b7:3a:84 brd ff:ff:ff:ff:ff:ff
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
    link/ether 08:00:27:2a:be:53 brd ff:ff:ff:ff:ff:ff
4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:41:91:4d brd ff:ff:ff:ff:ff:ff
5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 08:00:27:2a:be:53 brd ff:ff:ff:ff:ff:ff
    inet 192.168.225.53/24 brd 192.168.225.255 scope global noprefixroute br0
       valid_lft forever preferred_lft forever
    inet6 2409:4072:6084:198:df03:d9ed:62eb:df34/64 scope global noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::e8c8:e98b:7fef:5874/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

如上所述,桥接网络接口BR0分配了IP地址192.168.225.53,ENP0S8目前现在具有"Master BR0"条目。
这意味着ENP0S8属于桥梁。

我们还可以使用"桥接"命令来显示桥接状态:

# bridge link show br0
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 100

我们已成功创建了桥接界面,它处于活动状态。
我们需要做最后一件事。

我们应该将KVM配置为使用此桥接接口作为默认接口。
为此,创建一个名为host-bridge.xml的XML文件:

# vi host-bridge.xml

添加以下行:

<network>
  <name>host-bridge</name>
  <forward mode="bridge"
  <bridge name="br0"
</network>

运行以下命令以启动新创建的桥梁,并使它作为VM的默认网桥:

# virsh net-define host-bridge.xml
# virsh net-start host-bridge
# virsh net-autostart host-bridge

验证桥是否处于活动状态并使用命令启动:

# virsh net-list --all

示例输出:

Name          State    Autostart   Persistent
-----------------------------------------------
 host-bridge   active   yes         yes

恭喜!我们在CentOS 8无鼠键显示器服务器中安装和配置了KVM。