NixOSをbtrfsにインストールする
rootfsにbtrfsを使いたいので、btrfsにNixOSをインストールしていきます。
NixOSインストーラーの起動
標準のインストーラーは使わないので、Graphical ISOとMinimal ISOどっちでもいいです。とりあえずNixOS公式サイトからISOイメージを取得して起動しましょう。
起動したら passwd でログインパスワードを設定し、 sudo systemctl start sshd でSSHサーバーを起動しておくといいでしょう。
他のマシンからSSH経由でインストール作業を行うことができて楽です。
パーティションの準備
とりあえず sudo su でrootのシェルに入っておきましょう。
ここから、partedを使ってストレージのパーティションを切っていくので、まずは lsblk を使ってインストール先のストレージを確認しましょう。
この作業を行うと、インストール先にあるデータは全部消えるので注意してください。
以下のコマンドは /dev/vda にインストールする例になります。
# parted /dev/vda
(parted) mklabel gpt
(parted) mkpart ESP fat32 1MB 1GB
(parted) mkpart root btrfs 1GB 100%
(parted) set 1 esp on
(parted) print
Model: Virtio Block Device (virtblk)
Disk /dev/vda: 68.7GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 1000MB 999MB fat32 ESP boot, esp
2 1000MB 68.7GB 67.7GB btrfs root
(parted) quit先頭1GBをESPパーティション、残りをrootfs用のbtrfsパーティション用に確保します。partedで print を実行したときに期待通りのパーティションテーブルになっているか、あとはquitした後に再度lsblkを使ってパーティションを認識しているか確認しておくといいでしょう。
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 3.3G 1 loop /nix/.ro-store
sr0 11:0 1 3.5G 0 rom /iso
vda 254:0 0 64G 0 disk
├─vda1 254:1 0 953M 0 part
└─vda2 254:2 0 63.1G 0 partファイルシステムの準備
フォーマット
partedでやったのはパーティションを切るだけでまだ使えないので、パーティションをフォーマットしてファイルシステムを初期化します。
# mkfs.fat -F 32 -n boot /dev/disk/by-partlabel/ESP
# mkfs.btrfs -L nixos /dev/disk/by-partlabel/root/dev/disk/by-partlabel/ で指定しているのはpartedのmkpartで指定したラベルです。もちろん/dev/vda1のように指定してもいいのですが、ラベル指定しておくと/dev/nvme0n1とかにインストールする際でもこのあたりのコマンドを共通化できるのでこっちで説明しています。
サブボリュームの作成
btrfsのサブボリュームですが、各目的に合った形で作りましょう。
NixOSの場合システムやNix Storeはスナップショットを取る必要性がないので、基本的にはホームディレクトリとそれ以外でサブボリュームを分けることになると思います。
僕はマウントオプションを切り替えるために / /nix /home の3つをサブボリュームとして作ることにしました。
# mount /dev/disk/by-label/nixos /mnt
# cd /mnt
# btrfs subvolume create @
# btrfs subvolume create @home
# btrfs subvolume create @nix
# cd /
# umount /mntNixOSのインストール
nix-configurationの生成
まずは先ほど作ったパーティションやサブボリュームをマウントしてから nixos-generate-config を実行します。
自分は圧縮レベル1にしたかったのでここでマウント時に指定しています。(なお、ここで圧縮レベルを指定してもインストール時のファイル書き込み時の圧縮に使われるだけで、インストール後の圧縮レベル指定は別途nix-configurationを変更して設定する必要があります。)
# mount -o subvol=@,compress=zstd:1 /dev/disk/by-label/nixos /mnt
# mkdir -p /mnt/home
# mount -o subvol=@home,compress=zstd:1 /dev/disk/by-label/nixos /mnt/home
# mkdir -p /mnt/nix
# mount -o subvol=@nix,compress=zstd:1,noatime /dev/disk/by-label/nixos /mnt/nix
# mkdir -p /mnt/boot
# mount -o umask=077 /dev/disk/by-label/boot /mnt/boot
# nixos-generate-config --root /mntここから先、nix flakeを使うかどうかで手順が変わります。
flakeを使う場合
/mnt/etc/nixos/configuration.nix と /mnt/etc/nixos/hardware-configuration.nix を参考にnix flakeで管理しているnix-configurationを書き替えます。
btrfsの圧縮を使う場合は hardware-configuration.nix にある fileSystems 内の options に "compress=ztd:1" のように圧縮設定を入れておきましょう。
なお、hardware-configuration.nixには「nixos-generate-configで自動生成されるファイルだから書き替えるな」ってコメントが付いてますが、nix flakeでgit管理する時点で再生成とかどうでもいいので、ここは自由に書き替えて、なんだったら分かりやすいようにファイル名を変更したりconfiguration.nixと記述する内容を整理しちゃっていいと思います。
とりあえずnix-configurationの用意ができたらインストール先のマシンにそのflakeのレポジトリが存在するようにしてください。
あとはインストール先のマシンでflakeを指定してnixos-installを実行するだけです。
たとえば、nix-configurationのディレクトリを /home/nixos/nix-configuration に、インストールしたいマシンの設定を nixosConfigurations."machine_name" = nixpkgs.lib.nixosSystem { ... のような形で作った場合は、
# nixos-install --no-root-passwd --flake /home/nixos/nix-configuration#machine_nameのように実行します。これであとは指定したnix-configurationに従ってNixOSがインストールされるので、あとは再起動して無事起動すれば完了です。
flakeを使わない場合
flakeを使わない場合は、直接 /mnt/etc/nixos/configuration.nix と /mnt/etc/nixos/hardware-configuration.nix を編集して nixos-install --no-root-passwd を実行するだけです。
ただ、NixOSの設定はflakeを使ってgitで管理したほうが絶対にいいので、できれば再インストールのタイミングでflake環境を用意しておくことをお勧めします。
