Skip to Content

Puppy中pup_xxx.sfs所在的NTFS分区不能显示中文文件名

labrador 的头像
如果Puppy 4.1的pup_xxx.sfs是安装在NTFS分区上,那么当启动完成以后,这个分区显示已被挂载,而却不支持中文文件名,原有的中文文件名文件都不显示,而新建中文文件名文件则提示wide-character错误。用这个打过补丁的initrd.gz覆盖原来Puppy自带的initrd.gz文件即可解决这个此问题。

问题出在initrd阶段Puppy不支持glibc的locale,而ntfs-3g依赖于此来支持中文文件名。fat分区不受这个问题的影响,因为fat分区挂载是通过内核态的模块完成,其utf-8支持由内核中的相关库完成的,这与用户态ntfs-3g的原理有很大不同。

解决这个问题的方法是让Puppy在initrd阶段支持locale。主要分三个步骤:
  1. /usr/lib/locale/zh_CN.UTF-8目录放入initrd.gz中,这个目录可以在中文支持包中找到。新的ntfs-3g(2009.1.1)已经不需要指定额外的UTF-8。
  2. 修改initrd中的init文件,在ntfs-3g中加入参数locale=zh_CN.UTF-8。以下是init的补丁,注意其中有关ntfs-3g命令的修改:
    --- ../oldsrc/init	2008-12-09 13:32:56.000000000 -0500
    +++ init	2008-12-09 15:53:11.000000000 -0500
    @@ -85,14 +85,12 @@
     }
     
     mntfunc() {
    - if [ "`echo "$*" | grep 'ntfs'`" = "" ];then
    -  mount $@
    - else
    + if [ "`echo "$*" | grep 'ntfs'`" != "" ];then
       #screen out -o and -t options...
       MNTPRMS="`echo -n "$*" | tr '\t' ' ' | tr -s ' ' | tr ' ' '\n' | grep '^/' | tr '\n' ' '`"
       #v4.00 new ntfs-3g version...
       #ntfs-3g $MNTPRMS -o force,silent,umask=0,no_def_opts,allow_other 2>/dev/null #default is rw,noatime
    -  ntfs-3g $MNTPRMS -o umask=0,no_def_opts,noatime,rw 2>/dev/null #default is rw
    +  ntfs-3g $MNTPRMS -o umask=0,no_def_opts,noatime,rw 2>/dev/null #default is rw
       ntfsRETVAL=$?
       [ $ntfsRETVAL -eq 0 ] && return 0
       if [ $ntfsRETVAL -eq 14 ];then
    @@ -102,8 +100,16 @@
        echo -e "\\033[0;39m" >/dev/console
        return 14
       else
    -   ntfs-3g $MNTPRMS -o umask=0,no_def_opts,noatime,rw,force 2>/dev/null
    +   ntfs-3g $MNTPRMS -o umask=0,no_def_opts,noatime,rw,force 2>/dev/null
       fi
    + elif [ "`echo "$*" | grep 'vfat'`" != "" ];then  
    +  MNTPRMS="`echo -n "$*" | tr '\t' ' ' | tr -s ' ' | tr ' ' '\n' | grep '^/' | tr '\n' ' '`"  
    +  #echo "*=$*" >/dev/console  
    +  #echo "MNTPRMS=$MNTPRMS" >/dev/console  
    +  #sleep 10  
    +  mount $MNTPRMS -o noatime,utf8,quiet  
    + else
    +  mount $@
      fi
      return $?
     }
    @@ -1084,7 +1090,7 @@
       #find all the extra sfs files...
       touch /tmp/LOGONEBASES
       NPATTERN="_${PUPPYVERSION}\\.sfs"
    -  ls -1 $SFSSDIR/*.sfs |
    +  ls -1 $SFSSDIR/*.sfs ${PUPSFSDEVMNTPT}$(dirname $PUPSFSFILE)/*.sfs |
       while read ONEEXTRA
       do
        ONEBASE="`basename $ONEEXTRA`"
    
  3. 下载ntfs-3g源码,并重新编译并覆盖原来initrd.gz中的/bin/ntfs-3g,因为原来的initrd.gz中的ntfs-3g不支持locale。方法如下:
    ./configure --enable-really-static
    make
    make install
    
关于如何解开并重新打包initrd.gz,请参考用于显示中文文件名的initrd补丁细节
#2247
sasaqqdan 的头像
不错,/mnt/home(ntfs分区)能显示中文了,也能新建中文文件名文件了。
#2422
终于知道怎么解决了!~~
#3391
winpup 的头像
打了补丁后,还有一个奇怪的乱码问题。另一个地方的电脑上,仍然显示U盘中文名为??,若在该电脑上重命名(中文文件名),则在我的电脑上显示为??。明天再去那里测试一下。
#5331
dick_bourne 的头像
我现在用的是4.2.1版本的,挂载的NTFS倒能显示中文文件名,可是FAT32系统的却不能显示中文名的文件,不知道有什么好的解决办法

发表新评论

  • 你可以在文本中使用BBCode标记语言。 URL会自动被转为链接。

更多关於格式化选项的信息

CAPTCHA
请验证您是否是机器人。
Image CAPTCHA
Enter the characters shown in the image.