Skip to content

fix(nixos-laptop): 実機に入れて出た不具合を直し、常用できる状態にする - #382

Open
gapul wants to merge 8 commits into
mainfrom
fix/nixos-laptop-first-boot
Open

fix(nixos-laptop): 実機に入れて出た不具合を直し、常用できる状態にする#382
gapul wants to merge 8 commits into
mainfrom
fix/nixos-laptop-first-boot

Conversation

@gapul

@gapul gapul commented Aug 19, 2026

Copy link
Copy Markdown
Owner

ispc (HP EliteBook) を NixOS 化した際に、実機で初めて表面化した不具合をまとめて直す。
どれも nixos-laptop-ci では素通りしていたもので、CI が検出できない種類の抜けだった。

実機でしか出なかった不具合

flake が実機構成で評価できない。 hardwareConfig をモジュール引数のデフォルト値に頼っていたが、
host 側はそれを imports の中で使うため、_module.args 経由の解決に config が必要になり無限再帰する。
CI 用の nixos-laptop-ci は元から specialArgs で渡していて、実機側だけ抜けていた。

activation が途中で死ぬ。 /bin/mkdir を直接呼んでいる箇所が4ファイルあり、NixOS には /bin/sh しか
無いため status=127 で落ちる。そこで activation が止まるので以降の設定が丸ごと適用されない。
macOS には /bin/mkdir があるため今まで表面化していなかった。

デスクトップから端末を開く手段が無い。 rice が参照する ghostty / wofi / hyprshot / cliphist などが
home.packages に一切宣言されておらず closure に無かった。$mod+Return が無反応だった直接の原因。

ghostty がウィンドウを開かない。 パッケージを入れた後も無反応だった。共有している
configs/terminals/ghostty/config は macOS の Quick Terminal 常駐前提で
initial-window = false / quit-after-last-window-closed = false を持つ。Linux ではこれが
「起動しても窓を作らず居座る」だけの意味になる。既存の optional include の仕組みに乗せて Linux 側だけ打ち消す。

バーが2本出る。 hypridle / waybar / mako は home-manager の systemd ユーザーサービスとして
定義済みなのに exec-once にも書かれていて、それぞれ2つ起動していた。

lanzaboote の鍵作成タイミング。 手順書は Phase 8 (初回起動後) に置いていたが、実際には
ブートローダー設置時に鍵が要るため nixos-install の最後で失敗する。Phase 7 に前倒しする注記を追加。

運用のための変更

sudo をパスワード無しに。 この機械は ssh (鍵のみ・パスワード認証無効) で遠隔管理する前提なので、
rebuild のたびに実機の前で入力が要るのは成立しない。引き換えに ssh 秘密鍵の保持者が root を取れるが、
nixos-rebuild が打てる時点で root 相当なので実質の差は小さい。

公開鍵を宣言に。 再インストールのたびに curlauthorized_keys を作るのは宣言管理の外側になる。

ロケールを en_US.UTF-8 に。

指紋のコメントを訂正。 wheelNeedsPassword = false により sudo は PAM を通らないので指紋は効かない。
hyprlock も PAM ではなく fprintd の D-Bus を直接叩くため別途設定が要る。実態に合わせて書き直した。

常用のための追加

home/linux-gui.nix を新設し、mac の cask 一覧に対応する GUI アプリを packages として宣言。
zen だけ nixpkgs に無いので flake input から取る。

ゲーム環境は steam (32bit グラフィックスとファイアウォールが要るのでシステム側) に gamescope と
gamemode を併せ、lutris と heroic は home 側。safe specialisation では graphics を落としているため
steam/gamescope も強制無効にする必要がある (モジュールが hardware.graphics.package を読むため評価が壊れる)。

waydroid を有効化。イメージ取得は宣言外で、初回に sudo waydroid init -s GAPPS が要る。

検証

nixosConfigurations.nixos-laptop-cidarwinConfigurations.gapul の両方が評価を通ることを確認済み。
実機では fba0a039149e08 までを適用して動作確認済み (Secure Boot 有効 + TPM2 自動解錠で起動、
端末が開く、バーが1本になる)。9153613 のソフト追加分は実機未適用。

gapul added 8 commits August 18, 2026 23:10
実機に入れて初めて出た取りこぼしを直す。CI (nixos-laptop-ci) では
すべて通っていたため気づけなかった。

- flake: hardwareConfig を specialArgs で渡す。モジュール引数のデフォルト値に
  頼ると、imports の中で `_module.args` 経由の解決が走って無限再帰になる。
  CI 側は元から specialArgs で渡しており、実機側だけ抜けていた。
- hyprland: rice が参照するバイナリを home.packages に宣言する。ghostty も
  wofi も closure に無く、$mod+Return が無反応でデスクトップから端末を
  開く手段が存在しない状態だった。
- nixos-laptop: 公開鍵を宣言に入れる。再インストールのたびに手で curl して
  authorized_keys を作るのは宣言管理の外側になる。
- ロケールを en_US.UTF-8 に変更。
- docs: lanzaboote の署名鍵はブートローダー設置前に必要なので、Phase 7 に
  sbctl create-keys を前倒しする注記を足す。
NixOS には /bin/sh しか無いため、activation が ghosttyTerminfo の
`/bin/mkdir` で status=127 で落ち、それ以降の activation が丸ごと
適用されない状態だった (home-manager-gapul.service が failed → degraded)。
macOS には /bin/mkdir があるので今まで表面化していなかった。

Linux でも読まれる 4 ファイル (terminal / common / workstation / git-hooks)
を ${pkgs.coreutils}/bin/mkdir に変更。うち common.nix には pkgs 引数が
無かったので足した。darwin 専用ファイルは触っていない。
この機械は ssh (鍵のみ・パスワード認証無効) で遠隔管理する前提なので、
rebuild のたびに実機の前で入力が要るのは運用が成立しない。
引き換えに ssh 秘密鍵の保持者が root を取れる状態になるが、
nixos-rebuild が打てる時点で root 相当なので実質の差は小さい。
hypridle / waybar / mako は home-manager 側で systemd ユーザーサービスと
して定義済みなのに exec-once にも書かれていて、それぞれ2つ起動していた
(画面にバーが2本重なる)。exec-once には固有のユニットを持たないものだけ
残す。
ghostty:
  共有している configs/terminals/ghostty/config は macOS の Quick Terminal 常駐
  前提で initial-window = false / quit-after-last-window-closed = false を持つ。
  Linux ではこれが「起動しても窓を作らず居座る」だけの意味になり、$mod+Return が
  無反応で窓なしプロセスが溜まっていた。既存の optional include の仕組みに乗せて
  Linux 側だけ打ち消す。

GUI アプリ:
  home/linux-gui.nix を追加。mac の cask 一覧に対応するものを packages として宣言。
  zen だけ nixpkgs に無いので flake input (0xc000022070/zen-browser-flake) から取る。

ゲーム環境:
  steam は 32bit グラフィックスとファイアウォールが要るのでシステム側。gamescope と
  gamemode を併せて有効化。lutris と heroic は自前のプレフィックスを持つだけなので home 側。
  safe specialisation では graphics を落としているため steam/gamescope も強制無効に
  する必要がある (モジュールが hardware.graphics.package を読むため評価が壊れる)。

waydroid:
  virtualisation.waydroid.enable = true。イメージ取得は宣言外で、初回に
  `sudo waydroid init -s GAPPS` が要る。

指紋:
  コメントの誤りを直す。wheelNeedsPassword = false のため sudo は PAM を通らず
  指紋は効かない。hyprlock も PAM ではなく fprintd の D-Bus を直接叩くので別途設定が要る。
zen の package.nix は ffmpeg_9 を要求するが 26.05 系には ffmpeg_7 までしか無く、
follows で食わせると評価が abort する。zrythm-darwin と同じく別系統のまま置く。

蓋: ssh で遠隔管理する前提なので、AC接続中に閉じてもサスペンドさせない。
バッテリー駆動時は既定どおりサスペンドする(鞄の中で発熱させないため)。
linux-gui.nix を手で import して pkgs を外側スコープから渡していたため、
モジュールシステムが管理する pkgs (allowUnfree とオーバーレイを持つ方) が
使われず、google-chrome が unfree で弾かれていた。通常の imports に戻し、
zen は extraSpecialArgs 経由で渡す。
obsidian / bitwarden-desktop / beeper はいずれも Electron 39 に載っており、
nixpkgs が insecure として拒否する。同じ3つが mac でも同じ Electron で
動いている以上、Linux でだけ拒否しても実質的な防御にはならない。
バージョン文字列は nixpkgs 更新のたびに陳腐化するので、更新で不要になった
時点で行ごと消す前提の pin。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant