NixOSで外部GUIアプリのfile chooserがクラッシュした記録

NixOSで外部配布またはNix版のQtアプリを試したとき、アプリ本体は起動しても、ファイル選択を開いた瞬間に落ちることが複数回あった。HydrusとVOICEVOXで同型のエラーを確認している。

これはアプリ固有の保存・import処理だけでなく、Qt・GTK・GSettings・portal・親processから継承した環境の境界を疑うための記録。

共通していた症状

  • 通常画面までは起動する
  • importやproject保存からfile chooserを開く
  • アプリがabortする
  • stderrに次が出る
GLib-GIO-ERROR: Settings schema 'org.gtk.Settings.FileChooser' is not installed

Qtアプリでも、QT_QPA_PLATFORMTHEME=gtk3などを通じてGTK側へ入ると発生する。アプリ本体が起動しただけでは利用可能と判断せず、file chooserを最初のtight reproにする。

Hydrusの試行手順と実測

当初の導入案

2026-05-19には、静止画・イラスト管理として次の構成を考えていた。

  • gallery-dlで取得
  • Hydrusのwatch folderへ渡す
  • Hydrusでタグ付け・検索
  • DBとfilesはNASへ置く
  • Web UI/APIは外部公開しない

この案は後の2026-07-16-szurubooru-curationで再評価し、現在はIrisbooruを正本として維持している。

2026-07-30の隔離再評価

本番media・tag・DBへ触れず、生成fixtureと一時DBだけで評価した。network trafficも停止した。

生成fixture:

  • PNG
  • 類似JPEG
  • H.264/AAC MP4

公式Hydrus Client v681 bundle

隔離先:

/tmp/hydrus-reassessment-v681

専用DB・tempを使い、Waylandで起動した。Import Filesを開くとクラッシュした。

coredumpで確認したsignal:

  • SIGABRT: 2回
  • SIGSEGV: 2回

代表的なstderr:

libpixbufloader_svg.so: undefined symbol: rsvg_handle_get_pixbuf_and_error
Gtk:ERROR: gtkiconhelper.c:495:ensure_surface_for_gicon: assertion failed

公式bundleのQt/GTK系ライブラリと、NixOS側のlibrsvg・GDK pixbuf loader・icon theme系ライブラリが混在し、ABI不整合を起こした可能性が高い。

不足libraryをLD_LIBRARY_PATHへ継ぎ足す方法は、Wayland起動を直すとGTK icon loaderで落ち、XCBへ切り替えると別のsegfaultになる状態だった。アプリ評価よりbundleの再package化が主作業になったため、この経路は打ち切った。

Nix版Hydrus Client v679

隔離DB:

/tmp/hydrus-reassessment-v679-nix/db

最初はHermes側のPYTHONPATHを継承し、Python 3.14で動くHydrusがPython 3.12側のPillowを読んだ。

ImportError: cannot import name '_imaging' from 'PIL'

PYTHONPATHPYTHONHOMEを外すと起動した。window titleはmain — hydrus client 679だった。

ただし、親環境から次を継承した状態ではImport Filesでabortした。

QT_QPA_PLATFORMTHEME=gtk3
XDG_CURRENT_DESKTOP=niri
DESKTOP_SESSION=niri

このときxdg-desktop-portal.serviceはactive、xdg-desktop-portal-gtk.serviceはinactiveだった。stderrは共通症状と同じだった。

GLib-GIO-ERROR: Settings schema 'org.gtk.Settings.FileChooser' is not installed

次のprocess-localな環境隔離でfile chooserが開き、fixture 3件のimportに成功した。

unset PYTHONPATH PYTHONHOME \
  QT_QPA_PLATFORMTHEME \
  GTK_THEME GTK_PATH GTK_EXE_PREFIX GTK_DATA_PREFIX
export QT_STYLE_OVERRIDE=Fusion

したがって、Nix版v679のimport失敗はHydrusのfixtureやDBの破損ではなく、親processから継承したPython・Qt・GTK環境が主因だった。

HydrUI v0.9.0

Hydrusのnative UIが合わない場合のcompanionとして隔離起動した。

  • UI: 127.0.0.1:18080 — HTTP 200
  • health: 127.0.0.1:18081OK
  • loopback限定

Client API keyの作成・実media接続・実操作評価までは進めずに終了した。ソース上に機能があることやUIが起動したことを、実利用可能性の証拠とは扱っていない。

Hydrusの結論

環境を隔離すればimport自体はできた。ただしnative UIの操作感と閲覧性が日常運用に合わなかったため、正本の置換・役割分担は見送った。duplicate処理が主要ボトルネックになった場合だけ限定的に再評価する。

同型事例: VOICEVOX

VOICEVOXでもproject保存時に画面が固まり、アプリが消えた。terminal起動で次を確認した。

GLib-GIO-ERROR: Settings schema 'org.gtk.Settings.FileChooser' is not installed

Hydrus v679と同じく、保存内容より前のfile chooser境界で落ちていた。後にprojectを保存できる状態へ復旧した記録はあるが、当時の最終wrapperの正確な環境変数構成までは今回復元できていない。Hydrusと同じ回避策だったと確定はしない。

次に同じ症状が出たら

  1. terminalから起動し、file chooserを開く直前からstderrを採る
  2. coredumpctlでsignalとstackを確認する
  3. PYTHONPATHPYTHONHOMEと対象processのPython minor versionを照合する
  4. QT_QPA_PLATFORMTHEME=gtk3を外し、QT_STYLE_OVERRIDE=Fusionで再現を分離する
  5. GTK_PATHGTK_DATA_PREFIXGTK_EXE_PREFIXなど、host側GTK pluginを混ぜる変数を外す
  6. file chooserが開き、fixtureを実際に選択できるところまで確認する
  7. 動いた環境だけをprocess-localなNix wrapperへ固定する
  8. 公式bundleへhostのGTK/GDK/GLibを広く継ぎ足す必要が出たら、恒久修復ではなくNix版への切替か再package化として扱う

判断基準

外部GUIの評価では、アプリ機能とNixOS向けpackage/runtime適合性を分ける。ABI修復が評価の主作業になり始めたら、その経路を打ち切ってもアプリ自体の不採用理由にはしない。一方、動作後の主導線が合わないなら、機能数が多くても日常運用へ採用しない根拠になる。

関連: NixOS2026-07-16-szurubooru-curation