通過 sshfs 修改文件
Machine
A
的文件系統B
通過sshfs
. 一個在 上執行的程序B
,它A
由ssh
touch
es 從已掛載的文件系統上的文件啟動,A
以傳遞信號;然後信號(文件)被刪除A
。這在第一次創建/銷毀文件時可靠地工作 (touch
/rm
)。但是,如果第二個程序(同樣,在 上執行
B
,從 生成A
)嘗試訪問完全相同的文件,則偶爾會引發以下錯誤:`touch: cannot touch '/path/to/file': No such file or directory`.
這條路徑是有效的,因為在拋出錯誤後手動嘗試
touch
它都是成功的。如前所述,錯誤是偶發的(使調試嘗試複雜化),但僅在已經經歷了創建/刪除週期後觸摸文件時才會發生。間歇性產生錯誤(
touch
,rm
,touch
)的動作在時間上是分開的,因此並發訪問不太可能是罪魁禍首(即,第二次觸摸不會發生,直到第一次觸摸產生的文件被刪除)。認為原因可能源於文件系統緩衝,在刪除文件後sync
呼叫A
,但無濟於事。sync
在觸摸文件之前立即呼叫B
也無濟於事,儘管我不知道B
’ 的sync
呼叫是否會影響文件系統( onA
的版本缺少顯式文件系統規範的選項;我試圖從執行的程序呼叫on通過之前sync``B``-f``sync``A``B``ssh user@A sync``touch
ing,但該過程似乎在 sync-over-ssh 呼叫之後沒有錯誤地退出,因為包括該touch
語句在內的其餘行未執行;ssh
可能是因為在從客戶端到伺服器發起的程序上,不可能從伺服器返回到客戶ssh
端)。如何確定此文件系統相關錯誤的原因?
您可以通過使用 option 執行 sshfs 來調查可能發生的情況
-o debug
。它列印大量關於touch test
命令完成的基本文件系統操作的資訊。一個範例操作是:unique: 209, opcode: LOOKUP (1), nodeid: 1, insize: 45, pid: 10641 LOOKUP /test getattr /test NODEID: 44 unique: 209, success, outsize: 144
相關部分是
getattr
呼叫已完成,並以成功結束。當您成功觸摸不存在的文件時,我們看到的操作是(刪除細節):getattr /test unique: 190, error: -2 (No such file or directory), outsize: 16 create flags: 0x8841 /test 0100644 umask=0022 fgetattr[140469187119648] /test flush[140469187119648] utime /test 1507647885 1507647885 getattr /test flush[140469187119648] release[140469187119648] flags: 0x8801
我們看到文件的 getattr 測試失敗,這是正常的,因為它不存在,所以我們繼續創建文件。
如果文件現在在伺服器上被刪除,我們再次在客戶端上進行觸摸,我們會看到不同的序列:
getattr /test unique: 215, success, outsize: 144 open flags: 0x8801 /test unique: 216, error: -2 (No such file or directory), outsize: 16
現在 getattr 說該文件仍然存在,所以
touch
繼續open()
該文件,但這會導致您的錯誤消息:該文件根本不存在。因此,這一切似乎都是客戶端記憶體存在哪些文件的問題太慢而無法趕上遠端的更改。最簡單的答案是使用更短的
getattr
呼叫超時安裝遙控器,即stat()
係統呼叫。這應該適合你sshfs -o cache_stat_timeout=0 ...