概要
NVIDIA dGPU と AMD/Intel iGPU の両方が搭載された Linux マシンで、Vulkan ICD として nvidia_icd.json と radeon_icd.json (Mesa) の両方がインストールされている環境において、hazkey-server が起動直後または使用中に SIGILL (signal 4 / invalid opcode) で繰り返しクラッシュし、fcitx5 ごと連鎖的に止まって日本語入力が不能になります。
環境
- ディストリビューション: CachyOS (Arch Linux 系)
- カーネル: Linux 7.0.10-2-cachyos-bore
- CPU: AMD Ryzen 7 7700X (iGPU: Raphael / RDNA2)
- GPU: NVIDIA GeForce RTX 4070 + Ryzen 内蔵 GPU の 2基構成
- NVIDIA ドライバ: 610.43.02
- パッケージ:
fcitx5-hazkey-bin 0.2.1-2 (AUR)
- Vulkan ICD:
/usr/share/vulkan/icd.d/nvidia_icd.json と /usr/share/vulkan/icd.d/radeon_icd.json の両方が存在
症状
hazkey-server が SIGILL で異常終了し、fcitx5 が hazkey-server へ再接続を試みた末に SIGKILL で道連れに落ちます。約1週間で7回 coredump を確認:
TIME PID UID GID SIG EXE
Tue 2026-05-26 20:29:38 JST 3263 1000 1000 SIGILL /usr/lib/hazkey/hazkey-server
Thu 2026-05-28 01:01:13 JST 3264 1000 1000 SIGILL /usr/lib/hazkey/hazkey-server
Fri 2026-05-29 22:49:36 JST 3238 1000 1000 SIGILL /usr/lib/hazkey/hazkey-server
Sat 2026-05-30 01:55:25 JST 8565 1000 1000 SIGILL /usr/lib/hazkey/hazkey-server
Sat 2026-05-30 02:26:10 JST 194176 1000 1000 SIGILL /usr/lib/hazkey/hazkey-server
Tue 2026-06-02 20:37:10 JST 3382 1000 1000 SIGILL /usr/lib/hazkey/hazkey-server
Tue 2026-06-02 20:44:53 JST 30614 1000 1000 SIGILL /usr/lib/hazkey/hazkey-server
カーネルログ:
kernel: traps: hazkey-server[30614] trap invalid opcode ip:55b43e925ed5 sp:7fff97d647a0
error:0 in hazkey-server[ef4ed5,55b43da31000+19ba000]
systemd-coredump: Process 30614 (hazkey-server) of user 1000 terminated abnormally with signal 4/ILL
fcitx5 側のログ (hazkey_server_connector.cpp から大量の再接続失敗):
fcitx5: E hazkey_server_connector.cpp:116] Failed to create socket
fcitx5: I hazkey_server_connector.cpp:169] Failed to connect hazkey-server after 8 attempts
fcitx5: E hazkey_server_connector.cpp:181] Failed to establish connection to hazkey-server
systemd: app-org.fcitx.Fcitx5@autostart.service: Main process exited, code=killed, status=9/KILL
原因の推定
hazkey-server の coredump を coredumpctl info で確認したところ、プロセス内に NVIDIA と Mesa (RADV) の Vulkan ドライバが両方ロードされ、両方が独自のワーカースレッドを走らせていることが判明しました。
Stack trace of thread 3406 / 3407:
pthread_cond_wait (libc.so.6)
libvulkan_radeon.so + 0x379d7e
libvulkan_radeon.so + 0x34280d
libvulkan_radeon.so + 0x379cec
Stack trace of thread 3833 / 3834 / 3835 / 3838:
pthread_cond_timedwait (libc.so.6)
libnvidia-glcore.so.610.43.02 + 0x9f4f5c
...
クラッシュした親スレッドは Swift runtime 由来 (Swift は致命的エラー時に ud2 命令を発行 → SIGILL):
Stack trace of thread (crashing):
hazkey-server + 0xef4ed5
hazkey-server + 0x4fd4a9
hazkey-server + 0x4f48d1
hazkey-server + 0x4daaab
hazkey-server + 0x7687d3
hazkey-server + 0x76b20a
hazkey-server + 0x76a887
hazkey-server + 0x769982
hazkey_server_main (hazkey-server + 0x738f49)
_start (hazkey-server + 0x341ca5)
Vulkan loader が利用可能な ICD を全て初期化しに行く挙動と、Swift runtime / azooKey (Zenzai) 側の GPU 初期化処理の組み合わせで、ベンダー異なる Vulkan ドライバ同居が precondition failure を引き起こしていると思われます。
回避策 (確認済み・有効)
hazkey-server の起動環境で Vulkan ICD を 1 個に固定すると、クラッシュが止まります。systemd user の drop-in で fcitx5 サービスにだけ環境変数を注入する方法が副作用が少なく、他の Vulkan アプリ (ゲーム等) には影響しません。
~/.config/systemd/user/app-org.fcitx.Fcitx5@autostart.service.d/override.conf:
[Service]
Environment=VK_DRIVER_FILES=/usr/share/vulkan/icd.d/nvidia_icd.json
Environment=VK_ICD_FILENAMES=/usr/share/vulkan/icd.d/nvidia_icd.json
systemctl --user daemon-reload && systemctl --user restart app-org.fcitx.Fcitx5@autostart.service の後、SIGILL は再発していません。nvidia_icd.json 側を radeon_icd.json に置き換えても恐らく同様に機能します (未検証)。
提案
恒久的な対策として、hazkey-server 側で以下のいずれかを検討いただけると、マルチGPU環境のユーザーが救われると思います:
- Vulkan 初期化に失敗・競合した場合に CPU フォールバックする (現状はそのままクラッシュ)。
- デフォルトの ICD 選択ロジックを 1 個に絞る (例: 最初に成功した ICD のみ使用)。
hazkey-server 自身が起動時に VK_DRIVER_FILES 未設定であれば検出した ICD のうち 1 つに限定する。
- README またはパッケージドキュメントに「マルチGPU環境では
VK_DRIVER_FILES で 1 個に固定すること」を明記する。
ご確認よろしくお願いします。
概要
NVIDIA dGPU と AMD/Intel iGPU の両方が搭載された Linux マシンで、Vulkan ICD として
nvidia_icd.jsonとradeon_icd.json(Mesa) の両方がインストールされている環境において、hazkey-serverが起動直後または使用中に SIGILL (signal 4 / invalid opcode) で繰り返しクラッシュし、fcitx5 ごと連鎖的に止まって日本語入力が不能になります。環境
fcitx5-hazkey-bin 0.2.1-2(AUR)/usr/share/vulkan/icd.d/nvidia_icd.jsonと/usr/share/vulkan/icd.d/radeon_icd.jsonの両方が存在症状
hazkey-serverが SIGILL で異常終了し、fcitx5 が hazkey-server へ再接続を試みた末に SIGKILL で道連れに落ちます。約1週間で7回 coredump を確認:カーネルログ:
fcitx5 側のログ (
hazkey_server_connector.cppから大量の再接続失敗):原因の推定
hazkey-serverの coredump をcoredumpctl infoで確認したところ、プロセス内に NVIDIA と Mesa (RADV) の Vulkan ドライバが両方ロードされ、両方が独自のワーカースレッドを走らせていることが判明しました。クラッシュした親スレッドは Swift runtime 由来 (Swift は致命的エラー時に
ud2命令を発行 → SIGILL):Vulkan loader が利用可能な ICD を全て初期化しに行く挙動と、Swift runtime / azooKey (Zenzai) 側の GPU 初期化処理の組み合わせで、ベンダー異なる Vulkan ドライバ同居が precondition failure を引き起こしていると思われます。
回避策 (確認済み・有効)
hazkey-serverの起動環境で Vulkan ICD を 1 個に固定すると、クラッシュが止まります。systemd user の drop-in で fcitx5 サービスにだけ環境変数を注入する方法が副作用が少なく、他の Vulkan アプリ (ゲーム等) には影響しません。~/.config/systemd/user/app-org.fcitx.Fcitx5@autostart.service.d/override.conf:systemctl --user daemon-reload && systemctl --user restart app-org.fcitx.Fcitx5@autostart.serviceの後、SIGILL は再発していません。nvidia_icd.json側をradeon_icd.jsonに置き換えても恐らく同様に機能します (未検証)。提案
恒久的な対策として、hazkey-server 側で以下のいずれかを検討いただけると、マルチGPU環境のユーザーが救われると思います:
hazkey-server自身が起動時にVK_DRIVER_FILES未設定であれば検出した ICD のうち 1 つに限定する。VK_DRIVER_FILESで 1 個に固定すること」を明記する。ご確認よろしくお願いします。