Kagoya VPS に NixOS を手動インストールして死闘した
どうも白澤です。だいぶブログの間が空いてしまいましたが(半年くらい?)、その間にこれまたバタバタと色々やっていました。沼案件を進めていてなかなか作業量が多く辛いところではありますが頑張っていきたいですね。
今回は Kagoya VPS に NixOS を手動でインストールした話です。先にネタバレ的なことをすると、めちゃくちゃハマりました。AI に聞きながら進めるも何度もサーバーが起動しなくなって VPS のコンソールからインスタンス自体を作り直して、を繰り返すまさに死闘でした。
Novalumo ではステージングや技術検証など様々な用途で VPS を運用しています。今まで主に Ubuntu の LTS を使っていて、使い慣れていたので使い続けてはいたのですが、サーバーのソフトウェア構成とかを毎度インスタンスを立ち上げるごとに設定するのがめっちゃ大変で、Ansible とか色々検討はしていました。結局 Ansible はよくわからなかった、、、
その時期に個人の dotfiles を Nix (home-manager + nix-darwin) で管理するようになってから、サーバーの構成も Nix で管理したいなという気持ちが強くなっていました。Nix は純粋関数型パッケージマネージャであり、Docker イメージよりも環境再現性が高いらしいということがかなり魅力的で、まさに自分が求めていたものでした。
そこでまずは 1 台 NixOS にしてみようと。で、普段よく使っている Kagoya VPS に入れてみたのですが、国産 VPS 特有のハマりポイントが多すぎて大変でした。同じことをやろうとしている人の参考になれば。
環境
- VPS: Kagoya VPS(QEMU/KVM、VirtIO)
- CPU: 4 vCPU
- メモリ: 4 GB
- ストレージ: 600 GB NVMe
- ディスク:
/dev/vda - ブート: BIOS/Legacy(UEFI ではない)
最後の「ブート」が最大のポイントです。最近のマシンは UEFI が主流なので、ネットで見つかる NixOS のインストールガイドもだいたい UEFI 前提で書かれている印象ですが、Kagoya VPS(というか多くの国産 VPS)はおそらく BIOS Boot で動いています。ここを見誤ると全部が狂います、、、
一応手元の眠ってるパソコンがレガシーなものばかりなので、BIOS 自体はちょっとわかっていたのが不幸中の幸い?だったかも。
ちなみに方法としては、Kagoya VPS で用意しているイメージには NixOS がないので、公式サイト ↗ から ISO をダウンロードして管理画面からアップロード、それをブートしてインストール、という流れになります。
ディスク・パーティション・マウント編
デバイス名の罠
まずそもそもの話、Kagoya VPS は VirtIO なのでディスクデバイスが /dev/vda です。手癖で /dev/sda を叩いてしまって「デバイスが見つからない」と。
はい。lsblk は最初に叩きましょう。
そもそも Ubuntu を使っていた時はディスクデバイスのことを意識することも普段の運用上はほぼ無かったので、これはちょっとした躓きポイント。
UEFI じゃないのに GPT を切ってしまう問題
何も考えずに GPT パーティションテーブルで切ったら、ブートローダーのインストールでコケました。VPS では MBR(msdos)ラベルでないとブートしないケースがあります。
ラベルの付け忘れ
nixos-generate-config はファイルシステムのラベル(by-label)を見に行く設定を生成することが多くて、フォーマット時に -L nixos を忘れると、起動時に Cannot find root file system でカーネルパニックします。
# ラベルなしでフォーマットすると...
mkfs.ext4 /dev/vda1 # これだとラベルがない
# ラベル付きでフォーマットする
mkfs.ext4 -L nixos /dev/vda1 # こっちが正解
地味に気づきにくいやつです。
正解のパーティション手順
色々試行錯誤した結果、Kagoya VPS での正解はこれでした。
# MBR (msdos) で初期化
parted /dev/vda -- mklabel msdos
# メインパーティション作成(Boot も Root も一緒)
parted /dev/vda -- mkpart primary ext4 1MB 100%
# Boot フラグを立てる(これを忘れると BIOS が OS を見つけられない)
parted /dev/vda -- set 1 boot on
# ラベル付きでフォーマット
mkfs.ext4 -L nixos /dev/vda1
# マウント
mount /dev/disk/by-label/nixos /mnt
Boot パーティションを分けずに 1 パーティションで全部入れるのが、BIOS Boot 環境では一番事故りにくいです。
ブートローダー(GRUB)設定編
ここが最大の詰みポイントでした。
何が起こるか
nixos-install の最後で failed to install GRUB と出て止まります。
原因は nixos-generate-config が自動生成する configuration.nix が UEFI 用の systemd-boot になっていること。Kagoya VPS は BIOS Boot なのでこれでは動きません。こういうところでコケる経験ができたおかげで、このあたりの仕組みを調べるきっかけになった感があります。
正解の設定
{ config, pkgs, ... }: {
# systemd-boot は使わない(UEFI 用なので)
# boot.loader.systemd-boot.enable = true;
# boot.loader.efi.canTouchEfiVariables = true;
# BIOS Boot 用の GRUB 設定
boot.loader.grub = {
enable = true;
device = "/dev/vda"; # ディスクそのものを指定
systemd-boot.enable = false; # これも念のため無効化
};
}
インストール後の初期構築編
OS が起動するようになった後も、運用に乗せるまでにいくつかハマりました。
git が入っていない
当たり前なのですが、最小構成だと git すら入っていません。Flakes のリポジトリを clone しようとして「あ、git ない」ってなりました。nix-shell -p git で一時的に凌いで、すぐに environment.systemPackages に追加。
git が入ってないという経験は多分国産 VPS を普通に使う分にはほとんど体験することがないことな気がしますね。というのも、大体は Ubuntu とかを選択すると最初から入ってることが多いので、すんなり使えなくてありゃ?となりました。
Flake が無効
NixOS のデフォルトでは Flake が無効になっています。Flake って結構 Nix のデファクトっぽい割にはまだ experimental っていう。
nix.settings.experimental-features = [ "nix-command" "flakes" ];
これを configuration.nix に追加する必要があります。初手は --extra-experimental-features オプション付きのコマンドで突破しました。
ユーザー定義の import 忘れ
これが一番怖かった。自分のユーザー定義を書いた users.nix を configuration.nix の imports に書き忘れた状態で nixos-rebuild switch したら、再起動後に自分のユーザーにログインできなくなりました。
NixOS は configuration.nix に書かれていないユーザーは基本的に存在しないことになるので、import を忘れると自分のユーザーが消えます。VPS のコンソールから root で入って復旧しましたが、マジでビビりました。
Git の権限問題
sudo で git pull してしまって .git 内の所有権が root になるやつ。これは NixOS に限った話ではないですが、nixos-rebuild switch を sudo でやる流れの中でうっかり sudo git pull もやってしまいがちです。
# やらかした後の修正
sudo chown -R siraken:users .
Git 操作は一般ユーザーで、nixos-rebuild switch だけ sudo で。
SSH の鍵認証設定ミス
鍵認証のみに切り替えた後、公開鍵の登録をミスっていてログインできなくなる問題。SSH のポート変更や認証方式の変更をするときは、今の SSH セッションを切らずに別窓で接続テストするのが鉄則です。わかってたのに多分大丈夫だろーとか気を抜いてたら実際にやらかしました。
ちなみにこのタイミングくらいで ~/.ssh/ にいつ作ったかわからない鍵が大量にあることに気づいて、鍵の数が 1/10 くらいになりました。明らかに無駄に作りすぎだったし、そもそも鍵の使い方わからないで適当に作ってるのもあったので、これを機に整理できてよかったです。一番古い鍵だと5年くらい前だったかな、、、
まとめ
以上、Kagoya VPS に NixOS を手動インストールした記録でした。BIOS Boot まわりのハマりが一番大きかったですね。
最終的にはこの手順で安定して動くようになりました。
partedで MBR パーティション作成 + Boot フラグmkfs.ext4 -L nixosでラベル付きフォーマットconfiguration.nixで GRUB 設定- Flakes 有効化 + ユーザー定義の import を忘れない
- SSH 設定変更時は別窓テスト必須
NixOS、構成管理の面では本当に良いのですが、初回セットアップの難易度はまあまあ高いです。特に UEFI じゃない環境だと情報が比較的少なくて手探りになります。
ただ、一度セットアップが終われば nixos-rebuild switch で全部管理できるのは本当に最高です。Nix はいいぞ。
もう少し NixOS のインストールを楽にできそうな nixos-anywhere とかパーティション管理の disko なるものもあるみたいで、それらを組み合わせるともっと便利らしいので、次はそっちも試してみたいですね。それでは!