시스템 서비스를 위한 추가 마운트 지점

시스템 서비스를 위한 추가 마운트 지점

일반적으로 마운트하고 싶지 않은 파일 시스템에 액세스해야 하는 systemd 서비스를 설정하려고 합니다(해당되는 경우 btrfs에 Snapper를 설정하지만 사용하고 싶습니다).플랫 하위 볼륨 레이아웃다양한 곳에서 언급했듯이, 예를 들어.여기.snapshots, 다른 모든 항목에 대해서는 디렉토리를 언로드 하려고 합니다 ).

서비스에 자체 전용 마운트 네임스페이스를 제공하는 것이 가능하다는 것을 알고 있지만 대부분의 문서에서는 이에 대해 설명합니다.한계대신 일반적으로 사용 가능한 데이터에 액세스합니다.승인하다일반적으로 접근할 수 없는 콘텐츠에 접근하세요. 시스템의 나머지 부분은 설치하지 않고 Snapper만 설치되어 있는지 어떻게 확인하나요?

편집 : 물론 나는할 수 있는값을 바꾼 Exec=다음 주요 작업을 실행하지만 이는 여러 면에서 우아하지 않습니다. 이것)아니요기본 서비스를 루트로 실행하려면 를 사용하는 것이 아니라 수동으로 변경해야 합니다 User=. 하지만 이 방법을 사용하더라도 파일 시스템을 마운트 해제하기 위한 스크립트가 여전히 필요합니까, 아니면 시스템에서 자동으로 정리합니까?

편집 2: 확실한 해결 방법은 다음을 사용 ExecStartPre=하여 설치하는 것 입니다.문서, 이 경우에는 적용되지 않습니다.

파일 시스템 네임스페이스는 서비스 관리자가 분기한 각 프로세스에 대해 개별적으로 설정됩니다. ExecStartPre=따라서 프로세스가 종료되면 프로세스의 네임스페이스에 설정된 마운트가 자동으로 지워지고 분기된 후속 프로세스에서 사용할 수 없게 됩니다 ExecStart=(유사한 상황이 장치에 구성된 다양한 다른 명령에 적용됩니다). 마찬가지로 JoinsNamespaceOf=유닛 간에 커널 설치 네임스페이스를 공유하는 것은 허용되지 않으며 공유 /tmp//var/tmp/디렉터리만 허용됩니다.

답변1

일반적으로 말해서, 당신이 찾고 있는 것은 다음 unshare -m과 같습니다 PrivateMounts:

PrivateMounts=true

group=xxxwhere xxxis the user's group 옵션을 사용하여 해당 경로에 대한 항목을 fstab에 추가할 수도 있습니다 . 이를 통해 사용자는 루트가 아니어도 설치를 수행할 수 있습니다.

그런 다음 정상적으로 서비스 파일 생성을 계속하여 다음 콘텐츠를 추가할 수 있습니다.

ExecStartPre=mount ....

마운트는 프로세스의 나머지 부분과 공유되지 않고 서비스가 종료될 때 자동으로 마운트 해제되는 별도의 마운트 네임스페이스에서 수행되어야 합니다. 유일한 문제는 사용자가 루트 마운트 네임스페이스에서도 마운트를 수행할 수 있다는 것입니다.

관련 정보