Running NixOS on Proxmox

Michael Lynch

在 Proxmox 上運行 NixOS

原文由 Michael Lynch 發布,訂閱此部落格

相容性:本教學適用於 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 伺服器檢視中 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 分頁中黑畫面的截圖

如果按下「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 連線至你的 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 進行翻譯

留言