Linux

為什麼 rpc.lockd 從 netstat/lsof 輸出中被掩蓋了?

  • April 14, 2014

序幕:

在許多充當 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,又名lockdNFS。取消搜尋。

# 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_tcpportfs.nfs.nlm_udpportsysctl 重新配置。

問題:

不過我很感興趣。會喜歡一些核心內部的洞察力……

  1. 為什麼核心執行緒的 PID 不可見netstat
  2. 為什麼綁定的埠不可見lsof

netstat 和 lsof 都爬行/proc/<pid>/fd以將程序與埠/套接字關聯,並且/proc/<pid>/fd不會為核心執行緒 AFAIK 填充。

lockd 始終是核心執行緒 - 至少在現代(比 2.2 新)核心上。

引用自:https://serverfault.com/questions/153996