Running NixOS on Proxmox

Michael Lynch

在 Proxmox 上运行 NixOS

原文由 Michael Lynch 发布,订阅该博客

兼容性:本教程适用于 Proxmox 8.x 和 NixOS 24.05。

我在尝试 NixOS 时遇到的障碍之一,就是无法在自己常用的虚拟机服务器 Proxmox 上运行它。

通过一番摸索,我找到了将 NixOS 作为 Proxmox 容器来安装的方法。

下载 NixOS 容器镜像

首先,下载最新的 NixOS x86_x64 lxdContainerImage 镜像。对于其他硬件架构,请参阅这条 GitHub 评论

警告:Hydra 上还有一个名为 proxmoxLXC.x86_64-linux 的构建。我原本以为它在 Proxmox 上的兼容性会更好,但它似乎有问题。虽然能启动 NixOS,但登录时不接受任何标准的 NixOS 凭据(nixosroot)。

撰写本文时,最新的 NixOS 容器构建版本是 275970650,不过你阅读本文时只需点击最新的构建即可。

最新构建页面截图,显示每天都有一次 NixOS 容器镜像构建。

在构建结果页面,点击标有 nixos-system-x86_64-linux.tar.xz 的链接以下载镜像:

2023-09-21 的一次 NixOS 构建的元数据页面截图

将镜像上传至 Proxmox

现在该将镜像上传到 Proxmox 了。滚动找到你的某个 Proxmox 存储节点。

点击你想使用的存储节点。默认的存储节点名为 local,不过你可能还有其他节点。

Proxmox 服务器视图中 local 存储节点菜单项的截图

在存储节点页面,点击“CT Templates”,然后点击“Download from URL”。

存储节点设置页面截图,显示已选中 CT Templates 标签页,箭头指向 Upload 按钮

下载的 NixOS 容器镜像文件名中不包含任何版本或日期信息。为了便于管理,我将其重命名为:

  • nixos-2024-10-21-lxdContainerImage.x86_64-linux.tar.xz

这样重命名后,日后在 Proxmox 中看到该文件时就能辨认出这是哪个版本的 NixOS,不过这一步是可选的。

下载设置截图,顶部显示构建 URL,中间字段为自定义文件名

点击“Download”即可将模板下载到 Proxmox。

创建 NixOS 容器

警告:通过 Proxmox 网页界面创建容器的方式不适用于此模板。你需要通过 Proxmox 终端来完成这一步。

接下来,通过 SSH 连接到你的 Proxmox 系统,并切换到 root 用户:

ssh root@pve

在 Proxmox 的 SSH 会话中,为新的 NixOS 容器设置以下参数:

# Where the template file is located
TEMPLATE_STORAGE='local'
# Name of the template file downloaded from Hydra.
TEMPLATE_FILE='nixos-2024-10-21-lxdContainerImage.x86_64-linux.tar.xz'
# Name to assign to new NixOS container.
CONTAINER_HOSTNAME='nixos'
# Which storage location to place the new NixOS container.
CONTAINER_STORAGE='local'
# How much RAM to assign the new container.
CONTAINER_RAM_IN_MB='8192'
# How much disk space to assign the new container.
CONTAINER_DISK_SIZE_IN_GB='80'

设置好这些参数后,使用 pct create 创建新的 NixOS 容器:

pct create "$(pvesh get /cluster/nextid)" \
  --arch amd64 \
  "${TEMPLATE_STORAGE}:vztmpl/${TEMPLATE_FILE}" \
  --ostype unmanaged \
  --description nixos \
  --hostname "${CONTAINER_HOSTNAME}" \
  --net0 name=eth0,bridge=vmbr0,ip=dhcp,firewall=1 \
  --storage "${CONTAINER_STORAGE}" \
  --memory "${CONTAINER_RAM_IN_MB}" \
  --rootfs ${CONTAINER_STORAGE}:${CONTAINER_DISK_SIZE_IN_GB} \
  --unprivileged 1 \
  --features nesting=1 \
  --cmode console \
  --onboot 1 \
  --start 1

登录 NixOS

你的 NixOS 容器现已配置完成,应该已经在运行了。

令人困惑的是,如果你打开新容器的 Console 标签页,只会看到一片黑屏:

Proxmox 容器 Console 标签页中黑屏的截图

此时按下回车键,就应该能看到标准的 NixOS 登录提示。你可以使用用户名 root 且无需密码登录。

Proxmox 容器 Console 标签页中 NixOS 默认登录提示的截图

获取 NixOS 的 SSH 访问权限

奇怪的是,NixOS 容器镜像自带的 configuration.nix 文件无法正常工作。如果你尝试运行 nixos-rebuild,会看到关于缺少 lxd.nix 文件的报错。即使修复了这个问题,仍会出现其他 systemd 错误。

在修复这些问题之前,最好先获取 SSH 访问权限。我找到的最简单方法是将你的 SSH 公钥下载到系统上。如果你有一个已配置 SSH 密钥的 GitHub 账号,可以按以下方式操作:

GITHUB_USERNAME='your-github-username' # Replace this.

mkdir -p ~/.ssh && \
  curl "https://github.com/${GITHUB_USERNAME}.keys" > ~/.ssh/authorized_keys

完成之后,你应该就可以通过 ssh root@nixos SSH 登录到 NixOS 系统了。

配置 NixOS

我为作为 Proxmox 容器运行的 NixOS 服务器系统创建了一份基础配置。你可以通过运行以下命令来下载这份配置:

curl \
  --show-error \
  --fail \
  https://mtlynch.io/notes/nixos-proxmox/configuration.nix \
  > /etc/nixos/configuration.nix

运行以下命令以应用新配置:

nix-channel --update && \
  nixos-rebuild switch --upgrade && \
  echo "install complete, rebooting..." && \
  poweroff --reboot

至此,你就拥有了一个基础的 NixOS 服务器系统,可以根据需要自行配置了。

参考资料

本文章由 muse-spark-1.2-contributor 进行翻译

评论