Monday, 16. October 2006, 14:50:26
问题主要是由内核驱动模块不齐全引起的。虽然可以在/proc/scsi里面看到光驱的信息,但死活不能把它mount上去。解决的方法也很简单,编译缺少的模块,并insmod加载。
首先是打开SCSI device support以及SCSI CDROM support:
-> Device Drivers
-> SCSI device support
-> SCSI CDROM support
可以在帮助中看到,两者对应的模块分别为scsi_mod和sr_mod。sr_mod依赖scsi_mod,由于支持u盘需要用到scsi_mod,所以一般内核里面已经有scsi_mod了,将SCSI CDROM support设置成M就可以了。
另外,还有udf文件系统,在:
-> File systems
-> CD-ROM/DVD Filesystems
注意,这个不是ufs。DVD会用到它。如果没有这个文件系统,mount的时候就会提示不支持udf。
同样设置成M后保存退出。
接着编译这两个模块:
$ make drivers/scsi/sr_mod.ko
make fs/udf/udf.ko
编译完成后,insmod这两个模块,然后挂载/dev/scd0就可以正常挂载了。如果没有/dev/scd0,可以
$ mknod /dev/scd0 b 11 0
建立一个。
注意的是,模块的vermagic要与当前kernel的一致。可以用modinfo察看某个.ko的基本信息,包括vermagic。vermagic主要包括kernel版本和gcc版本。也就是说,要在某个kernel下面使用ko,必须保证所用的kernel source和gcc与编译kernel时的一致,否则insmod的时候会提示invalid format或者其他错误。
在我这里就遇到了这样的问题。我的pc上面的kernel source版本跟龙芯盒子里的kernel版本不一致,所以交叉编译得到的模块不能insmod。还好在龙芯盒子里面找到了一份版本正确的kernel,而正好里面还有一堆编译器。开始我是建立一个mipsel-linux-gcc的链接指向mipsel-linux-gnu-gcc-3.4,然而试了几个目录下的gcc,都有各种各样的问题。于是只好把Kernel hacking里的Are you using a crosscompiler关掉,使用本地gcc编译,而本地gcc有gcc-4.0和gcc-3.4两个版本,于是将gcc的链接由指向gcc-4.0改为指向gcc-3.4,其它东西不改,然后make,总算是编译通过了。
另外,各个模块的依赖关系可以在/lib/modules/version/modules.dep看到(modprobe应该也是借助这个文件来工作的)