幾個月來,我已經從 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 除了過時之外,效率極低且不安全。
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 在同一裝載點上裝載相同共用的多個副本