什么是 LXD

LXD 应该是虚拟化管理平台,他有两种底层虚拟技术,一个是 LXC 容器,一个是 kvm 虚拟机。
他提供了类似 docker hub 的东西,主流 linux 的 lxc 镜像和 kvm 镜像都有。
LXD 现在是 ubuntu 母公司 Canonical 的项目了,应该短时间不会太监。
LXD 提供 web ui,基本的使用还可以,但是有很多操作还是要命令行,网页不完善。
lxc
LXC 虚拟化,感觉和 docker 差不多,不过比 docker 更底层,更像虚拟机,但共享主机的内核。
他有 systemd,能运行服务,比如跑个 ssh 服务。
所以能在里边再装个 doceker。
ubuntu 24.04 旧版内核有 bug,会让 docker 无法运行,apt upgrade 到最新后就正常了。
到目前为止,我还没遇到能再虚拟机跑,但是不能再 lxc 跑的软件。
kvm
kvm 就不说了,就是 kvm。
lxd 就是包装了一层。
安装 LXD
说是装 lxd,其实他会把底层的 lxc 自动装上。
这里使用 ubuntu 24.04
首先,更新系统。
这一步是必要的,旧版的 24.04 内核有 bug,会导致 lxc 容器内的 docker 无法启动。
sudo apt update
sudo apt upgrade
通过 snap 安装 lxd,lxd 是通过 snap 分发的。
默认安装的是 lts 版,手动指定安装最新稳定版。
如果系统已经 lxd,snap 会提示已安装 lxd,要升级需要使用 refresh 命令。
不想管直接运行这三个命令就行了,不管输出
sudo apt install snapd
sudo snap install --channel=latest/stable lxd
sudo snap refresh --channel=latest/stable lxd
开启虚拟机支持
要用传统虚拟机,就装上 qemu,lxd 就能管理虚拟机了。
apt install qemu-system
一般来说,自己本地的机器都没事。
但是如果是装在 vps 上,可以检查机器是否支持 kvm。
sudo apt install cpu-checker # 安装检查工具
kvm-ok # 运行检查
# 输出结果
INFO: /dev/kvm exists
KVM acceleration can be used
初始化配置
sudo lxd init
按如下配置,注意开启外网访问。
Would you like to use LXD clustering? (yes/no) [default=no]:
Do you want to configure a new storage pool? (yes/no) [default=yes]:
Name of the new storage pool [default=default]:
Name of the storage backend to use (powerflex, zfs, lvm, pure, btrfs, ceph, dir) [default=zfs]: btrfs
Create a new BTRFS pool? (yes/no) [default=yes]:
Would you like to use an existing empty block device (e.g. a disk or partition)? (yes/no) [default=no]:
Size in GiB of the new loop device (1GiB minimum) [default=12GiB]: 32
Would you like to connect to a MAAS server? (yes/no) [default=no]:
Would you like to create a new local network bridge? (yes/no) [default=yes]:
What should the new bridge be called? [default=lxdbr0]:
What IPv4 address should be used? (CIDR subnet notation,“auto”or“none”) [default=auto]:
What IPv6 address should be used? (CIDR subnet notation,“auto”or“none”) [default=auto]:
Would you like the LXD server to be available over the network? (yes/no) [default=no]: yes
Address to bind LXD to (not including port) [default=all]:
Port to bind LXD to [default=8443]:
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]:
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]:
开启 web ui
默认是只开 rest api 的,开启 ui 并重启服务
sudo snap set lxd ui.enable=true
sudo systemctl reload snap.lxd.daemon
接下来可以通过浏览器访问 web 页面。
https://1.1.1.242:8443/
lxd 的页面很奇葩,通过本地证书验证。
进入这个页面,点击生成,网页上能生成两个证书,看起来是再浏览器里用 js 本地生成,都下载下来。
他的意思,把 crt 放到 lxd 的 host 里面,然后执行那个命令,添加信任,这实际是公钥。
然后把 pfx 导入到浏览器里,里面应该是完整的密钥对。
这样就能通过 pfx 证明你是你。
重启浏览器后重新进入这个页面,就能正常进入系统。

web ui 反向代理
他这种验证方式太麻烦了,还得安装证书,本想通过一些配置,关闭 LXD 验证系统,但是尝试无果。
最后使用 nginx 部署一个反向代理,然后由 nginx 向 lxd 提供这个证书。
把上面的 pfx 证书转成 ngixn 可识别的格式
openssl pkcs12 -in xxx.pfx -clcerts -nokeys -out clint.crt -nodes
openssl pkcs12 -in xxx.pfx -nocerts -out clint.key -nodes
另外,lxd 的前端代码,写死了 websocket 使用 ssl,所以整个网站必须要用 ssl。
这里给 localhost 自签一个证书
openssl req -x509 -newkey rsa:2048 -nodes -keyout localhost.key -out localhost.crt -days 365 -subj "/CN=localhost" -addext "subjectAltName=DNS:localhost,IP:127.0.0.1"
本地启一个 nginx,使用如下配置文件
events {worker_connections 1024;}
http {
server {
listen 443 ssl;
server_name localhost;
ssl_certificate localhost.crt;
ssl_certificate_key localhost.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass https://1.1.1.242:8443;
proxy_http_version 1.1;
proxy_set_header Connection "upgrade";
proxy_set_header Upgrade $http_upgrade;
proxy_ssl_certificate client.crt;
proxy_ssl_certificate_key client.key;
}
}
}
访问 localhost 可以观察到,无需验证,直接登录。
解决 docker 网络不兼容问题
如果不在 host 上装 docker,不会有任何问题
装上 docker 后,会出现所有容器无法上外网的问题
依据官方文档,他推荐的是卸载 docker,再一个 lxc 容器中运行 docker。废话。
或者很复杂的配置防火墙,不会,pass。
最终选择了直接执行下面的命令,看不懂,但好用,不过好像会降低安全性。
echo "net.ipv4.conf.all.forwarding=1" > /etc/sysctl.d/99-forwarding.conf
systemctl restart systemd-sysctl
CheetSheet
网络配置
# 设置端口转发
lxc config device add mycontainer myproxy proxy listen=tcp:0.0.0.0:80 connect=tcp:127.0.0.1:80
# 设置端口转发,并且开启 proxy protocol 协议,这个协议会给数据包加个头,用来告诉后边原始 ip
# nginx 等都支持解析这个协议
lxc config device add mycontainer myproxy proxy listen=tcp:0.0.0.0:80 connect=tcp:127.0.0.1:80 proxy_protocol=true
# 设置容器静态 ip
#eth0 是从默认 profile 里继承的,所以不能用 set,而用 override
lxc config device override mycontainer eth0 ipv4.address=123.123.123.123
安装 Windows
需要对原始 windows iso 镜像进行修补,注入一些驱动,才能开始装。
这点不好,凑活用。
https://ubuntu.com/tutorials/how-to-install-a-windows-11-vm-using-lxd
不如这个项目做的好
https://github.com/dockur/windows