Running NixOS on Proxmox

Michael Lynch

在 Proxmox 上运行 NixOS

兼容性:本说明适用于 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 服务器视图中本地存储节点菜单项的截图

在存储节点中,点击“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 标签页中黑屏的截图

如果按下“Enter”键,你应该会看到标准的 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 服务器系统,可以根据需要进行任意配置。

参考资料

原文由 Michael Lynch 发布

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