CIFS 隨機遺失與 Windows 共享的連接

CIFS 隨機遺失與 Windows 共享的連接

幾個月來,我已經從 Debian Jessie 遠端安裝了幾個目錄到 Windows 共用。

在過去的幾周里,我一直抱怨與掛載點的隨機斷開連接,並且不得不做一個

sudo mount -a

重新獲得掛載連接,需要幾次(伺服器每週使用一到兩次)。

例如,在不使用一段時間後,安裝座通常不會恢復。

Windows管理員也告訴我Windows伺服器已經有一段時間沒有重新啟動了。

今天,巧合的是,mount -a再次嘗試時,僅在第二次嘗試時有效,而第一次嘗試時出現以下錯誤:

sudo mount -a
mount error(104): Connection reset by peer
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)
mount error(112): Host is down
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)

目錄是/etc/fstab這樣安裝的:

//10.2.1.2/XX/ZZ/YY /mnt/mount_point cifs credentials=/root/.smbcredentials,iocharset=utf8,file_mode=0770,dir_mode=0770,uid=1001,gid=1001 0 0

當執行 mount 命令時,您也可以看到該選項echo_interval預設在 60 秒時啟動。

$mount //10.2.1.2/XX/ZZ/YY on /mnt/mount_point type cifs (rw,relatime,vers=1.0,cache=strict,username=someusername,domain=XXX,uid=1001,forceuid,gid=1001,forcegid,addr=10.2.1.2,file_mode=0770,dir_mode=0770,nounix,serverino,mapposix,rsize=61440,wsize=65536,echo_interval=60,actimeo=1)

怎麼辦?

答案1

我在這裡發現了一個有趣的相關帖子cifs掛載資料夾不斷斷開連接(ubuntu伺服器),談論類似的問題(相同的錯誤,Samba 共享)。

這裡的相關花絮是,為了遵循其餘的答案,CIFS 安裝預設使用 SMBv1.0 協議,可以透過發出命令mount並注意該vers=1.0欄位來驗證。

$mount //10.2.1.2/XX/ZZ/YY on /mnt/mount_point type cifs (rw,relatime,vers=1.0,cache=strict,username=someusername,domain=XXX,uid=1001,forceuid,gid=1001,forcegid,addr=10.2.1.2,file_mode=0770,dir_mode=0770,nounix,serverino,mapposix,rsize=61440,wsize=65536,echo_interval=60,actimeo=1)

我還在 Stack Overflow 中找到了這個帖子裝載 CIFS 主機已關閉

這也可能是由於協議不匹配造成的。 2017 年,微軟修補了 Windows 伺服器並建議停用 SMB1 協定。

從現在開始,mount.cifs 可能會出現協議協商問題。

顯示的錯誤是「主機已關閉」。但是當你調試時:

smbclient -L <server_ip> -U <username> -d 256

你會得到錯誤:

protocol negotiation failed: NT_STATUS_CONNECTION_RESET

該貼文提到,Windows 對協定/Wannacry 等的補丁正在搞亂/或更準確地說,有些人禁用了 v1 CIFS 請求功能;類似的問題也發生在 Windows 上,考慮到時間,這讓我懷疑問題一定是相關的。

我們尚未在此特定伺服器中停用 v1 CIFS,AFAIK(測試證實了這一點),但是 MS 公告表明預設的 SMBv1 行為已(略有)更改。

我最終遵循了上述 Samba 問題中建議的整體思路。從男人mounts.cifs

vers=

    SMB 協定版本。允許的值為:

    • 1.0 - 經典的 CIFS/SMBv1 協定。這是預設值。

    • 2.0 - SMBv2.002 協定。這最初是在 Windows Vista Service Pack 1 和 Windows Server 2008 中引入的。

    • 2.1 - Microsoft Windows 7 和 Windows Server 2008R2 中引入的 SMBv2.1 協定。

    • 3.0 - Microsoft Windows 8 和 Windows Server 2012 中引入的 SMBv3.0 協定。

    另請注意,雖然此選項控制所使用的協定版本,但並非每個版本的所有功能都可用。

--verbose

    列印掛載的附加偵錯資訊。請注意,該參數必須在-o.例如:

     mount -t cifs //server/share /mnt --verbose -o user=username
    

從手冊中可以看出,在 Windows 8 之後的最近 Windows 版本中至少使用vers=2.0可能更有意義;命令列中的替代語法以及--verbose提到的選項對於進一步調試可能出現的任何複雜情況也很有用。

因此,由於我在這個問題上安裝的 Windows 伺服器是 Windows Server 2008 R2,所以我輸入/etc/fstab

//10.2.1.2/XX/ZZ/YY /mnt/mount_point cifs credentials=/root/.smbcredentials,iocharset=utf8,file_mode=0770,dir_mode=0770,uid=1001,gid=1001,vers=2.1 0 0

然後重新掛載它以使選項生效:

sudo mount -o remount /mnt/mount_point

現在我們mount再次驗證以確認協商的協議:

$mount //10.2.1.2/XX/ZZ/YY on /mnt/mount_point type cifs (rw,relatime,vers=2.1,cache=strict,username=someusername,domain=XXX,uid=1001,forceuid,gid=1001,forcegid,addr=10.2.1.2,file_mode=0770,dir_mode=0770,nounix,serverino,mapposix,rsize=61440,wsize=65536,echo_interval=60,actimeo=1)

我們確實可以確認我們成功修改了正在使用的 SMB 協定。

也可以看看MS Developer Network - [MS-SMB2]:版本控制與功能協商 - 1.7 版本控制與功能協商

還應該指出的是,與新版本的協定相比,CIFS v1.0 除了過時之外,效率極低且不安全。

MS 部落格 - 停止使用 SMB1

SMB1 既不現代也不高效
當您使用 SMB1 時,您將失去最終用戶的關鍵效能和生產力優化。

  • 更大的讀取和寫入 (2.02+) – 更有效地使用更快的網路或更高延遲的 WAN。大 MTU 支援。
  • 資料夾和檔案屬性的對等快取 (2.02+) – 用戶端透過 BranchCache 保留資料夾和檔案的本機副本
  • 耐用句柄 (2.02、2.1) – 如果暫時斷開連接,允許連接透明地重新連接到伺服器
  • 用戶端 oplock 租賃模型 (2.02+) – 限制客戶端和伺服器之間傳輸的數據,提高高延遲網路的效能並提高 SMB 伺服器可擴展性
  • 多通道和 SMB Direct (3.0+) – 如果用戶端和伺服器之間有多個路徑可用,則網路頻寬和容錯的聚合,再加上現代超高吞吐​​量 RDMA 基礎架構的使用
  • 目錄租賃 (3.0+) – 透過快取提高分行的應用程式回應時間

有趣的是,最後一篇文章表明,如果使用 >= 2.01 的協議,在斷開連接(持久句柄)後不太可能出現斷開連接問題,因此我再次強調,不要繼續使用 CIFS v1.0。 (例如,在 1.0 中,echo_interval=60確實保持連接,如果發生網路故障或其他伺服器中斷,則在使用 CIFS v1.0 時,如果沒有手動幹預,掛載將無法自行恢復)

作為最後一項建議,避免這樣做sudo mount -a,並開始這樣做:

sudo mount -o remount -a

另請參閱我的問題CIFS 在同一裝載點上裝載相同共用的多個副本

相關內容