TrueNAS文件名長(zhǎng)度限制問題,尤其是中文文件名
問題:最近在將windows電腦上文件向truenas拷貝的過程中,發(fā)現(xiàn)了一個(gè)問題,明明在windows系統(tǒng)中可以正常訪問和創(chuàng)建的超長(zhǎng)中文文件名文件(80-100字),不管是通過smb、sftp還是ssh向truenas傳輸都會(huì)出現(xiàn)“文件名過長(zhǎng)”的報(bào)錯(cuò)或者直接卡住。

最開始發(fā)現(xiàn)這個(gè)問題的時(shí)候也去查了很多資料,因?yàn)槭侵形奈募?,所以討論的人并不多,也沒什么發(fā)現(xiàn),一直以為是windows smb或者truenas系統(tǒng)配置的問題,最后發(fā)現(xiàn)是自己沒有認(rèn)真看文檔。。。
爬坑經(jīng)歷就不說了,直接說結(jié)論吧。

結(jié)論:
windows使用NTFS文件系統(tǒng)的時(shí)候,文件名長(zhǎng)度限制為255個(gè)字符,注意是字符!路徑長(zhǎng)度限制一般是255還是260字符。
我實(shí)際測(cè)試過感覺到不了,最長(zhǎng)大概是247個(gè)字符左右(含路徑,路徑長(zhǎng)則文件名就短),即便我在注冊(cè)表里面開啟了LongPathsEnabled,但是依舊不能解除限制,不知道是什么bug
到了truenas這邊的ZFS文件系統(tǒng),它屬于是Linux系里面場(chǎng)景的文件系統(tǒng)吧,這類的文件系統(tǒng)包括ext4這些,文件名長(zhǎng)度限制是255個(gè)字節(jié),對(duì)是字節(jié)不是字符!而路徑長(zhǎng)度一般都長(zhǎng)達(dá)4096字節(jié)或者無限制。
這里注意有字符和字節(jié)的差別就夠了。
各文件系統(tǒng)的對(duì)比可以參考維基:https://en.wikipedia.org/wiki/Comparison_of_file_systems#Limits
一般情況下,如果是英文文件名,字節(jié)和字符就沒有什么區(qū)別了,但是到了中文文件名的時(shí)候就有區(qū)別了,因?yàn)橐粋€(gè)中文字符往往占用多個(gè)字節(jié),尤其Linux系統(tǒng)的默認(rèn)編碼方式還是UTF-8,UTF-8一個(gè)中文漢字需要占用3個(gè)字節(jié)的空間,這樣就會(huì)出現(xiàn)英文文件名可以長(zhǎng)達(dá)255個(gè)字符,而中文文件名只能85個(gè)漢字,出現(xiàn)了巨大的差異的情況。
這個(gè)限制是linux系統(tǒng)與生俱來的的限制,幾乎沒法修改,所以作為用戶只能接受這個(gè)設(shè)定了。并且在今后的使用中避免生成過長(zhǎng)的中文文件名。

搞清楚這個(gè)問題之后,以后再遇到windows向linux拷貝文件出現(xiàn)文件名超長(zhǎng)的情況,就可以自己實(shí)際計(jì)算一下當(dāng)前windows的文件名以UTF-8編碼計(jì)算占了多少字節(jié)(漢字、中文符號(hào)都是3字節(jié),英文、數(shù)字、英文符號(hào)都是1字節(jié)),通過刪減和修改文件名讓文件名的字節(jié)數(shù)少于255就可以正常傳輸文件了。