Flatpaksにプリランフックを追加するスクリプトの作成

Flatpaksにプリランフックを追加するスクリプトの作成

Flatpakが実行される前に、Flatpakが使用するコンテナが実行されるようにインストールされているFlatpakの実行方法を変更したいと思いますpodman(Flatpakの実行が完了したら終了することをお勧めしますが、これはオプションです)。これの目的は、リソースを節約することです。podmanコンテナが常に実行される必要はありません。

explainshellたとえば、VSCodeの起動時にコンテナを起動したいとします。

コマンドラインでFlatpaksを実行する場合を扱うのは簡単です。スクリプトalias flatpakを使用flatpak-wrapperし、そのflatpak-wrapperスクリプト内でflatpak run関心のある呼び出しを傍受し、podman run必要に応じてコマンドを実行してから元の要求flatpak runコマンドを実行します。

ただし、flatpakを介してインストールされたファイルには、シェルエイリアスの影響を受けないハードコーディングされた.desktop呼び出しが含まれているため、よりトリッキーです。 KDE UIを使用してこれらのファイルを1つずつ簡単に編集/usr/bin/flatpakできますが、この編集内容をスクリプトとして作成するにはどうすればよいですか?.desktop

私が必要なのは、次のようなものだと思います。

  1. .desktopbashスクリプトを使用して編集できるように、特定のFlatpak用にインストールされているファイルを見つける方法
  2. .desktopFlatpakのアップグレードによってファイルが変更された後でも、ユーザー.desktopの手動ステップなしでそのファイルの編集内容をそのまま残すことができます。

(Podmanコンテナがサポートしていないため、ソケットアクティベーションが利用できないとします。)

答え1

私のdbusセッションバスを少し監視した結果、vscodium Flatpakコンテナに関連する多くのトラフィックが明らかになりました。しかし、インターネット検索の後にsystemdが実行されている場合 - それが私に役立つことを知りました -どのFlatpakコンテナは起動時にsystemdにメッセージを送信します。システム構成ファイルの使用必要な自動起動動作を設定します。

これが私がすることです。このソリューションは、systemd構成ファイルを生成する2つの可能な方法を示しています。

  1. 単純なファイルまたは
  2. ディレクトリ内のファイル.d- 他のスクリプトと競合しない一意のファイル名を使用できるため、スクリプトの生成に適しています。
[greenrd@fedora ~]$ mkdir .config/systemd/user

.servicePodmanコンテナのsystemdファイルを生成します。 Upholdは後で再起動する必要があるため、再起動ポリシーを「いいえ」に設定しました。

teeコマンドプロンプトでこれを手動で実行するため、インストール前に確認できるようにこの方法を使用しています。スクリプトではこれは必要ありません。

[greenrd@fedora ~]$ podman generate systemd --restart-policy=no explainshell |tee es.service
WARN[0000] Container 2f9dd483eed9f6a5705dc142e65c55103c25f8884aa51e3b0e400686f8640b31 has restart policy "always" which can lead to issues on shutdown: consider recreating the container without a restart policy and use systemd's restart mechanism instead 
# container-2f9dd483eed9f6a5705dc142e65c55103c25f8884aa51e3b0e400686f8640b31.service
# autogenerated by Podman 4.5.1
# Fri Jun 16 21:19:03 BST 2023

[Unit]
Description=Podman container-2f9dd483eed9f6a5705dc142e65c55103c25f8884aa51e3b0e400686f8640b31.service
Documentation=man:podman-generate-systemd(1)
Wants=network-online.target
After=network-online.target
RequiresMountsFor=/run/user/1000/containers

[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=no
TimeoutStopSec=70
ExecStart=/usr/bin/podman start 2f9dd483eed9f6a5705dc142e65c55103c25f8884aa51e3b0e400686f8640b31
ExecStop=/usr/bin/podman stop  \
        -t 10 2f9dd483eed9f6a5705dc142e65c55103c25f8884aa51e3b0e400686f8640b31
ExecStopPost=/usr/bin/podman stop  \
        -t 10 2f9dd483eed9f6a5705dc142e65c55103c25f8884aa51e3b0e400686f8640b31
PIDFile=/run/user/1000/containers/overlay-containers/2f9dd483eed9f6a5705dc142e65c55103c25f8884aa51e3b0e400686f8640b31/userdata/conmon.pid
Type=forking

[Install]
WantedBy=default.target

起動時に自動的に開始される動作を削除してみましょう。

[greenrd@fedora ~]$ sed -i -e '/WantedBy=default\.target/d' es.service

Upholds次の問題を処理する必要があるため、再起動設定を削除してください。

[greenrd@fedora ~]$ sed -i -e '/Restart=/d' es.service

よさそうですね。インストールしてみましょう。

[greenrd@fedora ~]$ mv es.service .config/systemd/user/explainshell.service

依存関係を追加します。範囲を使って見つけました。忙しい:

[greenrd@fedora ~]$ cat <<EOF >.config/systemd/user/app-com.vscodium.codium-.scope.d/my-ublue.conf
> [Unit]
Upholds=explainshell.service
> EOF

最後に、新しい設定ファイルについてsystemdに通知します。

[greenrd@fedora ~]$ systemctl --user daemon-reload

いいですね。動作しますが、vscodiumが終了した後もコンテナはまだ存在します。

[greenrd@fedora ~]$ podman ps
CONTAINER ID  IMAGE                                    COMMAND               CREATED       STATUS             PORTS                   NAMES
9b733a307e42  quay.io/fedora/fedora:38                 -v --name greenrd...  2 days ago    Up 2 days                                  fedora
ef21c84a47eb  ghcr.io/ublue-os/boxkit:latest           -v --name greenrd...  2 days ago    Up 2 days                                  boxkit
2f9dd483eed9  ghcr.io/idank/idank/explainshell:master  make serve            45 hours ago  Up About a minute  0.0.0.0:5000->5000/tcp  explainshell

実際、vscodiumはまだ完全に死んでいません。いくつかのゾンビプロセスと他のいくつかのプロセスはまだ生きています。奇妙な。それらを殺そう:

[greenrd@fedora ~]$ killall codium
[greenrd@fedora ~]$ killall codium
[greenrd@fedora ~]$ killall -KILL codium
codium: no process found

ただし、explainshellコンテナはまだ存在します。

[greenrd@fedora ~]$ podman ps
CONTAINER ID  IMAGE                                    COMMAND               CREATED       STATUS        PORTS                   NAMES
9b733a307e42  quay.io/fedora/fedora:38                 -v --name greenrd...  2 days ago    Up 2 days                             fedora
ef21c84a47eb  ghcr.io/ublue-os/boxkit:latest           -v --name greenrd...  2 days ago    Up 2 days                             boxkit
2f9dd483eed9  ghcr.io/idank/idank/explainshell:master  make serve            45 hours ago  Up 3 minutes  0.0.0.0:5000->5000/tcp  explainshell

この問題を解決するために追加しようとしました。

After=explainshell.service
PropagatesStopTo=explainshell.service

到着するmy-ublue.conf。しかし、残念ながら、Flatpakによって生成された初期範囲は一時的であるため、停止し、すぐにexplainshellコンテナも停止します。したがって、コンテナを自動的に終了することはできませんが、これはオプションの要件です。

関連情報