Linux
為什麼 rpc.lockd 從 netstat/lsof 輸出中被掩蓋了?
序幕:
在許多充當 NFS 客戶端的機器上,
netstat
報告了兩個打開的埠,但沒有為關聯的守護程序列出 PID。通常這可能有點令人擔憂。# netstat -lnp | egrep -- '- +$' tcp 0 0 0.0.0.0:57448 0.0.0.0:* LISTEN - udp 0 0 0.0.0.0:48933 0.0.0.0:* -
另外
netcat
確認 TCP 埠確實是打開的。# nc -v localhost 57448 localhost [127.0.0.1] 57448 (?) open ^C
然而
lsof
,這兩個埠沒有報告任何內容。陰謀增長。# lsof -i TCP:57448 -i UDP:48933
然而
rpcinfo
,最終為我們指明了正確的方向。它由 NFS 開放nlockmgr
,又名lockd
NFS。取消搜尋。# rpcinfo -p | egrep '57448|48933' 100021 1 udp 48933 nlockmgr 100021 3 udp 48933 nlockmgr 100021 4 udp 48933 nlockmgr 100021 1 tcp 57448 nlockmgr 100021 3 tcp 57448 nlockmgr 100021 4 tcp 57448 nlockmgr
很明顯,在掛載 NFS 導出時會呼叫
lockd
/ 。rpc.lockd
這是一個核心執行緒(總是這樣嗎?),它將自己綁定到臨時範圍內的一個 TCP 和一個 UDP 埠。埠通常可以使用fs.nfs.nlm_tcpport
和fs.nfs.nlm_udpport
sysctl 重新配置。問題:
不過我很感興趣。會喜歡一些核心內部的洞察力……
- 為什麼核心執行緒的 PID 不可見
netstat
?- 為什麼綁定的埠不可見
lsof
?
netstat 和 lsof 都爬行
/proc/<pid>/fd
以將程序與埠/套接字關聯,並且/proc/<pid>/fd
不會為核心執行緒 AFAIK 填充。lockd 始終是核心執行緒 - 至少在現代(比 2.2 新)核心上。