- 1. 环境说明
- 2. 安装KVM和libvirt
- 3. 配置br0物理网桥
- 3.1 备份Netplan配置
- 3.2 创建网桥配置
- 3.3 检查网桥
- 3.4 br0显示NO-CARRIER的解决方法
- 4. 创建libvirt桥接网络
- 5. 下载HAOS虚拟机镜像
- 6. 解压并扩容HAOS磁盘
- 7. 创建HAOS虚拟机
- 8. 查看HAOS控制台
- 9. 首次启动Home Assistant
- 10. 几个踩坑记录
- 10.1 virt-install提示必须指定osinfo
- 10.2 启动后一直返回UEFI Boot Manager
- 10.3 netplan try无法测试网桥
- 10.4 br0创建了但没有网络
- 10.5 virt-host-validate出现WARN或LXC FAIL
- 10.6 HAOS能联网,但Core里面DNS解析失败
- 10.7 Raspberry Pi Power Supply Checker无法使用
- 11. 常用管理命令
- 12. 总结
之前写过一篇《树莓派5通过NVME固态硬盘安装Home Assistant》,当时是直接把 HAOS 写入固态硬盘,树莓派启动之后就只能运行 Home Assistant 了。
后来又想让这台树莓派同时运行旁路由,例如 iStoreOS,如果继续使用裸机安装的方式就不太方便了。
折腾了一圈,最终采用了下面这套方案:
|
1 2 3 4 5 |
树莓派5 └── Debian 13 ├── KVM / QEMU / libvirt ├── Home Assistant OS虚拟机 └── iStoreOS虚拟机 |
这样既可以保留完整的 HAOS、Supervisor 和应用商店,又不会占用整台树莓派,后面还可以继续安装其他虚拟机。
这里完整记录一下安装过程,顺便把中间踩到的几个坑也写下来~
1. 环境说明
我这里使用的硬件和系统如下:
|
1 2 3 4 5 6 7 8 9 |
设备:Raspberry Pi 5 内存:8GB 硬盘:256GB NVME 宿主系统:Debian 13 Trixie ARM64 虚拟化:KVM + QEMU + libvirt HAOS内存:4GB HAOS CPU:2核 HAOS硬盘:64GB 网络模式:br0物理网桥 |
最终的网络结构是:
|
1 2 3 4 5 6 7 8 |
主路由 │ 树莓派eth0 │ Linux网桥br0 ├── Debian宿主机 ├── HAOS虚拟机 └── iStoreOS虚拟机 |
虚拟机通过网桥直接接入局域网,因此主路由会把 HAOS 当成一台单独的设备,并给它分配独立的局域网 IP。
2. 安装KVM和libvirt
首先更新软件包:
|
1 2 |
sudo apt update sudo apt upgrade -y |
安装虚拟化组件:
|
1 2 3 4 5 6 7 8 |
sudo apt install -y \ qemu-system-arm \ qemu-utils \ qemu-efi-aarch64 \ libvirt-daemon-system \ libvirt-clients \ virt-install \ bridge-utils |
启动 libvirt:
|
1 |
sudo systemctl enable --now libvirtd |
把当前用户加入 libvirt 和 kvm 用户组:
|
1 |
sudo usermod -aG libvirt,kvm "$USER" |
执行之后需要退出当前 SSH,再重新登录,否则用户组不会立即刷新。
|
1 |
exit |
重新连接后检查:
|
1 |
groups |
正常应该能看到:
|
1 |
libvirt kvm |
接着检查硬件虚拟化:
|
1 2 |
ls -l /dev/kvm sudo virt-host-validate |
我这里关键项目全部是 PASS:
|
1 2 3 |
/dev/kvm PASS /dev/vhost-net PASS /dev/net/tun PASS |
再检查 QEMU 支持的加速器:
|
1 |
qemu-system-aarch64 -accel help |
输出:
|
1 2 3 |
Accelerators supported in QEMU binary: kvm tcg |
看到 kvm 就说明树莓派的硬件虚拟化已经可以正常使用了。
测试一下 libvirt:
|
1 |
virsh -c qemu:///system list --all |
如果显示一个空表格,没有权限报错,就是正常的:
|
1 2 |
Id Name State -------------------- |
3. 配置br0物理网桥
这一步比较关键。
如果直接使用 libvirt 默认的 NAT 网络,HAOS 会被藏在宿主机后面,不方便局域网设备发现、广播和访问。
所以这里把树莓派的有线网卡 eth0 加入 br0 网桥,让虚拟机直接接入家庭局域网。
PS:修改网桥的时候,有线网络可能会短暂断开。最好提前连接好树莓派的 Wi-Fi,或者安装 Tailscale,通过备用地址操作,避免把自己关在门外~
先查看网卡:
|
1 |
ip -br addr |
我这里原来的地址是:
|
1 2 |
eth0 192.168.110.48 wlan0 192.168.110.49 |
查看有线网卡的 MAC 地址:
|
1 |
cat /sys/class/net/eth0/address |
我这里是:
|
1 |
2c:cf:67:b7:08:3a |
下面的配置需要把这个地址替换成你自己的。
3.1 备份Netplan配置
|
1 2 |
sudo cp -a /etc/netplan \ "/etc/netplan.backup-$(date +%Y%m%d-%H%M%S)" |
3.2 创建网桥配置
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
sudo tee /etc/netplan/99-br0.yaml >/dev/null <<'EOF' network: version: 2 renderer: NetworkManager ethernets: eth0: dhcp4: false dhcp6: false accept-ra: false bridges: br0: interfaces: - eth0 macaddress: 2c:cf:67:b7:08:3a dhcp4: true dhcp6: true accept-ra: true parameters: stp: false forward-delay: 0 EOF |
这里让 br0 使用了原来 eth0 的 MAC 地址,这样主路由通常还会继续分配原来的 IP。
修改配置文件权限:
|
1 2 |
sudo chown root:root /etc/netplan/99-br0.yaml sudo chmod 600 /etc/netplan/99-br0.yaml |
如果执行 netplan generate 时提示其他 YAML 文件权限太宽,也可以统一修改:
|
1 2 3 4 5 |
sudo find /etc/netplan /lib/netplan \ -maxdepth 1 \ -type f \ -name '*.yaml' \ -exec chmod 600 {} \; |
检查语法:
|
1 |
sudo netplan generate |
没有输出就说明语法正常。
然后应用配置:
|
1 |
sudo netplan apply |
注意一定要带 sudo,否则可能会报:
|
1 2 |
PermissionError: /run/NetworkManager/system-connections/... |
3.3 检查网桥
|
1 2 3 4 |
ip -br addr ip route bridge link nmcli -f NAME,TYPE,DEVICE connection show --active |
正确结果类似:
|
1 2 3 |
eth0 UP br0 UP 192.168.110.48/24 wlan0 UP 192.168.110.49/24 |
其中 eth0 不再有自己的 IP,而是作为 br0 的物理端口。
bridge link 应该显示:
|
1 |
eth0 ... master br0 state forwarding |
测试网络:
|
1 2 |
ping -I br0 -c 4 192.168.110.1 ping -I br0 -c 4 1.1.1.1 |
我这里最终的默认路由是:
|
1 2 |
default via 192.168.110.1 dev br0 default via 192.168.110.1 dev wlan0 |
因为 br0 的 metric 更小,所以优先走有线;Wi-Fi 只是备用。
3.4 br0显示NO-CARRIER的解决方法
我第一次应用配置后,出现了下面这种情况:
|
1 2 |
br0 DOWN eth0 192.168.110.48 |
也就是网桥创建了,但是 eth0 仍然被旧的 NetworkManager 配置占用,没有真正加入 br0。
先查看连接:
|
1 |
nmcli -f NAME,UUID,TYPE,DEVICE,AUTOCONNECT connection show |
我这里同时存在:
|
1 2 3 |
eth0 独立DHCP连接 netplan-eth0 br0桥接端口 netplan-br0 网桥 |
需要先通过 Wi-Fi 或 Tailscale 登录,然后切换连接:
|
1 2 3 |
sudo nmcli connection down eth0 sudo nmcli connection up netplan-br0 sudo nmcli connection up netplan-eth0 |
再次检查:
|
1 2 |
ip -br addr bridge link |
当看到:
|
1 2 |
br0 192.168.110.48/24 eth0 无IP |
以及:
|
1 |
eth0 ... master br0 state forwarding |
就说明桥接成功了。
建议重启一次,确认配置可以持久保存:
|
1 |
sudo reboot |
4. 创建libvirt桥接网络
宿主机的 br0 配置完成后,还需要在 libvirt 中定义一个桥接网络。
创建配置文件:
|
1 2 3 4 5 6 7 |
cat <<'EOF' | sudo tee /tmp/lan-bridge.xml <network> <name>lan-bridge</name> <forward mode="bridge"/> <bridge name="br0"/> </network> EOF |
导入:
|
1 2 3 |
sudo virsh net-define /tmp/lan-bridge.xml sudo virsh net-start lan-bridge sudo virsh net-autostart lan-bridge |
检查:
|
1 |
sudo virsh net-list --all |
正常显示:
|
1 2 3 |
Name State Autostart Persistent ------------------------------------------------ lan-bridge active yes yes |
查看具体配置:
|
1 |
sudo virsh net-dumpxml lan-bridge |
输出类似:
|
1 2 3 4 5 |
<network> <name>lan-bridge</name> <forward mode='bridge'/> <bridge name='br0'/> </network> |
后面创建虚拟机时,网卡就使用:
|
1 2 |
网络:lan-bridge 型号:virtio |
5. 下载HAOS虚拟机镜像
这里要注意,虚拟机不能下载树莓派5专用的:
|
1 |
haos_rpi5-xxx.img.xz |
应该下载:
|
1 |
haos_generic-aarch64-xxx.qcow2.xz |
因为宿主机和虚拟机都是 ARM64,所以需要使用 Generic AArch64 QCOW2 镜像。
本文安装时使用的是:
|
1 |
haos_generic-aarch64-18.1.qcow2.xz |
这里的版本号以自己下载时的实际版本为准。后面命令中的 18.1 也要替换成对应版本。
官方下载地址:
|
1 |
https://github.com/home-assistant/operating-system/releases |
由于树莓派直接从 GitHub 下载可能比较慢,我这里是在电脑上下载好,然后通过 scp 传到树莓派:
|
1 2 |
scp haos_generic-aarch64-18.1.qcow2.xz \ mcj@192.168.110.48:/tmp/ |
6. 解压并扩容HAOS磁盘
创建虚拟机目录:
|
1 |
sudo mkdir -p /var/lib/libvirt/images/haos |
解压镜像:
|
1 2 |
cd /tmp unxz haos_generic-aarch64-18.1.qcow2.xz |
如果系统提示没有 unxz 命令,可以先安装:
|
1 |
sudo apt install -y xz-utils |
移动到 libvirt 目录:
|
1 2 |
sudo mv haos_generic-aarch64-18.1.qcow2 \ /var/lib/libvirt/images/haos/haos.qcow2 |
原镜像比较小,我这里把虚拟磁盘扩容到了 64GB:
|
1 2 3 |
sudo qemu-img resize \ /var/lib/libvirt/images/haos/haos.qcow2 \ 64G |
设置权限:
|
1 2 3 4 5 |
sudo chown libvirt-qemu:libvirt-qemu \ /var/lib/libvirt/images/haos/haos.qcow2 sudo chmod 660 \ /var/lib/libvirt/images/haos/haos.qcow2 |
查看镜像:
|
1 2 |
sudo qemu-img info \ /var/lib/libvirt/images/haos/haos.qcow2 |
我这里显示:
|
1 2 3 4 |
file format: qcow2 virtual size: 64 GiB disk size: 428 MiB corrupt: false |
说明镜像正常。
7. 创建HAOS虚拟机
执行:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
sudo virt-install \ --connect qemu:///system \ --name haos \ --description "Home Assistant OS" \ --arch aarch64 \ --machine virt \ --cpu host-passthrough \ --vcpus 2 \ --memory 4096 \ --osinfo linux2024 \ --import \ --disk path=/var/lib/libvirt/images/haos/haos.qcow2,format=qcow2,bus=scsi,discard=unmap \ --controller type=scsi,model=virtio-scsi \ --network network=lan-bridge,model=virtio \ --boot uefi,firmware.feature0.name=secure-boot,firmware.feature0.enabled=no \ --graphics none \ --console pty,target.type=serial \ --noautoconsole |
几个重要参数:
|
1 |
--arch aarch64 |
表示创建 ARM64 虚拟机。
|
1 |
--cpu host-passthrough |
让虚拟机直接使用树莓派的 CPU 特性。
|
1 |
--memory 4096 |
分配 4GB 内存。
|
1 |
--network network=lan-bridge,model=virtio |
让虚拟机直接接入前面创建的物理网桥。
|
1 |
firmware.feature0.enabled=no |
明确关闭 Secure Boot。
Home Assistant 的 Generic AArch64 镜像需要使用 UEFI 启动,并且要关闭 Secure Boot。这里最好明确写出来,不要只使用简单的 --boot uefi。
创建完成后设置开机自动启动:
|
1 |
sudo virsh autostart haos |
查看虚拟机:
|
1 |
sudo virsh list --all |
正常显示:
|
1 2 3 |
Id Name State ---------------------- 1 haos running |
查看虚拟网卡:
|
1 |
sudo virsh domiflist haos |
正常应该看到:
|
1 2 3 |
Interface Type Source Model ------------------------------------------------ vnet0 network lan-bridge virtio |
8. 查看HAOS控制台
进入虚拟机控制台:
|
1 |
sudo virsh console haos |
如果没有马上显示内容,可以按一次回车。
退出控制台使用:
|
1 |
Ctrl + ] |
正常启动后会看到:
|
1 2 3 |
Welcome to Home Assistant homeassistant login: |
这里其实不用登录也可以直接使用 ha 命令。如果想进入系统 Shell,可以输入:
|
1 |
login |
然后会进入:
|
1 |
# |
常用命令例如:
|
1 2 3 4 5 |
ha supervisor info ha supervisor logs ha core info ha core logs ha network info |
查看虚拟机地址可以执行:
|
1 |
ha network info |
也可以进入 Shell 后执行:
|
1 |
ip -4 addr |
我这里 HAOS 从主路由获取到的地址是:
|
1 |
192.168.110.28 |
9. 首次启动Home Assistant
浏览器访问:
|
1 |
http://192.168.110.28:8123 |
或者尝试:
|
1 |
http://homeassistant.local:8123 |
第一次启动时,HAOS 还需要下载并启动 Supervisor、Home Assistant Core 等组件,所以不会立刻出现初始化页面。
如果执行命令时出现:
|
1 |
System is not ready with state: setup |
先不要重启,通常只是系统还在初始化。
可以查看日志:
|
1 |
ha supervisor logs |
或者只看最后几十行:
|
1 |
ha supervisor logs | tail -n 80 |
如果日志里一直在拉取镜像,就继续等待。
我这里第一次初始化花的时间比较长,主要还是取决于访问 GitHub 和 GHCR 的速度。我大概等了2小时~
等网页出现创建账号的界面,就说明安装完成了~
10. 几个踩坑记录
10.1 virt-install提示必须指定osinfo
第一次创建时出现:
|
1 |
--os-variant/--osinfo OS name is required |
这是新版 virt-install 强制要求填写系统类型。
命令里添加:
|
1 |
--osinfo linux2024 |
即可。
如果系统里没有 linux2024,可以查看可选项:
|
1 |
virt-install --osinfo list | grep -E '^linux|generic' |
也可以暂时使用:
|
1 |
--osinfo detect=on,require=off |
10.2 启动后一直返回UEFI Boot Manager
我第一次启动时,固件能识别到:
|
1 |
UEFI QEMU QEMU HARDDISK |
但是按回车后又回到了 Boot Manager,无法真正启动系统。
最后发现是 UEFI 自动选择了带 Secure Boot 的固件。
重新创建虚拟机时加入:
|
1 |
--boot uefi,firmware.feature0.name=secure-boot,firmware.feature0.enabled=no |
之后就可以正常启动了。
所以这里不要只写:
|
1 |
--boot uefi |
最好明确关闭 Secure Boot,省得再踩一次坑。
10.3 netplan try无法测试网桥
执行:
|
1 |
sudo netplan try --timeout 120 |
可能提示:
|
1 |
br0: reverting custom parameters for bridges and bonds is not supported |
这是因为 netplan try 无法自动回滚网桥的部分自定义参数。
确认 YAML 没问题后,直接执行:
|
1 |
sudo netplan apply |
即可。
10.4 br0创建了但没有网络
如果出现:
|
1 2 |
br0 DOWN eth0 仍然有IP |
说明旧的 NetworkManager 连接还占用着 eth0。
查看连接:
|
1 |
nmcli connection show |
然后停掉旧连接,启用:
|
1 2 3 |
sudo nmcli connection down eth0 sudo nmcli connection up netplan-br0 sudo nmcli connection up netplan-eth0 |
最终必须满足:
|
1 2 3 |
br0持有IP eth0没有IP eth0的master是br0 |
否则虚拟机无法通过网桥正常联网。
10.5 virt-host-validate出现WARN或LXC FAIL
我这里执行 virt-host-validate 时,除了关键项目通过之外,还出现了几个提示:
|
1 2 3 4 5 |
QEMU: cgroup memory controller support WARN QEMU: IOMMU support WARN QEMU: Secure Guest support WARN LXC: cgroup memory FAIL LXC: cgroup freezer FAIL |
这些提示不会影响当前的 HAOS 虚拟机。
只要下面几个关键项目是 PASS:
|
1 2 3 |
/dev/kvm /dev/vhost-net /dev/net/tun |
并且:
|
1 |
qemu-system-aarch64 -accel help |
输出中包含 kvm,就可以继续安装。
LXC 部分的 FAIL 只影响 LXC 容器,不影响 QEMU/KVM 虚拟机。IOMMU 的警告则表示不适合做 PCIe 设备直通,但普通的 VirtIO 网卡、VirtIO 磁盘以及 USB 设备直通仍然可以正常使用。
10.6 HAOS能联网,但Core里面DNS解析失败
后面安装 Xiaomi Home 集成时,我还遇到过一个比较隐蔽的问题。
在 HAOS Shell 中执行 curl 可以正常访问外网,但是 Home Assistant Core 日志一直报:
|
1 2 |
ClientConnectorDNSError DNS server returned general failure |
进入 Core 容器测试后发现,所有域名都解析失败:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
docker exec -i homeassistant python3 - <<'PY' import socket for host in ( "account.xiaomi.com", "ha.api.io.mi.com", ): try: print(host, socket.getaddrinfo(host, 443)) except Exception as err: print(host, repr(err)) PY |
最后检查 HAOS 的有线连接配置,发现 DHCP 下发的 DNS 被忽略了:
|
1 2 3 4 5 |
CON="$(nmcli -g GENERAL.CONNECTION device show enp1s0)" nmcli -g \ ipv4.method,ipv4.dns,ipv4.ignore-auto-dns,ipv4.gateway \ connection show "$CON" |
当时显示:
|
1 2 3 |
auto yes |
也就是 ipv4.ignore-auto-dns 被设置成了 yes,但又没有手动配置 DNS。
恢复 DHCP DNS:
|
1 2 3 4 5 6 |
nmcli connection modify "$CON" \ ipv4.method auto \ ipv4.dns "" \ ipv4.ignore-auto-dns no nmcli device reapply enp1s0 |
确认已经拿到 DNS:
|
1 |
PAGER=cat nmcli -f IP4.DNS,IP4.GATEWAY device show enp1s0 |
我这里恢复后显示:
|
1 2 |
IP4.DNS[1]: 192.168.110.1 IP4.GATEWAY: 192.168.110.1 |
然后重启 HAOS 内部 DNS 和 Core:
|
1 2 3 |
ha dns restart sleep 10 ha core restart |
测试 Supervisor DNS:
|
1 2 |
nslookup account.xiaomi.com 172.30.32.3 nslookup ha.api.io.mi.com 172.30.32.3 |
能够正常返回 IP 后,Core 里面的网络访问也恢复了。
这个问题和虚拟机本身没有直接关系,但如果以前手动改过 HAOS 的 DNS,后面又切回 DHCP,建议顺手检查一下 ipv4.ignore-auto-dns。
10.7 Raspberry Pi Power Supply Checker无法使用
HAOS改成运行在KVM虚拟机之后,原来的树莓派电源检测集成会提示:
|
1 |
Under-voltage monitoring is not supported on this device. |
这是正常现象,因为Home Assistant现在运行在QEMU/KVM提供的通用ARM虚拟硬件中,无法直接访问树莓派宿主机的固件和欠压检测接口。
这个集成可以直接删除,不会影响HAOS的其他功能。
需要检查树莓派真实供电状态时,应该在Debian宿主机执行:
|
1 |
vcgencmd get_throttled |
正常结果为:
|
1 |
throttled=0x0 |
如果后续需要在Home Assistant中显示电源状态,可以在Debian宿主机定时读取该值,再通过MQTT发送给HAOS。
11. 常用管理命令
启动虚拟机:
|
1 |
sudo virsh start haos |
正常关机:
|
1 |
sudo virsh shutdown haos |
强制关闭:
|
1 |
sudo virsh destroy haos |
重启:
|
1 |
sudo virsh reboot haos |
进入控制台:
|
1 |
sudo virsh console haos |
查看运行状态:
|
1 |
sudo virsh list --all |
查看虚拟机配置:
|
1 |
sudo virsh dumpxml haos |
查看虚拟机网卡:
|
1 |
sudo virsh domiflist haos |
查看虚拟机磁盘:
|
1 |
sudo virsh domblklist haos |
启用开机启动:
|
1 |
sudo virsh autostart haos |
取消开机启动:
|
1 |
sudo virsh autostart --disable haos |
查看开机启动状态:
|
1 |
sudo virsh dominfo haos | grep Autostart |
12. 总结
OK,到这里,树莓派5上的 HAOS 虚拟机就安装完成了。
最终效果:
|
1 2 |
Debian宿主机:192.168.110.48 HAOS虚拟机: 192.168.110.28 |
两者都通过 br0 接入局域网,互相独立。
相比直接把 HAOS 写入整个 NVME,这种方式稍微复杂一些,但是灵活性高了很多:
|
1 2 3 4 5 |
HAOS保留完整Supervisor和应用商店 宿主机仍然可以运行其他服务 可以继续创建iStoreOS虚拟机 HAOS可以独立重启和备份 虚拟机之间的网络配置互不干扰 |
树莓派5的性能跑一个普通家庭使用的 HAOS 完全够用,剩余资源还可以继续部署一台轻量级的旁路由虚拟机。
中间最容易踩坑的地方主要有三个:
|
1 2 3 |
物理网桥br0 ARM64 UEFI Secure Boot |
把这三个地方配置正确,后面基本就比较顺利了。
另外,如果后面遇到“HAOS宿主机能联网,但是Home Assistant Core里面解析不了域名”的情况,也要检查一下 HAOS 连接配置中的 ipv4.ignore-auto-dns。
记录一下,给准备在树莓派上使用虚拟机安装 Home Assistant OS 的朋友做个参考~





最新评论
同样
站长您好,亚马逊云咨询推广资源,望建立联系,可邮件,谢谢。
换友情链接吗?
看你的站做的挺不错的
恭喜!!太强了,硕博连读啊
雁过留毛,人过留名。
看不懂但大受震撼
每天都在战争,希望2026和平.