|
楼主 |
发表于 2003-3-27 15:17:29
|
显示全部楼层
然后,进入KDE,这回一切正常。xsim很正常的调用出来了。但我感觉xsim也很一般。
上面的错误虽然浪费了我很长时间,但让我对XIM服务器有了一定的了解,对我下面的配置工作有了很大的帮助。如果在加载XIM服务器后,进入不了WM,比如KDE或GNOME,基本上就是WM和XIM之间无法建立联接的原因。DCOP通讯超时,WM就退出了。无法建立联接基本上是由下面两种原因造成的:
a)XIM服务器异常退出。就象上面发生的情况。
b)XIM服务器没有正常的初始化。这大多数始由于LC_ALL、LC_CTYPE和LANG这些locale环境变量造成的。
在BSD里,中文locale是zh_CN.EUC,这对于那些判断locale的输入法来说就成了很大的问题。这些输入法都查看locale是否是zh_CN.GB2312或zh_CN。
我在RedHat下使用过小企鹅输入法fcitx,挺好用的,在linuxsir上有它的很多信息。那么,在FreeBSD上能不能用它呢?试试看把。我下载了小企鹅输入法的输入法的源代码包fcitx-1.8.2.tar.gz。我对于XIM几乎没有什么了解,但连蒙带唬的编译软件包却是我的特长。先make一下试试,呵呵出错。那就修改一下Makefile吧:
把Makefile中的如下内容
CFLAGS= -O2 -fno-strength-reduce
INC = -I/usr/X11R6/include -I
LIB = -L/usr/X11R6/lib -lX11
修改成
CFLAGS= -O2 -fno-strength-reduce -DSIGUNUSED=32
INC = -I/usr/X11R6/include -I. -I/usr/local/include/
LIB = -L/usr/X11R6/lib -lX11 -L/usr/local/lib -liconv
再make一下,呵呵,当然成功了。但fcitx还是不好使。嗯,研究研究。fcitx源代码写的非常工整,看上去很养眼睛。软件模块划分也非常清楚,因此跟踪起来也非常容易。埃,国内要是多一些这样的程序员就好了。fcitx的作者所在的公司真是好福气。
大致上,我简单修改了fcitx的代码。由于我只是想让它再FreeBSD上运行,因此没有作什么判断,而是暴力修改。
修改文件xim.c,查找关键字IMOpenIM所在的行。删除该行,把它替换成如下内容:
ims = IMOpenIM (dpy,
IMModifiers, "Xi18n",
IMServerWindow, im_window,
IMServerName, imname,
IMLocale, "zh_CN",
IMServerTransport, transport,
IMInputStyles, input_styles,
IMEncodingList, encodings,
IMOnKeysList, on_keys,
IMProtocolHandler, MyProtoHandler,
IMFilterEventMask, filter_mask,
NULL);
该行下面几行,有3个函数调用IMSetIMValues,可以注释掉。当然,不注释掉也行。呵呵,但最后一个IMSetIMValues调用令我非常费解。
现在,fcitx可以正常运行了,但看不到汉字。编辑文件window.c,查找关键字XCreateFontSet,找到第二个匹配。第一个是XFT模式的。在函数XCreateFontSet前加一行:
setlocale (LC_CTYPE, "zh_CN.EUC");
重新make,make install。修改~/.xinitrc 文件,添加如下内容:
export XMODIFIERS=@im=fcitx
fcitx &
重新进入KDE,一切OK。由于我没有仔细看fcitx的源代码,因此上面的修改是否要造成不良后果,我就不知道了。不过这篇文章就是用fcitx在FreeBSD下写的。感谢fcitx的作者。修改了你的代码,你可别生气呀。
汉化的XFree86和KDE后,下一个要解决的问题就是FreeBSD的中文文件名问题。这才是真正的FreeBSD汉化。不过操作起来很简单。在FreeBSD中,当你用ls中文文件名的时候,看到的不是各种乱码,而是多个?号或者-号。这时候,需要安装gnuls和gbfs包。使用上面的Ports操作,可以很容易安装他们。安装后reboot系统。你会在启动信息里看到一些错误信息:
module_register: module cd9660 already exists!
linker_file_sysinit "cd9660.ko" failed to register! 17
如果你没有看清楚,查看/var/log/message。查看/usr/local/etc/rc.d看到里面多了一个启动脚本gbfs.sh。其内容是用kldload加载/usr/local/modules下的模块。到/usr/local/modules/下看看,看到里面有两个模块文件cd9660.ko和msdos.ko。使用kldload来手动加载cd9660.ko。依然显示上面的错误。上网查资料才知道,需要修改kernel配置文件注释掉以下几行:
options MSDOSFS #MSDOS Filesystem
options CD9660 #ISO 9660 Filesystem
options CD9660_ROOT #CD-ROM usable as root, CD9660 required
然后重新编译并安装内核。ok先试试,反正FreeBSD编译内核的速度奇快。编译、安装内核后,reboot。但错误依然。这是怎么回事?这时,我在想为什么要注释掉上面呢三行,难道说要让FreeBSD不支持msdos和cd文件系统?显然不是,因为我还是可以mount上fat分区。我想,这可能是要强制FreeBSD对msdos和cd文件系统的支持在module模式下运行。而我在/etc/fstab中添加了在启动时mount我的fat分区的内容。因此FreeBSD先使用了原来的msdos.ko。当gbfs.sh加载自己的msdos.ko时,当然回出现错误了。ok,试试看。把/modules/cd9660.ko和/modules/msdos.ko备份一下。然后把/usr/local/modules/msdos.ko和/usr/local/modules/cd9660.ko拷贝到/modules下,删除/usr/local/etc/rc.d/gbfs.sh。reboot系统。在~/.cshrc下增加如下内容:
alias ls 'gnuls --show-control-chars'
这回看看msdos下的中文文件名。哈哈,OK了。
9、奇怪的UDMA错误
每次我启动FreeBSD的时候,都会在dmesg中出现下面的错误:
ad1s1a: UDMA ICRC error reading fsbn 255 of 96-127 (ad1s1 bn 255; cn 0 tn 4 sn 3) retrying
呵呵,可不是只出现一行,而是出现一打。有时,在控制台上还会反复出现。这时怎么回事?以前没时间处理它,现在可要研究研究了。上网查查,基本上没有什么结果。看看man吧。man ata。ata是ATA/ATAPI控制器的驱动。它说ata总是尝试使用控制器通道的最高速率来初始化。在我的机器上就是udma66。如果初始化失败,它会把相应的通道降到PIO模式。这就是上面那个错误的原因。但是可以使用atacontrol来控制。使用atacontrol mode 0命令看看,我的IDE1果然工作在PIO4模式。我的BIOS告诉我,我的IDE1是udma33,使用atacontrol mode 0 1 udma33后,我的IDE1控制器,回到了udma33模式。但我不知道,pio4和udma33在FreeBSD上的速度到底有多达的差距。我写了一个perl脚本来测算速度,脚本如下:
#!/usr/bin/perl
`rm Looking.rar`;
$t = time();
`cp /usr/Looking.rar .`;
$t = time() - $t;
print "$t\n";
Looking.rar这个文件有270M。我记录下了两种模式下运行该脚本的时间。
REBOOT后第一次运行的速度 多次运行后的速度
PIO4 57秒 29秒
UDMA33 27秒 11秒
这个速度上的差距真的是非常惊人。但我不知道如何强制ata在udma模式下运行,只好写了一个脚本放到/usr/local/rc.d下,该脚本叫ata.sh,内容如下:
/sbin/atacontrol mode 0 1 udma33
/sbin/atacontrol mode 1 1 udma33
尽管那些错误在启动的时候依然存在,但我的心里感觉好多了。
10、后记
我到http://www.kde-look.org/上找 ... 除了我的RedHat 7.3。这并不是说,FreeBSD比Linux强。我虽然是一名程序员,但我不是搞系统内核的,我没有资格评判哪种系统更优秀。我只是一个玩家,一个使用者。FreeBSD的纯净、单纯、强大,深深的赢得了我的心。世界上只有一个FreeBSD,区别只是版本问题。FreeBSD是那么的不追求名利。你原意使是就使,FreeBSD绝不去推销自己。而现在的Linux世界却充满了商业,令我的心真的很烦。现在,世界终于安宁了。 |
|