Windows NFS 真弱 → 中文亂碼導致檔案找不到

青石路發表於2024-03-05

開心一刻

  正睡著覺,然後來了個電話

  對方說:你好,泡麵是嗎

  我愣了一下,以為是惡作劇

  回了句:我不是,我是火腿腸!

  就掛了電話

  又躺了好一會,忽然琢磨過來......

  不對呀,她好像說的是:你好,泡麵試嗎?

Windows NFS 真弱 → 中文亂碼導致檔案找不到

前提準備

  專案中有這麼一塊業務

  1、 指令碼同步 這一環,是運維同事透過指令碼實現的,所以我沒去關注

  2、 讀取檔案並上傳 這一環,是我實現的,穩定執行了很長一段時間了,一直沒出問題

中文亂碼

  直到有一天, 生產環境 出現了異常資訊: /data/userData/Rsync 下不存在檔案:測試檔案.txt

  提示很明顯,在目錄 /data/userData/Rsync 下,沒有找到檔案 測試檔案.txt

  然後聯絡運維,讓運維去看 本系統 的目錄: /data/userData/Rsync 下,檔案 測試檔案.txt 是否存在

  運維的反饋是檔案存在,還發了截圖

  並且把檔案複製給我了

  然後我將這個檔案複製到 測試環境/data/userData/Rsync 目錄下, 測試環境 能正常找到檔案 測試環境.txt

  那問題出在哪?

Windows NFS 真弱 → 中文亂碼導致檔案找不到

問題排查

  後面與同個運維同事溝通了下,瞭解了整個完整流程的細節:

  其中 CentOS 7 作為 NFS 伺服器 ,其系統編碼是 UTF-8

  Win 2012 作為 NFS 客戶端 ,其系統編碼是 GBK (chcp 值 936 表示 GBK)

  我在懷疑是不是 NFS 的問題?

  怎麼驗證了?

  其實最簡單的辦法就是看一眼 CentOS 7 目錄 /data/userData/Rsync 下是不是有中文名亂碼檔案即可

  奈何我認為我說清楚了,運維同事也認為他理解了

  結果南轅北轍,我想看的是 CentOS 7 的目錄 /data/userData/Rsync ,運維給我看的卻是 Win 2012 下的掛載目錄 L:

  關鍵是當時我沒發現他給我的截圖其實不是我想看的!

  然後我就開始了我的線上環境模擬之旅

  NFS 服務端

   CentOS 7 上搭建 NFS 伺服器非常簡單

  1、安裝 NFS ,執行 yum install -y nfs-utils 即可

  2、對客戶端 IP 進行授權

    編輯 /etc/exports ,進行授權配置,例如

     /data/userData/Rsync/ 表示要共享出去的目錄,不存在則需要先建立: mkdir -p /data/userData/Rsync

     10.5.108.221 表示客戶端 IP 地址,說明共享給誰

     (rw,sync,no_root_squash) 表示授權列表, rw 表示客戶端可以讀寫, sync 表示自動同步, no_root_squash 是什麼含義,你們自己去查

    涉及到目錄的讀寫,需要對 /data/userData/Rsync/ 配置合適的讀寫許可權,方便演示就簡單點: chmod 777 /data/userData/Rsync/

    編輯好之後,使配置生效,執行命令: exportfs -rv

  3、啟動 NFSsystemctl start nfs-server

    開機啟動: systemctl enable nfs-server

  4、防火牆放行

    為了演示方便,直接關閉防火牆: systemctl stop firewalld

  NFS 客戶端

   WIN 2012 作為客戶端,配置起來也很簡單

  1、安裝 NFS 客戶端

     控制皮膚 -> 程式 -> 啟用或關閉 Windows 功能

     新增角色與功能 ,直接連續下一步,直到 伺服器角色

    如果在 WIN 2012 上搭建 NFS 伺服器,則上面三個框住的需要勾選上,然後進行 安裝

    我們目前是搭建客戶端,這個地方可以不勾,下一步,來到 功能

    勾選上 NFS 客戶端 ,然後進行安裝即可

  2、防火牆放行,為了演示方便,直接關閉防火牆

  3、目錄掛載

    直接在 cmd 中執行: mount 10.5.108.225:/data/userData/Rsync L:

    不出意外的話,掛載成功

  此時, 我的電腦 會出現一個網路盤

  正常來講,不會有紅叉;不影響效果,先不糾結

  同步

  簡單點模擬,直接在 win 2012 上,往掛載盤(網路盤)寫檔案,檔名是: 測試檔案.txt

  在 win 2012 的掛載目錄 L: 看,中文沒亂碼,簡直太正常了!

  但是,我們去 CentOS 7 的目錄 /data/userData/Rsync/ 看下

  哦豁,換了個馬甲,還真不認識了!

  程式去找 測試檔案.txt ,怎麼找得到嘛

Windows NFS 真弱 → 中文亂碼導致檔案找不到

  亂碼原因

  這個時候基本能斷定問題出在 NFS ,直接 google 下關鍵字: Window 2012 NFS 中文亂碼 就能找到答案

  根因就是:windows 內建的 nfs 支援的編碼非常有限,不支援 utf-8

問題解決

  去掉中文

  既然中文有問題,那就幹掉中文

  和上游系統協商了下,檔名改成英文,中文亂碼自然就不存在了

  有小夥伴可能會有疑問:之前沒有中文亂碼問題?

  其實你們心裡應該有答案了,沒錯,就如你們所想:這塊業務,之前一直沒出現中文名的檔案!

  升級 window 系統

   win10 可以開啟 Beta 版本 ,來支援 UTF-8

Windows NFS 真弱 → 中文亂碼導致檔案找不到

  具體可參考:一個小設定,讓Win10 NFS正常顯示中文UTF-8

  注意看評論區,坑很多,不推薦這種方式

  至於 Windows 系統的其他版本是否支援該配置,大家結合自己的系統去查閱

  第三方 NFS 客戶端

  ms-nfs41-client,人家搭建步驟寫的很清楚了

  換共享方案

   Samba 就是其中之一,大家可以去查閱並實現

總結

  1、 Windows 自帶的 NFS 支援的編碼非常有限,竟連 UTF-8 都不支援,會導致中文亂碼問題

  2、溝通的時候,一定要清楚的表達自己的意圖,要保證人家接收到的資訊就是你要表達的資訊

相關文章