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를 통해 이러한 파일을 하나씩 쉽게 편집 /usr/bin/flatpak
할 수 있지만 이 편집 내용을 스크립트로 작성하려면 어떻게 해야 합니까?.desktop
내가 필요한 것은 다음과 같다고 생각합니다.
.desktop
bash 스크립트를 사용하여 편집할 수 있도록 특정 Flatpak에 대해 설치된 파일을 찾는 방법.desktop
Flatpak 업그레이드로 인해 파일이 변경된 후에도.desktop
사용자의 수동 단계 없이 해당 파일에 대한 편집 내용이 그대로 유지되도록 허용합니다.
(podman 컨테이너가 지원하지 않기 때문에 소켓 활성화를 사용할 수 없다고 가정합니다.)
답변1
내 dbus 세션 버스를 조금 모니터링한 결과 vscodium Flatpak 컨테이너와 관련된 많은 트래픽이 드러났습니다. 하지만 인터넷 검색을 한 후에 systemd가 실행 중이라면 - 그것이 나에게 도움이 되었다는 것을 알게 되었습니다 -어느Flatpak 컨테이너는 시작 시 systemd에 메시지를 보냅니다.시스템 구성 파일 사용원하는 자동 시작 동작을 구성합니다.
이것이 제가하는 것입니다. 이 솔루션은 systemd 구성 파일을 생성하는 두 가지 가능한 방법을 보여줍니다.
- 간단한 파일 또는
- 디렉터리의 파일
.d
- 다른 스크립트와 충돌하지 않는 고유한 파일 이름을 사용할 수 있으므로 스크립트 생성에 더 적합합니다.
[greenrd@fedora ~]$ mkdir .config/systemd/user
.service
Podman 컨테이너에 대한 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 컨테이너도 중지됩니다. 따라서 컨테이너를 자동으로 종료할 수는 없지만 이는 선택적인 요구 사항입니다.