이미 설치된 경우 로그인 시 바인드 설치 방지

이미 설치된 경우 로그인 시 바인드 설치 방지

로그인하면 바인드 마운트가 생성됩니다. 존재하다 ~/.pam_mount.conf.xml:

  <volume options="bind" user="phg" mountpoint="/nix" path="/store/nix" />

이 작업은 시작 시 한 번만 수행하면 됩니다. fstab 또는 systemd 마운트에 액세스할 수 없습니다.

바인드 마운트 자체가 작동합니다. 하지만,로그인할 때마다 실행됩니다.. SSH를 통해 수십, 수백 번 로그인할 수 있기 때문에 마운트 테이블이 빠르게 채워집니다. 불과 몇 분 전만 해도 자원 고갈로 인해 상자를 사용할 수 없게 되었습니다.

기존 번들 설치를 감지하는 것은 쉽지만pam_mount.so 스크립트 결과에 따라 설치를 결정하는 방법이 없습니다.

그래서 내 질문은 다음과 같습니다

  • 바인드 마운트가 여러 번 실행되는 것을 방지하는 방법,또는
  • 마운트 축적을 방지하기 위해 중복 바인드 마운트를 무작동으로 만드는 방법은 무엇입니까?

또한보십시오:https://github.com/karelzak/util-linux/issues/448

답변1

systemd(기본적으로 전파를 마운트함)를 사용하는지 궁금합니다. 번들 설치 수가 매번 두 배 이상 증가하는 것 같습니다. 어쩌면 private설치 옵션에서 더 잘 작동할 수도 있습니다...아. unbindable설치 옵션으로 쓸 수 있는 것 같습니다 . 이를 수락하면 귀하의 질문에 답할 수 있습니다. pam_mount설치가 실패하도록 허용하고 로그인을 중단하지 마십시오 .


어떤 이유에서인지 귀하의 프로그램이 pam_mount설계된 대로 작동하지 않는 것 같습니다.

pam_mount는 마운트의 "참조 카운트"를 유지합니다. 예를 들어 동시에 두 개의 활성 로그인이 있는 경우 파일 시스템은 한 번만 마운트할 수 있습니다. 두 세션이 모두 로그아웃되면 제거됩니다.

로그아웃 시 파일 시스템이 마운트되는 것을 막는다면 pam_mount를 남용하는 것입니다. 나중에 설정이 중단되는 방식으로 변경될 수 있습니다.

답변2

경험한 후pam_mount코드 나는 무슨 일이 일어나고 있는지 알고 있다고 믿습니다. 이러한 상황은 주로 다음 두 가지 문제로 인해 발생합니다.

  • 이것pam_mount마운트된 볼륨을 감지하는 방법은 너무 단순합니다.

  • 소스 경로와 마운트 지점이 동일하더라도 커널은 중복된 바인드 마운트를 서로 쌓을 것입니다.

에서mount.cpam_mount환매 계약:

128         xcmp = fstype2_icase(vpt->type) ? strcasecmp : strcmp;
129         if (source != NULL)
130                 result = xcmp(vpt->volume, source) == 0;
131         if (target != NULL)
132                 result &= strcmp(vpt->mountpoint, target) == 0;

그게 다야. 값원천그리고표적공급자: 라이브러리 마운트유틸리티 리눅스에서. 안타깝게도,라이브러리 마운트번들 마운트가 있는 경우에만 원래 소스 경로를 결정할 수 있습니다 /run/mount/utab. PAM 마운트 지점의 경우에는 그렇지 않습니다. 따라서 위의 확인을 확장하는 것만으로는 충분하지 않습니다.

그러나 바인드 마운트의 경우

<volume
  options="bind,nodev,exec,nosuid"
  user="yourstruly"
  mountpoint="/nix"
  path="/mnt/local/nix"
  />

커널은 /proc/mounts다음과 같이 항목을 생성합니다.

/dev/mapper/VolGroup00-local /nix ext4 rw,relatime 0 0

여기서 소스는 분명히 우리가 mount(8) 명령줄에 지정한 경로와 일치하지 않습니다. 대신 기본 볼륨을 소스로 제공하여 확인을 유발합니다.pam_mount실패하다.

소스 경로 정보가 손실됩니다. 더 나은 점 /proc/self/mountinfo:

934 654 253:6 /nix /nix rw,relatime shared:33 - ext4 /dev/mapper/VolGroup00-local rw

또한 기반으로 라이브러리 설치 소스 이것첫 번째 /nix(인수 인덱스 4)는 "FS 내에 마운트된 루트"에 해당합니다. (두 번째는 VFS의 마운트 지점입니다.)따라서 원래 경로가 다음으로 전달됩니다.설치(8)볼륨 내의 위치로 대체됩니다.볼륨이 마운트되면 /mnt/local결국은 API()를 사용하여 /nix값을 쿼리할 수 있습니다.mnt_table_get_fs_root()pam_mount왜냐하면 후자는 검사를 수행할 때 소스 값에서 마운트 지점을 제거하지 않기 때문입니다.

관련 정보