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 installedQtアプリでも、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'PYTHONPATHとPYTHONHOMEを外すと起動した。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:18081—OK - 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 installedHydrus v679と同じく、保存内容より前のfile chooser境界で落ちていた。後にprojectを保存できる状態へ復旧した記録はあるが、当時の最終wrapperの正確な環境変数構成までは今回復元できていない。Hydrusと同じ回避策だったと確定はしない。
次に同じ症状が出たら
- terminalから起動し、file chooserを開く直前からstderrを採る
coredumpctlでsignalとstackを確認するPYTHONPATH・PYTHONHOMEと対象processのPython minor versionを照合するQT_QPA_PLATFORMTHEME=gtk3を外し、QT_STYLE_OVERRIDE=Fusionで再現を分離するGTK_PATH・GTK_DATA_PREFIX・GTK_EXE_PREFIXなど、host側GTK pluginを混ぜる変数を外す- file chooserが開き、fixtureを実際に選択できるところまで確認する
- 動いた環境だけをprocess-localなNix wrapperへ固定する
- 公式bundleへhostのGTK/GDK/GLibを広く継ぎ足す必要が出たら、恒久修復ではなくNix版への切替か再package化として扱う
判断基準
外部GUIの評価では、アプリ機能とNixOS向けpackage/runtime適合性を分ける。ABI修復が評価の主作業になり始めたら、その経路を打ち切ってもアプリ自体の不採用理由にはしない。一方、動作後の主導線が合わないなら、機能数が多くても日常運用へ採用しない根拠になる。