fix(nixos-laptop): 実機に入れて出た不具合を直し、常用できる状態にする - #382
Open
gapul wants to merge 8 commits into
Open
Conversation
実機に入れて初めて出た取りこぼしを直す。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。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 相当なので実質の差は小さい。公開鍵を宣言に。 再インストールのたびに
curlでauthorized_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 側。
safespecialisation では graphics を落としているためsteam/gamescope も強制無効にする必要がある (モジュールが
hardware.graphics.packageを読むため評価が壊れる)。waydroid を有効化。イメージ取得は宣言外で、初回に
sudo waydroid init -s GAPPSが要る。検証
nixosConfigurations.nixos-laptop-ciとdarwinConfigurations.gapulの両方が評価を通ることを確認済み。実機では fba0a03 〜 9149e08 までを適用して動作確認済み (Secure Boot 有効 + TPM2 自動解錠で起動、
端末が開く、バーが1本になる)。9153613 のソフト追加分は実機未適用。