systemd 서비스가 네트워크 드라이브에서 실행되지 않습니다

systemd 서비스가 네트워크 드라이브에서 실행되지 않습니다

용어, 문법, 관례 등의 훼손이 있는 경우 미리 사과드립니다. 저는 아직 꽤 새로운 Linux 사용자입니다. 저는 최신 SteamOS(3.5.17)를 실행하는 Steam Deck을 개발 중입니다.

설정을 사용하여 서비스를 성공적으로 시작하고 종료했습니다.체계Steam Deck과 Raspberry Pi에 설정한 SAMBA 공유 네트워크 드라이브 간에 게임 저장을 동기화합니다. 드라이브가 "/home/deck/mnt/xtra/"(fstab을 통해)에 자동으로 마운트되도록 설정했습니다. 각 서비스가 실행됩니다.세게 때리다"sync_saves.sh" 스크립트는 각각 시작하고 종료할 때 호출됩니다.

문제는 "sync_saves.sh" 스크립트를 네트워크 드라이브에 저장하고 거기에서 실행하여 더 쉽게 업데이트할 수도 있다는 것입니다. 이 스크립트는 네트워크에 있는 다른 컴퓨터에서 자주 업데이트되는 구성 파일을 읽습니다. 수동으로 동기화를 유지하는 것이 매우 고통스럽기 때문에 각각의 로컬 버전을 갖는 것을 원하지 않습니다. 그러나 네트워크 드라이브에서 직접 스크립트를 실행할 수는 있지만제공하다스크립트가 네트워크 드라이브에 있으면 실행되지 않습니다. 오류가 있는 경우 다음을 실행할 때 오류가 표시되지 않습니다.

systemctl --user status ss_lin_startup

이 두 서비스는 ss_lin_startup.service 및 ss_lin_shutdown.service라는 파일에 정의되어 있습니다. 여기에 포함된 내용은 다음과 같습니다.

ss_lin_startup.service

[Unit]
Description=SyncSaves Startup

[Service]
#ExecStart=/home/deck/mnt/xtra/scripts/SyncSaves/sync_saves.sh #network drive, doesn't work
ExecStart=/home/deck/Documents/scripts/SyncSaves/sync_saves.sh #local drive, works

[Install]
WantedBy=default.target

ss_lin_shutdown.service

[Unit]
Description=SyncSaves Shutdown

[Service]
Type=oneshot
RemainAfterExit=true
#ExecStop=/home/deck/mnt/xtra/scripts/SyncSaves/sync_saves.sh #network drive, doesn't work
ExecStop=/home/deck/Documents/scripts/SyncSaves/sync_saves.sh #local drive, works

[Install]
WantedBy=default.target

"/home/deck/.config/systemd/user/"에 서비스 파일에 대한 링크를 넣고 다음 명령을 실행하여 (스크립트가 로컬 드라이브에 저장된 경우) 작동하도록 했습니다.

systemctl --user daemon-reload
systemctl --user enable ss_lin_startup.service
systemctl --user enable ss_lin_shutdown.service

중요한 경우 서비스 파일은 "/home/deck/Documents/scripts/SyncSaves/services"에 저장되고 "/home/deck/.config/systemd/user/" 폴더에 연결됩니다. Steam Deck 데스크톱 환경에서는 파일을 끌어서 놓아 이동, 복사 또는 링크할 수 있는 옵션을 제공하는데, 이것이 제가 링크를 만드는 데 사용하는 방법입니다.

작동하게 하는 방법이 있나요? 내가 이 문제를 올바른 방식으로 처리하고 있나요? 또는 시작 시 "sync_saves.sh" 스크립트를 네트워크 드라이브에서 로컬 드라이브로 자동으로 복사할 수 있는 방법이 있습니까?

나는 몇 시간 동안 인터넷 검색을 해왔고 내가 얻은 유일한 힌트는 다음과 같습니다.

-systemd가 서비스가 다른 파티션(아마도 시스템 파티션)에 있는 것을 좋아하지 않는다는 내용을 읽었지만 올바르게 이해했는지, 여기에 의미가 적용되는지 또는 스크립트가 호출하는 위치가 중요한지 잘 모르겠습니다. 저장됩니다.

- 이 주제에 대한 대부분의 토론에서 서비스는 "/etc/systemd/system/"에 배치되거나 링크되며 이를 활성화하는 명령은 --user 플래그 없이 때로는 sudo를 사용하는 "systemctl 활성화 your_service.service"입니다. Raspberry Pi의 초기 테스트에서 이 방법을 사용했지만 Steam Deck에 문제가 발생했습니다.

고쳐 쓰다:

문제의 일부를 해결했지만 여전히 해결책이 없습니다. 이런 일이 발생할 수 있다고 생각하지만 해결 방법을 모르겠습니다. 나는 달렸다

systemctl --user -l status ss_lin_startup.service

더 자세한 출력을 얻을 수 있습니다. "실행 파일을 찾을 수 없습니다...sync_saves.sh"라는 메시지가 나타납니다. 따라서 아마도 (적어도 부팅 시) 무슨 일이 일어나고 있는지는 드라이브가 아직 마운트되지 않았다는 것입니다. 사람들이 네트워크가 가동된 후 명령이 실행되도록 서비스 파일에서 다른 매개변수를 사용하는 것을 보았습니다(예: Wants=network-online.target, After=network-online.target). 그러나 이 매개변수를 사용하면 뭔가를 얻게 됩니다. "대상을 찾을 수 없습니다"와 같습니다.

최종 업데이트:

제가 생각해낸 해결책은 업데이트 스크립트를 작성하고(네트워크 드라이브에서 최신 버전의 sync_saves.sh 및 구성 파일 추출) 업데이트 스크립트를 실행하는 스크립트를 작성한 다음 동기화 스크립트를 실행하는 것이었습니다. 이렇게 하면 예상대로 작동합니다. SteamOS 기능에 대한 정보가 많지 않은 것 같아서 여기서 얼마나 진전이 있을 수 있을지 잘 모르겠습니다.

답변1

  • SELINUX가 있는 경우구현하다기본 모드(예: RHEL 8.9)에서 selinux는 /home/deck/mnt/xtra/scripts/SyncSaves/sync_saves.sh파일이 실행을 허용하는 selinux 컨텍스트로 표시되지 않는 한 서비스가 실행되지 않도록 합니다. 나는 이 질문을 했는데 어떤 어려운 관례도 없는 것 같으므로 자신만의 selinux 규칙을 작성하고 싶지 않다면 그냥 태그를 달겠습니다 bin_t.
  • SELINUX의 경우 다른 옵션은 다음과 같습니다.
    • 프롬프트에서 작업을 수행하여 즉시 허용 모드로 설정하고 setenforce 0문제를 해결합니다. 문제가 즉시 사라지면 selinux가 이를 차단합니다.
    • 다음을 수행하여 selinux 블록을 볼 수 있고 tail -f /var/log/audit/audit.log, 그런 일이 발생하면 출력물을 볼 수 있습니다.
    • /etc/selinux/configselinux를 편집한 다음 재부팅하여 전역적으로 허용 모드로 설정합니다. 수행 중인 작업을 알지 못하는 한 비활성화로 설정하지 않는 것이 좋습니다. 허용은 ​​기본적으로 비활성화되어 있지만 모든 것을 허용하지만 감사의 내용도 인쇄합니다. .log 문제를 일으킬 수 있습니다.

systemd 서비스가 네트워크 드라이브에서 실행되지 않습니다

다음과 같이 이 설치를 설치하면 /home/deck/Documents/scripts/SyncSaves/sync_saves.sh해당 문제에 대한 스크립트나 스크립트 또는 파일이 실행되지 않기 때문입니다. a를 실행하고 a가 설치 옵션으로 존재하는지 확인합니다. 또한 호출하려는 파일에 해당 파일을 실행할 사용자에 대한 실행 권한이 있는지 확인하십시오.noexec/etc/fstabsync_saves.shmount | grep homenoexec.sh.service

systemd가 서비스가 다른 파티션에 있는 것을 좋아하지 않는다는 내용을 읽었습니다.

이것제공하다systemctl list-unit-filesdaemon-reload.... your file 을 실행한 후 인식되는 파일입니다 ss_lin_startup.service. 서비스 파일이 호출되는지 여부에 관계없이 execstart실행 execstop을 위해 호출되는 모든 파일에는 selinux가 시행될 때 실행이 허용되는 각 selinux 규칙에 대해 selinux 태그가 있어야 하며 이 bin_t태그는 그 중 하나입니다. 이 파일의 위치는 noexec마운트 옵션을 사용하여 nfs 마운트에 있지 않는 한 중요하지 않습니다.

sync_saves.sh또한 첫 번째 줄에 이 있는지 확인하십시오 #!/bin/bash. 그렇지 않은 경우 내 경험에 따르면 파일에서 호출할 때 실행되지 않습니다 .service.

답변2

네트워크 파일 시스템에서 시스템 서비스를 실행하는 방법에 대한 질문의 주요 부분에는 기본적으로 두 가지 질문이 있습니다. 하나는 주어진 경로/마운트 지점을 사용할 수 있어야 한다는 조건을 systemd 장치에 추가하는 것입니다. 다른 하나는 systemd가 처음에 해당 경로/마운트 지점을 실제로 마운트하는 방법입니다. 왜냐하면 이에 의존해야 하기 때문입니다.

  • 경로에 대한 시스템 단위 종속성

다음을 통해 네트워크 파일 시스템 경로에 대한 종속성을 추가해 보아야 합니다.설치 필요=옵션. 이는 계층화된 설치에도 적용됩니다(/home은 아마도 별도의 파일 시스템이고 /home/deck/mnt/xtra는 설명에 따라 그 아래에 마운트된 네트워크 파일 시스템입니다).

견적 설명:

공백으로 구분된 절대 경로 목록입니다. 지정된 경로에 액세스하는 데 필요한 모든 설치 단위에 대해 Requires= 및 After= 유형 종속성을 자동으로 추가합니다.

noauto로 표시된 마운트 지점은 local-fs.target을 통해 자동으로 마운트되지 않지만 이 옵션의 목적에 따라 여전히 존중됩니다. 즉, 장치에서 끌어옵니다.

그러니 추가해 보세요

RequiresMountsFor=/home/deck/mnt/xtra/scripts/SyncSaves/sync_saves.sh

여기 있습니다 ss_lin_startup.service. 를 실행하면 쉽게 이 작업을 수행할 수 있습니다 systemctl edit --full --user ss_lin_startup.service. 그러면 시스템 서비스를 편집할 수 있으며 그 후에도 실행됩니다 systemctl daemon-reload --user.

  • systemd가 /etc/fstab에서 항목을 마운트하는 방법

/etc/fstab의 모든 항목은 다음을 통해 systemd에 의해 구문 분석됩니다.systemd-fstab-생성기.mount시작할 때마다 각각에 대해 소위 셀을 생성합니다. 네트워크 파일 시스템의 경우 항상 추가해야 합니다._netdev구문 분석될 때 /etc/fstab 항목에 대한 옵션으로 systemd-fstab-generator쌍을 추가합니다 remote-fs.target. 이는 일반적 으로 네트워크 파일 시스템을 마운트하기 전에 시스템이 네트워크를 사용할 수 있을 때까지 기다릴 수 있을 만큼 충분히 안정적입니다.

--- * 일반적으로 네트워크 연결과 온라인 네트워크 사이에 차이가 있음을 의미합니다. 즉, 시작된 네트워크 연결 중 하나가 실제로 무엇이든 연결할 수 있음을 의미합니다. 이는 그 자체로 매우 복잡한 주제이고 아마도 이 질문/답변의 범위를 넘어서는 것일 수 있습니다.

관련 정보