作者:E4b9a6, 创建:2023-08-18, 字数:5498, 已阅:144, 最后更新:2024-10-21
KVM (Kernel-based Virtual Machine) 是一种开源虚拟化技术,它是 Linux 内核的一部分,KVM 能够将 Linux 系统转化为一个 hypervisor,允许多个虚拟机在同一台物理服务器上运行
KVM 在 x86 架构的服务器上运行,并支持多种操作系统,包括 Linux、Windows、BSD 等,KVM 提供了高性能、安全性和可扩展性
下面将实践在 Ubuntu2204 系统下创建一个桥接网络和使用桥接网络的虚拟机
安装Ubuntu2204后,安装KVM软件
sudo apt update
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
sudo systemctl enable libvirtd
sudo systemctl start libvirtd
编辑 /etc/sysctl.conf :
...
net.ipv4.ip_forward=1
让上述 ipv4 转发设置生效
sudo sysctl -p
Ubuntu2204 采用了 netplan 作为网络管理器,我的网络配置文件位于 /etc/netplan/00-installer-config.yaml
,内容参考如下:
network:
ethernets:
eno1: # 这是我的物理网卡,通过`ip a`可以确认,这里设置为不获取IP
dhcp4: no
dhcp6: no
bridges:
br0: # 即将创建的虚拟网卡
dhcp4: no
addresses: [192.168.1.100/24] # IP 请通过 `ip a` 来确认填入,这里应该是原来物理网卡的IP
nameservers:
addresses:
- 114.114.114.114
routes: # Ubuntu2204取消了Gateway4的写法,采用路由写法,`192.168.1.1` 是我的网关(路由器)
- to: default
via: 192.168.1.1
on-link: true
interfaces: [eno1] # 桥接到物理网卡eno1
使上述配置生效
sudo netplan apply --debug
桥接网络的一些查看方式
# 查看所有桥接状态
sudo networkctl -a
# 查看br0状态
sudo networkctl status br0
# 显示所有桥接信息
sudo brctl show
# 查看br0的网络信息
ip a show br0
打印当前的网络如下:
➜ netplan 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: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
link/ether 1c:69:7a:0c:a5:be brd ff:ff:ff:ff:ff:ff
altname enp0s31f6
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 72:de:2b:99:77:26 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.100/24 brd 192.168.1.255 scope global br0
valid_lft forever preferred_lft forever
br0
即桥接网卡名称
在确认br0
信息后,开始创建KVM的桥接网络配置
编辑 /tmp/host-bridge.xml
文件,文件内容如下:
<network>
<name>host-bridge</name>
<forward mode="bridge"/>
<bridge name="br0"/>
</network>
读取这个文件作为 KVM 的网络配置:
sudo virsh net-define /tmp/host-bridge.xml
sudo virsh net-start host-bridge
sudo virsh net-autostart host-bridge
检查桥接网络是否已经导入 KVM 中:
sudo virsh net-list --all
我的输出如下:
➜ sudo virsh net-list --all
Name State Autostart Persistent
----------------------------------------------- host-bridge active yes yes
请确保 State 和 Autostart 的值是 active 和 yes
以 Alpine3.16
为例,创建指令如下:
sudo virt-install \
-n Alpine3.16 \
--description "Test VM with Alpine3.16" \
--os-type=Linux \
--os-variant=Alpine3.16 \
--ram=512 \
--vcpus=2 \
--disk path=/var/lib/libvirt/images/Alpine3.16.img,bus=virtio,size=64 \
--graphics vnc,listen=192.168.1.100 --noautoconsole \
--cdrom /var/lib/libvirt/images/Alpine3.16.iso \
--network network=host-bridge
使用任意客户端,输入 192.168.1.100:5902
连接到该虚拟机完成初始化安装
Windows 下可使用开源的 TightVNC ,可通过 scoop 直接安装
安装后检查是否可以顺利访问局域网内其他机器
如果使用 KVM 安装 Windows 会遇到在VNC界面中无法找到任何虚拟磁盘,这是因为缺少了 VirtIO
驱动
下载地址:
重新创建 Windows 的虚拟机,将下载后的 virtio-win.iso
作为 cdrom
导入虚拟机,如下:
virt-install \
-n Windows10 \
--os-variant=win10 \
--ram=4096 \
--vcpus=2 \
--disk path=/var/lib/libvirt/images/Windows10.img,bus=virtio,size=256 \
--graphics vnc,listen=192.168.11.1 --noautoconsole \
--cdrom /opt/aria2c/downloads/en-us_windows_10_enterprise_ltsc_2021_x64_dvd_d289cf96.iso \
--disk path=/opt/aria2c/downloads/virtio-win-0.1.262.iso,device=cdrom \
--network network=host-bridge
到磁盘选择界面,选择浏览驱动,再选择 virtio-win.iso
中对应的驱动即可
virsh 是一个用于管理虚拟机和虚拟化环境的命令行工具
虚拟机管理如下:
virsh list --all # 列出所有虚拟机
virsh start <vm-name> # 启动虚拟机
virsh shutdown <vm-name> # 关闭虚拟机(对于Windows而言无效)
virsh destroy <vm-name> # 强制关闭虚拟机(对Windows生效)
virsh reboot <vm-name> # 重启虚拟机
virsh undefine <vm-name> # 删除虚拟机(慎用)
virsh dominfo <vm-name> # 查看虚拟机配置
virsh edit <vm-name> # 编辑虚拟机配置
virsh clone <vm-name> --name <new-vm-name> # 克隆虚拟机
虚拟网络管理如下:
virsh net-list --all # 列出所有网络
virsh net-start <network-name> # 启动网络
virsh net-destroy <network-name> # 停止网络
virsh net-define <network-config.xml> # 导入网络配置
virsh net-undefine <network-name> # 删除网络配置
卷管理如下:
virsh pool-list --all # 列出所有卷
virsh pool-start <pool-name> # 启动卷
virsh pool-destroy <pool-name> # 关闭卷
virsh pool-define <pool-config.xml> # 导入卷
virsh pool-undefine <pool-config.xml> # 删除卷
快照管理如下:
virsh snapshot-create-as <vm-name> <snapshot-name> # 创建快照
virsh snapshot-list <vm-name> # 列出所有快照
virsh snapshot-revert <vm-name> <snapshot-name> # 恢复快照
virsh snapshot-delete <vm-name> <snapshot-name> # 删除快照