일반적으로 마운트하고 싶지 않은 파일 시스템에 액세스해야 하는 systemd 서비스를 설정하려고 합니다(해당되는 경우 btrfs에 Snapper를 설정하지만 사용하고 싶습니다).플랫 하위 볼륨 레이아웃다양한 곳에서 언급했듯이, 예를 들어.여기.snapshots
, 다른 모든 항목에 대해서는 디렉토리를 언로드 하려고 합니다 ).
서비스에 자체 전용 마운트 네임스페이스를 제공하는 것이 가능하다는 것을 알고 있지만 대부분의 문서에서는 이에 대해 설명합니다.한계대신 일반적으로 사용 가능한 데이터에 액세스합니다.승인하다일반적으로 접근할 수 없는 콘텐츠에 접근하세요. 시스템의 나머지 부분은 설치하지 않고 Snapper만 설치되어 있는지 어떻게 확인하나요?
편집 : 물론 나는할 수 있는값을 바꾼 Exec=
다음 주요 작업을 실행하지만 이는 여러 면에서 우아하지 않습니다. 이것)아니요기본 서비스를 루트로 실행하려면 를 사용하는 것이 아니라 수동으로 변경해야 합니다 User=
. 하지만 이 방법을 사용하더라도 파일 시스템을 마운트 해제하기 위한 스크립트가 여전히 필요합니까, 아니면 시스템에서 자동으로 정리합니까?
편집 2: 확실한 해결 방법은 다음을 사용 ExecStartPre=
하여 설치하는 것 입니다.문서, 이 경우에는 적용되지 않습니다.
파일 시스템 네임스페이스는 서비스 관리자가 분기한 각 프로세스에 대해 개별적으로 설정됩니다.
ExecStartPre=
따라서 프로세스가 종료되면 프로세스의 네임스페이스에 설정된 마운트가 자동으로 지워지고 분기된 후속 프로세스에서 사용할 수 없게 됩니다ExecStart=
(유사한 상황이 장치에 구성된 다양한 다른 명령에 적용됩니다). 마찬가지로JoinsNamespaceOf=
유닛 간에 커널 설치 네임스페이스를 공유하는 것은 허용되지 않으며 공유/tmp/
및/var/tmp/
디렉터리만 허용됩니다.
답변1
일반적으로 말해서, 당신이 찾고 있는 것은 다음 unshare -m
과 같습니다 PrivateMounts
:
PrivateMounts=true
group=xxx
where xxx
is the user's group 옵션을 사용하여 해당 경로에 대한 항목을 fstab에 추가할 수도 있습니다 . 이를 통해 사용자는 루트가 아니어도 설치를 수행할 수 있습니다.
그런 다음 정상적으로 서비스 파일 생성을 계속하여 다음 콘텐츠를 추가할 수 있습니다.
ExecStartPre=mount ....
마운트는 프로세스의 나머지 부분과 공유되지 않고 서비스가 종료될 때 자동으로 마운트 해제되는 별도의 마운트 네임스페이스에서 수행되어야 합니다. 유일한 문제는 사용자가 루트 마운트 네임스페이스에서도 마운트를 수행할 수 있다는 것입니다.