Ssh

通過 sshfs 修改文件

  • October 10, 2017

MachineA的文件系統B通過sshfs. 一個在 上執行的程序B,它Assh touches 從已掛載的文件系統上的文件啟動,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``touching,但該過程似乎在 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 ...

引用自:https://unix.stackexchange.com/questions/397138