Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1222754
  • 博文数量: 322
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 3276
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-17 09:21
文章分类

全部博文(322)

文章存档

2010年(155)

2009年(167)

我的朋友

分类: LINUX

2009-12-30 01:39:57

 
    这个问题非常复杂,我不知道我能否将它写好。网上一直都有许多关于此问题的文章
    (当然,这也是我配置的参考前提和基础),但是网上除了有点乱以外,我没啥好说的。
    而我写本文是基于我已经把它完全配置几近完美的程度上写的,我仅能确定的是,
我这里已经有一个实解:它可读可写,且支持简体中文!
 
如果本文能对你配置自己的Linux支持NTFS有帮助,那么我将十分欣慰;
如果它对你配置自己的系统毫无帮助,那么它的存在仅提供了一个可能解。
 
       任何一个头脑再不清楚的人也知道这个问题必须分成两个部分来讨论:
第一、从Linux下挂载NTFS分区,只读;
第二、从Linux下挂载NTFS分区,可读可写。
 
第一部分
从Linux下挂载NTFS分区,只读
 
    该方法从理论上讲,是基于Linux内核本身对NTFS的支持,内核不用太新,至少Redhat9的2.4.20里面就包含了相应的文件,只是默认没有编译成模块罢了。
 
    为了得到这么一个ntfs.o模块,你可能会大费周章,因为通常它有两种途径:
    1、通过源代码树编译。在大多数情况下,这对新手来讲是一个深渊,因为它需要太多的周边知识,如果你只会照抄别人的命令,那么除了期待自己人品爆发以外,不要期望成功。
    我的建议是:期望自己不要因此而把系统弄乱或者弄坏就可以了。
    不过在此,我仍提供相关的技术,但是不详加说明,并假设你具备编译内核的相关知识,
    因为一般来讲,它不见得可以精确地在你自己的系统上运作。
       a. make oldconfig  (旧的config文件在/boot下)
       b. make menuconfig (选一下fs里的ntfs相关模块)
       c. make dep       (内核2.4必须执行这么一步)
       d. make modules    SUBDIRS=fs/ntfs   (只编译一个模块)
如果人品爆发的话,那么会产生ntfs.o的模块文件,放到/lib/modules/{当前使用内核版本}/kernel/fs/ntfs里;
e.depmod -a        (整理模块间的相关性)
       f.modprobe ntfs     或者 insmod ntfs   (加载ntfs模块)
       g.lsmod | grep ntfs 或者 modprobe -l | grep ntfs (查看是不是真的加载了)
       h.mount -t ntfs /dev/hda1 /mnt/C    (如果这条命令没抱怨啥,那么恭喜你成功了)
2、幸好我们还有一种不需要人品爆发的方法,那就是得益于这个地球上存在这么一类文件
kernel-ntfs-2.4.21-9.EL.i686.rpm,在rpmfind.net你也许可以找到对应你自己的包。
       这是别人帮你编译好了的模块文件,装上就能直接挂载成功了,强烈建议欲速成的朋友使用该方法。
 
       只读的部分较简单,到这里就讲完了。顺便说一句,内核中ntfs选项里不仅存在可读模块,也存在可写模块,但是实验性质的,并且已知一些弟兄使用该功能导致NTFS文件系统崩溃,为了您和您的NTFS分区安全,请不要选它。我们有更好的写NTFS分区的方案,马上就介绍。
 
                  第二部分
       从Linux下挂载NTFS分区,可读可写,Using ntfs-3g
 
       该方法从技术上讲,得益于另一个开源项目ntfs-3g
    从理论上讲,装上该软件包就应该可以成功了,但是理论终归是理论,实践中你无法想象会遇到什么具体问题。
      
第一个坎:FUSE
 
也许你和我一样,第一次听说这么一个东西,让我们来看看它是什么,根据README:
     FUSE (Filesystem in Userspace) is a simple interface for userspace programs to export a virtual filesystem to the Linux kernel.
不管准确的翻译是什么,FUSE至少是一个由用户空间的程序使用的把一个虚拟文件系统传递给Linux内核的简单接口。
       其实这本不关我们的事情,但是ntfs-3g需要使用fuse,否则安装依赖性通不过。所以,
    无论如何,我们得安装它,我安装的是FUSE-2.7.4,而安装它的一个困难在于README里有这么一个依赖性的说明:
       Dependencies
       ============
       Linux kernel version 2.6.X where X >= 9.
       Alternatively a kernel module from FUSE release 2.5.* can be used with
       this release, which supports kernels >= 2.4.21.                       
 
    如果你使用2.6.9以上的内核,应该没有问题。但如果你和我一样,是在REDHAT9上,那么你可能会遇到跟我一样的问题,那就是软件安装完之后无法使用,提示找不到fuse模块,你应该先modprobe fuse再挂载,/dev/fuse不存在等等。这些确实是存在的,至少
在我的系统上提示了这些错误。
 
    我的解决方案得益于README里紧接着的那句话:
    作为另一种选择,在FUSE 2.5.*的发行版里,有这么一个内核模块,
    它可以跟这个版本(指你要安装的版本)一起使用,它支持2.4.21以上的内核。
于是我弄来了fuse-2.5.3,安装上之后确实有fuse模块,并且运作正常:
    有/dev/fuse,并且lsmod也看得见fuse等等等等,就如同托尔斯泰的那句名言描述的:
    正常的Linux都是相同的,不正常的Linux却各有各的不正常。
 
    具体安装细节毫无技术含量,本质上讲,就是从2.5版本中得到一个fuse模块给2.7版本使用,这一步不需要人品爆发,一顿乱装胡装瞎装,差不多就会成功,也不用担心把系统搞坏。
 
       好了,我们来看看第二个坎吧,Linux is really a long road !
 
           第二个坎:ntfs-3g
 
         这个软件是十分温顺的,只有一个依赖性,那就是FUSE,只要FUSE已安装,ntfs-3g安装从来就没有抱怨过什么,顺顺利利地安装结束,但是它变态的地方就是当我们开始挂载的时候,无论是mount -t ntfs-3g /dev/hda1 /mnt/C还是ntfs-3g /dev/hda1 /mnt/C都提示:
      /bin/mount:无效选项 -- i
Usage: mount -V                 : print version
       mount -h                 : print this help
       mount                    : list mounted filesystems
       mount -l                 : idem, including volume labels
So far the informational part. Next the mounting.
The command is `mount [-t fstype] something somewhere'.
Details found in /etc/fstab may be omitted.
       mount -a [-t|-O] ...     : mount all stuff from /etc/fstab
       mount device             : mount device at the known place
       mount directory          : mount known device here
       mount -t type dev dir    : ordinary mount command
Note that one does not really mount a device, one mounts
a filesystem (of the given type) found on the device.
One can also mount an already visible directory tree elsewhere:
       mount --bind olddir newdir
or move a subtree:
       mount --move olddir newdir
A device can be given by name, say /dev/hda1 or /dev/cdrom,
or by label, using  -L label  or by uuid, using  -U uuid .
Other options: [-nfFrsvw] [-o options].
For many more details, say  man 8 mount .
FUSE mount point creation failed                               
       这是一个非常头疼的问题,因为这看起来好像不是ntfs-3g的问题,而是系统的mount命令有问题。而给出的错误提示,可以说对解决问题没有任何帮助,因为它似乎只是说mount命令没有-i选项,正确的语法应该如下云云。可在哪里使用了mount -i命令呢,也许是ntfs-3g里吧,天知道呢。
而这种问题又是最难搜索的,因为它与特定的问题相关性不足,整个互联网似乎只搜索到一处有人在使用ntfs-3g时确实遇到该问题,并且也只有该处有一人回答了
Your /bin/mount utility doesn't support the -i option what FUSE requires to edit /etc/fstab.
Upgrade or ask you /bin/mount provider to fix the problem.
       这个回答可以说再普通不过了,升级或者找mount命令的提供方解决该问题,可互联网上又没有其他地方有该问题的回答了,所以此时应该感到绝望和无奈。
       不过看到该回答来自于ntfs-3g的lead programmer,我还是觉得这可能真的是唯一可行的办法了。
       于是我来想办法升级mount,让它支持-i选项。
      
第三个坎:mount
 
       这是个不常见的问题,我想很少有人单独升级某个命令,大多数人都是跟随新版本系统一起而使用新命令的,所以网上也不应该有该问题的指导。
       a.我试了mindi-busybox-1.7.3-1.rh9.i386.rpm,没用;
       b.在rpmfind上也没有找到相应的升级包,因为REDHAT9自带的mount版本在mount-2.11y-9,从搜索结果上来看,不是很老;
       c.最后我只好找mount命令的源头,那就是util-linux,我安装了util-linux-2.11y-31.1.src.rpm,安装完毕后,mount命令版本没有被更新,还是mount 2.11y-9,这当然是有可能的,一方面版本号本来就很近,另一方面在这一版里也许就没有更新mount。
       d.最后绝招,我下载了util-linux-2.12r.tar.gz,其实还有更新的测试版2.13pre1,但是我想ntfs-3g和fuse肯定不是非要mount最新的测试版才能运作的,如果最新的稳定版解决不了问题,那么测试版也是枉然的。
       于是我来安装util-linux-2.12r.tar.gz,这个包最好是别乱装,因为它与Linux系统联系很紧,
WARNING: THIS COLLECTION CONFLICTS WITH SYSTEM V INITTAB.
       WARNING: DO *NOT* INSTALL WITHOUT THINKING.
        If you are not a wizard, do *NOT* blindly install these utilities: they could
     prevent you from logging into your system.
       
        这段英文大致的意思简单讲,就是脑子不是很清楚自己在干什么最好是别动。
 
        然而,我们还是有稳妥的办法来干这件事情的,那就是Just make, But NOT make install,
        我们不就是为了一个mount命令吗,我们make出来,但不用make install来帮我们安装了,自己手动安装就行了。编译出来真的有mount命令(希望不是人品爆发所致),将它放入/bin/mount,以前的mount当然要备份,谁知道新玩意儿管不管用呢?
 
        实践证明,2.12r的mount完全可用,可以使用mount --version查看其版本。
        至此,一切复杂问题全部搞定。
 
最后,简述一下关于mount命令中-o选项指定支持中文的问题。
一般来讲,最经典的就是一句 iocharset=cp936了,几乎屡试不爽。
建议大家先试验它,有问题再考虑其他方案,这就多了,如utf8,gb2312等等等等。
这里是我的/etc/fstab文件的内容,让大家看看最后的面貌是啥样子的:
LABEL=/                 /                       ext3    defaults                  1 1
LABEL=/boot             /boot                    ext3    defaults                  1 2
none                     /dev/pts                 devpts  gid=5,mode=620           0 0
none                     /proc                   proc    defaults                   0 0
none                     /dev/shm                tmpfs   defaults                   0 0
/dev/hda5              /mnt/D                  vfat  iocharset=cp936,defaults       0 0
/dev/hda6              /mnt/E                  vfat  iocharset=cp936,defaults       0 0
 
#NTFS
/dev/hda1              /mnt/C_R                     ntfs  iocharset=cp936,defaults       0 0
/dev/hda7              /mnt/F_R               ntfs  iocharset=cp936,defaults       0 0
/dev/hda8              /mnt/G_R              ntfs  iocharset=cp936,defaults       0 0
 
#NTFS-3G
/dev/hda1              /mnt/C_W             ntfs-3g    iocharset=cp936,noauto         0 0
/dev/hda7              /mnt/F_W              ntfs-3g    iocharset=cp936,noauto         0 0
/dev/hda8              /mnt/G_W             ntfs-3g    iocharset=cp936,noauto         0 0
 
#Removable Devices
/dev/sda1        /mnt/U                  vfat  iocharset=cp936,noauto                0 0
/dev/cdrom   /mnt/cdrom       udf,iso9660 noauto,owner,kudzu,ro    0 0
        
我选择的方案是随系统启动时自动加载
只读的ntfs文件系统,利用内核功能,
要想写ntfs时临时挂载,利用ntfs-3g功能。
    这是基于两方面考虑:
       1、fuse的用户态较耗资源,没必要一直挂载;
       2、对ntfs分区的写功能一直没有被证明是完全可靠的,能不写就别蛮写,毕竟是后果自负的。
 
       本文无意于成为任何Linux下挂载ntfs的教程,仅仅是对linux下挂载ntfs的一个研究,并且对网上几乎从来没有提到的几个问题给出了自己的解决方案,通过实践指出了一个可能的实解,希望对大家有参考作用。
 
 
阅读(1219) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~