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

Ubuntu2204创建KVM桥接网络

作者:Chancel Yang, 创建:2023-04-23, 字数:3674, 已阅:115, 最后更新:2023-04-23

这篇文章更新于 362 天前,文中部分信息可能失效,请自行甄别无效内容。

1. 简介

KVM (Kernel-based Virtual Machine) 是一种开源虚拟化技术,它是 Linux 内核的一部分。KVM 能够将 Linux 系统转化为一个 hypervisor,允许多个虚拟机在同一台物理服务器上运行。KVM 可以在 x86 架构的服务器上运行,并支持多种操作系统,包括 Linux、Windows、BSD 等,KVM 提供了高性能、安全性和可扩展性。

2. 实践

2.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/netplan/00-installer-config.yaml,内容参考如下

Bash
network:
  ethernets:
    eno1: # 这是我的物理网卡,通过`ip a`可以确认,这里配置静态IPV4和动态IPV6
      dhcp4: no
      dhcp6: yes
  bridges:
    virbr1: # 创建一个桥接网卡,设置IP与DNS
      dhcp4: no
      addresses: [192.168.1.100/24]   
      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] # 桥接到我的物理网卡

使上述配置生效

Bash
sudo netplan apply --debug

以下是检查桥接网络的方法(来自fabianlee.org)

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

此时你的网络配置看起来应该类似如下,virbr1即我们配置的桥接网卡

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 virbr1 state UP group default qlen 1000
    link/ether 1c:69:7a:0c:a5:be brd ff:ff:ff:ff:ff:ff
    altname enp0s31f6
3: virbr1: <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 virbr1
       valid_lft forever preferred_lft forever

2.2. 网络配置

确认virbr1信息正常后,我们开始创建KVM的桥接网络配置,首先是编辑 /tmp/host-bridge.xml 文件,文件内容如下

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

让kvm读取这个文件作为网络配置

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

检查是否设置成功,检查方法如下,请确保AutostartState输出正常

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

再修改 /etc/sysctl.conf文件,添加允许ipv4转发,如下

Bash
net.ipv4.ip_forward=1

让上述ipv4转发设置生效

Bash
sudo sysctl -p

KVM的桥接网络便配置结束

2.3. 创建虚拟机

创建一个Alpine3.16操作系统的虚拟机,附带VNC远程,创建指令如下

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=127.0.0.1 --noautoconsole \
    --cdrom /var/lib/libvirt/images/Alpine3.16.iso

通过VNC+SSH隧道的方式连接到这个虚拟机,顺利完成安装,安装完成先关机,再编辑虚拟机的配置文件

Bash
sudo virsh edit Alpine3.16

添加如下部分配置

XML
<interface type='network'>
    <source network='host-bridge'/>
    <model type='virtio'/>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>

2.4. 检查

配置Alpine3.16静态IP为192.168.1.101,访问192.168.1.1没有问题则表示桥接网络配置成功

3. 结尾

参考资料

  • https://fabianlee.org/2022/09/20/kvm-creating-a-bridged-network-with-netplan-on-ubuntu-22-04/

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

account_circle
email
web_asset
textsms

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

还没有可以显示的留言...
[[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)]]