로그인하면 바인드 마운트가 생성됩니다. 존재하다 ~/.pam_mount.conf.xml
:
<volume options="bind" user="phg" mountpoint="/nix" path="/store/nix" />
이 작업은 시작 시 한 번만 수행하면 됩니다. fstab 또는 systemd 마운트에 액세스할 수 없습니다.
바인드 마운트 자체가 작동합니다. 하지만,로그인할 때마다 실행됩니다.. SSH를 통해 수십, 수백 번 로그인할 수 있기 때문에 마운트 테이블이 빠르게 채워집니다. 불과 몇 분 전만 해도 자원 고갈로 인해 상자를 사용할 수 없게 되었습니다.
기존 번들 설치를 감지하는 것은 쉽지만pam_mount.so 스크립트 결과에 따라 설치를 결정하는 방법이 없습니다.
그래서 내 질문은 다음과 같습니다
- 바인드 마운트가 여러 번 실행되는 것을 방지하는 방법,또는
- 마운트 축적을 방지하기 위해 중복 바인드 마운트를 무작동으로 만드는 방법은 무엇입니까?
답변1
systemd(기본적으로 전파를 마운트함)를 사용하는지 궁금합니다. 번들 설치 수가 매번 두 배 이상 증가하는 것 같습니다. 어쩌면 private
설치 옵션에서 더 잘 작동할 수도 있습니다...아. unbindable
설치 옵션으로 쓸 수 있는 것 같습니다 . 이를 수락하면 귀하의 질문에 답할 수 있습니다. pam_mount
설치가 실패하도록 허용하고 로그인을 중단하지 마십시오 .
어떤 이유에서인지 귀하의 프로그램이 pam_mount
설계된 대로 작동하지 않는 것 같습니다.
pam_mount는 마운트의 "참조 카운트"를 유지합니다. 예를 들어 동시에 두 개의 활성 로그인이 있는 경우 파일 시스템은 한 번만 마운트할 수 있습니다. 두 세션이 모두 로그아웃되면 제거됩니다.
로그아웃 시 파일 시스템이 마운트되는 것을 막는다면 pam_mount를 남용하는 것입니다. 나중에 설정이 중단되는 방식으로 변경될 수 있습니다.
답변2
경험한 후pam_mount코드 나는 무슨 일이 일어나고 있는지 알고 있다고 믿습니다. 이러한 상황은 주로 다음 두 가지 문제로 인해 발생합니다.
이것pam_mount마운트된 볼륨을 감지하는 방법은 너무 단순합니다.
소스 경로와 마운트 지점이 동일하더라도 커널은 중복된 바인드 마운트를 서로 쌓을 것입니다.
에서mount.c
pam_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왜냐하면 후자는 검사를 수행할 때 소스 값에서 마운트 지점을 제거하지 않기 때문입니다.