Wednesday, September 30, 2015

nfs mount 出問題了,真神奇

同事於 arm device 上發生困難求助
#mount -t nfs -o nolock 1.2.3.4:/home/skyter/nfs /nfs
出現錯誤訊息 (我記得是 no such directory)

首先我懷疑 device 上 /nfs 目錄不存在,所以 ls -al 發現有 nfs 目錄

所以懷疑 server 設定有問題,先確認 1.2.3.4 /home/skyter/nfs 目錄存在
接著觀察 /etc/exports
$sudo vi /etc/exports
結果也沒問題,/etc/exports 檔案屬於 nfs 的一部分,可以 man nfs 看說明
如果 /etc/exports 檔案不存在,則 nfs service 未安裝,可 apt-get install nfs-kernel-server 或者 yum install nfs-xxx 安裝,實際情況可能要 google 一下你的 Linux 套件是用於哪一種安裝指令,以及正確的 nfs 套件名稱

接著確認 nfs server 有重啟,還是不行

接著 sudo, cd 到 /var 可以觀察到 spool (用來寄 mail), mail .... log 很多目錄,這些是 Linux 系統使用的檔案,而我們要觀察的是 log 目錄裡面的內容,因為各種 service 都會把記錄儲存於此處

ls -alrt /var/log 可以按照時間排續新的最後面,看看最近幾分鐘內系統記錄了什麼資訊,因為是 Ubuntu , 所以可以看到 syslog , auth.log 皆有變動
tail syslog 或者 tail -n 30 syslog 可以看到最後面最近發生的記錄,可以看到 1.2.3.4 確實有來 mount /home/skyter/nfs.
tail auth.log 則沒有觀察到 nfs mount 相關資訊

dmesg 是系統內部命令,也可以觀察到 nfs 如果有問題時是否有記錄
於 server 與 device 執行
#dmesg | tail -n 20
都沒有看到相關訊息

因為 nfs mount 透過網路,而 Device 位於不同子網段,所以懷疑網路路由有問題,從 device ping server 有回應,route -n 顯示路由也沒問題

接著在 server 執行
#ifconfig 觀察主要網路卡是哪一張,通常是 eth0
#tcpdump -i eth0 -n host 1.2.3.4
然後 device 再執行一次 mount nfs , 有看到網路封包,但是看不到內容
-i eth0 代表監聽 eth0 網卡,-n 代表不要對 ip 做 name 的 dns 反查動作(浪費時間) , host 1.2.3.4 代表過濾監聽發送/接收方是 1.2.3.4 的封包

完整側錄封包存檔供 wireshark 分析
#tcpdump -i eth0 -n host 1.2.3.4 -s 1600 -w xx.pcap
-s 1600 代表每一個封包最多記錄到 1600 bytes , 已經足以涵蓋完整的 ip 封包大小 (約 1500 bytes 左右) , 預設值很小不足以分析
-w xx.pcap 代表全部血到 xx.pcap
再 mount nfs 一次後,Ctrl + C 停到 tcpdump

不管透過 scp, nfs, http, 或者 Linux 桌面,打開 Wireshark (Win/Linux/Mac) 去開啟 xx.pcap 檔案
其中有兩段 connection , 你可以右鍵隨便一個封包,選擇 Follow , 或者是在正常檢視下去玩弄每一個功能,最後你應該會觀察到 nfs 的 req / reply .
在這邊顯示一切正常,沒有錯誤。

所以 server , 網路都沒問題,看起來問題出在 device (kernel or user space ) , 所以啟動 strace (arm 版本), 如無 strace , 則 google 找抓下來自己編譯,丟到 device 上去跑 (記得 chmod 755 strace)

#./strace mount -t nfs -o ..................
注意最後幾則 syscall 監聽,可以看到 mount 呼叫發生錯誤,一樣是 no such directory .
這時候我
#pwd
注意到目前位於 /root , 而 nfs 目錄件於 /root/nfs
難怪 mount fail , 所以應該改成
#mount -t nfs -o nolock 1.2.3.4:/home/skyter/nfs /root/nfs


收工

No comments: