一、问题描述
内核版本为2.4.x的Linux系统下,在vfat分区上建立或复制中文文件名的文件后,回到window$会有一
部分文件无法打开和删除,试图删除这种文件时出现1026文件系统错误而无法删除。但在内核版本为2.2.x且
支持nls_cp936的Linux系统下可以看到出错文件的文件名中带若干个??号,可以打开或删除;在window$2000
下看到的是口字形符号,需要将其改名才能正常使用。如果先在内核版本为2.4.x的Linux系统下建立有错误的
文件,将这些文件压缩成tgz格式后回到window$98/2000或内核版本为2.2.x且支持nls_cp936的Linux系统将
该tgz文件解压缩到有错误文件相同的目录下,在window$上就会看到一对对文件明相同的文件。具体症状请
看补丁http://china-greencity.51cgi.com/nls-fix.tgz了的图片。
二、问题原因
引自不点版主主页http://tinybit.top263.net/上《2_4_x 内核 vfat 中文文件名的 BUG 及修补》。
内核中的 /usr/src/linux/fs/nls/nls_cp936.c 文件中的字符集转换表存在问题,这个转换表把两个
不同的unicode 代码点转换成同一个 GB 码字符,也就是说,同一个汉字内码,对应着两个 unicode 码值。
就上述几个例子文件来说,出问题的汉字有“不”“流”“茶”三个字。一个字有多个 unicode 码值,即使
不算错误,也离错误不远。内核中的这个转换表原本是从微软网站下载的,又经过了修改。究竟是谁的错,
不必追究。
三、补丁安装方法
该补丁由不点版主制作的程序(http://tinybit.top263.net/s4/dbcs_uni.tar.gz)生成两个文件,
nls_cp936.c和nls_cp950.c,新的文件可以应用直至最新的2.4.17内核,更新的版本还不可知晓。
下载补丁:http://china-greencity.51cgi.com/nls-fix.tgz
为了免去一些麻烦,您只需按以下步骤就可以不编译内核就可以安装新的nls模块:
(1)确保您的Linux系统上已经安装了内核源代码。
#cd /usr/src/linux
#make menuconfig
直接保存退出。
#make dep
(2)将补丁压缩文件解压到任何目录下
#bunzip2 -dc nls-fix.tar.bz2|tar xvf -
#cd nls-fix
#make cp936 /*也可以直接输入make生成nls_cp936.o*/
#make cp950 /*不知道原来的内核中的nls_cp950.c是否也有错误*/
#make clean /*删除生成的.o文件*/
(3)将生成的.o文件复制到/lib/modules/[version]/kernel/fs/nls/目录下。
其中version是与内核源代码版本一致的目录,如果您需要不重起就能修正错误,请务必保证
内核源代码的版本与当前的内核版本一致。
(4)umount所有vfat分区,用rmmod gb2312和rmmod nls_cp936卸载原来的模块,运行mount -a,
再回到中文环境下看看,你在Linux下保存到vfat分区的中文文件的文件名是否有??符号?