共计 5741 个字符,预计需要花费 15 分钟才能阅读完成。
在 fnOS 系统上安装 KVM 虚拟化,并使用 Cockpit 网页管理虚拟机,支持硬件直通功能,支持虚拟机快照,不影响 fnOS 系统更新,其他 Debian 底层可通用, 具体教程操作步骤如下:
1. 安装 KVM 虚拟化组件
首先,更新软件列表和系统包:
sudo apt update && sudo apt upgrade -y
安装 KVM 及相关工具软件:
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
运行以下命令检查 KVM 是否成功安装:
sudo systemctl status libvirtd
如果服务正在运行,KVM 安装成功。
2. 安装 Cockpit 管理工具
安装 Cockpit 及其虚拟机管理插件:
sudo apt install cockpit cockpit-machines
启动 Cockpit 服务:
sudo systemctl start cockpit
安装完成后即可打开浏览器,输入以下地址访问Cockpit
:
http://< 您的服务器 IP>:9090
使用您的 fnOS 用户名和密码登录,就可以管理服务器和虚拟机了。
3. 关闭 Apparmor 对 Libvirt
安全限制
Libvirt 在执行和访问系统文件的时候会被 Apparmor
阻挡,因此为了确保 Libvirt
始终有必须的权限,必须禁用apparmor
:
ln -s /etc/apparmor.d/usr.sbin.libvirtd /etc/apparmor.d/disable/
apparmor_parser -R /etc/apparmor.d/usr.sbin.libvirtd
执行完成后 reboot
重启机器。
4. 创建 Bridge
网络,使虚拟机通过 bridge0
桥接到物理网络
在 Cockpit Web 管理界面进行操作
5. 安装虚拟机(以 OpenWrt 为例)
在 Cockpit Web 管理界面进行操作(这一步需先创建虚拟机存储池)
6. 解决虚拟机网桥不通的问题
解决虚拟机无法 ping 通网桥(如 bridge0
)内其他主机的问题,需要在 nftables
的规则中添加放行 bridge0
网桥的规则。具体步骤如下:
1. 允许 bridge0
网桥的流量,在 filter
表的 FORWARD
链中添加规则,以允许通过 bridge0
网桥的流量,这样可以确保来自虚拟机的流量可以通过网桥转发到其他主机:
nft add rule ip filter FORWARD iifname "bridge0" accept
nft add rule ip filter FORWARD oifname "bridge0" accept
2. 保存规则,使用 nftables
提供的保存功能将当前规则保存到配置文件中:
sudo nft list ruleset > /etc/nftables.conf
3. 确保 nftables
服务在启动时加载配置:
sudo systemctl enable nftables
7. 解决虚拟机开机无法自动启动的问题
虚拟机无法自动启动原因是 libvirtd
服务过早启动,fnOS 的存储和挂载点未准备好,导致虚拟机存储池 vmdisk
未能挂载,虚拟机无法访问到磁盘文件,我们可以修改 libvirtd.service
启动服务,增加判断,当 fnOS 存储目录可以访问时,再启动libvirtd
,这样就可以让虚拟机正常自动启动。
编辑 libvirtd.service
文件:
sudo nano /lib/systemd/system/libvirtd.service
在 [Service]
中找到这一行:
ExecStart=/usr/sbin/libvirtd $LIBVIRTD_ARGS
修改为改为:
ExecStart=/bin/bash -c 'while [! -d /vol1/1000/vmdisk]; do sleep 5; done; /usr/sbin/libvirtd $LIBVIRTD_ARGS'
增加了对 /vol1/1000/vmdisk
路径访问到判断,可以按自己路径进行修改,改完以后效果:
[Service]
Type=notify
Environment=LIBVIRTD_ARGS="--timeout 120"
EnvironmentFile=-/etc/default/libvirtd
ExecStart=/bin/bash -c 'while [! -d /vol1/1000/vmdisk]; do sleep 5; done; /usr/sbin/libvirtd $LIBVIRTD_ARGS'
如果上述方法不生效,可以在 ExecStart= 那行上面增加延迟启动:ExecStartPre=/bin/sleep 10
,最后的 10 代表 10 秒可以根据自己机器启动速度进行调整,这个方法比较稳定一些。
至此,教程结束,虚拟机一切功能正常,fnOS 更新不会影响虚拟机的使用,虚拟机的磁盘文件在飞牛的存储池内,也能保证虚拟机数据的安全性。
调整虚拟机关机超时时间(可选)
有些虚拟机不支持 acpid 或者无法安装 ga 代理工具,可能出现无法响应关机命令,造成 fnOS 关机或者重启过慢。
可以 修改 /etc/default/libvirt-guests
文件中的相关设置,调整关机超时时间减少等待,配置文件也 可以控制虚拟机关机的相关动作,默认的关机时间为 300s,即 5 分钟:
SHUTDOWN_TIMEOUT=300
根据自己情况修改,修改完成后,重新启动 libvirt 服务生效:
sudo systemctl restart libvirtd
虚拟机的快照功能(可选)
如果需要使用快照功能,需要使用下面命令将 img 格式的磁盘文件转换为 qcow2 格式:
qemu-img convert -f raw -O qcow2 /path/to/source.img /path/to/destination.qcow2
使用 iptables 解决虚拟机网桥不通(无需)
无需再次操作,仅供参考,无需操作,教程已用 nf
实现:
1. 放行 bridge0 流量:
sudo iptables -A FORWARD -i bridge0 -j ACCEPT
sudo iptables -A FORWARD -o bridge0 -j ACCEPT
2. 安装 iptables-persisten 使 tiptables 规则持久化保存:
sudo apt install iptables-persistent
虚拟机配置数据的备份(可选操作)
- 虚拟机创建好以后,配置文件存放在
/etc/libvirt/qemu/
路径下 - 可以使用 sh 脚本配合 crontab 计划任务,定时对此路径下的文件进行备份,当系统意外崩溃损坏后重装后,可以导入虚拟机的配置文件,快速恢复虚拟机。
- 配置文件不是非常重要,就是些虚拟机的 CPU 核心数、内存、磁盘路径、系统等硬件信息。根据自己情况进行备份即可,相比之下虚拟磁盘文件是最重要的,有虚拟磁盘重建虚拟机也就是分分钟的事。
- 所以不建议在系统盘创建存储空间存放数据,虚拟磁盘等重要的用户数据应该存放在带有效验恢复能力的 RAID1 RAID5 等阵列中,加以保护。
飞牛注意事项(公测中,谨慎使用,小心数据丢失)
- 建议把飞牛 OS 安装在独立的硬盘上,不要在系统盘上再创建存储空间存储数据。
- 按上面做法,在系统盘损坏或者系统损坏重装后,至少不会丢失存储空间的数据。
- 存储空间建议使用 RAID1 RAID5 等具有效验恢复能力的阵列存储,提升安全性。
- 此操作需要具备一定的 Linux 和网络基础知识,不建议新手对 fnOS 底层进行修改操作。
- fnOS 仍在测试阶段,可能发生数据丢失损毁的情况,不建议存放重要数据。
- 虚拟机内不建议存放重要数据,以免虚拟文件损坏导致数据丢失。
- 无论如何,重要的数据使用冷备份、网盘备份等多重备份才能确保其安全性。
硬件直通的配置(参考)
一般情况下的直通配置
新版的内核和 KVM,无需过多的配置,在硬件正常的支持的情况下,只需要在 grub
文件的 CMDLINE
增加 intel_iommu=on
参数,开启 vt-d
功能,大部分硬件就能够正常直通:
- 编辑 GRUB 配置:
sudo nano /etc/default/grub
- 找到
GRUB_CMDLINE_LINUX_DEFAULT
行,并添加intel_iommu=on
:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on i915.force_probe=7d55"
原有的参数不清楚的不要动,保持不变,把 intel_iommu=on
插入其中即可。
- 更新 GRUB:
sudo update-grub
- 重启系统:
sudo reboot
通过上述步骤,大部分设备就可以正常直通了,虚拟机添加了 pci 设备后,在启动虚拟机时,KVM 其实可以自动启用 vfio 相关模块,将设备驱动卸载,绑定 VFIO 驱动实现直通,无需额外人为操作干预。
屏蔽驱动的配置方法
但如果某些设备被系统占用,无法解除,可以去检查宿主机是否正在使用这个设备,确认宿主不需要这个设备的情况下,可以在设备在开机时绑定到 VFIO 或者屏蔽指定硬件驱动加载,确保直通能够成功。
例如 nvidia 显卡就需要屏蔽驱动:
编辑 blacklist 屏蔽 N 卡驱动 nouveau,并增加允许不安全中断参数:
nano /etc/modprobe.d/blacklist.conf
增加参数:
blacklist nouveau
options vfio_iommu_type1 allow_unsafe_interrupts=1
编辑完成后更新 initramfs:
update-initramfs -u -k all
重启生效:
reboot
上述完成后,N 卡就能够正常直通了,目前 N 卡已经解除了对虚拟化的限制,直接使用最新的驱动就可以,不会再出现错误代码 43 的情况。
开机绑定 VFIO 的方式
某些设备直通失败,可能是系统在开机时进行了调用和加载,可以采用 vfio 绑定的方式来确保直通能够成功,先让系统开机加载 vfio 模块,编辑 modules 文件:
nano /etc/modules
增加下面 3 个参数
vfio
vfio_pci
vfio_iommu_type1
vfio_virqfd #Linux 内核高于 6.2 可以不加 飞牛就不需要
编辑完成后更新 initramfs:
update-initramfs -u -k all
重启生效:
reboot
重启后检查是否加载成功:
lsmod | grep vfio
需要将设备绑定到 VFIO 的话,先检查设备 ID:
ls -nn
例如:
00:17.0 SATA controller [0106]: Intel Corporation 200 Series PCH SATA controller [AHCI mode] [8086:a282]
最后面的 8086:a282
就是设备 ID
编辑屏蔽文件 conf
,只要在/etc/modprobe.d/
路径下的 conf 文件,都会加载生效:
nano /etc/modprobe.d/vfio.conf
加入屏蔽如下参数,ID 就是上面获得的:
options vfio-pci ids=8086:a282
如果还需要绑定其他设备,把 id 加到后面,使用逗号分隔即可。例如:
options vfio-pci ids=10de:249d,10de:228b
编辑完成后更新 initramfs:
update-initramfs -u -k all
重启生效:
reboot
完成上述操作后,一般就能直通成功。
其他情况
如果直通还有问题,可以在 grub 的 cmdline 再增加下面参数:
pcie_acs_override=downstream,multifunction vfio_iommu_type1.allow_unsafe_interrupts=1
允许 PCIe ACS 覆盖和 VFIO 不安全的中断,编辑后,记得更新 grub
硬件直通总结:
总之硬件直通是一个复杂的工作,跟 linux 内核也有着关系,不同硬件直通起来会有不同的情况,有些硬件直通起来就很容易,基本上不用配置什么,有些硬件就比较容易失败,需要我们反复进行尝试,一般情况下服务器平台就很容易,使用品牌主板的台式机 Desktop 平台就比移动端和低功耗平台容易些,最后,祝大家都能直通成功,打造自己完美的 NAS 系统。
卸载 KVM 虚拟化及 Cockpit
有朋友问怎么卸载,其实反向操作,移除软件包就可以了:
1. 停止虚拟机和 Cockpit 服务
首先,确保所有正在运行的虚拟机已停止,然后停止 Cockpit 服务:
sudo systemctl stop cockpit
2. 卸载 KVM 虚拟化
卸载 KVM 相关的软件包:
sudo apt-get purge qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils
3. 卸载 Cockpit 和 cockpit-machines
卸载 Cockpit 及其虚拟机管理插件:
sudo apt-get purge cockpit cockpit-machines
4. 清理配置文件
如果需要,可以删除相关的配置文件和目录:
# 清理 KVM 相关配置
sudo rm -rf /etc/libvirt/
sudo rm -rf /var/lib/libvirt/
# 清理 Cockpit 相关配置
sudo rm -rf /etc/cockpit/
sudo rm -rf /var/lib/cockpit/
5. 更新包列表
最后,更新包列表,清理未使用的包:
sudo apt-get autoremove
sudo apt-get autoclean
完成上述步骤后,KVM
虚拟化、Cockpit
及 cockpit-machines
将从系统中完全卸载,相关依赖和配置数据也全部清理完成。。
杂七杂八的闲聊
有朋友担心虚拟化性能有损耗,我这边进行了实测,单核性能虚拟机是物理机的 98.9%,性能损失不到 1.1%,多核性能虚拟机是物理机的 96.6%,损失不到 3.4%。这样的损耗符合 KVM 的表现,甚至比 UNRAID 系统的虚拟机还要好一些,日常使用几乎没有区别无法感知。
CPU 和直通的显卡等硬件,性能都不会有太大的损耗。只有虚拟磁盘性能相比物理设备性能下降较为严重,这会影响到网心云等对 IO 要求高的 CDN 业务的用户,可以考虑直通物理磁盘,或者开启缓存加速 writeback 来提升磁盘性能。