VPN クライアントはアプリケーションメニューから起動し、トンネルは接続するのに、あるマシンではサインイン後にアイコンが決して現れず、同じパッケージが別のマシンでは正しく動作する。三つの観察が一つの不満に押し込められている。プログラムが起動したか、そのインターフェースが見えているか、トンネルが上がっているか。ランチャーはフィルタ用キーを持つデスクトップエントリで制御されており、そのエントリは VPN プロトコルとは何の関係もない。手順書を順に進め、三つのうち一つがきれいに切り分けられたら止める。

三つの別々の事実: 起動、アイコン、トンネル

デスクトップエントリはプログラムを起動する。トレイ実装をインストールすることはできず、アプリケーションが使うプロトコルに対応していないパネルにインジケーターを出すこともできない。プロセスがすでに動いているなら、起動の問いは解決済みで、代わりに見ているのは統合の問題である。

トンネルはまた別の第三の事実である。アイコンが出ないことは接続が落ちた証拠ではなく、アイコンを「直す」ためにクライアントを強制終了して再起動するのは、動いているトンネンを理由もなく中断させる方法そのものだ。利用者はアイコンの欠落とトンネルの破綻を同じ一文で報告する。だからこそ、この二つは紙の上で分けておく必要がある。

何かを変える前に切り分ける。プロセスが存在するか、次にパネルがインジケーターに対応しているか、最後にインターフェースが接続を報告しているかを確認する。それぞれの答えは異なる層と異なる担当者を指している。

セッションが実際に読むエントリを見つける

自動起動エントリはユーザーディレクトリとシステムディレクトリにあり、ファイル名が一致する場合はユーザー側のコピーが優先される。間違った方を読むことが、変更が効果なしに見える最も一般的な理由である。何かを編集する前に両方のディレクトリを一覧し、セッションが実際に読み込むファイルを記録しておく。

ls -l ~/.config/autostart/ /etc/xdg/autostart/
echo "$XDG_CURRENT_DESKTOP"
grep -H -E '^(OnlyShowIn|NotShowIn|TryExec|Hidden|Exec)=' ~/.config/autostart/*.desktop /etc/xdg/autostart/*.desktop

環境変数はフィルタ用キーと比較されるセッション名を出力する。通常はコロンで区切られたリストだ。エントリ内の値と文字どおりに比較すること。これらの名前はセッションの説明ではなく、大文字小文字を区別する設定の詳細だからだ。値GNOMEはgnomeと一致せず、その結果生じる沈黙にはエラーメッセージが一切添えられない。推測せずに出力すること。

同じファイル名が両方のディレクトリにある場合、重要なのはユーザー側のコピーである。システム側のファイルを編集して、なぜ何も変わらないのかと首をかしげるのは、非常によくある無駄な一時間だ。

フィルタ用キーを順に読む

以下の例示エントリは、セッションがプログラムを起動するかどうかを決めるキーを示している。これは断片であり完全なランチャーではなく、値は架空のパスに属する。

[Desktop Entry]
Type=Application
Name=Example VPN
Exec=/opt/example-vpn/client --minimized
TryExec=/opt/example-vpn/client
OnlyShowIn=GNOME;

OnlyShowInはエントリを列挙された環境に限定し、NotShowInは列挙された環境を除外する。両方が一つのエントリに現れる場合の有用な動作は仕様で定義されていないので、両方を含むファイルは巧みな組み合わせではなく欠陥として扱う。二つ目を足して優先規則に期待するのではなく、不要なキーを削除すること。

TryExecは、セッションが起動する前に実行ファイルが存在するかを問い合わせる。そのため古いインストールの残骸のパスは、新しいパッケージがメニューから起動すれば動くとしても自動起動を抑え込み、その失敗はデスクトップのフィルタとまったく同じに見える。

システムレベルではなくユーザーレベルで上書きする

このマシンにとってフィルタが本当に誤っている場合は、システムのエントリをユーザーディレクトリにコピーして、コピーを変更する。XDG の自動起動規則では同名のユーザーエントリが優先され、Hidden=trueはシステムのファイルを削除せずに無効化する。

mkdir -p ~/.config/autostart
cp /etc/xdg/autostart/example-vpn.desktop ~/.config/autostart/
sed -i '/^OnlyShowIn=/d' ~/.config/autostart/example-vpn.desktop
desktop-file-validate ~/.config/autostart/example-vpn.desktop

ログアウトする前に結果を検証すること。不正な形式のエントリは黙って無視され、次のテストでは何も分からない。パッケージを再インストールしても上書きは消えない。それが要点であり、存在を記録しておく理由でもある。チケットにファイルのパスを書き、次の人が上書きを再導出せずに見つけられるようにする。

共有のシステムランチャーを編集するより、こちらを選ぶ。それはマシン上のすべての利用者の動作を変え、同じようにはレビューできない。ユーザーレベルの上書きは一か所で見え、ファイルを一つ消せば元に戻り、チケットで説明しやすい。システムのファイルはベンダーが同梱したまま残るので、パッケージ更新があなたの推論を黙って打ち消すことはない。

トンネルに触れずに起動を確認する

ログアウトして再びログインし、パネルを見る前にプロセスが存在することを確認する。起動の成功とアイコンの表示は二つの異なる結果である。デスクトップ統合の作業が必要なのは二つ目だけだ。両者を混同すると、ずっと動いていたパッケージを再インストールすることになる。

pgrep -af example-vpn
systemctl --user status example-vpn.service
journalctl --user -b --no-pager | grep -i example-vpn | tail -20

プロセスが無い場合は、残っているフィルタや古いTryExecパスがないかエントリを読み直す。プロセスがあるならランチャーは機能しており、アイコンの欠落はパネルのインジケーター対応という別の問題であって、いま編集したエントリの問題ではない。

三つの観察をチケットに記録する。起動した、見えている、接続している。その記録は次の人が同じ三方向の混乱を繰り返すのを防ぎ、どの層にまだ作業が必要かを明らかにする。

関連記事