pam_systemd.so 有什麼作用?
我將我的 SD 卡從快速的 RaspberryPi 4 切換到 RaspberryPi 2。現在,使用它登錄
ssh -vv
大約需要 3 分鐘,然後卡在pledge: network
. 這個問題討論了這種行為,我的解決方案是session optional pam_systemd.so
在/etc/pam.d/common-session
.但我想知道這實際上是做什麼的。我知道這與打開使用者會話有關,但我不熟悉為什麼它很重要。
我的
journalctl | grep pam
節目是這樣的:Dec 29 15:59:07 RPi4 sshd[1392]: pam_unix(sshd:session): session opened for user admin by (uid=0) Dec 29 15:59:08 RPi4 systemd: pam_unix(systemd-user:session): session opened for user admin by (uid=0) Dec 29 16:02:01 RPi4 sudo: pam_unix(sudo:session): session opened for user root by admin(uid=0) Dec 29 16:02:01 RPi4 sudo: pam_unix(sudo:session): session closed for user root Dec 29 16:02:23 RPi4 sudo: pam_unix(sudo:session): session opened for user root by admin(uid=0)
pam_systemd
是區別經典(系統前)登錄過程和systemd
-aware 登錄過程的外掛。沒有它,登錄過程就像使用 SysVinit 一樣工作:如果使用者程序守護程序(即關閉其標準輸入、輸出和錯誤流,分叉兩次,然後子程序死亡,孫子程序成為孤兒,重新設置為 UID #1由核心),將無法跟踪它屬於哪個會話。不是將整個登錄會話及其所有子會話可靠地封裝到一個單獨的控制組中,而是將所有程序都放入公共堆中。因此,也無法執行每會話資源限制。
/run/user/<UID>/
此外,不會創建使用者執行時目錄,這可能會禁用某些桌面環境的某些功能,以及嘗試對多會話友好的東西,例如 GnuPG 代理。最後但並非最不重要的一點是,user@<UID>.service
系統服務和由它管理的任何每使用者systemd
服務都不會啟動:該使用者/會話將沒有會話 D-Bus,也沒有 Pulseaudio。請參閱systemctl --user
(在具有工作的每使用者systemd
服務的系統中)。在註銷時,如果不在
pam_systemd
遊戲中,註銷程序將無法乾淨利落地強制使用者會話的所有程序在會話結束時肯定被清除(如果系統管理員希望這樣做;請參見KillUserProcesses=
參考資料logind.conf(5)
)。您還將失去一種簡單的方法來將非 root 操作插入到諸如使用者登錄/註銷之類的事件中,或者以掛載文件系統或可熱插拔網路/儲存/藍牙/其他設備存在或出現等事件為條件的非 root 操作稍後在登錄會話期間。
如果你的目標是一台精幹的單任務機器,你可能會認為這是對許多不必要的東西的成功截斷;但根據您的目標,您可能不會。
無論如何,您提到的問題表明問題可能是由導致系統D-Bus 重新啟動的某些原因引起的,這將需要重新啟動
systemd-logind
以及可能依賴於系統 D-Bus 的其他系統服務。您的登錄緩慢問題的根本原因也可能是 Pulseaudio 仍被配置為期望 RasPi 4 硬體並且因找不到它而感到困惑。
背景:
在
systemd
基於 的安裝中,每個使用者會話可能至少有兩個相關的 D-Bus 實例:一個系統D-Bus,可以選擇性地傳遞由 配置的系統範圍的狀態資訊和控制polkit
,以及一個會話D-Bus對於使用者級的東西。一些 GUI 桌面環境可能會啟動一個或兩個小的額外 D-Bus 實例來處理可訪問性和/或國際化(中文/日文/韓文字元和類似字元的輸入法)。