linux小系统支持中文的问题

来源:互联网 发布:苏州人口数据 编辑:程序博客网 时间:2024/04/27 07:16

    最近在调试linux小系统,想让小系统支持中文,经过几天的调试,这个问题终于得以解决,下面总结一下遇到的问题和解决办法。
    在console下面支持中文我选择的是采用外挂式平台的办法,并不真正汉化内核,因为担心汉化内核会有较大的风险,所以选用外挂的方式。采用外挂的方式必须得准备软件包,诸如zhcon、chdrv、autoconvert、cce之类,但这些源码包在我的虚拟机下编译始终不通过,花了一定时间在修改zhcon源码上,源码中某些结构体的声明在其他头文件中编译时不认识,由于对gcc、vi运用比较生疏,查找感觉比较麻烦而且花费时间较多,于是放弃了这条路,选择从rpm包的方式安装,结果rpm安装zhcon后提示运行提示cannot open framebuffer,查看内核选项发现支持framebuffer,将启动方式改为vga=***,cat /proc/device发现确实有fb后仍然不能使用zhcon,当时怀疑rpm可能不靠谱,因为下载的rpm包和我的redhat4.7版本差别较大,果断放弃了rpm决定一心一意回头去编译源码,顺便提到一点就是考虑到我们项目组内服务器和我的redhat标准系统是一个版本,内核为2.6.9,里面各种库十分齐全而且很稳定,将zhcon拷贝到服务器上编译通过,然后在服务器上测试zhcon能够正常运行,将服务器zhcon移植到我的系统中却不能干活同样是cannot open framebuffer这时候似乎是黔驴技穷了,于是跑去请教钟sir,钟sir告知通过strace查找原因。
    strace是linux中用来跟踪系统调用的命令,功能非常强大。
    移植zhcon我采用的思路是在虚拟机标准系统(内核2.6.9)的console下测试,然后在新编译的内核系统(内核2.6.33)下测试,最后测试mini系统。
    在虚拟机标准系统(内核2.6.9)下strace调试比较顺利,strace发现缺少/etc/zhcon.conf配置文件从服务器上copy过来即可。
    在新编译的内核系统(内核2.6.33)中测试,strace之后发现/dev/下面很多文件提示cannot open,于是将这些设备文件mknod,mknod的主要设备文件有pty、ptmx、vc、mem、zero等设备文件,之后zhcon能正常运行,做到这一点就非常好办了,因为新编译的内核系统能够运行,mini系统是肯定可以运行的。但是谁知道在mini系统中测试的时候遇到了很多问题,虽然我对能够将zhcon移植到mini系统上的可行性这一点深信不疑,后面会谈到这一点。
    移植到mini系统中zhcon一把,果然是不能运行啦,strace之后发现缺少很多库的支持,比如libgpm、libutil等等,说道这里不得不说一下关于如何分析strace命令啦,一般来说某个系统调用返回-1是出现了错误信息,只要从这里出发就能找到错误原因所在。
    比如:
 open("/dev/fb",O_RDWR)=-1 ENOENT(No such file or directory)表示无法开/dev/fb,返回错误码表示该设备不存在。
    另外在strace zhcon时会发生诸如死机的问题,另外对strace zhcon输出的信息不能通过shift+pgUp/paDn来查看,strace zhcon > xxx.txt无效的情况表示不理解比较无语外,其他的就是要仔细看然后不明白的查linux的api了。
    在strace zhon发现copy之后的pty**仍然无法打开,即使/dev/目录下面存在这样一个设备文件。怀疑是缺少某些模块,比对新编译的内核系统(内核2.6.33)和小系统的lsmod发现没有什么不合理的地方,一直想不明白为什么环境差别并不大,系统表现会不一样,继续思考,为什么存在的设备文件会提示打不开呢?无非是驱动、文件系统另外还有是否挂载的问题,比对新编译的内核系统(内核2.6.33)和mini系统mount信息,mini系统的/dev/pts没有挂载,原因是我在制作mini系统是修改了/etc/fstab文件,在启动是没有挂载pts,切换到mini系统中手动mount,然后运行strace zhcon发现问题解决了,zhcon之后出现zhcon的红色界面,心情十分舒畅......
    最后总结:
    1,gcc、vi工具的使用这一块存在较大的问题,之后要多用,对于strace zhcon > xxx.txt无法输出到文件不理解;另外在调试mini系统的时候,先在内核系统(内核2.6.33)中chroot到硬盘上制作mini系统的文件系统目录下然后运行相关命令和直接在mini系统中调试环境差别是什么不是太清楚,因为两者表现会不一样。
    2,移植的过程很重要,先在虚拟机标准系统(内核2.6.9)的console下测试,然后在新编译的内核系统(内核2.6.33)下测试,最后测试mini系统,这个过程很重要,因为如果直接在mini系统中测试可能出了问题不知道是内核的原因还是环境的原因,问题定位会比较麻烦,当然这里仅限于如我一样的newbie,骨灰级如钟sir、jian帅、nelson可以无视~。
    3,多查资料,多google是好习惯,但是貌似实验室和东五楼的网络很多搜索到的网页无法打开,基本上我是在宿舍的电信网中查资料的,当然了man也是要多看的。最后是不停的尝试了...
    经过一段时间的调试,目前我的小系统可以ssh,支持中文输入,能播放MP3但是不能支持u盘,关于u盘的支持花了很多时间,也只有dmesg下面能够看到设备型号比如Kingston,cat /proc/bus/usb/device能看到U盘的信息,相关驱动也都加载了,文件系统(vfat)但是死活不能mount,估计是内核的原因,因为虚拟机标准系统(内核2.6.9)可以mount U盘,新编译的内核系统(内核2.6.33)不能识别U盘,自己对内核选项也调整过多次,现在没有发现比较好的调试方法,欢迎大家指导~