開心一刻
正睡著覺,然後來了個電話
對方說:你好,泡麵是嗎
我愣了一下,以為是惡作劇
回了句:我不是,我是火腿腸!
就掛了電話
又躺了好一會,忽然琢磨過來......
不對呀,她好像說的是:你好,泡麵試嗎?
前提準備
專案中有這麼一塊業務
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、溝通的時候,一定要清楚的表達自己的意圖,要保證人家接收到的資訊就是你要表達的資訊