Glibc
什麼會突然導致程序在啟動時讀取 /etc/ld.so.preload?
Apparmor 強制消息已開始出現在 Trisquel 7 機器的 syslog 中。受影響的程序請求
open
文件/etc/ld.so.preload
,處於讀取模式,並被 apparmor 策略拒絕。以下是該消息的第一個實例:-May 8 21:25:54 box kernel: [928193.797140] type=1400 audit(1462739154.627:76): \ apparmor="DENIED" operation="open" profile="/usr/lib/NetworkManager/nm-dhcp-client.action" \ name="/etc/ld.so.preload" pid=13471 comm="nm-dhcp-client." requested_mask="r" \ denied_mask="r" fsuid=0 ouid=0
其他一些 apparmor 受限程序被拒絕了相同的請求,包括 cupsd 和 mysqld。
apparmor 配置文件沒有改變,這些消息以前從未出現過 - 所以這些(也許還有其他不受約束的)程序似乎突然開始嘗試讀取(空)文件
/etc/ld.so.preload
。我唯一的線索是那天早些時候我第一次編譯了mame。在第一條消息之前的某個時間,我執行了一台模擬機器,並讓它在無人看管的情況下執行。主機在我返回後不久就沒有響應,我不得不在收到消息後大約 20 分鐘重置它。
那麼這兩件事是否相關,我應該從哪裡開始尋找這些程序為什麼現在正在尋找預載入庫?
所有程序都嘗試打開
/etc/ld.so.preload
,這種行為被嵌入到 Glibc 中。但他們只在它存在時才嘗試打開它(Glibc 首先呼叫access
)。通常
/etc/ld.so.preload
不存在,所以每個程序只是呼叫access
,得到否定的答案並繼續前進。這不會觸發 AppArmor 的任何內容。但如果文件存在,則程序呼叫
open
以從中讀取。如果文件為空,則不影響動態連結,唯一的影響是對性能的輕微影響。如果在某些程序打開文件時觸發了 AppArmor 規則,那麼您會收到這些警告。我不知道編譯 mame 是否最終會創建
/etc/ld.so.preload
,或者它是否無關。無論如何,如果文件為空,只需將其刪除即可。