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

開心一刻

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

  對方說:你好,方便麪是嗎

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

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

  就掛了電話

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

  不對呀,她好像說的是:你好,方便麪試嗎?

前提準備

  項目中有這麼一塊業務

  1、 腳本同步 這一環,是運維同事通過腳本實現的,所以我沒去關注

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

中文亂碼

  直到有一天, 生產環境 出現了異常信息: /data/userData/Rsync 下不存在文件:測試文件.txt 

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

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

  運維的反饋是文件存在,還發了截圖

  並且把文件複製給我了

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

  那問題出在哪?

問題排查

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

  其中 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、啓動 NFS : systemctl 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 ,怎麼找得到嘛

  亂碼原因

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

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

問題解決

  去掉中文

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

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

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

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

  升級 window 系統

   win10 可以開啓 Beta 版本 ,來支持 UTF-8 

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

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

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

  第三方 NFS 客戶端

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

  換共享方案

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

總結

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章