本稿は、Debian 上の GNOME Wayland 環境(iMac/Debian)で発生した「起動直後に日本語入力できない」「ibus-setup を契機に入力できるようになる」「その後 ibus-daemon が二重起動している」という現象を、観測ログに基づいて原因まで切り分け、最終的にどの起動責務を採用すべきかまでを確定した記録である。結論は、GNOME Wayland では IBus は systemd の常駐サービスとして固定的に起動される設計ではなく、DBus activation(要求に応じた起動)を中心に組まれている、という一点に尽きる。DBus の service activation 自体は仕様として明文化されている。[1]
想定読者は、Debian + GNOME Wayland + IBus(mozc)を運用し、プロセス監視や自動起動を自前で制御したくなる層である。以降のコマンド例は「観測」と「再発防止」のための最小セットに絞る。原則として IBus を手動で常駐化しない。Wayland と Xwayland の関係、GNOME セッションと systemd –user の関係、IBus と mozc の関係を区別して読むことが重要になる。[2][3][4]
1. 現象の全体像
観測された事実は次の 3 点に収束する。第一に、ps で ibus-daemon -drx が起動しているように見える局面があるのに、起動直後に日本語入力ができないケースがあった。第二に、ibus-setup 実行後に日本語入力が可能になった。第三に、その後の ps で ibus-daemon -drx と ibus-daemon –xim –daemonize が同時に存在し、二重起動になった。
この一連を解く鍵は 3 つある。A は「観測コマンドの仕様」(特に pgrep の落とし穴)、B は「Wayland における XIM の位置づけ」、C は「GNOME Wayland における IBus 起動方式(DBus activation)」である。IBus 自体の構成要素(daemon、engine、UI、X11 ブリッジ)を理解しておくと、プロセスの増減を正しく読める。[5][6]
2. pgrep の落とし穴
最初の混乱は、pgrep -x “ibus-daemon -drx” が 0 件になり、「起動していない」と誤認したことにあった。pgrep -x はプロセス名(comm)に対する完全一致であり、コマンドライン全体に対する照合ではない。さらに、Linux 側で comm の長さには制限があり、pgrep は「プロセス名が 15 文字を超えるパターンは一致しない」旨を警告する。つまり、”ibus-daemon -drx” のように引数込み文字列を「プロセス名」として照合しようとすると、意図どおりに動かない。[7][8]
2.1 正しい観測コマンド
| 目的 | 推奨コマンド | 理由 |
|---|---|---|
| 実行ファイル名で存在確認 | pgrep -x ibus-daemon | comm に一致させるため。引数差分に引きずられない。 |
| 引数も含めて一覧 | pgrep -a ibus-daemon | PID と引数が同時に取れる。 |
| コマンドライン文字列で照合 | pgrep -f ‘ibus-daemon -drx’ | pattern を cmdline 全体に当てる(ただし誤一致には注意)。[7] |
以降の議論では「IBus が動いているか」は pgrep -a ibus-daemon を主に使う。起動責務の追跡は systemd の cgroup(scope/service)を読むことで行う。systemd のユーザーマネージャと systemctl の仕様を押さえると、プロセスの由来を機械的に確定できる。[9][10]
3. XIM 経路は「ある」が「主役ではない」
Wayland セッション(XDG_SESSION_TYPE=wayland)でも、X11 アプリ互換のために Xwayland が動き、IBus 側の X11 ブリッジ(ibus-x11)が起動し、root window の XIM_SERVERS に IBus が登録されることがある。これは「X11 時代の入力方式(XIM)」を Xwayland 経由で提供するための互換層であり、Wayland 上の GNOME での主経路そのものではない。Xwayland 自体は Wayland セッション上で X11 クライアントを動かすための公式コンポーネントである。[11][12][2]
今回、ibus-setup 実行後に ibus-daemon –xim –daemonize が追加で起動し、日本語入力が可能になったように見えた。しかし、この観測だけで「XIM が必要だった」と結論するのは危険である。理由は、Wayland 上の GTK/Qt は通常 IBus を直接利用し、XIM は必須ではないからだ。XIM の仕様自体は Xlib の Input Methods として文書化されているが、Wayland とは異なる時代の仕組みである。[12][2]
3.1 XIM 関連の確認点
| 観測点 | コマンド | 読むべき意味 |
|---|---|---|
| XIM サーバ登録 | xprop -root | grep XIM_SERVERS | Xwayland 側の互換層が動いているかの参考。 |
| 環境変数 | echo $XMODIFIERS | XIM を使うクライアントが参照する設定。 |
| ibus-x11 の存在 | ps aux | grep ibus-x11 | X11 クライアント向けブリッジが起動している。 |
ここまでで言えるのは、「XIM は観測できるが、Wayland GNOME における本質ではない」ということだ。次節で示す DBus activation ログが、今回の現象の説明としてより強い根拠になる。
4. 本質: GNOME Wayland の IBus は DBus activation で起動される
GNOME Wayland 環境では、IBus は「常時起動して待つ」よりも、「クライアントが必要になった瞬間に DBus がサービスを起動する」方式が中心になる。DBus 仕様には、メッセージバスがサービスを起動する(starting services / activation)仕組みが明記されている。従って、ログイン直後に必ず IBus が常駐していなくても、入力コンテキストが作られ、IBus サービス名が要求された瞬間に起動しても設計上は自然である。[1]
今回の journalctl –user -b では、org.freedesktop.portal.IBus の activation が「requested by: … (comm=ibus-daemon …)」として記録されていた。xdg-desktop-portal は、Wayland デスクトップでアプリとデスクトップ環境を橋渡しするための標準コンポーネントであり、GNOME 実装も公開されている。ここに IBus 関連の portal が現れるのは不自然ではない。[13][14]
安定状態では、pgrep -a ibus-daemon が /usr/bin/ibus-daemon –panel disable の 1 個体になった。ibus-daemon のオプションは man ページとして提供されており、–panel disable は IBus 側パネルを無効にする設定である。GNOME Shell は入力ソース UI を統合管理するため、GNOME Wayland でこの形が選ばれるのは合理的である。GNOME 側の入力ソース設定のユーザ向け説明も存在する。[16][17]
4.1 観測で確定する手順
| 観測したいこと | コマンド | 成功判定 |
|---|---|---|
| IBus の実体(個体数と引数) | pgrep -a ibus-daemon | 1 行で panel disable を含む。 |
| DBus activation の痕跡 | journalctl –user -b | grep -E ‘portal.IBus|ibus-daemon’ | Activating service … requested by … が出る。 |
| Wayland セッションであること | echo $XDG_SESSION_TYPE | wayland。 |
| デスクトップ環境の確定 | echo $XDG_CURRENT_DESKTOP | GNOME。 |
5. 二重起動が起きた理由
二重起動は「起動責務が複数に分散している」時に起きる。今回の候補は 3 つだった。第一に、シェルで ibus-daemon -drx を起動するロジックを入れていたこと。第二に、ibus-setup 実行が IBus の起動を誘発し、結果として別の ibus-daemon 個体(–xim 付きなど)を追加し得ること。第三に、GNOME 側が DBus activation で別個体を起動すること。
結果として ibus-daemon -drx と ibus-daemon –xim –daemonize が同時に存在した。二重起動は表面的には「直った」ように見える場合があるが、長期的には入力フォーカスの揺れ、ショートカット競合、engine の複数起動などの温床になる。mozc は IBus の engine として動作し、プロセスとして ibus-engine-mozc が立つため、二重起動は engine にも波及しやすい。[18][19]
6. 起動責務を特定する: systemd cgroup と scope の読み方
「親プロセスが systemd –user(PPID が systemd)」という観測だけでは、GNOME が起動したのか、端末が起動したのかは判定できない。決定打になるのは systemd が管理する cgroup(scope/service)である。systemctl は PID を指定して status を表示でき、そこに cgroup と scope が出る。[9][10]
今回、手動で ibus-daemon -drx を起動した個体は vte-spawn-….scope 配下(端末由来)に入っていた。これは「GNOME の autostart 由来」ではなく「端末プロセスツリー由来」であることを意味する。一方、GNOME が起動するアプリは app-….scope のように記録されることがある。GNOME セッションと systemd –user の連携自体は GNOME 側の取り組みとして説明されている。[9][15]
6.1 何を見ればよいか
| 観測点 | コマンド | 読み方 |
|---|---|---|
| PID が属する scope | systemctl –user status <PID> | vte-spawn なら端末由来、app-gnome なら GNOME 由来の可能性が高い。 |
| autostart generator の存在 | systemctl –user list-unit-files –all | grep autostart | generated として列挙される。存在(生成されうる)と active は別。 |
| デスクトップの確定 | echo $XDG_CURRENT_DESKTOP | GNOME であることを確定する。 |
なお、/etc/xdg/autostart にある ibus-mozc-launch-xwayland.desktop は、Wayland セッションで xrefresh を呼んで Xwayland 側の準備を促す目的のものであり、ibus-daemon を直接起動するものではなかった。この「名前に ibus-mozc と付いているが ibus-daemon を起動しない」という事実は、起動責務を読み違えやすいポイントである。環境変数やセッション環境の設計は systemd 側の仕組みと組み合わさって動く。[21]
7. systemd unit 化が失敗した理由
「起動責務を systemd に寄せて明示管理する」方針を試し、~/.config/systemd/user/ibus.service で ExecStart=/usr/bin/ibus-daemon -drx を設定した。しかし unit は Started と記録されるものの、すぐ inactive (dead) になり、常駐できなかった。その間も DBus activation により /usr/bin/ibus-daemon –panel disable が起動しており、systemd unit は主役になれない。
これは設計上自然で、GNOME Wayland の IBus は DBus activation を中心にしている。systemd から常駐させようとすると、DBus 名の競合や初期化順の競合が起き、IBus 側が自己終了するか、どちらかが上書きされる。結果として unit が維持されない。この挙動は「systemd と DBus activation を二重に持つ」構成が根本的に不安定であることを示している。従って GNOME Wayland では「systemd unit 化は採用しない」が正しい判断となった。[1][16]
8. 最終構成(確定した運用ルール)
最終的に採用した運用ルールは次のとおり。
- IBus は GNOME Wayland の既定どおり DBus activation に任せる。
- シェルで ibus-daemon を起動しない。
- systemd –user の独自 ibus.service は作らない(作っても維持されず、競合する)。
- 二重起動を疑う場合は、まず pgrep -a ibus-daemon を確認し、1 個体であることを確かめる。
ログイン後に安定している状態では、pgrep -a ibus-daemon は /usr/bin/ibus-daemon –panel disable の 1 行になり、これが「正」の状態になる。
9. 環境変数の位置づけ
このとき ~/.zshrc_local には次の export があった。
1 2 3 | export GTK_IM_MODULE=ibus export QT_IM_MODULE=ibus export XMODIFIERS=@im=ibus |
これらは「zsh から起動したプロセス」に対しては確実に効く。一方、GNOME セッション全体(systemd –user の environment)に必ず入るとは限らない。systemd の環境配布は environment.d という仕組みとして用意されており、GUI セッション全体に確実に反映させたい場合の一般的な方法として知られている。環境変数の整理方法としては Arch Wiki のまとめが参考になる。[20][21]
しかし本件では、environment.d に環境変数を移設した状態で、GNOME ログイン後に terminal を再起動するとキー入力を受け付けなくなる現象が発生した。SSH セッションやログイン画面では正常に入力できるため、キーボードやシェル設定の問題ではなく、GNOME セッション内の入力方式初期化に影響が出ていることが確認された。
Wayland 環境の GNOME では、IBus は DBus activation によって起動され、GTK アプリケーションは IBus と直接通信するため、従来の XIM 環境変数(特に XMODIFIERS)は必須ではない。実際に環境変数を完全に削除した状態でも、日本語入力は安定して動作することを確認した。
このため本環境では environment.d による環境変数設定は採用していない。GNOME Wayland 環境では、IBus は DBus activation に任せ、環境変数は設定しない構成とした。
GDM やセッション環境の扱いを理解しておくと、環境変数の適用範囲の議論が整理しやすくなる。[22]
10. 再発防止チェックリスト
同様の現象が再発した場合の機械的チェック手順を固定する。
1 2 3 4 5 6 7 8 9 | # 1. IBus の個体数と起動形 pgrep -a ibus-daemon # 2. DBus activation の痕跡 journalctl --user -b | grep -E 'portal.IBus|ibus-daemon' # 3. セッション種別とデスクトップ echo $XDG_SESSION_TYPE echo $XDG_CURRENT_DESKTOP |
この 3 点が揃っていれば「GNOME Wayland の正規経路で動いている」。二重起動が見えた場合は、まず手動起動(シェル起動)を疑い、必要なら killall ibus-daemon の後、ログアウト/ログインで GNOME に再構成させる。
参考文献
- D-Bus specification: Starting services (activation). https://dbus.freedesktop.org/doc/dbus-specification.html#message-bus-starting-services
- Wayland documentation (protocol and architecture). https://wayland.freedesktop.org/docs/html/
- Mutter (GNOME compositor) repository. https://gitlab.gnome.org/GNOME/mutter
- GNOME Shell project overview. https://wiki.gnome.org/Projects/GnomeShell
- IBus (upstream repository). https://github.com/ibus/ibus
- Arch Wiki: IBus (overview and integration). https://wiki.archlinux.org/title/IBus
- procps-ng pgrep manual (pgrep, -f option). https://man7.org/linux/man-pages/man1/pgrep.1.html
- Linux kernel documentation: /proc filesystem (process information). https://www.kernel.org/doc/html/latest/filesystems/proc.html
- systemd manual: systemd (user manager). https://www.freedesktop.org/software/systemd/man/systemd.html
- systemd manual: systemctl. https://www.freedesktop.org/software/systemd/man/systemctl.html
- Xwayland overview (freedesktop.org). https://www.freedesktop.org/wiki/Software/Xwayland/
- Xlib manual: Input Methods (XIM). https://www.x.org/releases/X11R7.7/doc/libX11/libX11/libX11.html#Input_Methods
- xdg-desktop-portal (overview). https://flatpak.github.io/xdg-desktop-portal/
- xdg-desktop-portal-gnome (GNOME implementation). https://gitlab.gnome.org/GNOME/xdg-desktop-portal-gnome
- GNOME Wiki: systemd –user initiative. https://wiki.gnome.org/Initiatives/SystemdUser
- Debian manpages: ibus-daemon (options). https://manpages.debian.org/ibus-daemon
- GNOME Help: Keyboard layouts and input sources. https://help.gnome.org/users/gnome-help/stable/keyboard-layouts.html
- Mozc (upstream repository). https://github.com/google/mozc
- Debian packages: ibus-mozc. https://packages.debian.org/ibus-mozc
- Arch Wiki: Localization input method environment variables. https://wiki.archlinux.org/title/Localization#Input_method
- systemd manual: environment.d. https://www.freedesktop.org/software/systemd/man/environment.d.html
- GNOME: GDM administration guide (session environment basics). https://help.gnome.org/admin/gdm/stable/