Skip navigation.

火与冰--alva's blog

胸有激雷,面如平湖

Posts tagged with "Linux"

drcom的进展

这几天还是有点迷糊,原来的设想似乎是错误的,在drcom-module里面无法操作。应用程序联网的过程,是使用socket(),通过调用general BSD Socket,然后针对于type调用不同的ops,而ops的细节实现是调用网络层的sock。
struct socket {
        socket_state            state;  
        unsigned long           flags;  
        const struct proto_ops  *ops;
        struct fasync_struct    *fasync_list;
        struct file             *file;  
        struct sock             *sk;    
        wait_queue_head_t       wait;   
        short                   type;   
};

这是所有unix,linux程序共同的地方,否则也不存在网络应用程序的可移植性了,再往下面一层就是inet层了,需要的入口肯定在这里。却不能在这个结构体里面进行指定,原来天真的想可以覆盖下面具体的函数实现,仔细一看内核的代码,但发现是不可操作的。后来想能否通过操作inetsw_array [ ]来实现。它是一个静态数组,但是却不是外部变量,所以从内核模块无法操作这个变量。inet_stream_ops等等被声明定义为常量,所以无法操作,再往下就是ops所调用的各个函数,而这些函数却是无法被暂时的替换然后在模块退出时返回原值的。再往下就到了网络层,这层往下的操作如何来做,我是不知道。

最近还有些其他的事情,所以这个也只有暂时放下了,我想除了FC5,其他的发型版还是用老版的内核吧,应该还有时间等后面有人做出来。自己能力有限吧,我需要时间再加强加强。如果是FC5的用户,需要用的,那么就自己hacker一下内核吧,为了drcom发布一个内核补丁是不值的。应该还有其他的解决方案。下面是通过读内核源码想到的hacker内核的方法,我自己还没有测试过,我懒得装2.6.16的内核,有用FC5的就先充当这个测试吧。内核版本为 2.6.16.1,其他版本的应该行数也没有变或者在附近。该完之后重新编译内核和drcomsuite
1. 修改声明
/*file:include/net/inet_common.h,第四行和第五行,去掉常量的声明*/
extern struct proto_ops           inet_stream_ops;
extern struct proto_ops           inet_dgram_ops;

2. 修改定义
/*file:net/ipv4/af_inet.c,line 790,811行,去掉常量声明*/
790: struct proto_ops inet_stream_ops = {
       //omited
     };
811: struct proto_ops inet_dgram_ops = {
       //omited
     };

是下雨心情不好,还是在感慨些什么?

,

昨天晚上大概搞懂了这几天研究的思路,由于要为drcom的内核模块,在linux下找到新的入口。我准备阅读linux的TCP协议栈源代码。在电脑上看书,总是觉得眼睛太累,所以第一步还是去图书馆找是否有相关的资料。计划早上早起,先陪一个朋友出去吃早餐,送她上课,然后去图书馆。昨天是她生日,可是我错过了,算做补偿吧。也好像很久没有见到她了。早上起来发现昨晚下过雨,出去看看,还挺冷。所以也就只好说改天了,也不知道那边卖铁板里脊的来不来,天色挺暗,也许待会会下雨。这次变天让我挺不爽的,几次计划好和同学去踢球,都被一些事情打断了,可能有一个多星期没有运动过了吧。昨天上午天气还挺好,下午去踢球时,风太大,去的人不多也没有踢得尽兴。计划早上和很久不见的朋友出去,结果下雨。呵呵,也没有感性到让天气影响心情的地步,只是这么多天,毕业设计包括自由软件的项目都没有什么大进展,让我感觉自己挺失败的。而身边的同学,沉浸于大学最后时光的享受当中,整天的魔兽,这对于我项目关键时候需要安静的环境来说,确实是一种挑战--如何的拒绝诱惑,拒绝干扰。
到了图书馆,照例查查有没有什么我感兴趣的新书上架。有一本FreeBSD的。FreeBSD曾经有一段时间对于我的吸引力特别的大,我想让它来做网站的服务器。FreeBSD坚如磐石的特性很让我着迷,结果却还是暂时的放弃掉了,而是选择了Linux。原因在于我让它运行的环境。网站改版之后大部分是用java重写了,因为想为后面的维护省下很多事情,不再多写代码。我实现的是开发了一套页面标签,就用那些标签插入到页面里面就可以很容易的建立一个版块的内容,而这点php做不到。而当时从网上知道,Sun的java源码协议和BSD之间出了点问题,在FreeBSD上安装java开发环境有点麻烦。(这个问题,昨天,4月5日已经不成问题了,FreeBSD基金会已经和Sun达成了发布JDK和JRE二进制包的协议)另外还有就是学校开始正式的使用drcom作为校园网的控制,而FreeBSD上暂时没有实现开源版本的drcom客户端。虽然服务器放在网络中心可以不受限制的上网运行,那么测试服务器呢,那么我日常的使用呢?而FreeBSD的软件包管理机制,很依赖于网络。后来我选择了gentoo作为我主要的操作系统,它给了我最大的自由和最真实的体验,用linux以来从来没有过的体验。但是即使是现在,BSD还是对我有着深深的吸引力,或者别人或者我自己如果开发了BSD下的drcom,或者是我走出了这个被Drcom困住的环境,遇到服务器运用的场合,我可能还要尝试再应用FreeBSD,但是桌面的操作系统,我想gentoo是没有其他任何发行版可以取代了,因为我随着我对它开始熟悉,它很听我的话了,我对它无可挑剔了。
今天第二点让我不爽的地方就是这本书的序,序是某社区的负责人写的。但是对于他的观点我想我不能苟同,关于linux的。我想要么是当时(2002年)linux没有发展到令人感觉很好的境地,要么就是他当时对于linux并不是了解,虽然里面也列举了他用过的几个linux的发型版本。但是却在文中把Linux和Linux发型版的概念去混淆,把各个发型版的特性来混淆。把各个发型版的不足之处,都算到linux之上。如slackwave的难于安装配置和redhat的太傻瓜化都算成linux的不足之处。最后得出一个结论:“Linux轻浮,FreeBSD优雅,Solaris高贵”,这些话如果发到某个拥有linux和FreeBSD重多用户的社区,那么我想又是一场口水战。“轻浮”这个词是不能随便用的,轻浮的永远是人,而不是一个伟大的工程。如果说轻浮,那我可以承认一下我当初选择gentoo的初衷,我看到了gentoo的很多贴图,很漂亮,而没有其他任何一个发型版有这样的东西。我应用linux,不是光在服务器上应用,而是所有开电脑的时候我都在用,很长一段时间我只有一个gentoo linux,从2004.8到现在的2006.0;并且我试图让所有的学习工作,娱乐都往上面进行,我不能容忍自己写代码的同时却可以心安理得的跑着盗版的操作系统。我想,这对于windows我没有半点的贬低,我想这是尊重!最实际最客观的尊重。gentoo linux让我做我想做而它又能做的的任何事情,我喜欢对着它漂亮的脸蛋儿工作(fbsplash和fvwm)。这也许和生活中的我一样,我想我是喜欢美女的,只有内秀的女人只可能做朋友;花瓶我也消受不起,不可能真正的喜欢,更不可能成为我的老婆。我喜欢象gentoo linux这样的女人,也许在一起,互相了解,需要长的时间,需要一起去经历才可以如此的默契,但是经过了考验的感情才可以长久,但是她却可以成为我独一无二的,近乎完美的伴侣。说到windows,只到最近,要做毕业设计,才无奈装了一个windows2000,但是现在进入的次数不到5次。我自己也是对FreeBSD有着兴趣的,有人说它纯粹正宗,有人说它朴实,有人说它易于学习编程,其实我看上的,一是它的授权,如果我想在将来的产品中运用它但是又不得不封闭源码的时候;二是它作为服务器运行的接近于完美。我其实我也不想把别人2002年写的话再来提到现在来说,我只是觉得,开源世界的变换实在太快谁也不知道明天会发生什么,不要用一句话定了别人的将来,这样非但显不出水平,反而是浅薄轻浮。我想,master是绝不会下这样的定论。并且,有时侯这样的话会误导新人,会引起争端。我觉得开源世界应该健康活泼的发展下去,而不是总有windows vs linux,linux vs BSD,linux distribution A vs linux distribution B;我也承认没有竞争就没有发展,但是在国内有些地方,却竟然可以演化为人身攻击,而这些陷入争论的人是否有技术,其实大家都清楚。大家比技术共同发展是很好的,但是不要让别人觉得如果没有了微软,那么linux就会“树倒猢狲散”。说到轻浮,我很瞧不起国内的某些开源社区里面的某些人,说是什么“忠实追随者”,却不明白GPL的哲学,去不明白Free不等于no charge!整天论战挑起事端,自己弄不好就发牢骚,很久很久之后,还是个“green hand”而已,这是被开源世界定义为loser的,为什么呢,因为他即便是在论战的时候都是在windows下上网啊。我还记得,有一次在linuxsir的gentoo论坛,有人对gentoo的“月月秀”大发感慨,说都“沉迷于此,而不研究真正的技术。”我就认为发这话的一定是初学者中的初学者,技术?何必这么现实,各个有个人的追求,有些人用linux本来就是为了爱好,而爱好是什么,个人有个人的看法,“just for fun”而已。从来也不要认为用过linux就了不起,水平高低的是人的差别,而不是操作系统。不说了,即使那本书的序言作者看到本文,也请不要生气,本人就那点浅薄的知识,侃侃而已。
第三点让我不爽的是,我看到的linux的内核源代码分析的书。想从中间找到某些有用的部分,所以翻了很多的书。我以前不想去看内核源代码,感觉没有必要,我用不着,而确实要花不少的时间。图书馆里面关于内核源码分析的书还是有几本的,但是有些书却被画记了许多东西,但基本上不是重点,只要有相关知识的人就可以看出,划记的东西根本不可能是重点,而是很平白的几个形容词;划记的部分大概就前面几节吧。这让我感觉到两点:第一,素质,图书馆的书居然可以在上面划这么多东西,这是大学生该做的吗?;第二点,不说了,大家猜吧,其实还是轻浮。

出大问题了!

这几天不断有FC5的用户向我询问2.6.16内核下无法编译drcom的问题,(注:drcom是宽带登陆客户端,这个drcom-client是linux下实现的开源版本,本人启动了一个q-drcom项目,做drcom的使用支持和图形界面的开发)。编译的错误很明显,是drcom内核模块中给常量inet_stream_ops赋值的原因,但是我自己不用Fc5,并且身边的机器也没有Fc5.我想吧,也许是fedora社区对内核进行更改了,最近比较忙,也不想管,因为其他的发行版本都没有反馈这个问题的。昨天下下来一个fedora5的rpm包,不过是2.6.15的。我的gentoo没有办法解rpm包,在linuxsir上fedora论坛里发贴请fc5的用户帮我把头文件发过来,很久都没有人回应。后来从网上找到一个脚本,可以利用gunzip这些普通命令什么的解rpm包。解开之后,查看那些patch,发现没有对那个头文件进行修改的,而2.6.15的原始内核也是没有象我想象的有修改。fc5下2.6.15内核编译错误的原因,是因为应用的patch-2.6.16的补丁。不过不知道为什么,解压内核补丁的bz2压缩包时出错,所以也没有去管了。我开始意识到,是否是2.6.16内核的原因,今天早上更新了portage之后,emerge了最新的2.6.16-r1内核,我去内核源码树里面去看那个头文件,gentoo里面的那两个量也被声明为常量了,那么是否linux的原始内核已经在这个地方做了修改了呢?于是去了kernel.org下了2.6.16版本的内核下来,一看,果然如我所想,做了修改。那么我的猜想也是对的,fc5中应用的2.6.15的内核发布比较玩,是加了各个补丁的内核,并且这个修改并入了2.6.16;而且inet_common.h这个头文件做修改的就这两行,都被声明了外部常量了。
extern const struct proto_ops           inet_stream_ops;
extern const struct proto_ops           inet_dgram_ops;


如果向drcom模块现在这样的方法,通过给inet_stream_ops赋值来达到改变发送的数据的方法,肯定是行不通的。而为这个改内核的那个头文件或者发布一个布丁,如果能编译运行的话,这也是为大家所不可接受的。在2.6.16版本中对内核进行的修改肯定是为某个原因,甚至有可能是安全方面的原因。现在我所想的是,好好读读这一部分代码,然后是否能有一个比较完美的方案,改动drcom模块本身,或者说确认不声明为常量对其他部分没有影响,而对内核打补丁。对于在drcom下生存的linux用户,也只有请稍微缓缓再升级内核到2.6.16了。我尽力,这几天把重心移到这个上面来,找到一个可以接受的方案。

今天升级了gcc到3.4.5了

今天升级了gcc,中间遇到了一些问题,确实完整参照了gentoo官方的指南,但是由于同时我改变了CHOST,所以情况有些特殊,写篇心得给大家看。官方的原文在此:
http://www.gentoo.org/doc/en/gcc-upgrading.xml
我以前的CHOST设的是i386,因为那个用的是duron的cpu,那个时候官方的文档说duron不要设成了i686,今天在gentoo wiki上看到了一个关于各种类型的cpu的CFlag的设定方法,所以决定趁着这次要升级gcc,一并改了,这样系统就可以少编译一次。我的make.conf设置,根据gentoo wiki上的提供的资料对应着自己的cpu信息,可以找到自己合适的设置。
      CFLAGS="-march=athlon-xp -O2 -pipe -fomit-frame-pointer"
      CHOST="i686-pc-linux-gnu"
      CXXFLAGS="${CFLAGS}"

按照gentoo gcc升级指南上面,我重新编译了gcc3.4.5之后,用gcc-config转到心的gcc配置,以后就都不能用emerge了,说是找不到共享库libstdc++.so.5,没有办法到处找资料,但是没有找到合适的,不过看了一些资料,大概知道了毛病出在了哪,因为更新了之后,python没有被编译过,所以python就找不到那个共享库了,遂拷贝了老的gcc库中的libstdc++.so.5放到了/usr/local/lib中,这个时候更新环境变量之后,如果不行,可以用gcc-config再设定一次,还有可以到/etc/env.d/gcc下面直接改设置。确保你用的是新的编译器gcc-3.4.5,这个时候emerge应该可以工作了,先编译了python,然后删除刚刚考过去的/usr/local/lib/libstdc++.so.5。最后用
emerge -e system
emerge -e world

这需要一个很长的过程,要有心理准备,几十个小时吧:smile:
编译整个系统。最后删除老版的gcc就可以了。

修改fvwm的源代码,实现完美的中文显示

,

这可能是fvwm的一个bug,有人在2.5.12版本里就提出来了,但是现在到2.5.16还没有改,今天收到了fvwm-crystal开发者的邮件,他说他也因为fvwm的utf-8码问题头痛呢,在多语言的环境中应用fvwm-crystal就会有问题。我个人觉得应用fvwm-crystal是最舒服,最省内存的构建桌面环境的方法,非常合适机器配置不高的机器使用,并且fvwm-crystal的效果很cool,现在可以做到不修改fvwm-crystal的任何设置达到完美显示各个地方中文的效果,窗体标题,图标提示等等,所有问题,还剩下的一个问题就是我翻译了fvwm-crystal的菜单,并且用gettext生成了对应的mo文件,但是fvwm-crystal的默认设置还是不行的,默认菜单的字体是tohoma,不能显示中文,不知道fvwm-crystal的作者是否愿意把字体显示的字体修改成支持国际化字体的字体,这样就不要做任何的修改了。或者我在这边提供设置的过程,使大家知道该去改哪一个文件。要想菜单支持中文,除了需要我这里提供的mo文件,还需要改个地方,就是components/styles/Menu
修改fvwm-2.5.16的源代码过程:
在libs/FlocaleCharset.c的525行
FLCXOMCharsetList[0]改成下面这个样子
FLCXOMCharsetList[FLCXOMCharsetList_num -1];
然后重新编译就可以了。bug提交的内容见这里:
http://www.fvwm.org/cgi-bin/fvwm-bug/incoming?id=1647;page=12
另外说明一下gentoo用户的具体操作方法:
gentoo用户如果不做任何修改用的只是fvwm-crystal的2.x版本,2.x版本个人认为没有3.x版本好,为了用fvwm-crystal3.x版本,你必需在/etc/portage/package.keywords加入它,这样才可以被emerge,同时你也要加上fvwm,fvwm-crystal需要2.5.13以上的fvwm版本。
这是package.keywords的内容中加入下面两行:
      x11-wm/fvwm ~x86
      x11-themes/fvwm-crystal ~x86

为了使用portage来帮你编译你修改过的源代码,你可以这样来操作:
emerge --fetchonly fvwm #取得fvwm的源代码

从distfiles中fvwm-2.5.16.tar.bz2解压之后按照上面的方法修改第525行,然后重新打包成fvwm-2.5.16.tar.bz2,放回到distfiles,现在需要重新取得修改后的包的md5码
运行:md5sum fvwm-2.5.16.tar.bz2
复制它的md5码,修改
/usr/portage/x11-wm/fvwm/files/digest-fvwm-2.5.16,把其中的md5码改成刚刚生成的md5
码,还要改一个字段,就是fvwm-2.5.16.tar.bz2的大小变化了,你需要改变digest-fvwm-2.5.16最后一个字段。
ls -l fvwm-2.5.16.tar.bz2 #这个可以得到这个包的字节数。

由于你现在改动了digest-fvwm-2.5.16,所以在/usr/portage/x11-wm/fvwm/Manifest要做相应的修改。用同样的方法得到digest-fvwm-2.5.16的md5码和字节数,改变Manifest中对象的行。
最后就可以emerge fvwm了,你可以直接emerge fvwm-crystal,由于依赖性的关系fvwm会直接被装上。
这样在.xinitrc中加上fvwm-crystal &
就可以直接应用fvwm-crystal了,保证你不会失望,fvwm-crystal很漂亮哦

fvwm-crystal的本地化

,

昨天晚上修改了fvwm的源代码,所以fvwm-crystal不用进行修改就可以很好的显示窗体标题,图标最小化后的提示都没有中文问题了,这确实是fvwm的问题,它默认的编码搞错了,不应该是iso8859-1,而应该是iso10646-1,里面有一行代码有问题,参照了fvwm的bug report,有时间就把详细过程写出来,虽然自定义的fvwm config可以显示没有问题,但是要指名了StringEncoding。如果想应用fvwm-crystal,就要对fvwm-crystal做大量的修改。用fvwm-crystal本来就是为了便于使用,而修改这么多又把它复杂化了,并且fvwm-crystal的配置文件很多,按一种方式组织了,很多初学者改起来会很迷茫。我的目标是要不改动fvwm-crystal来达到完满的中文显示。今天试着翻译了一个中文的locale文件,但是如果不对fvwm-crystal做修改,那么菜单显示的都是方块。还给fvwm-crystal的维护者发了一封邮件,希望来翻译fvwm-crystal中文,并且希望有一天能加入到官方的发行包,给中文用户提供完满的桌面环境,那个时候运用fvwm就一点也不成问题了。呵呵,努力中~~~
July 2009
S M T W T F S
June 2009August 2009
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31