使用 muiltipass 在 linux 上创建虚拟机 - 桥接主机网络

背景

采购了几台 Linux 机器用于开发测试,通过 ddns 服务可以在外网通过 ipv6 访问到这些机器。

由于物理机数量有限,单机配置过剩,需要拆分为多个虚拟机以便更多开发者使用,打算采取简单易用的 multipass 做虚拟机管理。

  • 虚拟机需要能够通过外网连接,方便不在办公室的开发者使用
  • 使用 multipass 创建虚拟机,默认 driver 为 qemu,不支持指定自定义网口,无法桥接到公司网络,外网就不能连接该机器
  • 需将 multipass 默认 driver 改为 lxd, 创建桥接网络,将虚拟机桥接到公司网络
  • 由于电信的 IP 是动态分配的,需执行计划任务,定期将最新的 IP 更新到域名解析上(DDNS)

其中 DDNS 是本地跑一个计划任务,每分钟将本机 ip 上报给一个 laf 云函数,云函数会将 ip 更新到域名解析上。

关于 multipass,参考 multipass 安装和使用

安装和配置 multipass

1
2
3
4
5
6
7
8
9
10
11
12
13
# install multipass
sudo snap install multipass
sudo snap info multipass

# install lxd
sudo snap install lxd

# change multipass driver from `qemu` to `lxd`
multipass set local.driver=lxd
sudo snap connect multipass:lxd lxd

# !IMPORTANT you must run this command to apply multipass driver change
sudo snap info multipass

创建 bridge 网卡 br0,在下面文件增加 bridges 字段部分:

1
sudo vim /etc/netplan/00-installer-config.yaml
1
2
3
4
5
6
7
8
9
10
network:
ethernets:
enp6s0:
dhcp4: true
bridges:
br0:
dhcp4: true
interfaces:
- enp6s0
version: 2

其中 enp6s0 是物理机的网卡,名字会和你的环境不一样,可以通过 ip a 查看,替换为自己的实际的网卡名。

应用以上配置

1
2
3
4
5
6
7
sudo netplan apply 

# 查看新建的网卡配置
ip a show br0

# 查看 multipass 可用网卡
multipass networks

创建虚拟机

1
2
3
4
5
6
7
multipass launch --name k1 -c 2 -m 4G -d 20G --network br0
multipass ls # 查看其 vm ip

multipass shell k1 # 进入虚拟机

# 查看虚拟机网卡配置
ip a show

定时更新 DNS

创建脚本 /ddns.sh

1
2
3
4
5
6
7
8
9
10
sudo cat > /ddns.sh << EOF
#!/bin/bash
#ip=$(curl 6.ipw.cn)
ip=$(ip -f inet6 a | grep global | grep /128 | awk '{print $2}' | tr "/" ' ' | awk '{print $1}')
server=$(hostname)
curl "https://your_appid.lafyun.com/change-ip?key=xxxxx&server=$server&ip=$ip"
EOF

# 添加执行权限
sudo chmod +x /ddns.sh

添加到 crontab 中,crontab -e:

1
* * * * * /ddns.sh

DDNS 部分的配置和云函数代码接下来会单独写一篇文介绍。

其它

若宿主机器上没有 netplan 环境,可以通过以下命令安装:

1
2
3
4
sudo apt-get install network-manager  
sudo apt-get install network-manager-gnome # 这条可能不需要,未排除
sudo systemctl enable NetworkManager.service
sudo systemctl start NetworkManager.service

References