Nix OS をインストールしてみる

余っている SSD (2.5 インチ) にNix OS を入れてみる
バージョンは 23.11
筆者の Linux 経験
- WSL 1 年
- Manjaro, i3wm 1 年
- Unixporn が好き
- たまに Ubuntu やラズパイ

GNONE 環境の 64 bit Intel/AMD の ISO を下からダウンロード
別の Linux から bootable メディアを作成
-
lsblk
コマンドでデバイスを確認 - USB をアンマウント
- dd コマンドでイメージの書き込み

ブートしたらこんな画面が出てきた(画像は reddit から)
reddit 曰く上から
- regular
- nomodeset: グラフィックドライバーに問題があったときに役立つもの
- copytoram: イメージをマウントせず,中身を RAM にコピーするもの
- tmpfs に書き込み
- debug: ブートのログをデバッグ
まぁ問題ない限り一番上

デスクトップ環境は GNOME
Xfce や Plasma など,ディスプレイ環境を後から選べるらしい.
デスクトップ環境にお世話になっている i3 がなかったのと,「GNOME が最もよくテストされてるデスクトップ環境です!」と言ってきたためひとまず GNOME
デスクトップ環境なしにもできたのでいつか i3 に置き換える (NVIDIA ドライバ)

UEFI のブートの優先順位を操作して起動
なぜか最初ログイン後に真っ黒背景にカーソルしか映らない事件が発生したが,電源を落として再度起動してログインしたら治った

ちょっと使ってみた感想
何も設定してないが,とてもいい感じ
理由
- 日本語がしっかり表示される
- ただしフォントは変
- スピーカーから音が出る(すごい!)
- 時間が正しく表示される(すごい!)
- Wi-fi と Bluetooth が最初から使える(とてもすごい!)
- 無線イヤホンが Windows, Mac と同じくらい簡単につながった
- マルチディスプレイが対応されている(すごい!)
個人的にはFirefox がデフォルトで入っていてありがたい
まぁよくあることだが
設定画面も Ubuntu like でいい感じ

Nix OS が関数型でパッケージを管理することしか知らなかったが、日本語対応は難なくできた
まず fcitx5 をインストール
コマンドでインストールすることに慣れている我々だが、 nix OS では設定ファイルに「設定 + 使用するパッケージ」を書き、rebuild するだけでその設定ファイルに書かれたパッケージがインストールされるようだ
関数型の宣言的なところを守っててよき
ということで設定ファイル (/etc/nixos/configuration.nix
) に以下の設定を書く。
この設定は nixos wiki より抜粋。
各場所は i18n.defaultLocale や i18n.extraLocaleSettings と同じレベルに書いてみたら、一発でうまくいった。
i18n.inputMethod = {
enabled = "fcitx5";
fcitx5.addons = with pkgs; [
fcitx5-mozc
fcitx5-gtk
];
};
以下のコマンドを打って再起動
sudo nixos-rebuild switch
再起動後は fcitx-configtools
を起動して、mozc を追加すれば日本語が打てるようになる。
デフォルトでは Control + Space で input Method の切り替えが可能

ここまでで 8.8GB 使用していた
結構大きい

5日ほど使っていたが、nixos の boot loader が他 ssd に入っている Manjaro の GRUB 画面で表示されない問題があった
os-prober
によってリストアップはされるのだが、いくら update-grub
コマンドを叩いても GRUB のリストに表示されない
これでは dual boot するにはいちいち UEFI に入らないといけないではないか。
これはまずい。
ということだが解決できた
とりあえず Nix OS の boot loader を標準の systemd-boot から grub に変更すると Manjaro の GRUB に表示された
(他パーティションのディストロを grub に検知させるには、そのディストロの boot loader も GRUB じゃないといかんのかな)
変更方法:
-
/etc/nixos/configuration.nix
に下の設定を書く
(デフォルトで書いてある systemd-boot の enable の行は消す必要がある。複数の boot loader が設定されていたらおかしいからね)
boot.loader.grub = {
enable = true;
device = "nodev"; # Use "nodev" for UEFI, or your specific device for BIOS
efiSupport = true; # true for UEFI, false for BIOS
useOSProber = true;
};
-
sudo nixos-rebuild --install-bootloader boot
コマンドを叩く
- これで
os-prober
とgrub
がインストールされるはず - もしかしたら
sudo nixos-rebuild switch
コマンドも必要かもしれない - 筆者はビルド時に何度も
os-prober
がないと言われ、何度もsudo nixos-rebuild switch
コマンドを叩いてたらなんとかなってた
これで Manjaro の GRUB に nixos が表示される
だがしかし最初からあった nixos のブートローダーで起動すると、どういうことか再ビルドしたはずなのに generation が変化していない systemd-boot 画面が表示される
UEFI の boot priority 設定に nixos というブートローダーが追加されているため、これを最優先にするとManjaro も Windows もnixos も起動できる GRUB が表示された
これでよし
見た感じ systemd-boot が残っているのかな
消さないと

VSCode をインストールすることを試みる
そのためまずhome-manager
をインストールする
home-manager のインストール方法
この公式ドキュメントを見て進める
ただし私はこのドキュメント通りに進まなかったためそれに言及しながら紹介する
まず home-manager 用の channel というものを追加
これはインストールする Nix のパッケージの検索先の指定みたいな感じかな
$ nix-channel --add https://github.com/nix-community/home-manager/archive/master.tar.gz home-manager
実は上のコマンドをそのまま叩くと、のちのち次のような Warning が出る
trace: warning: you are using Home Manager version 24.05 and Nixpkgs version 23.11.
私は使っているのは Nix OS の最新の LTS である 23.11 で、 上のコマンドでインストールする home-manager は 24.05 対応なので危険だと忠告してくれている
よく公式ドキュメント読んでなかったが、unstable なチャネルを設定しようとするのね
(このとき Nix OS の canary が 24.05 だった)
そのため home-manager のチャネルも v23.11 対応のものにする
Nix OS が v23.11 なら以下のコマンドを打つ
nix-channel --add https://github.com/nix-community/home-manager/archive/release-23.11.tar.gz home-manager
そしてパッケージに更新があるかもしれないためチャネルをアップデート
apt update
のようなものかな
$ nix-channel --update
ここまでしたらついに home-manager をインストールし、最初のジェネレーションを作成する
nix-shell '<home-manager>' -A install
このコマンドを叩くと、次のようなエラーが出てきた
error: file 'home-manager' was not found in the Nix search path (add it using $NIX_PATH or -I)
at «none»:0: (source not available)
$NIX_PATH
に home-manager がないよと言われている
まさか home-manager をインストールするときに home-manager がないと言われている?
ばかな
ぐぐったら解決できた
ログアウト(or 再起動)でよいみたいだ
まーた伝家の宝刀が問題を解決してるわ
ちなみにターミナルの再起動ではだめでした
これで home-manager が使用できるようになりました

VSCode のインストール
home-manager 経由で VSCode をインストールする
パッケージをインストールしたいとき、 .config/home-manager/home.nix
を操作する
`home.nix` の初期の内容
{ config, pkgs, ... }:
{
# Home Manager needs a bit of information about you and the paths it should
# manage.
home.username = "key5n";
home.homeDirectory = "/home/key5n";
# This value determines the Home Manager release that your configuration is
# compatible with. This helps avoid breakage when a new Home Manager release
# introduces backwards incompatible changes.
#
# You should not change this value, even if you update Home Manager. If you do
# want to update the value, then make sure to first check the Home Manager
# release notes.
home.stateVersion = "23.11"; # Please read the comment before changing.
# The home.packages option allows you to install Nix packages into your
# environment.
home.packages = [
# # Adds the 'hello' command to your environment. It prints a friendly
# # "Hello, world!" when run.
# pkgs.hello
# # It is sometimes useful to fine-tune packages, for example, by applying
# # overrides. You can do that directly here, just don't forget the
# # parentheses. Maybe you want to install Nerd Fonts with a limited number of
# # fonts?
# (pkgs.nerdfonts.override { fonts = [ "FantasqueSansMono" ]; })
# # You can also create simple shell scripts directly inside your
# # configuration. For example, this adds a command 'my-hello' to your
# # environment:
# (pkgs.writeShellScriptBin "my-hello" ''
# echo "Hello, ${config.home.username}!"
# '')
];
# Home Manager is pretty good at managing dotfiles. The primary way to manage
# plain files is through 'home.file'.
home.file = {
# # Building this configuration will create a copy of 'dotfiles/screenrc' in
# # the Nix store. Activating the configuration will then make '~/.screenrc' a
# # symlink to the Nix store copy.
# ".screenrc".source = dotfiles/screenrc;
# # You can also set the file content immediately.
# ".gradle/gradle.properties".text = ''
# org.gradle.console=verbose
# org.gradle.daemon.idletimeout=3600000
# '';
};
# Home Manager can also manage your environment variables through
# 'home.sessionVariables'. These will be explicitly sourced when using a
# shell provided by Home Manager. If you don't want to manage your shell
# through Home Manager then you have to manually source 'hm-session-vars.sh'
# located at either
#
# ~/.nix-profile/etc/profile.d/hm-session-vars.sh
#
# or
#
# ~/.local/state/nix/profiles/profile/etc/profile.d/hm-session-vars.sh
#
# or
#
# /etc/profiles/per-user/key5n/etc/profile.d/hm-session-vars.sh
#
home.sessionVariables = {
# EDITOR = "emacs";
};
# Let Home Manager install and manage itself.
programs.home-manager.enable = true;
}
新しいパッケージをインストールしたいときはこのファイルのhome.packages
にパッケージ名を追加する
home.packages = [
pkgs.vscode
];
追加したら下のコマンドで最後にビルドする
home-manager switch
このコマンドを叩いたあとはコマンドラインから code
コマンドやらが使用できるようになる...
と思いきやビルドに失敗する
なぜなら VSCode は Unfree なライセンスだからだ
ということで home-manager 用に Unfree なパッケージを許す設定を追加する必要がある
.config/nixpkgs/config.nix
に以下を追加する
これで VSCode もインストールすることができる
{
allowUnfree = true;
}
設定の同期
VSCode でログインして設定を同期する
GitHub でログインしようとしたら以下の問題があった
- Firefox でログイン不可
- Chrome でも
Signing in to github.com…
から進まない
Firefox で GitHub 認証をすると、なぜか VSCode へのリダイレクトポップアウトの代わりに下の画面が出る
The address wasn’t understood
Firefox doesn’t know how to open this address, because one of the following protocols (vscode) isn’t associated with any program or is not allowed in this context.
You might need to install other software to open this address.
ということで Chrome を使いましょう
しかしそうするとブラウザではログインが完了しても VSCode のほうが永遠にSigning in to github.com…
から進みません
困った私はとりあえず伝家の宝刀(再起動)を使ってみました
すると、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
ログインできました!!!!!!!!!!!
やったぁぁぁっぁl11!!!
1 時間返せ
そうして Setting Sync を on にすると拡張機能がインストールされました
VSCode の設定終わり
Nix OS でも学生時代に打ち込んだものが使えるようになりました
よし

nixos-rebuild
で数世代前の設定に戻りたくなったのだが、どうやら特定のジェネレーションに戻ることはできないらしい
修正する PR があるがなんと2020年5月に出て長いこと放置されてる

rollback してみて気づいたのだが、rollback してもシステム構成ファイル(/etc/nixos/configuration.nix
)が変化するわけではないらしい
てっきり Git の switch(checkout) みたいなものかと思っていたが、どうやらそうではないらしい
その解消法などが下のフォーラムに書いてあった

きれいな日本語フォント(Noto Sans JP)を追加
といっても Nix Search では Noto Sans JP 単体のパッケージは見つからなかったため Noto Sans CJK をインストール
Firefox プロセスを kill してから開いたらフォント設定画面のサジェストに Noto Sans JP が出てくる

とても良くわかっていなかったが、どうやらいくつかのパッケージは下のように packages に追加せずともとも enable するだけでよいらしい
// よくない例
home.packages = [
pkgs.git
]
programs.git = {
enable = true;
}
// これだけでよい
programs.git = {
enable = true;
}

flake 学ばずとも環境構築できると思っていたが、 dotfiles でぐぐると大体 flake 使っているためしぶしぶ学ぶとする
公式ドキュメント見ても flake の tutorial が書かれておらずとても困った
Nix OS wiki も tutorial があるわけではないため初学者用のドキュメントではなかった
nix の作者による flake の tutorial を発見したため(ただし 4 年前の記事)それをもとに学習する

今までの問題
- 今までは以下の因子により再現性を保証することができなかった
~/.config/nixpkgs/config.nix
- environment variables
- Git repo
-
$NIX_PATH
にあるファイル - コマンドライン引数
- システムタイプ(
builtins.currentSystem
)
- Nix ベースのプロジェクトのスタンダードな組み上げ方法がなかった
- Nix ベースのプロジェクトを配布することが難しかった
というわけで flake が作られた
flake の特徴
- パッケージや NixOS のモジュールのスタンダードなインターフェースを提供するシンプルなソースツリー(Git のリポジトリ)
- 他の flake に対して依存を持つことが可能
- lock file により依存のバージョンを固定することが可能で、再現性を確保可能

flake.nix
の意味
-
description
- 一行の説明
-
nix flake metadata
で表示される
-
inputs
- この flake が依存している他の flakes
- Nix によってフェッチされ、
outputs
関数の引数として渡される
-
outputs
- flake の心臓
-
self
は flake 自身を表す- flake のソース自身を言及する際に有用
- 他の output の値(例:
self.defaultPackage.x86_64-linux
) を利用する際に使用
- 生成される属性は任意の値(
defaultPackage.${system}
を除く)
- すべての flake はメタデータを持つ
- 例:
self.lastModifiedDate
- 例:

nix build
によってビルドするときは flake.nix
やソースファイルはすべて git で追跡される必要があるらしい
私はこれから何度かひっかかることを宣言する

記事内では以下のコマンドで nixpkgs のバージョンを最新のバージョンにアップデートできると言っており、 flake.lock
ファイルの nixpkgs が指すバージョンを勝手に変えてくれるのかと思いきやそうではないみたい
nix flake lock --update-input nixpkgs
さらなる調査が必要

もし私が github の hello リポジトリにアップロードしたら
nix shell github:Key5n/hello -c hello
をすることで hello コマンドをローカルにインストールせずに実行できる

Nix の評価は遅いらしい
なぜ Nix 評価は遅いのか
後日

3 つ目の記事を読んだが、「flake で Nix OS の設定をする」という題名だったがウェブサーバーの立てたりしていてよくわからなかった

ログインシェルを zsh にしたいのだが、/etc/nixos/configuration.nix
に以下を追加しても一向にログインシェルが変化しない...
programs.zsh.enable = true;
users.users.key5n.shell = pkgs.zsh;
でも sudo nixos-rebuild switch
で rebuild するとログインシェルが変化する(再起動するともとに戻る)
OS 再インストールを決意

再インストールしたら簡単にできました
12 時間くらい返してほしい
原因不明です

Dotfiles の作成
いよいよここまで来た
そして flake.nix
の書き方さっぱりわからない
他の人の dotfiles 見ても「なぜその attributes があるんだ」で終結する
神サイト見つけたかもしれない

学んだ結果ですが、神サイトでした
flake の使い方についてとてもよく学べます
イチオシサイト

まったく想定外だったのだが、configuration.nix
で使用できても home-manager では使用できないオプションがあるみたいだ
home-manager で使用できるオプション検索↓

これ何回もひっかかる...

ゲームしてみる
環境
▗▄▄▄ ▗▄▄▄▄ ▄▄▄▖ key5n@nixos
▜███▙ ▜███▙ ▟███▛ -----------
▜███▙ ▜███▙▟███▛ OS: NixOS 23.11.20240502.383ffe0 (Tapir) x86_64
▜███▙ ▜██████▛ Host: MS-7C95 (1.0)
▟█████████████████▙ ▜████▛ ▟▙ Kernel: 6.1.90
▟███████████████████▙ ▜███▙ ▟██▙ Uptime: 12 mins
▄▄▄▄▖ ▜███▙ ▟███▛ Packages: 1379 (nix-system)
▟███▛ ▜██▛ ▟███▛ Shell: zsh 5.9
▟███▛ ▜▛ ▟███▛ Display (Acer Technologies 27"): 1920x1080 @ 60Hz [External]
▟███████████▛ ▟██████████▙ Display (VX3276-QHD): 2560x1440 @ 60Hz
▜██████████▛ ▟███████████▛ Display (PL2390): 1920x1080 @ 60Hz
▟███▛ ▟▙ ▟███▛ DE: Gnome 45.5
▟███▛ ▟██▙ ▟███▛ WM: Mutter (Wayland)
▟███▛ ▜███▙ ▝▀▀▀▀ WM Theme: Adwaita
▜██▛ ▜███▙ ▜██████████████████▛ Theme: Adwaita [GTK2/3/4]
▜▛ ▟████▙ ▜████████████████▛ Icons: Adwaita [GTK2/3/4]
▟██████▙ ▜███▙ Font: Cantarell (11pt) [GTK2/3/4]
▟███▛▜███▙ ▜███▙ Cursor: Adwaita (24px)
▟███▛ ▜███▙ ▜███▙ Terminal: code 1.85.2
▝▀▀▀ ▀▀▀▀▘ ▀▀▀▘ CPU: AMD Ryzen 7 5800X (16) @ 4.85 GHz
GPU: NVIDIA GeForce RTX 3060 Lite Hash Rate
Memory: 3.92 GiB / 31.28 GiB (13%)
Swap: Disabled
Disk (/): 26.91 GiB / 116.32 GiB (23%) - ext4
Disk (/run/media/key5n/nixos-gnome-23.11-x86_64): 2.38 GiB / 2.38]
Local IP (enp42s0): 192.168.0.29/24 *
Locale: en_US.UTF-8
NixOS wiki 通りに steam を入れる
動かしてみると...とてもカクカクな画面が出てきた
おそらくリフレッシュレートは 4 ~ 8 ほど
デフォルトでは GPU ドライバは入ってないらしい
今まで気づいていなかった
私の GPU は NVIDIA 製である
それすなわち、私は痛い目を見ることが確定しているということだ
どうかフィンランドのおっさんよろしく、 **NVIDIA f**k you **にならないことを祈る

NVIDIA ドライバを入れたらゲームはヌルヌルになったものの Discord が開かなくなった
ガン萎えである

reddit のおかげで直りました
下を入れたら直りました
神である
environment.sessionVariables.NIXOS_OZONE_WL = "1"
どうやら discord は古いバージョンの Electron を使っていて、それが Wayland に対応してないらしい?
それなら Slack が動く理由がわかる

Wayland だとDiscord、Slack でやはり日本語入力ができない
はい
X11 にしました
# Enable the X11 windowing system.
services.xserver.enable = true;
services.xserver.displayManager.gdm.wayland = false;

学んだことを活かして Dotfiles 作成しました
やっとか...
まる 5 日くらいかかった
ここから i3 の設定をするとなるともっと疲れるかな...

nixpkgs
を v23.11 にしているから alacritty が yaml で吐き出される
せっかくなので toml にしようとして alacritty を nixpkgs-unstable からインストールした
そうすると、alacritty のバージョンは v0.13.2 であるにもかかわらず、設定が toml ではなく yaml で吐き出される
何が原因なんだろ

home-manager が v23.11 だからだ
だから設定ファイルが v23.11 仕様で吐き出されるんだ
うーん
alacritty を v23.11 互換に戻すしかないか

Twitter 見てたら cheat sheet の PR が出たことを知った
現在 Open

nix-darwin の環境構築をしました
programs.zsh.enable = true
or programs.fish.enable
をつけずに nix-build
をすると darwin-rebuild
コマンドが not found になるらしい
どちらかを enable にしないと nix-darwin
にパスが通らないらしい

dotfiles が整備できました
下の dotfiles の更新は続けますが,このあとは desktop の設定に関しては特に書くことないのでクローズします

左腕を骨折してキーボードを比較的打たなくて良い作業を考え、hyprland の設定でもすることにしました
この文章も右手で売っています
打ちにくいので文章量少なめで綴ります
構成
項目名 | 値 |
---|---|
Display Manager | なし(greetd) |
Desktop Env | なし |
Window Manager | Hyprland |
Term | Alacritty |
Editor | Neovim |