html

即使你只是将脚浸入Proxmox生态系统以运行虚拟机,你肯定会在后面遇到LXC。尽管提供的隔离功能较弱,LXC相当灵活,并且消耗的资源仅为其虚拟机对应物的一小部分。随着Proxmox VE Helper-Scripts库提供大量有用的模板,LXC的部署极其简单,使其非常适合低功率设备的新手和硬核服务器拥有者。

然而,你会发现LXC有两种类型:特权和非特权,你可以选择任一变体。大多数初始化脚本通常默认使用非特权LXC,你经常会听到家庭实验室的用户(包括我自己)提倡使用这些容器。这是因为它们的特权对应物可能会带来重大的安全挑战,即使你还是Proxmox新手,它们看起来也许无害(而且更有用)。

乍一看,特权LXC提供了无忧的体验

乍一看,特权LXC提供了无忧的体验

将设备传递给它们非常简单

将设备传递给它们非常简单

当你试图在Proxmox主机上部署多个GPU密集型服务,如Ollama、Immich(至少对于机器学习部分)和Jellyfin时,走LXC这条路听起来更不错。毕竟,你不需要研究SR-IOV就能把同一张卡传给不同的虚拟机,也不必处理它们占用更多系统资源的倾向。你也不用修改内核模块,还要跑好几个脚本才能让GPU直通到你的虚拟机。

虽然前两点适用于无特权容器,但传递你的 PCI 设备(甚至是连接到 USB 端口的设备)可能会是一场噩梦。毕竟,你需要编辑多个配置文件,还要运行不同的命令,才能给无特权 LXC 授予正确的权限。如果有时候出现问题,排查 UID/GID 映射可真让人头疼。

相比之下,特权容器传递设备就方便多了。一旦你从主机获取了外设的设备路径,就可以直接把它粘贴到你选择的 LXC 的资源选项卡的添加部分。GPU 通常需要在容器里装上合适的驱动,但这比把它们传递给无特权 LXC 要简单多了。

网络共享同样不需要任何变通

网络共享同样不需要任何变通

非特权容器出于安全考虑,完全禁用了网络共享,这与设备直通不同。对于像我这样在专用NAS服务器上存储电子书、图片、ROM和提取文件的人来说,非特权容器不支持挂载网络共享是个大问题,因为这让媒体服务器LXC无法与存储的文件配对,除非采取一些变通方法。

而且,这些变通方法充其量也只是勉强可行。例如,我在主机上挂载了我的SMB共享,这样我就可以将它们与非特权的Jellyfin、Calibre-Web、Immich和RomM LXC配对。现在,强制LXC使用主机上的挂载点并不理想,如果我在高可用性集群中配置它们,甚至可能会导致它们失效。对于NFS共享,这个解决方案就更复杂了,因为你还得处理与普通系统设备相同的权限问题。

另一方面,特权 LXC 支持网络共享,因此在与媒体管理应用程序一起使用时,无需经历多个步骤。其实,我最开始把我的 Jellyfin 服务器部署成特权容器,就是为了避免这些问题。幸好我在可能对主机造成不可逆损害之前意识到了这个错误。

但它们对注重安全的朋友来说是个噩梦

但它们对注重安全的朋友来说是个噩梦

毕竟,它们拥有与您的 Proxmox 节点的根用户相同的权限

毕竟,它们拥有与您的 Proxmox 节点的根用户相同的权限

虚拟化环境最大的优势之一是它们与主机机器相对隔离。当然,至少对于一般的虚拟机和非特权 LXC 来说是这样的。你知道,特权容器让挂载网络共享和配置设备直通变得特别简单,这正是因为 LXC 的根 ID 映射到了实际 Proxmox 主机的根用户。实际上,容器的权限和 PVE 的根用户是一样的。

如果容器受到威胁,恶意软件可能会轻易传播到 Proxmox 主机并感染您家庭实验室的其余部分。有人可能会认为某些恶意软件能够突破严格隔离的虚拟机,但事实是 LXC 和主机共享相同的 UID 映射,使得有特权的容器更加脆弱,即使您的家庭服务器没有暴露在互联网上。

非特权容器通过使用映射到主机上随机(通常是一个较大的数字)的 UID/GID 来解决这个问题,这些 ID 权限非常有限,这正是让在这些 LXC 上进行设备直通变得如此麻烦的原因。