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