Open42

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

Key5nKey5n

余っている SSD (2.5 インチ) にNix OS を入れてみる
バージョンは 23.11

筆者の Linux 経験

  • WSL 1 年
  • Manjaro, i3wm 1 年
    • Unixporn が好き
  • たまに Ubuntu やラズパイ
Key5nKey5n

ブートしたらこんな画面が出てきた(画像は reddit から)

reddit 曰く上から

  1. regular
  2. nomodeset: グラフィックドライバーに問題があったときに役立つもの
  3. copytoram: イメージをマウントせず,中身を RAM にコピーするもの
    • tmpfs に書き込み
  4. debug: ブートのログをデバッグ

まぁ問題ない限り一番上

https://www.reddit.com/r/NixOS/comments/qb96mq/what_does_the_first_list_of_options_mean_when/

https://nixos.wiki/wiki/Bootloader

Key5nKey5n

デスクトップ環境は GNOME

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

デスクトップ環境なしにもできたのでいつか i3 に置き換える (NVIDIA ドライバ)

Key5nKey5n

UEFI のブートの優先順位を操作して起動

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

Key5nKey5n

ちょっと使ってみた感想

何も設定してないが,とてもいい感じ

理由

  • 日本語がしっかり表示される
    • ただしフォントは変
  • スピーカーから音が出る(すごい!)
  • 時間が正しく表示される(すごい!)
  • Wi-fi と Bluetooth が最初から使える(とてもすごい!)
    • 無線イヤホンが Windows, Mac と同じくらい簡単につながった
  • マルチディスプレイが対応されている(すごい!)

個人的にはFirefox がデフォルトで入っていてありがたい
まぁよくあることだが

設定画面も Ubuntu like でいい感じ

Key5nKey5n

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 の切り替えが可能

Key5nKey5n

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

Key5nKey5n

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 じゃないといかんのかな)

変更方法:

  1. /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;
};
  1. sudo nixos-rebuild --install-bootloader boot コマンドを叩く
  • これで os-probergrubがインストールされるはず
  • もしかしたら 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 が残っているのかな
消さないと

Key5nKey5n

VSCode をインストールすることを試みる
そのためまずhome-manager をインストールする

home-manager のインストール方法

この公式ドキュメントを見て進める
ただし私はこのドキュメント通りに進まなかったためそれに言及しながら紹介する
https://nix-community.github.io/home-manager/index.xhtml#sec-install-standalone

まず 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 再起動)でよいみたいだ
まーた伝家の宝刀が問題を解決してるわ

ちなみにターミナルの再起動ではだめでした

https://github.com/nix-community/home-manager/issues/487#issuecomment-445299884

これで home-manager が使用できるようになりました

Key5nKey5n

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 でログインしようとしたら以下の問題があった

  1. Firefox でログイン不可
  2. 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 でも学生時代に打ち込んだものが使えるようになりました
よし

Key5nKey5n

nixos-rebuild で数世代前の設定に戻りたくなったのだが、どうやら特定のジェネレーションに戻ることはできないらしい

修正する PR があるがなんと2020年5月に出て長いこと放置されてる
https://github.com/NixOS/nixpkgs/pull/105910

Key5nKey5n

きれいな日本語フォント(Noto Sans JP)を追加

といっても Nix Search では Noto Sans JP 単体のパッケージは見つからなかったため Noto Sans CJK をインストール

Firefox プロセスを kill してから開いたらフォント設定画面のサジェストに Noto Sans JP が出てくる

Key5nKey5n

とても良くわかっていなかったが、どうやらいくつかのパッケージは下のように packages に追加せずともとも enable するだけでよいらしい

// よくない例
home.packages = [
  pkgs.git
]

programs.git = {
  enable = true;
}
// これだけでよい
programs.git = {
  enable = true;
}
Key5nKey5n

flake 学ばずとも環境構築できると思っていたが、 dotfiles でぐぐると大体 flake 使っているためしぶしぶ学ぶとする

公式ドキュメント見ても flake の tutorial が書かれておらずとても困った
Nix OS wiki も tutorial があるわけではないため初学者用のドキュメントではなかった

nix の作者による flake の tutorial を発見したため(ただし 4 年前の記事)それをもとに学習する
https://www.tweag.io/blog/2020-05-25-flakes/

Key5nKey5n

今までの問題

  • 今までは以下の因子により再現性を保証することができなかった
    • ~/.config/nixpkgs/config.nix
    • environment variables
    • Git repo
    • $NIX_PATH にあるファイル
    • コマンドライン引数
    • システムタイプ(builtins.currentSystem
  • Nix ベースのプロジェクトのスタンダードな組み上げ方法がなかった
  • Nix ベースのプロジェクトを配布することが難しかった

というわけで flake が作られた

flake の特徴

  • パッケージや NixOS のモジュールのスタンダードなインターフェースを提供するシンプルなソースツリー(Git のリポジトリ)
  • 他の flake に対して依存を持つことが可能
    • lock file により依存のバージョンを固定することが可能で、再現性を確保可能
Key5nKey5n

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
Key5nKey5n

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

私はこれから何度かひっかかることを宣言する

Key5nKey5n

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

nix flake lock --update-input nixpkgs

さらなる調査が必要

Key5nKey5n

もし私が github の hello リポジトリにアップロードしたら

nix shell github:Key5n/hello -c hello

をすることで hello コマンドをローカルにインストールせずに実行できる

Key5nKey5n

Nix の評価は遅いらしい

なぜ Nix 評価は遅いのか

後日

Key5nKey5n

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

Key5nKey5n

ログインシェルを zsh にしたいのだが、/etc/nixos/configuration.nix に以下を追加しても一向にログインシェルが変化しない...

  programs.zsh.enable = true;
  users.users.key5n.shell = pkgs.zsh;

でも sudo nixos-rebuild switch で rebuild するとログインシェルが変化する(再起動するともとに戻る)

OS 再インストールを決意

Key5nKey5n

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

原因不明です

Key5nKey5n

Dotfiles の作成

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

神サイト見つけたかもしれない
https://nixos-and-flakes.thiscute.world/

Key5nKey5n

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

Key5nKey5n

ゲームしてみる

環境

          ▗▄▄▄       ▗▄▄▄▄    ▄▄▄▖             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 **にならないことを祈る

Key5nKey5n

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

Key5nKey5n

Wayland だとDiscord、Slack でやはり日本語入力ができない

はい

X11 にしました

  # Enable the X11 windowing system.
  services.xserver.enable = true;
  services.xserver.displayManager.gdm.wayland = false;
Key5nKey5n

nixpkgs を v23.11 にしているから alacritty が yaml で吐き出される
せっかくなので toml にしようとして alacritty を nixpkgs-unstable からインストールした

そうすると、alacritty のバージョンは v0.13.2 であるにもかかわらず、設定が toml ではなく yaml で吐き出される
何が原因なんだろ

Key5nKey5n

home-manager が v23.11 だからだ
だから設定ファイルが v23.11 仕様で吐き出されるんだ

うーん
alacritty を v23.11 互換に戻すしかないか

Key5nKey5n

nix-darwin の環境構築をしました

programs.zsh.enable = true or programs.fish.enable をつけずに nix-build をすると darwin-rebuild コマンドが not found になるらしい

どちらかを enable にしないと nix-darwin にパスが通らないらしい
https://github.com/LnL7/nix-darwin/issues/177

Key5nKey5n

なぜか brew と brew で入れたコマンドが not found になる...
/opt/homebrew/bin が $PATH にないことが原因

だがなぜ $PATH にないのかが調べてもわからない
誰も語ってない

一旦下のスクリプトで回避する

  programs.zsh = {
    initExtra = ''
      export PATH="/opt/homebrew/bin:$PATH"
    '';
  };
Key5nKey5n

左腕を骨折してキーボードを比較的打たなくて良い作業を考え、hyprland の設定でもすることにしました

この文章も右手で売っています
打ちにくいので文章量少なめで綴ります

構成

項目名
Display Manager なし(greetd)
Desktop Env なし
Window Manager Hyprland
Term Alacritty
Editor Neovim