
ログインすると、バインドマウントが作成されます。存在する~/.pam_mount.conf.xml
:
<volume options="bind" user="phg" mountpoint="/nix" path="/store/nix" />
これは起動時に一度だけ実行できます。 fstabまたはsystemdマウントにアクセスできません。
バインドマウント自体が機能します。しかし、ログインするたびに実行されます。。 SSH経由で数十、数百回ログインできるため、マウントテーブルがすばやく入力されます。ほんの数分前でも、資源の枯渇のために箱が利用できなくなりました。
既存のバンドルのインストールを検出するのは簡単ですが、pam_mount.so スクリプトの結果に基づいてインストールを決定する方法はありません。
だから私の質問は次のようになります
- バインドマウントが複数回実行されるのを防ぐ方法、または
- マウントの蓄積を防ぐために、冗長バインドマウントをランダムにする方法は?
答え1
systemd(基本的に電波をマウントする)を使用しているかどうか疑問に思います。バンドルの設置数が毎回2倍以上増加するようです。おそらく、private
インストールオプションでよりうまく機能するかもしれません...ああ。unbindable
インストールオプションとして書き込むことができるようです。これを受け入れると、あなたの質問に答えることができます。pam_mount
インストールが失敗することを許可し、ログインを中断しないでください。
何らかの理由であなたのプログラムが設計どおりpam_mount
に機能しないようです。
pam_mount はマウントの「参照カウント」を保持します。たとえば、同時に2つのアクティブなログインがある場合、ファイルシステムは一度だけマウントできます。両方のセッションがログアウトすると削除されます。
ログアウト時にファイルシステムがマウントされないようにする場合は、pam_mountを乱用することです。後で設定が中断されるように変更されることがあります。
答え2
経験した後pam_mountコード私は何が起こっているのか知っていると思います。このような状況は、主に次の2つの問題が原因で発生します。
これ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;
それはすべてです。値源泉そしてターゲットサプライヤー:
ライブラリマウントユーティリティLinuxで。残念ながら、ライブラリマウントバンドルマウントがある場合にのみ、元のソースパスを決定できます/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内にマウントされたルート」に対応します。 (2番目はVFSのマウントポイントです。)したがって、元のパスが次に渡されます。設置(8)ボリューム内の場所に置き換えられます。ボリュームがマウントされると、/mnt/local
最終的にはAPI()を使用して/nix
値を照会できます。mnt_table_get_fs_root()
pam_mountこれは、後者はチェックを実行するときにソース値からマウントポイントを削除しないためです。