systemd-nspawn 容器的快速巡演
在去年的更新中,我谈到了在 Ollama 上自托管的 LLMs 和 Open WebUI 在 systemd-nspawn 容器中隔离运行,并承诺撰写一篇关于它的博客文章。然而,在写这篇博客文章时,关于为什么我选择使用它而不是 Docker 的一个脚注意外地演变成了一篇完整的博文。这里是关于 systemd-nspawn 的实际帖子。从根本上说,systemd-nspawn 是一种基于 Linux 命名空间的轻量级容器技术,与 Docker 相似。不同之处主要在于镜像管理——systemd-nspawn 通常使用可写的根文件系统,运行方式更类似于虚拟机,而不是通过 Dockerfile 描述如何构建镜像和分发包含已准备好运行软件的只读预构建镜像。对于那些还记得使用 chroot 在不同的 Linux 发行版上运行软件的人来说,它也可以被描述为增强版的 chroot。我发现 systemd-nspawn 在以下场景中特别有用:当你想在 VPS 上以某种程度的隔离运行软件时,而由于不支持嵌套虚拟化,无法创建完整的虚拟机;当你需要共享对硬件的访问,如 GPU(这就是我在 systemd-nspawn 中运行 LLMs 的原因);当你不想有虚拟化的开销;当你希望直接访问主机系统上的某些文件,而不需要 resorting 到 virtiofs;以及当你通常会使用 Docker 但无法或不想使用的时候。有关理由,请参见脚注转变的博客文章。在这篇文章中,我将描述设置 systemd-nspawn 容器的过程,以及如何在一些常见场景中使用它们。更新(2025-05-19):添加了更安全的 Alpine 容器创建说明和一些有关设置 Alpine Linux 容器的更多指导。首先,chroot systemd-nspawn 像所有容器一样,需要在目录中有一个单独的 rootfs。由于它没有图像管理器来为你构建镜像,因此你需要使用传统的 Unix 方法来创建 chroot。毕竟,它是增强版的 chroot。对于 systemd-nspawn,典型的约定是将这些 rootfs 放在 /var/lib/machines/[hostname] 下,其中 hostname 为容器的名称。对于这个练习,我将使用操作系统的名称作为 hostname。每个 Linux 发行版都有自己创建新 rootfs 的方法,因此我们将讨论一些更常见的方法。我正在 Debian 上测试这一切,但没有理由你不能在其他发行版上进行任何尝试,只需替换等效的软件包。尽管如此,我可能会更深入地探讨 Debian,因为我对此更熟悉。对于 Debian 家族中 debootstrap,debootstrap 在这个博客中出现了很多次,主要是在手动从救援系统安装 Debian 这种疯狂的事情时。对于基于 Debian 的发行版,如 Ubuntu 或 Debian 本身,这是创建 rootfs 的工具。在基于 Debian 的操作系统上,使用 sudo apt install debootstrap 安装。它也可能在其他发行版上被打包,或者你可以直接从 Debian 的软件库中下载:$ curl -L https://salsa.debian.org/installer-team/debootstrap/-/archive/master/debootstrap-master.tar.gz | tar xz ... $ cd debootstrap-master/ $ ./debootstrap I: usage: [OPTION]... <suite> <target> [ <mirror> [ <script>]] ... 无论你用哪种方式安装 debootstrap,让我们在 /var/lib/machines/debian 创建 rootfs:$ sudo debootstrap --include = systemd,dbus,locales,bash-completion,curl bookworm /var/lib/machines/debian I: Target architecture can be executed I: Retrieving InRelease ... I: Base system installed successfully. 在这里,我们安装了 bookworm,但请随意将其替换为最新的 Debian 发行版。为了避免愚蠢的问题,我确保安装了 systemd 和 dbus,以及 locales,以避免在 apt 中出现奇怪的警告,bash-completion 让我在输入命令时不要烦恼,curl 以便稍后可以下载东西。这些中的一些稍后需要额外的配置,我们将在进入容器后完成。使用 dnf 安装 RHEL 衍生版本。首先,在另一个发行版上安装 dnf 和 rpm,例如在 Debian 上:$ sudo apt install dnf rpm ... 设置 dnf (4.14.0-3+deb12u1) ... 设置 rpm (4.18.0+dfsg-1+deb12u1) ...
阅读全文 →本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡