menu E4b9a6's blog
rss_feed
E4b9a6's blog
有善始者实繁,能克终者盖寡。

Ubuntu2204创建KVM桥接网络

作者: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 系统下创建一个桥接网络和使用桥接网络的虚拟机

1. 实践

1.1. 准备工作

安装Ubuntu2204后,安装KVM软件

Bash
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

TEXT
...
net.ipv4.ip_forward=1

让上述 ipv4 转发设置生效

Bash
sudo sysctl -p

1.2. 创建网络桥接

Ubuntu2204 采用了 netplan 作为网络管理器,我的网络配置文件位于 /etc/netplan/00-installer-config.yaml,内容参考如下:

Bash
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

使上述配置生效

Bash
sudo netplan apply --debug

桥接网络的一些查看方式

Bash
# 查看所有桥接状态
sudo networkctl -a
# 查看br0状态
sudo networkctl status br0
# 显示所有桥接信息
sudo brctl show
# 查看br0的网络信息
ip a show br0

打印当前的网络如下:

Bash
➜  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 即桥接网卡名称

2. KVM 配置

2.1. 导入桥接网络

在确认br0信息后,开始创建KVM的桥接网络配置

编辑 /tmp/host-bridge.xml 文件,文件内容如下:

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

读取这个文件作为 KVM 的网络配置:

Bash
sudo virsh net-define /tmp/host-bridge.xml
sudo virsh net-start host-bridge
sudo virsh net-autostart host-bridge

检查桥接网络是否已经导入 KVM 中:

Bash
sudo virsh net-list --all

我的输出如下:

Bash
➜ sudo virsh net-list --all 
 Name          State      Autostart   Persistent
----------------------------------------------- host-bridge   active     yes         yes

请确保 State 和 Autostart 的值是 active 和 yes

2.2. 创建虚拟机

Alpine3.16 为例,创建指令如下:

Bash
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 直接安装

安装后检查是否可以顺利访问局域网内其他机器

3. 写在最后

3.1. 安装 Windows 没有磁盘可以选?

如果使用 KVM 安装 Windows 会遇到在VNC界面中无法找到任何虚拟磁盘,这是因为缺少了 VirtIO 驱动

下载地址:

重新创建 Windows 的虚拟机,将下载后的 virtio-win.iso 作为 cdrom 导入虚拟机,如下:

Bash
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 中对应的驱动即可

3.2. 如何管理虚拟机?

virsh 是一个用于管理虚拟机和虚拟化环境的命令行工具

虚拟机管理如下:

Bash
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>    # 克隆虚拟机

虚拟网络管理如下:

Bash
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>       # 删除网络配置

卷管理如下:

Bash
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> # 删除卷

快照管理如下:

Bash
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>       # 删除快照

[[replyMessage== null?"发表评论":"发表评论 @ " + replyMessage.m_author]]

account_circle
email
web_asset
textsms

评论列表([[messageResponse.total]])

还没有可以显示的留言...
gravatar
[[messageItem.m_author]] [[messageItem.m_author]]
[[messageItem.create_time]]
[[getEnviron(messageItem.m_environ)]]
[[subMessage.m_author]] [[subMessage.m_author]] @ [[subMessage.parent_message.m_author]] [[subMessage.parent_message.m_author]]
[[subMessage.create_time]]
[[getEnviron(messageItem.m_environ)]]