Running NixOS on Proxmox

Michael Lynch

在 Proxmox 上執行 NixOS

相容性:本教學適用於 Proxmox 8.x 與 NixOS 24.05。

我在試用 NixOS 時遇到的其中一個障礙,就是無法在自己慣用的虛擬機伺服器 Proxmox 上執行它。

經過反覆嘗試後,我摸索出以 Proxmox 容器的形式安裝 NixOS 的方法。

下載 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 進行翻譯