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コンテナイメージのビルドが毎日1件表示されている、最新ビルドのページのスクリーンショット。

ビルド結果のページで、nixos-system-x86_64-linux.tar.xzと表示されたリンクをクリックしてイメージをダウンロードします。

2023年9月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のWeb UIからコンテナを作成しても、このテンプレートでは動作しません。この手順はProxmoxのターミナルから行う必要があります。

次の手順では、ProxmoxシステムにSSH接続し、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タブを開くと、黒い画面しか表示されません。

Consoleタブ内のProxmoxコンテナで黒い画面が表示されているスクリーンショット

「Enter」を押すと、標準のNixOSプロンプトが表示されるはずです。ユーザー名root、パスワードなしでログインできます。

Consoleタブ内のProxmoxコンテナで、NixOSのデフォルトログインプロンプトが表示されているスクリーンショット

NixOSへのSSHアクセスを設定する

不思議なことに、NixOSコンテナイメージに含まれるconfiguration.nixファイルは動作しません。nixos-rebuildを実行すると、lxd.nixファイルがないというエラーが表示されます。それを修正しても、ほかにもsystemdのエラーがあります。

それらを修正する前に、SSHアクセスを用意しておくと楽です。私が見つけた最も簡単な方法は、SSH鍵をシステムにダウンロードすることです。GitHubアカウントでSSH鍵を有効にしている場合、次のように実行できます。

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

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

これで、ssh root@nixosを使ってNixOSシステムにSSH接続できるはずです。

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 により に公開されました。

この記事は「gpt-5.6-terra」を使用して翻訳されました。