You are on page 1of 117

卷首语

卷首语

大师的到来与中国的开源
二月的北京,气候开始转暖,经过一个喜庆春节的洗礼,人们又投入到忙碌的工作当中。在 IT 圈,
“收购”再次成为了时兴的名词。微软 446 亿美元天价收购雅虎,虽然该起收购至今悬而未决,但至少
表明了微软未来的战略方向,也暗暗预示了雅虎终将被收购的命运;Sun 一鼓作气,接连收购 MySQL 和
Innotek,引发了人们的广泛议论,更有分析人士指出,Sun 此次收购 MySQL,意在数据库领域的重新崛
起,而 MySQL 在 Web 2.0 的广泛应用,也昭示了 Sun 进入 Web 2.0 软件的动机。
然而,对于中国的开源爱好者,诸多国际开源大师再聚北京这一事件则吸引了更多的眼球。Andrew
Morton 来了,Jonathan Corbet 来了,Jim Zemlin 也来了。在我的印象中,这已经是第四次开源大师齐聚中
国了,第一次是 2006 年 8 月的“2006 开源中国 开源世界——开放标准、开源架构、开源生态系统与应
用解决方案高峰论坛”,作为中国开源软件推进(OSS)联盟智囊团高级成员,时任 FSG 主席的 Jim
Zemlin、Apache 创始人 Brian Behlendorf、MySQL 创始人 OSI 负责人 David Axmark、Sun 首席开源技术官
Simon Phipps 和 Intel 公司开源战略总监 Dirk Hohndel 第一次聚首中国北京,为中国的开源出谋划策。其
后在 2007 年 6 月与同年 11 月分别在广州和北京举办了一次开源大会和开放标准大会,此次大师们再次来
到北京,是为参加“2008 Linux 开发者研讨会-中国”。
Jim Zemlin,可以看作是开源大师在中国的一个缩影,在这四次开源盛会上,Jim Zemlin 是唯一“全
勤”的一人,作为第一个从中国开源软件推进联盟陆首群主席手中接受聘书的智囊团高级顾问,从 Jim
Zemlin 的四次中国之行当中,我们也能隐约看出国际开源大师在中国的角色变化。Jim Zemlin 作为 OSS
智囊团高级顾问,前两次来到北京可以看作是参加 OSS 每年一度的“例会”,第三次参加开放标准的大
会,Jim Zemlin 则作为特邀嘉宾参与,而此次盛会,Jim Zemlin 一跃成为主办方,在中国当起了“东道
主”。更值得一提的是,此次大会是由 Jim Zemlin 提议举办,不仅从国外请来了诸如 Andrew Morton 这样
的领袖,而且由 Linux Foundation 承担了大师们此次参会的所有费用,这从精神和物质两个维度都对中国
的开源发展给予了高度的支持。
Jim Zemlin 来了四次,我也见了他四次,此次见面时,我饶有兴致地询问他为什么对中国如此感兴趣
是中国的传统文化?美食?还是我们的东方美女?Jim Zemlin 笑着反问我,现在全世界都对中国感兴趣,
我能不感兴趣吗?接着他一本正经的表示,中国的经济增长速度全球第一,并且中国有着不一样的文化
及 IT 特色,在中国推广开源有着不一样的机会。对于这样的一个比较官方的说法,我的解读为:中国盗
版猖獗,大多数人都用着盗版软件,如果能这些使用盗版的用户搬家到“正版”的开源软件上,这就是
开源的机会,也正是中国这样的 IT 特色为开源提供了独有的机会。
对于 Linux Foundation 这样基金会性质的组织“瞄”上中国,我们还可以更多的理解为开源的“公益”

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 2


卷首语

性质,那么对于 Ubuntu 这样的 Linux 发行商,其创始人 Mark Shuttleworth 我也在中国见了两次,第一次


是完全的“布道”性质,为中国的开源爱好者讲述 Ubuntu 的理想及他的目标,并宣传“人类的 Linux ”
这样的软件哲学,而他第二次来到中国,则完全是寻求商业上的合作,因为有着敏锐洞察力的 Mark 也发
现了蕴藏在中国开源领域的巨大价值。
开源大师纷纷登陆中国,对中国的开源界是一个好事,用中国开源软件推进联盟陆主席的话说,就
是我们有了当学生的机会,而不像原来那样有着求知的欲望,却没有合理的学习方法及名师的指导。作
为国内 Linux 发行版的中科红旗,其 CEO 贾栋也感叹,这些大师的到来不仅给我们提供了学习的机会,
也搭建了一个交流合作的平台。虽然他表示目前红旗还没有因这些大师的到来寻求到商务上的合作,但
他相信不久的将来总会有这么一天到来的。
大师来了,又走了,留给了我们开源界更多的是反思,为什么如此聪明的国人就没能产生几个国际
开源界的大师,文化是一个因素、语言也可以成为一个借口,但我们更多的应该从自身寻找原因,这次
Andrew Morton 就尖锐地指出,为什么一些小国家英语并不好、甚至生活无以为继的人们都在为内核贡献
着代码,而有着十几亿人口的中国却无所作为。我们可以将此看作是这个内核“二号人物”的责难,也
可以认为是对中国这个开源“消费者”的不满,但更能从中体会到一种“恨铁不成钢”的语态。
中国需要自己的开源大师,这是我数次见过这些开源大师后的感觉,开源社区是一个分散的、颇具
理想化的圈子,在这里面,对人的尊重和对技术的尊重是并行的。“大师”这样的称谓不是我们传统意
义上的“明星”,而是“英雄”,开源社区的成员对大师不是追星似的盲从,而是发自内心的由衷敬佩。
开源社区要发展,必须诞生几个开源大师,或在那振臂高呼、或在那号令四方。
好在,我们的开源也在不断地发展,我们的一些开源开发人员也在逐步登上国际舞台,此次大会上,
来自中国科技大学的吴峰光和来自 Intel 开源技术中心的董耀祖分别做了关于“Linux 内核文件预读算法和
提高 I/O 效率”和“Linux 虚拟化技术、虚拟化技术 KVM 性能优化和测试方法”的报告,这两个报告都
具备国际先进水平。吴峰光的 Linux 文件预读已经收录到最新的 Linux 内核当中,而 Intel 开源技术中心在
Linux 领域最高级别的大会 OLS(Ottawa Linux Symposium)上发表三篇文章,挂上了三面五星红旗。
在《开源》第二期杂志当中收录了我向吴峰光和董耀祖邀约的两篇文章,从技术的角度讲述了他们
现在从事的开源项目,也希望读者朋友们能从中了解到我们中国对国际开源社区的贡献,这是一个标志
性的转变,一个从开源“消费者”到“贡献者”的重要转变。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 3


版权页

《开源》 版权页
2008 年 2 月 第二期

主办:Linux 宝库
网址:http://www.linuxpk.com
主编:陈杰
副主编:陈绪
运营总监:晓黎
校验排版:邱风
封面设计:张亚运
编辑部:曹金成
投稿邮箱:opensource@linuxpk.com
合作邮箱:xiaoli@linuxpk.com
声明:杂志部分内容来自开源社区及互联网,目的是加强开源文化交流及开源应用传播,如
有版权问题,敬请联系,我们将在第一时间作出处理。
致谢:本电子杂志由 Openoffice.org 制作,并直接导出 PDF 文件,在此表示感谢。

《开源》第一期创刊号一经推出,得到了开源爱好者热烈的欢迎,
仅 Linux 宝库单点下载就超过两万余次,这让我们在惊喜的同时,
也感到了身上的责任。第一期混源新视界栏目的《探讨“混源应用”
发展之道》作者为刘志勇,链接地址为:
http://stlzy.blog.51cto.com/69882/37770,由于我们编辑部没能
找到文章原地址,因此对文章没有进行署名,该作者及时的联系到
本刊,特此在第二期进行说明,并对作者表示歉意,希望广大作者
踊跃投稿,为我们的兴趣、爱好、事业贡献一份开源的力量。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 4


目录

目录
卷首语..................................................................................................................................................2

《开源》 版权页................................................................................................................................4

产业聚焦..............................................................................................................................................7
倪光南院士对《开源》电子杂志月刊提出殷殷期望.................................................................7
开源大师齐聚京城 Linux 开发者研讨会开幕.............................................................................7
移动 Linux 新进展 Qtopia 电话版新版本面世 .......................................................................9
飞思卡尔在蜂窝产品上供集成 Linux BSP.................................................................................10
微软宣布加大服务器软件开放度................................................................................................11
AMD 开源多核开发项目促多媒体程序开发.............................................................................11
红帽将在未来的 RHEL 中支持 deb 软件包................................................................................12
Sun 收购 innotek............................................................................................................................13

博客文摘............................................................................................................................................14
2008:迎接 Linux 和开源软件的春天...........................................................................................14
因 GNU C 编译器 1.0 开始的开源人生.......................................................................................18
对微软标准我所坚持的观点 .....................................................................................................20
给“Linux 志愿者”一个名分.....................................................................................................23

开源社区............................................................................................................................................24
项目动态.......................................................................................................................................24
最新稳定版 KDE 3.5.9 发布...........................................................................................................................24
文泉驿正黑夸父(测试版)发布.......................................................................................................................25
Magic Linux 2.1 Beta1 发布通告...................................................................................................................26
Ubuntu 8.04 Hardy Heron Alpha 5:更易安装..............................................................................................27
Notepad++ 4.7.5 发布......................................................................................................................................28
Picasa 2.7.3736 Beta for Linux 发布...............................................................................................................29
Linux Kernel 2.6.24 发布................................................................................................................................30
Mandriva Linux 2008.1 Beta 1 发布...............................................................................................................30
WordPress 让博客更精彩.............................................................................................................32
Linux 内核的文件预读.................................................................................................................37
来自磁盘的需求..............................................................................................................................................37
来自程序的需求..............................................................................................................................................38
预读的概念......................................................................................................................................................39
Linux 的预读架构...........................................................................................................................................40
预读算法概要..................................................................................................................................................41
重新发现顺序读..............................................................................................................................................43
开源虚拟化技术的结构概述与发展...........................................................................................47

知识学堂............................................................................................................................................54
解读 Linux 编程库........................................................................................................................54
库的定义和种类..............................................................................................................................................54
库的命名和编号..............................................................................................................................................55
库操作命令......................................................................................................................................................56
库的升级..........................................................................................................................................................58
重读 2.4 内核(2).......................................................................................................................60

桌面应用............................................................................................................................................67
Linux 一句话精彩问答 ——系统配置篇(1).........................................................................67
开源世界中的 FreeProxy .............................................................................................................73
逐渐成熟的桌面 Linux.................................................................................................................78
MediaPortal,除了 Microsoft Media Center 之外的选择...........................................................83
Ubuntu 笔记本电源管理优化指南..............................................................................................86

企业应用............................................................................................................................................90
多网络出口下基于策略解析的 DNS 服务器..............................................................................90
HTTP 代理获取设计.....................................................................................................................99

混源新视界......................................................................................................................................113
混源:一种需求 一种策略..........................................................................................................113
产业聚焦

产 业 聚 焦

倪光南院士对《开源》电子杂志月刊提出殷殷期望

陈杰:
很高兴看到了《开源》月刊,虽然不是纸面杂志,但电
子杂志对于我们大多数人和纸面杂志是一样的。
  中国的开源事业的环境仍不够好,开源刊物遇到的困难
反映了整个开源事业的状况,以中国目前的经济实力而论,
我们在高技术领域,在信息领域,在软件领域,在开源软件
领域,投入是很小的,在这种情况下,只能依靠大家努力,
用最小的投入取得尽可能大的效益。
  由于国家贯彻自主创新的战略方针,开源软件的前途是
很光明的,国家的“核高基”专项就是一个重大的推动。问
题是国家战略的贯彻需要时间,需要克服各种阻力,所以在
短期内,开源软件企业、社区等都需要克服困难,争取发展,
然后就会有大的发展。

  希望《开源》月刊愈办愈好。
  祝新年快乐、万事如意!

倪光南

开源大师齐聚京城 Linux 开发者研讨会开幕

陈杰

2 月 19 日,由国际 Linux 基金会(TLF )与中国开源推进联盟(COPU )共同主办的“2008Linux 开


发者研讨会-中国”( 2008Linux Developer Symposium-China)在北京举办。来自国际 Linux 社区的开
发设计大师、国内 Linux 的开发设计精英以及全国各地的 300 余名 Linux 开发人员参加了本次大会。

此次大会的召开,将成为推动开源软件产业发展的重要里程碑事件。本次研讨会是国内外 Linux 顶

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 7


产业聚焦

级开发人员首次超大规模地聚会;同时,也是国内 Linux 对开源社区的成果与贡献的首次集中展示。


中国开放源码软件推进联盟主席陆首群在大会的开幕致辞上介绍了 Linux 在各领域的发展现状和趋势。
他认为,在互联网上,Linux 和开源软件占有很大优势。在服务器领域,Linux 操作系统的市场占有率已
达 20%以上,与 Windows 操作系统一起,已形成二元技术平台的主流操作系统;在桌面领域,由于近年
来世界各地第三方对驱动支持和应用支持的力度与计划空前加大,Linux 可望在未来几年内将出现一个发
展拐点,并从此进入高速发展的轨道;在移动嵌入式领域,以智能手机为例,Linux 遇到与
Symbian、Windows Mobile 以及基于开源“Net BSD”的 MacOS-X 等嵌入式操作系统的激烈竞争,可望
在竞争中取得主动,从而实现高增长。
陆首群主席同时表示,Linux 和开源软件其成长率之高、竞争力之强,从开发人才的对比也可窥见一
斑。而开源软件的兴起,日益改变世界软件产业的发展轨迹;也为中国软件产业的发展带来机遇。目前,
中国互联网用户正在从居全球第二向第一转化,中国手机市场居全球第一,PC 市场居全球第二,电视机
市场居全球第一,汽车(汽车电子化)市场方兴艾,这就决定了中国正在蕴育成长为全球最大的软件市
场,这也决定了开源软件在中国是大有作为的。
本次研讨会吸引了多位资深的 Linux 专
家参与,其中包括由国际 Linux 基金会特邀
的 Linux 资深专家以及由 COPU 特邀的
IBM、Intel、LIPS、Google、Red Hat 的
Linux 设计专家。值得一提是,国际开源社
区的领袖均在在本次研讨会上亮相,包括国
际 Linux 基金会执行董事 Jim Zemlin、内核
开发者 LWF 的作者 Jonathan Corbet、Linux
内核 2.6 的维护者 Andrew Morton、著名嵌入
式专家 Matt Mackall、GNOME 基金会前主
席 Dave Neary、GNOME 基金会 Jeff
Waugh、Novell 公司开源软件工程师 Coly
Li。

在记者的印象中,Jim Zemlin 是在不到两年的时间里第四次来到中国,显示了对中国开源世界的极


大关心与热忱,Jim 表示:“不只是他,所有的人都对中国表示了浓厚的兴趣,因为中国的经济发展全球
第一。同时,在 IT 环境发达的国家,微软已经成为了 IT 界的事实标准,但在中国,这种情况有可能转变,
因为中国有着不同的文化、历史,中国人也有着很多特殊的能力,我们只需要挖掘这些能力,中国能为
开源世界做出更多的贡献。”
除上述专家以外,近年来国内 Linux 社区涌现出来的开发设计精英,如中国科技大学吴峰光的 Linux

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 8


产业聚焦

内核文件预读算法,提高 I/O 效率,已为 Linux Kernel2.6.23 和 2.6.24 版本吸纳,Intel 中国开源技术中心


有着 100 多个工程师专职从事开源工作,来自 Intel 的董耀祖向大家介绍了虚拟化技术 KVM 性能优化和测
试方法,在 KVM 社区的年会上发表,显著地改进了 KVM-18 的性能。
在本次研讨会的成果展示区,集中展示了近年来国内一批 Linux 开发应用成果和营建 Linux 开发设计
环境的有关资料(创作或译著)。其中,中科红旗的移动互联网操作系统/MID(Mobile Internet
Device),江苏龙梦 Linux 计算机吸引了大批 Linux 开发人员的驻足。而一些企业和社区开发的前沿项目,
如:IBM 的 Open Client 、OpenMoko、OLPC 以及 Device VM 公司的快速启动技术成果(Splash Top,该
技术成果已被美国著名的 Phoronix 公司评选为 2007 年最伟大的发明)都成为与会者关注的焦点。

移动 Linux 新进展 Qtopia 电话版新版本面世

2 月 19 日,奇趣科技 TM 日前在 2008 全球移动大会


(MWC)上宣布,在其 Linux 移动电话的领先应用开发平台
和用户界面 Qtopia 电话版的原有基础上,推出了增强版本。目
前市场上已售出 1000 多万部基于奇趣科技技术开发出的设备。
Qtopia 4.3 版本在启动速度、关键行业标准符合性的外部
基准等方面进行了重大改进,并添加了一系列新功能。新发布
的版本充分继承了 Qtopia 架构的原有优势,其功能特色包括:
◆触摸式交互界面,该版本针对用户触摸操作新设计了带独特
的虚拟键盘和一个软件开发工具包(SDK)的用户界面主题,
该 SDK 基于 OpenMoko 的 Neo1973 设备。
◆Outlook 同步,新增了 Qtopia 同步处理机制 Qtopia Sync
Agent,使得 Qtopia 与微软的 Outlook 之间可进行数据同步。
◆增强的媒体支持,Qtopia 新版本可支持 GStreamer 和 Real Networks 的 Helix DNA 媒体框架下的移动音
频和视频。增强的 Qtopia 媒体播放器包括一个新增的用户界面和一系列扩展功能,此外,新增的音频协
议框架还可对各种输入和输出的复合音频声道进行管理。
◆启动速度加快,在 Greenphone 的实机测试过程中,Qtopia 4.3 版在启动速度上比之前的版本平均快出
50%。
◆为提高全球终端认证论坛(GCF)标准的符合性,对技术和 SIM 工具包进行了改进,电话协议栈和用
户界面都经过了再次完善,由此,Qtopia 的 GCF 标准的符合性得到了加强。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 9


产业聚焦

奇趣科技联合创始人兼首席执行官 Haavard Nord 表示:“奇趣科技推出的 Qtopia 4.3 将帮助开发人员


以更快的速度推出功能完备的移动电话,我们的最终目标是让消费者体会到,他们可以从移动电话的使
用中获取更多的体验。”
此次全球移动大会(MWC)上,奇趣科技还从其 100 多个创新合作伙伴的庞大网络中选择出两家合
作伙伴进行联合推广,广泛的合作伙伴产业链在奇趣科技成为基于 Linux 的移动电话领域的领先软件提供
商的过程中功不可没。
所介绍的两个合作伙伴包括:Torch Mobile,该公司为移动和嵌入式设备开发基于 WebKit 的软件解
决方案,其代表成果是创新的 Web 浏览器 Iris Browser;Discretix,该公司是内置安全系统领域的佼佼者,
它拥有多方案 DRM(数字权限管理)客户端,并预集成了嵌入式 Linux 平台。

飞思卡尔在蜂窝产品上供集成 Linux BSP

飞思卡尔(Freescale)日前宣布在其蜂窝产品上支持 Linux 操作系统。飞思卡尔的 Linux 蜂窝平台能够


支持任何 Linux 应用框架,不管是符合行业标准的还是 OEM 专有的解决方案。
飞思卡尔高级副总裁兼手机产品部总经理 TomDeitrich 说:“我们正在帮助 Linux 开发人员在移动手
机应用软件开发领域实现创新。我们的 MXC 架构为开放系统开发人员带来了新的灵感,帮助他们向运营
商和用户提供令人兴奋的新手机”。
随着用户开始进入一个与现有的台式机环境相似的移动
计算环境,设计人员面临着在广泛的设备中迅速部署熟悉而
日益复杂的应用的诸多挑战。
飞思卡尔的 MobileeXtremeConvergence(MXC) 平台优化
用于开放的操作系统(如 Linux),是基于单核调制解调器和
蜂窝平台接入(CPA)架构开发的。CPA 架构使开发人员可以
从调制解调器中提取或隔离应用引擎,使开发人员在开发过
程中不需要进入调制解调器核心。最终结果是将通信和应用
栈相隔离,同时实现了简便性以及简便及快速、低成本的软
件开发。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 10


产业聚焦

微软宣布加大服务器软件开放度

美国东部时间 2 月 21 日 11:20(北
京时间 2 月 22 日 0:20)消息,据国外媒
体报道,微软周四表示,将提高其服
务器软件的开放和透明度,以推进行
业竞争对手和客户的互操作性。业内
认为,微软此举是为应对欧盟的反垄
断裁决。
微软的举措涉及四项内容:确保
开放 API(应用程序接口)及通信协议,
促进数据可移植性,增强对行业标准的支持,鼓励与客户和行业(包括开源领域)进行更多的开放性接触。
微软将在网站公示其专利覆盖哪些协议,并将在合理、公平的前提下以较低费用授权。
涉及产品有 Windows Vista(包括.NET Framework)、Windows Server 2008、SQL Server 2008、Office
2007、Exchange Server 2007、Office SharePoint Server 2007 以及这些产品的后继版本。
2004 年 3 月,欧盟裁定微软垄断罪名成立,对其处以 4.97 亿欧元(约合 6.13 亿美元)的罚款。得益于
反竞争行为,微软在服务器软件市场占据的份额持续增长,而竞争对手则江河日下,其中一些甚至被迫
退出了市场。欧盟反垄断裁决公布之后,微软一度坚决抵制,并提起了上诉。但 2007 年 9 月,欧洲法院
支持了欧盟反垄断裁决,微软被迫妥协。
微软法律总顾问布拉德·史密斯(Brad Smith)表示:“微软将采取一切必要的措施以确保遵守欧洲法律。
在未来数周内,我们还将采取其它措施来处理欧洲法院裁决。”
微软 CEO 史蒂夫·鲍尔默(Steve Ballmer)表示:“微软通过更大程度地开放产品的技术信息,为该行
业的开发商和客户带来更强的互操作性、更多的机会和选择。”

AMD 开源多核开发项目促多媒体程序开发

AMD 近日公布了多核开发项目的开源代码,旨在让针对 x86


多核处理器进行媒体程序开发变得更容易。
原来叫 AMD Performance Library,现名 Framewave 的源代码
已在 SourceForge 上发布。
这些代码可以优化多核处理器上的媒体程序性能,例如,程序员可

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 11


产业聚焦

以用它来优化专门显卡的视频显示。
AMD 商业方案与软件战略部主管 Margaret Lewis 说,通过在 SourceForge.net 上开设开源项目,AMD
可以让程序员对软件进行定制与优化,以便其兼容 Linux,Windows 和 Solaris 的编译器。
专家们认为,为开发者门创建针对多核处理器的优化根据是业界目前面临的最大挑战。
Lewis 说,尤其是多媒体程序,通过优化代码,多媒体程序在多核处理器平台上的性能会得到极大提高。

红帽将在未来的 RHEL 中支持 deb 软件包

美国当地时间 2 月 18 日,红帽(RedHat)总裁卫赫士(Jim Whitehurst)透露,未来的 RHEL(红帽企


业版 Linux)将加入对 DEB 软件包的支持。
卫赫士说,“众所周知,红帽创造了 RPM,并成为了一时的 Linux 工业标准。但是 RPM 一个很大的
缺点就是软件包的依赖性很难解决。以 Ubuntu 为代表的使用 DEB 软件包的 Linux 发行版拥抱自由开源,
取得了很大成功。虽
然为了避免 Linux 陷
入像 Unix 那样的分裂
局面,Linux 厂商一
致遵守 LSB 标准。但
这还不够,所以红帽
将在未来的 RHEL 中
加入对 DEB 包的支持,
并计划逐渐削弱 RPM
包,直到最终取代。”
如果红帽放弃
RPM,无疑对同类厂
商会产生巨大的震动。
Novell
SuSe、Mandriva 等同
样采用 RPM 包的 Linux 厂商或许跟随其后。卫赫士还说,“采用 DEB 包以后,红帽将联合相关厂商重组
DCC 联盟(基于 Debian),以此压制 Ubuntu 的威胁。”2004 年,Debian 打算联合
Ubuntu、Linspire、Knoppix 组成 DCC 联盟,由于 Ubuntu 的坚决反对而作罢。
做为 Linux 厂商的魁首,放弃自己多年的技术实在令人惊讶,红帽能否保持成绩,抵御 Sun 和 Oracle 的不
断进攻,还需拭目以待。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 12


产业聚焦

Sun 收购 innotek

2 月 13 日,Sun 微系统公司宣布将以购买股票的方式收购 Innotek 软件公司,该公司是一家开源虚拟


软件提供商。但没有对外透露交易的金融细节。
Sun 表示,收购后 Innotek 公司的旗舰产品 VirtualBox 软件将扩展整合到 Sun 现有的台式机 xVM 平台。
VirtualBox 软 件能够使台式机和笔记本同时安装 Windows、 Linux、 Mac 或 Solaris 多种操作系统,只
需要用鼠标点击就能够在各种操作系统之间进行转换。
Sun 指出,VirtualBox 是开源软件,可以免费从 virtualbox.org 或 openxvm.org 网站下载使用。该软件
占用的储存空间小于 20MB,可以在任何现代 X86 架构的、运行多种操作系统的笔记本和台式机上安装。

根据传统的完成交易条件,Sun 预期收购将在 2008 财年第三季度完成。


此前,Sun 在今年 1 月 16 日宣布,决定以十亿美元的价格收购全球最流行的开源数据库厂商 MySQL
公司。这一收购是目前开源领域最大的一笔交易。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 13


博客文摘

博 客 文 摘

2008:迎接 Linux 和开源软件的春天

(写在“2008Linux 开发者研讨会-中国”之前)

中国开源软件推进联盟主席 陆首群

博客地址:http://www.lupaworld.com/16128/

  著名的 IT 调查分析公司 Gartner 认为:许多开源技术是成熟的、稳定的,用户可以获得良好技术支


持的。到 2012 年,开源软件的技术因素将占全部商业软件的 80%;这时,开源软件将在全球广泛应用。
  开源软件的兴起,日益改变世界软件产业的发展轨迹;也为中国软件产业的发展带来机遇。
  几年前,微软 CEO Stave Ballmer 就说:对微软构成挑战的三件事:(1)开源运动,(2)Google 的
网络广告,(3)Apple 的数字系统。
  2005 年,我在访问微软与其高层谈话时说:我在西雅图参观了四家著名企业,除微软外还有波音、
星巴克、亚马逊,这三家与微软近在咫尺的企业都在使用开源软件,你们对此有何感想?!
  几年前我曾指出,Linux 的兴起,自然向 Windows 挑战,并形成一种竞争的格局,但 Linux 的发展可
以与 Windows 共存、互补,从而为用户提供多一种选择;正确说应该形成一种既有竞争又有合作的局面,
我们提倡以理性的态度对待竞争,要相互尊重,不要虚声恫吓,不要炒作,更不要漫骂、讥讽。  

让我们来看看 Linux 在各领域发展的现状和趋势:


  在互联网上,Linux 和开源软件占有很大优势。
  在服务器领域,Linux 操作系统的市场占有率已达 20%以上,与 Windows 操作系统一起,已形成二
元技术平台的主流操作系统;近年来,随着 Unix 在高端系统逐渐衰落,Unix 向 Linux 迁移正在成为一种
趋势。由于 Linux 是一种类 Unix,在技术上、使用上,更在成本上,Unix 向 Linux 迁移比 Windows 更具
优势,目前在美日金融行业的一些关键任务系统(Mission Critical)中,主机 Z 系统上的
Unix(ZOS,AIX)正在向 Linux 迁移。
  在桌面领域,Linux 的市场占有率还很低(2%)。过去 Linux 桌面没有独立的产品,只有 Linux 服务
器的桌面端这种衍生产品,近几年才开始发展独立的桌面 Linux 操作系统;更由于近年来世界各地第三方
对驱动支持和应用支持的力度与计划空前加大,Linux 可望在未来几年内将出现一个发展拐点,并从此进
入高速发展的轨道。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 14


博客文摘

  在移动嵌入式领域,以智能手机为例,Linux 遇到与 Symbian、Windows Mobile 以及基于开源“Net


BSD”的 MacOS-X 等嵌入式操作系统的激烈竞争,可望在竞争中取得主动,从而实现高增长。
  Linux 和开源软件其成长率之高、竞争力之强,从开发人才的对比也可窥见一斑。
  我过去曾说过,微软开发 Vista,集中了 5000 人如此大规模的精英团队,我们为此叹为观止!但与开
源社区的开发队伍来比,还有小巫见大巫之感!分布在全球开源软件的志愿开发者,有 200 多万人这样
蔚为壮观的队伍,他们为开源社区的开发创新作贡献;有人说“这是乌合之众”,显然是错误的!而开
源社区 80%的开源成果,又来自几十、上百家 IT 企业中有组织的志愿开发者,他们作为开源社区的核心
层作出了无偿贡献。这样对比起来,即使象微软这样的超级公司,其开发力量也是难以与开源社区相比
拟的。事实上,开源社区(如 kernel.org, Free BSD, Xen Source, Source Forge,JBOSS,SugarCRM 等)还
不断向微软提供了很多组件和关键技术。
  有人认为,Linux 是自由软件,是“完全是免费的”,其开发的性能“相当粗糙”,且“使用不便”,
“开发者又不提供技术支持和服务”,“需要使用者自己来安装、配置和调试”,因此 Linux 是“没有价
值的”,“不可能给 Windows 构成竞争威胁”,“Linux 也不可能形成产业”。说这种话的人真糊涂,他
们对 Linux 和开源软件在理解和体验上有误区。
  Linux 向人们提供两种开发成果或两种版本:应该指出,一种是由 Linux 社区(除 Kernel.org 外,还
有如:Fedora、SuSE、Debian、Ubuntu 等社区)开发的原创性成果(实现设计创新),他们提供社区版;
另一种是由 Linux 发行商(Distributor 或 Distro,如 Red Hat、Novell、中科红旗等企业),他们对社区版
进行工程化处理,注入工程技术(实现工程创新),取得产品化或商业化成果,他们提供企业版。
  我们千万不要把两种成果或两种版本混淆起来。
  Linux 社区版的全部技术体现在全部源程序代码中,社区版的全部源程序代码是公开的,因而社区版
的全部技术也是公开的。社区版是可以从网上免费下载的;人们对社区版可以自由使用,复制和修改,
还可以自由发行或传播(当然必须遵守 GPL 许可协议)。社区版并不进行工程化处理,没有商业模式,
当然社区也不为用户提供技术支持和服务(使用者在下载社区版后,只能自行进行安装、配置和调试)。
应该说,社区版作为原创性设计,其性能尚不够稳定、优化、高效和成熟。对某些人来说,如果你能
“自由”获得“免费”的版本,你就不该奢望其性能是那么稳定、优秀和成熟的,并以此来对“整个
Linux”说事!
  Linux 企业版由企业(Linux 发行商)对社区版进行工程化处理或工程创新(工程化处理技术主要是
由专用技术/know how 和工程经验所组成),Linux 企业版的全部技术由体现设计技术的全部源程序代码
(这是从社区版继承下来的,这里还可进一步提供二进制执行代码)与工程技术所组成,企业版的源代
码(及二进制代码)也是公开的,但工程技术(其中包含技术秘密和商业秘密)是不公开的,企业版是
有商业模式的(可以是低价的传统销售模式,也可是网上 SaaS 模式),企业(发行商)当然有责任为用
户提供技术支持和服务。应该说,企业版在进行工程化后续处理后,其性能将趋于稳定、优化、高效和

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 15


博客文摘

成熟。

现在我们来谈谈 Linux 操作系统


  很多人把 Linux 内核(Kernel)看作为 Linux 操作系统,即不认为 Linux 是一个独立的操作系统;我
们这里还是把 Linux 内核和其独立的操作系统两个概念区分来看。
  Linux 内核 2.6 版本的发布,是 Linux 操作系统发展的里程碑,开创了 Linux 企业级、电信级可管理性
的应用,使 Linux 性能走向稳定、优化和成熟。
  今天,Linux 操作系统已有 386 个版本,但各种不同版本的内核(底层)始终是统一的,这是 Linux
不同于 Unix 之处,这也是各种不同版本 Linux 实行标准化、互换性的基础。
  对先进网络的支持,这是 Linux 的优势之一。
  Linux 支持广泛的硬件和多平台,支持超线程(Hyper threading)和虚拟化技术(VM Tech.),支持
大型服务器、桌面和嵌入式。2.6 版本的 Linux 内核自身是可抢占(Preemptive)的,并允许自身在执行任
务时被打断,这就为发展软实时系统,扩大在嵌入式领域的应用,提升桌面系统的响应性、可交互性,
创造了条件。
  Linux 内核 2.6 版本增强了在关键应用(包括 Web 服务、数据库、数据可聚类中使用、高性能计算等)
的高性能、可靠性和稳定性
  Linux 内核 2.6 版本提升了 Linux 的安全性。Linux 是具有高度安全性的操作系统,这是不容置疑的
(美国政府、法国军方选择 Linux 和开源软件的案例说明了这点)。在本质上,Linux 基于内核的安全体
系(在“类 Unix”中超级用户权限)已被划分成一些可以被替换的安全模块,并更新以具有更细粒度的用
户访问控制;一些二进制驱动模块不能再重载系统调用,从而限制了非开放源码模块对内核的访问;新
的内核能够使用硬件随机数生成器(不是依靠随机硬件熵值变化),也提升了 Linux 的安全性能。
  由国际 Linux 基金会与中国开源软件推进联盟共同主办的“2008Linux 开发者研讨会——中国”
(2008Linux Developer Symposium—China)将于 2 月 19-20 日在北京开幕(开幕式在 2 月 18 日晚召开),
这是全球最具有人气的 Linux 开发者盛会;对中国开发者来说,有机会与全球资深的开发大师一起,通过
沟通、学习、交流、探索和合作,将会有力地带动自身设计技术和工程技术水平的提高;这次盛会将大
力推动中国 Linux 和开源运动的发展,以迎接中国和世界 Linux 和开源软件的春天。
  在讲演者中,不但有全球技术精湛、经验丰富的开发大师、资深专家,也有近年来涌现出来的本地
开发者精英。事实上,当前中国,从过去人们所谓的“国际开源社区资源消费者”的形象,正在向“贡
献者”的形象转化,这次会议将更加有力推动转化的进程。
  会议将从网络、服务器、桌面、移动嵌入式诸领域研讨 Linux 的开发技术和工程经验。会议不但吸引
了世界三大手机联盟 LIPS(法国电信、英国电信、华为、中兴通讯等)、LIMO(Motorola、三星等)和
OHA(Google、中国移动等)积极与会,NOKIA 也申请参加会议(NOKIA 是全球最大的智能手机制造

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 16


博客文摘

商,他们开发生产三种手机操作系统:S4O,NOKIA OS;S6O,Symbian;Linux 的智能手机);一些跨


国公司,如:IBM、Intel、Red Hat、Novell、Sun、Oracle、日立、富士通、NEC、KDDI、EMC、Device
VM、Siemons、SAP 等也申请参会。
  在本次研讨会上还将设置一个十分精简的成果展示区,集中展示近年来国内外一批 Linux 开发和应用
成果,其中有:关于 Linux 和内核的专著或译著,中科红旗的移动互联网操作系统(Mobile Internet
Device),中标软件 Linux 操作系统最新研制成果,江苏龙梦的 Linux 计算机,IBM 公司的桌面系统
(Open Collaboration Client/Lotus Notes 8,Symphony),Device VM 公司的快速启动技术成果(Splash
Top,涉及嵌入式 Linux 和节能技术,或涉及 Linux 生态系统,被 Phoronix 评选为 2007 年美国“最伟大的
发明”),Open MOKO,基于社区的智能手机版本,OLPC(装 Linux 版本,“每一个孩子一台笔记本计
算机”)
  中国互联网用户正在从居全球第二向第一转化,中国手机市场居全球第一,PC 市场居全球第二,电
视机市场居全球第一,汽车(汽车电子化)市场方兴艾,这就决定了中国正在蕴育成长全球最大的软件
市场,这也决定了开源软件在中国是大有作为的。
  市场需求推动技术发展,这就是这次“2008Linux 开发者研讨会”在北京召开的背景。
  让我们迎接中国和世界 Linux 和开源软件的春天!

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 17


博客文摘

因 GNU C 编译器 1.0 开始的开源人生

Michael Tiemann

博客地址:http://michaeltiemann.lupaworld.com

1987 年 6 月初,Richard Stallman 宣布推出 GNU C 编译器 1.0 版,那是截至那一天为止,我生命中最


激动人心和最紧张不安的日子。经过 1985 年初次阅读和愉快编写 Emacs 代码之后,经过 1986 年的阅读和
愉快编写 GDB 代码之后,1987 年 2 月我怀着迫切的心情参加了由 Stallman 于德克萨斯州奥斯汀的 MCC
举办的为期一周的系列讲座。白天,当我开始理解 Stallman 的技术设计的深度、理解他的实施方法的魅
力以及为我保护两个方面而不是通过 GPL 由我提供保护的方法时,我对 Stallman 以及 GNU 计划越来越欣
赏。夜晚,当 Stallman 趁讲座间隙尤其是当一天结束时忙里偷闲地编写尚未准备好披露的计划时,我的
好奇心也越来越强。
  到二月份那一周的周末,秘密展现在我眼前:他在编写一种 C 编译程序,当时正处于最后阶段,他
在完善优化程序。那年我 22 岁,仍然怀着有一天我可能编写出“美国历史上伟大的编译程序”的梦想。
对于有机会亲眼看到像 Stallman 这样大师做这样的事情,我感到兴奋不已,并且害怕如果 Stallman 创造
出第一种这样的伟大程序,我可能永远不会再创造出值得认可的程序。当 Stallman 到 20 年前的今天(大
概)宣布推出 1.0 版时,我做出一个决定:与他合作,我可以和他一争高下,或者也可以编织一个新的梦
想。我下载了 GCC 1.0 版,开始长达十年之久的协作(那时,由于 RSI,我不再将编程作为我的主要工
作)。
  GCC 1.0 版是我人生的一个分水岭。第一天我只是专心学习它如何运作——句法分析程序、词法分析
程序、中间码编制程序、优化程序以及与机器有关的汇编输出程序。我打印了所有文件(用了非常大量
的纸),然后把它们堆放在我的超大的餐桌上,从我所在的中间位置能够看到其他任何一个表面。我拿
出在学习集成电路设计的工艺与技术时使用的彩色铅笔(红色用于 polycilicon、绿色用于 n 扩散、蓝色用
于金属、黄色用于 n 井、黑色用于 via 和 contact),并赋予这些颜色新的意义,以便跟踪数据、代码以及
与编译程序有关的其他关系。经过五昼夜的学习,我取得了极大的成功,不再需要这些文件——突然之
间数据结构和基本组织变得再清晰不过了。我把铅笔丢到一边,开始极度渴望编写 GCC。
  我决定进行下一步——编写到微处理器的全新端口 National Semiconductor 32032,它一直都让我很着
迷。我在宾夕法尼亚大学摩尔工程学院时就有了该手册,所以我开始用适合 National 芯片的模板替换用于
VAX 和 Motorola 69020 处理器的模板。我很快就遇到了问题,但都是一些小问题,我轻而易举就解决了。
我在几天内就使 GCC 生成用于 National 芯片的代码,并在几天之后生成正确代码。
  当我在做这些工作的时候,一般汇编程序企业对于一项在一年到一年半时间内提供一种编译程序的

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 18


博客文摘

服务要收取数百万美元,有时甚至要用更长的时间。在我从免费软件基金会(Free Software Foundation)


下载汇编程序之后两周的时间里,我生成了代码,这比 National 汇编程序提供的代码速度快 20%。如果把
我当时每个月 3000 美元的薪酬与这些公司收取的费用相比,我花费 1/30 的时间和 1/1000 的成本提供了胜
过 20%的产品(用摩尔定律的时间表示为 6 至 9 个月)。我为自己的 23 岁生日献上了一份伟大的礼物!
  在公布这一新端口的一小段时间之后,我自己当然也包括其他人清楚地意识到,还需要进行许多优
化。又经过两周的努力,我生成了比 National 汇编程序快 40%的代码。由于 32032 被宣传为“1 MIPS”芯
片(意思是每秒钟执行 100 万条指令),因此 40%是一个重要的数据,但是它的基准测试结果仅为 0.75
MIPS,事情朝着不适合商业化的方向发展。对于我的 32032 端口,超过 1 MIPS 的芯片基准测试向我证明,
硬件人员已经提供,而软件人员没有提供。我还意识到,即使在 1987 年,也已经有足够的人可以非常成
功地进行协作处理。
  那年夏天,我继续编写许多其他端口,通过编写 GNU 表现了不同寻常的连贯一致性,我平时能够比
更大公司雇用的整个汇编程序编写人员队伍更快地生成更好的产品。到那一年的年底,我继续向新的目
标努力,那就是编写 GNU C++ 汇编程序。对于我而言,GNU C++是“伟大的美国 C++ 编译器”——对
我的最初目标进行完善的新版本。通过在我开始编写之前他人与我分享,以及通过在我开始编写之后他
人为我提供有帮助的建议和错误修复方法,我获益匪浅,而我也自由地与大家分享我所获得的知识。我
编写并举办了第一期关于 GNU 汇编程序内部组织的全面培训,把我的 100 多张 LaTeX 幻灯片给
Stallman,以便他也能够通过向别人传授如何编写程序而获得报酬。两年后,我正式将 GNU 软件的商业
优势商品化,而其余的,正如他们所说的,成为了历史。
  我不知道接下来的 20 年里将会发生什么……

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 19


博客文摘

对微软标准我所坚持的观点

胡才勇

博客地址:http://blog.sina.com.cn/hucaiyong

目前,因为临近决定 OOXML 命运的新一轮投票,有关 OOXML 的新闻和舆论展开了新一轮的爆发,


有很多人,通过各种渠道征求我对此的看法。我在此前也曾说过,微软无论是对外公布 DOC 二进制格式,
还是宣布支持中国国家标准 UOF,都是值得肯定的进步,但 OOXML 自身存在的问题和我们反对
OOXML 成为国际标准的理由仍然存在,我所坚持的对 OOXML 的原则态度保持不变。
自 2007 年 9 月 2 日 ISO 组织对 DIS29500 投票结束后,微软对各国提出的 3522 个问题进行了答复。
经过前期对 OOXML 的研究以及近期对微软的回复评估以后,我们认为 OOXML 并不是一个成熟的开放
标准,还有待于认真研究和改进,并不适宜走 ISO 的快速通道。具体有以下几个基本看法供参考:

一、OOXML 不是一个成熟的、全面开放的标准
1、OOXML 文本展现形式说明该标准缺乏标准制定的严谨性
该标准是微软为了应对开放标准趋势和挑战,匆忙推出的,标准文本也极为冗长,共有 6000 多页,各国
针对 OOXML 共提出了 3522 个问题,经微软归纳整理后也达到了 1000 多条。其中有许多问题是文字性
的错误,说明该标准制定过程缺少严谨性。目前,按照微软的回复,标准的文本将会做结构性的大调整。
一边向国际标准快步“迈进”,一边是进行结构性大调整,这在国际标准史上也不曾得见。这些都充分
说明 OOXML 的出台过于仓促,缺乏制定标准应有的严肃性,它的“晋级”势必将影响国际标准本身的
严肃性。
2、在许多重要环节只顾及微软产品的兼容性而拒绝采用国际标准
虽然 OOXML 明确表示要尽可能地采用国际标准,但是在一些关键性的环节中仍坚持使用自己的东
西,使该标准刻上了明显的私家协议性质的烙印。最典型的就是在对于办公文档很关键的图形描述中采
用 DrawingML,而不采用 W3C 的 SVG。虽然在一定程度上舍弃了 VML,但是仍没有真正采纳国际联盟
制定的标准。在 Ecma 的解释中,反而用“DIS 29500 兼容 SVG”混淆视听。
此外 ,OOXML 还定义了多个非标准加密算法,与真正意义上的开放标准背道而驰。如 OOXML 采
用了早期版本 Office 软件中采用的哈希算法,而没有采用 ISO/IEC 10118-3:2004 加密算法,这也影响了
互操作性。而这些算法,甚至连微软本身也不推荐采用。
OOXML 与显示数学公式的行业标准语言(MathML)不兼容。该标准语言大多被研究机构和大多数
最著名的出版机构所用,如科学,自然,等等。在 OOXML 说明书中没有涉及与 MathML 的互用性,这

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 20


博客文摘

将不利于标准的广泛施行。微软在最近的答复中虽然提供了可以兼容 MathMl 的方式,但还不完整。


这些都给我们一个强烈的印象:虽然微软一直宣称 OOXML 是个开放的标准,但标准的内容本身和
微软针对各种意见的答复都反映出,微软 OOMXL 并不是一个真正开放的标准。
3、OOXML 在 XML 技术上并不过关,甚至其语言本身都不符合 XML 标准
OOXML 并不完全符合 XML 语言的要求。OOXML 定义了新的字符串类型“Basic String”,作为“二
进制基本字符串类型”。这个新的字符串类型的一个特点是允许非 XML 字符(控制字符)可以特别编码。
然而, XML 文档中的非 XML 字符基于 XML 的处理工具无法处理此 XML 文件。
W3C'sInternationalization Activity 确认,这种控制代码的表达应当由合适的标记语言替换。由于 XML 提供
了编码结构化数据的标准化方法,采用控制字符,而不是标记语言将丧失了采用 XML 语言的优势。在
HTML 和 XHTML 中采用控制代码是不合适的,因为标记语言适宜用来表达文本,而不是数据。

二、OOXML 缺少可供第三方实现的实施指南
我们的格式兼容实践表明,办公软件文档格式仅能够确保文档的格式和内容被正确记载,但无法做
到精确的版式兼容。如果版面算法不一致,跑版现象是难以克服的。Ecma 并没有公布 OOXML 相应的实
现指南,特别是版面算法,因此,OOXML 的初衷,即通过 OOXML 让众多的实现人员能够忠实的再现
以前的所有办公文档将成为空话。
ODF 有开源的 OpenOffice 作为参考实现使人们得以分析其版面算法,但 Microsoft Office 则不能。由
于缺少真正的实施指南,微软 Office2007 就成为了 OOXML 的唯一实施标准。微软制定了一个“开放”
的标准,但所提供的实施标准就是 Office2007;由于 Office2007 的封闭性,反过来决定了微软是 OOXML
的唯一实现者。
而另一个更为严峻的问题在于,现在的 OOXML 按照各方的要求修改后,微软 Office2007 是否也能
随之修改,使其能继续符合 OOXML 标准。由于缺少符合性测试案例,我们甚至无法确认 Office2007 是
否符合该标准。换言之,完全可能出现的情况是:在 OOXML 成为国际标准后,市场上根本就不存在完
全符合该标准的产品。

三、OOXML 依然不能在 Linux 上实现


OOXML 存在明显的平台依赖性,其所定义的有些行为在 Windows 上可实现,但在
Mac、Linux、Unix 或其他平台上就不能实现,更何况其提供的某些加密算法还依赖于处理芯片。如:
1、剪贴板格式是私有的 Windows 格式
OOXML 定义了 ST_CF 类型用于记录剪贴板格式,以便于存储图形对象。其类型的值如
EMF、WMF 等等都是私有的 Windows 格式,其他的操作系统无法使用。例如,在 Linux 中,经常采用
开放标准格式 PNG,但是如果厂商在此类型中加入“PNG”,则此文档将是非法的,文档及其应用也将不
符合 OOXML 规范。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 21


博客文摘

2、电子表格中的密码哈希算法是依赖于机器的
电子表格中的密码哈希算法定义由 5 页纸的 C 语言代码来定义,似乎是从 Excel 中直接提取的。然而,
代码中的位控制又是依赖于机器的,根据处理器的不同会给出不同的结果。在一个机器上建立的文档可
能在另一个机器上不可阅读。关于此功能,OOXML 没有提供一个便捷的定义。OOXML 的平台依赖性对
国产操作系统和国产芯片都将是致命的打击。在确保微软 OOXML 能成为与平台无关的真正开放的标准
前,我们必须对此标准持反对态度。

四、微软需要承担 Doc 与 OOXML 全面转换的责任


过去国产软件被迫单项兼容微软 DOC 源于 DOC 的封闭性。微软在抛弃封闭格式,迈向开放标准的
过程中,应进一步拿出诚意和实际行动,主动解决封闭格式造成的历史遗留问题,并确保真正走向开放,
不再利用自身格式转换取得独家竞争优势。换言之,由于 DOC 和 OOXML 均是微软的标准,目前,世界
上只有微软拥有处理自己这两种格式的互操作能力,因此微软应该确保所有用户获得处理这两个格式的
能力。微软应该公开自己已完成的 DOC 和 OOXML 转换模块;而不应停留在支持第三方另起炉灶的阶段,
还会有故意拖延用户和竞争对手时间之嫌。

结语:
之前 OOXML 自身存在的问题和我们反对 OOXML 成为国际标准的理由仍然存在,并未随着微软的
回复而得到根本性的解决。我们认为此前中国政府在投票过程中的建议是非常理性、合理的:DIS
29500(即 OOXML)不适合快速通道,应转变快速通道为常规程序,或延长评审期限。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 22


博客文摘

给“Linux 志愿者”一个名分

袁萌

博客地址:http://blog.csdn.net/yuanmeng001

2 月 20 日,在《2008 Linux 开发者研讨会》期间,举行了一次“嘉宾(国内外专家)圆桌会议”,


讨论了三个主题,其中第三个主题是“如何建设中国的开源社区和营造开源发展的环境”。值得注意的
是,“营造”(“construct”)两字在译成英文时,被有意译为“improve”(“改善”之意),这两者的语
气是有差异的。在议论这一主题时,我提出要给“Linux 志愿者”(“Linux volunteer”)一个“名分”。
所谓“名分”,其实就是“身分”和“地位”之意。给“Linux 志愿者”一个适当的名分,给其一定
的“社会名誉”,这对改善我国 Linux 社区的现状是有意义的。老实说,现今 Linux 开发者已经拥有相当
高的“技术名分”,但是,对于“Linux 志愿者”,却几乎没有人提起,简直摆不上“台面”。“Linux
志愿者”,他们不一定是开发者,但却喜欢帮助别人,帮助别人掌握 Linux、应用 Linux,在 Linux 社区
中起着“举足轻重”的纽带作用。有人把 Linux 纯粹当成一本“教科书”,从中学习本领,只为提高自己,
而“Linux 志愿者”却把 Linux 当成一种“武器库”,用来武装自己,以助人为乐,否则,就不是“志愿
者”了。
有人认为,当前谈“Linux 志愿者”是瞎扯、是伪善者,是彻底的乌托邦式空想。我不认为是这样。
有人说我是骗子、伪善者,这不要紧,因为这只是对我一个人的评价。但是,对于“Linux 志愿者”的名
分,我还是要讲,我还是要说,而且,要在各种场合说,要在各种场合讲。坦率地说,我认为,中国的
Linux 事业多年不见“起色”,其根本原因就是“名不顺,言不正”。Linux 来到中国,就变味了。给
Linux 戴上什么民族的、国产的“桂冠”,把 Linux 私有化,这根本无助于 Linux 在我国的健康发展,反
而帮了个“大倒忙”。
让我们大家真心地向“Linux 志愿者”致敬!

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 23


开源社区

开 源 社 区

项目动态

最新稳定版 KDE 3.5.9 发布

近日,KDE 开发团队发布了其 3.5 稳定版的第 9 个更新。此次更新主要是针对大量 bug 进行了修复,


KDE 3.5.9 包含 65 种语言,对 KDE PIM 套件及其他软件进行了增强。3.5.9 版的 KDE 为该软件目前最稳定
的生产适用版。
其他主要更新包括:
为电子邮件工具 KMail 增加了“收藏”视图,并且支持文件夹拖放操作;
改进 KOrganizer 用户界面,方便操作;
增强了 KAlarm 和 KAddressbook。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 24


开源社区

文泉驿正黑夸父(测试版)发布

经过将近半年的优化和改进,文泉驿正黑下一个里程碑版本(夸父)的测试版(0.4.23)已经编译完成,
并上传至我们的网站 ( http://wenq.org/?ZenHei ),欢迎大家下载使用并提供反馈意见。在过去的半年当中,
文泉驿的志愿者完成了 800 多个汉字的绘制工作,优化了将近两千常用汉字的字型,并补充了 1400 多个
CJK 语言符号。可以说这是正黑向着高质量中文矢量字体迈出的坚实的一步。
对比去年 9 月份推出的紫箫(0.2.15),这次发布的字体的改进相当明显。夸父(beta)是第一个完整支持
GBK 标准的开源矢量字体(GBK 为 GB2312,GB12345 和 Big5 的超集),包含了 20924 个 GBK 汉字和 2000
多个 GBK 非汉字符号。除此以外,该字体还提供了较为完整的日文和韩文语言符号,通过 fontconfig,可
以满足数十种语言文字的显示(支持 zh_cn, zh_sg, zh_tw, zh_hk, zh_mo, ja, ko 等 locale)。
新字体当中,有很多中文符号是可能是所有开源字体当中第一个支持的,包括易经符号,太玄经符
号,中文合体符号,日语汉文注释符号,基本中文部首以及 CJK 兼容汉字增补等等。这些汉语符号将提
供大家更为更为完整的阅读环境和更为丰富的表达元素。
在大量添加汉字和汉语符号的同时,我们对汉字字型也进行了非常细致的改进。从 0.2.20 开始,汉
字笔画明显加
粗,提供更好
的显示效果。
在加粗笔画的
同时,我们还
根据具体笔画
密度优化特定
笔画,使得汉
字显示更加匀
称。另外,几
乎所有的笔画
曲线都得到了
优化,汉字基线和留白空间也有长足改进。
这里我希望感谢在过去半年中热心帮助改进字体的朋友,包括 wanghong, lsz, pem 等,特别需要感谢
的是来自香港的 three-leg-cat 朋友,这个字体中对常用汉字的改进有很大一部分得益于他的劳动。
正如这个字体版本号所表明的那样,我们的字体与完美尚有相当的距离。但就像我以前所说,这是
一个充满生命力的字体,它每一天都在成长,只要大家都来关心和支持,相信有一天,这个字体将成为
大家最为钟爱的字体。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 25


开源社区

Magic Linux 2.1 Beta1 发布通告

首先,祝大家新春愉快,合家欢乐,鼠年行好运,发大财。下面我简单的说下情况,具体的发布通
告慢慢补充吧。
说个大概情况,由于这两年添加了不少东西,这样还实现 2.0 的功能而不增加体积,基本是不可能了,
但又要考虑到只有 CD 刻录机的朋友的情况,所以发布成了两个版本,一个是 DVD 的,一个是两 CD 的,
其中,两 CD 的版本,安装只需要 1CD,但会少一些东西,少的东西下面会列一个表,可以在安装完成后
利用第二张 CD 补充安装,也可以不管,不影响使用(包括编译程序)。
目前使用的主要组件的版本如下:
kernel: 2.6.22.12
x-org-server: 1.4(也即 xorg7.3)
kde: 3.5.8
gtk:2.12.2
qt:3.3.8
其中 kernel 的 2.6.24 版本没有来得及打包,根据测试情况再决定正式版使用哪个版本。
关于目前已知的一些问题:

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 26


开源社区

● 安装程序(即 MI)的显示器识别不算完善,部分显示器无法识别,不过可以手工指定显示器。
● 安装程序的鼠标识别略有问题,最好手工选择,尤其 vmware 下。
● 安装程序能自动识别的 SCSI 会无法安装(不能自动识别的到是可以)。
● 首次启动部分机器会卡在欢迎屏幕,这里可以用 Ctrl+Alt+F1,然后 Ctrl+Alt+F2 切换下,应该就
可以继续了,如果还不能,可以用 Ctrl+Alt+Esc 跳过,也可以进单用户模式,手工运
行/etc/rc.d/magic-firstboot-script。因为我这里的机器没有办法重现这个 Bug,所以没有解决这个问
题,正式版肯定会解决。
● 网络设置在部分多网卡(含双网卡)机器上略有问题,可能需要手工改动一些设置。
● smart 因为中文翻译有问题,会影响软件的安装,所以暂时去掉了,我会重新编译的。
● 因为空间的原因,去掉了 uming 字体,改用文泉驿正黑代替。

关于测试的问题:
希望大家测试后能踊跃报告问题,包括 Bug 和需求、建议等,不过如果是 Bug 报告,希望能比较详
细的描述情况。

关于下一步的计划:
首先当然是除 Bug,希望两个月后可以发布 Beta2,然后在 5 月根据情况是 Beta3 还是 Rc1,到 7 月可
以发布正式版本,期间可能经历三到四个版本(包含 Beta 和 Rc)。然后是仓库的完善,第一是 Gnome 打
包,第二是 KDE4,还有其它程序,有什么需求以及仓库的错误,也可以提出来。最后是 3.0 的前期准备
工作。

Ubuntu 8.04 Hardy Heron Alpha 5:更易安装

2 月 24 日,Ubuntu 8.04 迎来了它第五个 Alpha 版本(代号:Hardy Heron)--Ubuntu 8.04 Alpha


5。这一版本集成了一些强大易用的应用程序,例如 BT 客户端 Transmission、CD/DVD 烧录程序
Brasero、全新的防火墙及最新的 Linux 内核版本 2.6.24.2 等。 Ubuntu 8.04 的第五个 Alpha 测试版已
经正式发布了,至此还剩最后一个 Alpha 6,马上就要迎来 Beta 版了。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 27


开源社区

在 Ubuntu 8.04 Hardy Heron Alpha 5 中,已经引入了 Firefox 3 Beta 3,而且默认已经不安装 Firefox 2
了。
虽然还只是 Preview,但是 Mozilla
应该能在 Ubuntu 8.04 正式发布前开发
完成其 Firefox 3。
Alpha 5 另外一个显著特征是,加
入了 Wubi 的安装支持。在 7.10 的时候,
Ubuntu 就支持 Wubi 进行安装了,不过
该特性默认并没有展示给用户。当用户
在 Windows 下插入光盘时,只会弹出
简介,用户需要自己进入光盘目录点击
Wubi 进行安装。
然而,在 Ubuntu 8.04 中,当用户在 Windows 下放入光盘,将可以直接选择是否进行安装 ,使用
Install inside Windows,即用 Wubi 安装在 Windows 内:
通过 Wubi,没有任何基础的普通用户,也能在 Windows 上简单的安装好 Ubuntu。
在 Alpha 5 这个版本,Ubuntu 8.04 的特性已经冻洁了,也就是说,未来的版本再不会有功能方面的增
减了。
而界面美工的截止时间将在二十多天后的 Beta 版,可以预见这些天在外观上还会有少许改进,当然
换上新主题已经是不可能的了。

Notepad++ 4.7.5 发布

日前,Notepad++项目组发布了最新的 4.7.5 版本。Notepad++是一款非常有特色的编辑器,是开源软


件,可以免费使用,具有以下功能:
● 内置支持多达 27 种语法高亮度显示(囊括各种常见的源代码、脚本,值得一提的是完美支持.nfo
文件查看),也支持自定义语言;
● 可自动检测文件类型,根据关键字显示节点,节点可自由折叠/打开,代码显示得非常有层次感,
这是此软件最具特色的体现之一;

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 28


开源社区

● 可打开双窗口,在分窗口中又可打开多个子窗口,允许快捷切换全屏显示模式(F11),支持鼠标滚
轮改变文档显示比例等;
● 提供数个特色功能,如邻
行互换位置、宏功能等。

现在网上有很多文件编辑器,
这个却是不可多得的一款,不论是
日常使用还是手写编程代码,都能
让你体会到它独有的优势和方便。

Picasa 2.7.3736 Beta for Linux 发布

基于 WINE and Mozilla 的照片管理程序 Picasa 2.7 Beta for Linux 已经可以使用了。使用 Red
Hat/Fedora/Suse/Mandriva 系统的 x86 用户可以在
http://dl.google.com/linux/rpm/testing/i386/picasa-2.7.3736-7.i386.rpm 下载 rpm 包。使用 Debian/Ubuntu 的
x86 用户可以点击 http://dl.google.com/linux/deb/pool/non-free/p/picasa/picasa_2.7.3736-7_i386.deb 下载 deb
包。AMD64 的 Debian/Ubuntu 用户可以点击 http://dl.google.com/linux/deb/pool/non-
free/p/picasa/picasa_2.7.3736-7_amd64.deb 下载 deb 包。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 29


开源社区

当然 Ubuntu 和 Debian 的用户可以通过以下方法快速安装 Picasa 2.7.3736。


首先添加源:deb http://dl.google.com/linux/deb/ testing non-free
接着在终端输入:sudo apt-get update
sudo apt-get install picasa
Beta 版肯定会有这样那样的问题,如果有错误要报告,可以在
http://groups.google.com/group/Google-Labs-Picasa-for-Linux 提交 Bug。以前 Picasa 的 Linux 版本
比 Windows 版本弱很多,现在终于可以享受和 Windows 版本同样的待遇了。为此希望大家踊跃充当小白鼠。

Linux Kernel 2.6.24 发布

作为 Linux 操作系统核心的 Kernel 最新稳定版 2.6.24 于近日发布。根据 Kernel Newbies 网站的描述,


Linux Kernel 2.6.24 改善了 CFS、针对 x86-64、PPC、UML、ARM、MIPS 等架构添加了 Tickless 支持、新
增了无线驱动程序及配置界面、引入了 Anti-fragmentation 补丁、使 MMC 层获得
了 SPI/SDIO 支持、添加了 USB authorization、per-device dirty thresholds、PID 及
网络命名空间、针对 TCP 流量的 LRO(Large Receive Offload)支持、TCG(Task
Control Groups)、Linux Kernel Markers、read-only bind mounts、x86-32/64 arch
reunification 等特性。
此外,该版本的 Linux 内核还添加了包括显卡、SATA/IDE、网络、声卡、
MTD、USB、V4L/DVB、Hwmon、I2C、蓝牙等设备在内的新驱动程序。你可以从 The Linux Kernel
Archives 网站获取 Linux Kernel 2.6.24 的源代码及补丁。

Mandriva Linux 2008.1 Beta 1 发布

近日,Mandriva 项目组发布了 Mandriva Linux 2008.1 Beta 1 版本。

Mandriva Linux(原先的 Mandrakelinux)创建于 1998 年,其宗旨是让 Linux 对所有人都更易于使用。


当时 Linux 作为操作系统已经以强大和稳定而著称,但它要求人们有很强的专业知识,并涉及大量的命令
行操作。MandrakeSoft 认为这是一个将最好的图形桌面环境及其自己的图形界面配置工具集成到 Linux 中
的机会,并且很快就因其树立了易用性和功能性的标准而著称。依靠这种创新的方法,Mandriva Linux 通

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 30


开源社区

过一种易于使用并令人愉快的环境,向个人和企业用户提供了 Linux 所有的强大功能和稳定性。


每天都有成千上万的新用户在
初识 Linux 并发现它可以完全替代
他们之前所使用的操作系统。无论
是作为服务器还是工作站,Linux
都用不着去妒嫉任何其他更广为采
用的操作系统了。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 31


开源社区

引言:当博客已经成为时下最火的网络应用,当人们通过博客来分享知识、获取信息、交流情感、
传播新闻时,WordPress 这款开源博客系统也渐渐成为了博客系统的主流,成为人们关注的焦点。本文以

WordPress 的发展历史、社区文化和应用为主要线索,带读者走进 WordPress 的精彩世界!

WordPress 让博客更精彩

朱珠
WordPress 是一个开源的 PHP+MySQL 博客发布系统,以 GPL 协议发布,以功能强大、运行稳定、安
全高效而广受博客作者的喜爱。它支持多种语言,拥有丰富的插件与模板资源,目前已成为全球使用最
广泛的博客发布系统之一。

历史背景
WordPress 这个名字是由 Christine Selleck(该项目领导人 Matt Mullenweg 的一位朋友)提出的。
WordPress 是 b2\cafelog 的官方替代项目,现在有非常兴盛的用户群和开发者社区。WordPress 目前支持
独立的博客或独立站点的安装,官方站点(如图 1 所示)上也提供了一个多用户的版本。实际上即使不
使用多用户博客,用户仍然可以有多个博客在同一服务器上,使用相同的数据库,只需要把文件放置到
不同的目录就可以实现。(图 1 WordPress 官方站点)

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 32


开源社区

2005 年 12 月,WordPress 2.0 正式发布,这个版本的代号是以著名爵士钢琴演奏家及作曲家 Duke


Ellington 的名字来命名。WordPress 2.0 加入了非常多的新特性,比如完全的内部引擎重新设计、快速的
管理系统(引入革新性的 AJAX 技术让用户方便使用“简单”与“高级”两种不同模式进行管理)、所
见即所得编辑器(使用 TinyMCE 团队专门为 WordPress 2.0 优化的 TinyMCE 编辑器)、及时的文件管理
(在发布页面就能管理上传的文件或图片)、用户等级(崭新的用户等级系统可以方便管理用户权限)、
页面预览(当保存一个页面就可以在编辑区底部模拟发布后的效果,让用户对不满意的内容方便修改)。
自从 Six Apart 在 2004 年改变了 Movable Type(又一个使用广泛的,以 Perl 为基础的博客系统)的授权
协议之后,很多 Movable Type 用户都转移到了 WordPress,从此 WordPress 走在了众多博客系统的最前端。
WordPress 属于 Automattic 团队领导并管理的一个项目。最新 WordPress 版本是 2006 年 3 月 10 日发
布的 2.0.2。

社区文化
同其他开源项目一样,WordPress 崇尚自由的精神和严谨的态度,它的开发初衷就是要把人性化、简
洁、安全、功能强大而又可以高速运行的博客系统带给用户。当然,从 1.5 版本的创新性博客功能到 2.0
版本的新技术使用和更完美的设计,WordPress 已经证明做到了这一点。作为开源社区内的软件项目,
WordPress 也同其他项目一样有非常活跃的用户群和开发者群。来自世界各地有着不同文化背景、不同信
仰的自愿者不停得提交 Bug,测试 Beta 版本,提出建议。有的则是直接参与到核心开发、插件编写、模
板制作中。可以说,每个 WordPress 用户都是 WordPress 社区中的一员。正是有了这些默默无闻的自愿者
与忠实用户才让 WordPress 社区变得无比坚固,充满活力,同时也让 WordPress 成为一个成熟的开源项目,
使其成为无数博客系统中的领跑者,这是商业软件所没有的。在 WordPress 上开源精神被发挥得淋漓尽致。
对开源软件有所了解的人都知道,几乎所有的开源软件都是支持多种语言的。WordPress 也不例外,
它支持多种语言及编码,用户不用为没有本地语言的支持而烦恼。这些多语言的支持几乎都是 WordPress
的忠实用户制作的,随着 WordPress 的每一次重大升级,相应的语言文件也会被相关维护者升级。
无数爱好者筑就了 WordPress 的坚固长城,他们积极地分享关于 WordPress 的经验、技巧、插件、模
板。他们大多都是通过自己的博客与别人分享这一切,有的甚至不计报酬执着地翻译非本地语言的
WordPress 资源。
WordPress 提供了灵活的外观模板和功能强大的插件支持。WordPress 的外观模板与插件设计接口非
常灵活和简单的,使得开发者更容易开发和维护自己的外观模板和插件,如图 3 所示。对用户而言,
WordPress 的插件与外观模板的安装管理都非常简单,只需要简单的激活和停止,就可以自由的控制插件
或外观模板的使用与否。对于有一定经验的用户,则提供了自主的对外观模板和插件的在线修改,非常
容易按用户的需要做出改动,并能立即使用改动后的程序。让用户在使用系统的同时充分体会到自由控
制的乐趣,让 WordPress 充分满足自己的需求。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 33


开源社区

WordPress 还可以让用户最大限度的发挥自己的想象力,网络上的 WordPress 插件比比皆是,找到合


适的插件,安装测试一下,保留自己满意的插件,然后寻找中意的外观模板,一个与众不同的博客就诞
生了。

图 3 灵活的插件管理

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 34


开源社区

多元应用
WordPress 的主要应用是个人博客系统,但是用户可以将它变成一个个人门户,一个商业门户,当然
这需要有特定的插件支持和一个优良的外观模板。结合其他相关自由软件项目,比如 Drupal、PHPBB 等
甚至可以建立自己的大型网络社区。给笔者印象最深的是知名的 Web 设置专家 Eric Meyer 的个人站点,
如图 4 所示,充分发挥 WordPress 的功能,加上良好的导航结构和优秀的外观样式设计,使任何访问过该
站点的人都会对他充满敬意。

图 4 Eric Meyer 用 WordPress 搭建的个人站点

互联网空间商也对 WordPress 颇有好感,很多空间商都会推荐自己的用户使用 WordPress 作为博客


系统,因为其充分发挥了 PHP 与 MySQL 的优点,运行速度极快,服务器资源占用小,在空间提供商中有极
好的口碑。Yahoo!更是首先推出了完整支持 WordPress 的空间服务。还有一个不得不提到的站点是
wordpress.com,这是首个使用多用户 WordPress 系统提供免费 Blog 空间服务的站点,如图 5 所示。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 35


开源社区

图 5 多用户 WordPress 系统提供免费 Blog

发展方向
从最初的几个开发者到现在规模庞大的开发者社区,WordPress 一直都在不停地进行 Bug 处理、升级、
Beta 版的开发与测试,并不断创新、修改和完善现有的博客系统。
如果说 Web 2.0 给互联网带来了又一次腾飞的契机,那么 WordPress 可以说是这场革命的先锋。从 1.5
到 2.0,用户看到了几乎完全不一样的 WordPress 但却有同一种精神,那就是自由的精神与分享的精神。
我们应该庆幸能通过博客与人分享知识、感动、故事和心情,更应该感谢 WordPress 这样的开源项目,感
谢默默无闻的开源社区每一员。

WordPress 相关链接
官方站点 http://www.wordpress.org
最新版本下载 http://www.wordpress.org/download/
官方插件、模板推荐 http://codex.wordpress.org/
多用户版本 http://mu.wordpress.org/
插件资源 http://wp-plugins.net/ 插件开发 http://dev.wp-plugins.org/
模板资源 http://www.alexking.org/software/wordpress/theme_browser.php

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 36


开源社区

Linux 内核的文件预读

中国科技大学 吴峰光

引言

从寄存器、L1/L2 高速缓存、内存、闪存,到磁盘/光盘/磁带/存储网络,计算机的各级存储器硬
件组成了一个金字塔结构。越是底层存储容量越大。然而访问速度也越慢,具体表现为更小的带宽和更
大的延迟。因而这很自然的便成为一个金字塔形的逐层缓存结构。由此产生了三类基本的缓存管理和优
化问题:

● 预取(prefetching)算法 从慢速存储中加载数据到缓存

● 替换(replacement)算法 从缓存中丢弃无用数据

● 写回(writeback)算法 把脏数据从缓存中保存到慢速存储

其中的预取算法,在磁盘这一层次尤为重要。磁盘的机械臂+旋转盘片的数据定位与读取方式,决
定了它最突出的性能特点:擅长顺序读写,不善于随机 I/O;I/O 延迟非常大。由此而产生了两个方面的
预读需求。

来自磁盘的需求

简单的说,磁盘的一个典型 I/O 操作由两个阶段组成:

1、数据定位

平均定位时间主要由两部分组成:平均寻道时间和平均转动延迟。寻道时间的典型值是 4.6ms。转动
延迟则取决于磁盘的转速:普通 7200RPM 桌面硬盘的转动延迟是 4.2ms,而高端 10000RPM 的是 3ms。
这些数字多年来一直徘徊不前,大概今后也无法有大的改善了。在下文中,我们不妨使用 8ms 作为典型
定位时间。

2、数据传输

持续传输率主要取决于盘片的转速(线速度)和存储密度,最新的典型值为 80MB/s。虽然磁盘转速
难以提高,但是存储密度却在逐年改善。巨磁阻、垂直磁记录等一系列新技术的采用,不但大大提高了
磁盘容量,也同时带来了更高的持续传输率。

显然,I/O 的粒度越大,传输时间在总时间中的比重就会越大,因而磁盘利用率和吞吐量就会越大。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 37


开源社区

简单的估算结果如表 1 所示。如果进行大量 4KB 的随机 I/O,那么磁盘在 99%以上的时间内都在忙着定位,


单个磁盘的吞吐量不到 500KB/s。但是当 I/O 大小达到 1MB 的时候,吞吐量可接近 50MB/s。由此可见,
采用更大的 I/O 粒度,可以把磁盘的利用效率和吞吐量提高整整 100 倍!因而必须尽一切可能避免小尺寸
I/O。这正是预读算法所要做的。

表 1 随机读大小与磁盘性能的关系

I/O 大小 定位时间 传输时间 磁盘利用率 吞吐量 IOPS

4KB 8ms 0.05ms 0.6% 497KB/s 124

32KB 8ms 0.39ms 4.7% 3814KB/s 119

128KB 8ms 1.56ms 16.3% 13386KB/s 105

512KB 8ms 6.25ms 43.9% 35930KB/s 70

1024KB 8ms 12.50ms 61.0% 49951KB/s 49

来自程序的需求
应用程序处理数据的一个典型流程是这样的:while(!done) { read(); compute(); }
假设这个循环要重复 5 次,总共处理 5 批数据,则程序运行的时序图可能如图 1 所示。
图 1 典型的 I/O 时序图

不难看出,磁盘和 CPU 是在交替忙碌:当进行磁盘 I/O 的时候,CPU 在等待;当 CPU 在计算和处理


数据时,磁盘是空闲的。那么是不是可以让两者流水线作业,以便加快程序的执行速度?预读--即预
先读取数据--可以帮助达成这一目标。基本的方法是,当 CPU 开始处理第 1 批数据的时候,由内核的
预读机制预加载下一批数据。这时候的预读是在后台异步进行的。如图 2 所示。

图 2 预读的流水线作业

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 38


开源社区

注意!在这里我们并没有改变应用程序的行为:程序的下一个读请求仍然是在处理完当前的数据之
后才发出的。只是这时候的被请求的数据可能已经在内核缓存中了,无须等待,直接就能复制过来用
(详见预读架构一节)。在这里,异步预读的功能是对上层应用程序“隐藏”磁盘 I/O 的大延迟。虽然延
迟事实上仍然存在,但是应用程序看不到了,因而运行的更流畅。

预读的概念

预取算法的涵义和应用非常广泛。它存在于 CPU、硬盘、内核、应用程序以及网络的各个层次。预
取有两种方案:启发性的(heuristic prefetching)和知情的(informed prefetching)。前者自动自发的进行预读
决策,对上层应用是透明的,但是对算法的要求较高,存在命中率的问题;后者则简单的提供 API 接口,
而由上层程序给予明确的预读指示。在磁盘这个层次,Linux 为我们提供了三个 API 接口:
posix_fadvise(2), readahead(2), madvise(2)。表 2 详细列出了 fadvise 可以完成的功能。

表2 预读 API:posix_fadvise(fd, offset, len, advice)

预读建议(advice) 涵义 内核动作

POSIX_FADV_NORMAL 无特别建议 重置预读大小为默认值

POSIX_FADV_SEQUENTIAL 将要进行顺序操作 设最大预读大小为默认值的 2 倍

POSIX_FADV_RANDOM 将要进行随机操作 将最大预读大小清零(预读被禁


止)

POSIX_FADV_NOREUSE 指定的数据将只访问一次 (无动作)

POSIX_FADV_WILLNEED 指定的数据即将被访问 立即预读数据到 pagecache

POSIX_FADV_DONTNEED 指定的数据近期不会被访问 立即从 pagecache 中丢弃数据

不过真正使用上述预读 API 的应用程序并不多见。因为一般情况下,内核中的启发式算法工作的很


好。

预读(readahead)算法预测即将访问的页面,并提前把它们批量的读入缓存。

它的主要功能和任务可以用三个关键词来概括:

- 批量 也就是把小 I/O 聚集为大 I/O,以改善磁盘的利用率,提升系统的吞吐量。

- 提前 也就是对应用程序隐藏磁盘的 I/O 延迟,以加快程序运行。

- 预测 这是预读算法的核心任务。前两个功能的达成都有赖于准确的预测能力。当前包括 Linux,
FreeBSD, Solaris 等主流操作系统都遵循了一个简单有效的原则:把读模式分为随机读和顺序读两大类,
并只对顺序读进行预读。这一原则相对保守,但是可以保证很高的预读命中率,同时有效率/覆盖率也

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 39


开源社区

很好。因为顺序读是最简单而普遍的,而随机读在内核来说也确实是难以预测的。

Linux 的预读架构

Linux 内核的一大特色就是支持最多的文件系统,并拥有一个虚拟文件系统(VFS)层。早在 2002 年,


也就是 2.5 内核的开发过程中,Andrew Morton 在 VFS 层引入了文件预读的基本框架,以统一支持各个文
件系统。如图所示,Linux 内核会将它最近访问过的文件页面缓存在内存中一段时间,这个文件缓存被称
为 pagecache。如图 3 所示。一般的 read()操作发生在应用程序提供的缓冲区与 pagecache 之间。而预读算
法则负责填充这个 pagecache。应用程序的读缓存一般都比较小,比如文件拷贝命令 cp 的读写粒度就是
4KB;内核的预读算法则会以它认为更合适的大小进行预读 I/O,比如 16-128KB。

图 3 以 pagecache 为中心的读和预读

大约一年之后,Linus Torvalds 把 mmap 缺页 I/O 的预取算法单独列出,从而形成了 read-around/read-


ahead 两个独立算法(图 4)。read-around 算法适用于那些以 mmap 方式访问的程序代码和数据,它们具
有很强的局域性(locality of reference)特征。当有缺页事件发生时,它以当前页面为中心,往前往后预取共
计 128KB 页面。而 readahead 算法主要针对 read()系统调用,它们一般都具有很好的顺序特性。但是随机
和非典型的读取模式也大量存在,因而 readahead 算法必须具有很好的智能和适应性。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 40


开源社区

图 4 Linux 中的 read-around, read-ahead 和 direct read

又过了一年,通过 Steven Pratt、Ram Pai 等人的大量工作,readahead 算法进一步完善。其中最重要


的一点是实现了对随机读的完好支持。随机读在数据库应用中处于非常突出的地位。在此之前,预读算
法以离散的读页面位置作为输入,一个多页面的随机读会触发“顺序预读”。这导致了预读 I/O 数的增加
和命中率的下降。改进后的算法通过监控所有完整的 read()调用,同时得到读请求的页面偏移量和数量,
因而能够更好的区分顺序读和随机读。

预读算法概要

这一节以 linux 2.6.22 为例,来剖析预读算法的几个要点。

- 顺序性检测

为了保证预读命中率,Linux 只对顺序读(sequential read)进行预读。内核通过验证如下两个条件来判


定一个 read()是否顺序读:

 这是文件被打开后的第一次读,并且读的是文件首部;

 当前的读请求与前一(记录的)读请求在文件内的位置是连续的。

如果不满足上述顺序性条件,就判定为随机读。任何一个随机读都将终止当前的顺序序列,从而终
止预读行为(而不是缩减预读大小)。注意这里的空间顺序性说的是文件内的偏移量,而不是指物理磁
盘扇区的连续性。在这里 Linux 作了一种简化,它行之有效的基本前提是文件在磁盘上是基本连续存储的,
没有严重的碎片化。

- 流水线预读

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 41


开源社区

当程序在处理一批数据时,我们希望内核能在后台把下一批数据事先准备好,以便 CPU 和硬盘能流


水线作业。Linux 用两个预读窗口来跟踪当前顺序流的预读状态:current 窗口和 ahead 窗口。其中的 ahead
窗口便是为流水线准备的:当应用程序工作在 current 窗口时,内核可能正在 ahead 窗口进行异步预读;
一旦程序进入当前的 ahead 窗口,内核就会立即往前推进两个窗口,并在新的 ahead 窗口中启动预读 I/
O。

- 预读的大小

当确定了要进行顺序预读(sequential readahead)时,就需要决定合适的预读大小。预读粒度太小的话,
达不到应有的性能提升效果;预读太多,又有可能载入太多程序不需要的页面,造成资源浪费。为此,
Linux 采用了一个快速的窗口扩张过程:

1. 首次预读: readahead_size = read_size * 2; // or *4

预读窗口的初始值是读大小的二到四倍。这意味着在您的程序中使用较大的读粒度(比如 32KB)可
以稍稍提升 I/O 效率。

2. 后续预读: readahead_size *= 2;

后续的预读窗口将逐次倍增,直到达到系统设定的最大预读大小,其缺省值是 128KB。这个缺省值
已经沿用至少五年了,在当前更快的硬盘和大容量内存面前,显得太过保守。比如西部数据公司近年推
出的 WD Raptor 猛禽 10000RPM SATA 硬盘,在进行 128KB 随机读的时候,只能达到 16%的磁盘利用率
(图 5)。所以如果您运行着 Linux 服务器或者桌面系统,不妨试着用如下命令把最大预读值提升到 1MB
看看,或许会有惊喜:

# blockdev –setra 2048 /dev/sda

当然预读大小不是越大越好,在很多情况下,也需要同时考虑 I/O 延迟问题。

图5 128KB I/O 的数据定位时间和传输时间比重

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 42


开源社区

重新发现顺序读

上一节我们解决了是否/何时进行预读,以及读多少的基本问题。由于现实的复杂性,上述算法并不
总能奏效,即使是对于顺序读的情况。例如最近发现的重试读(retried read)的问题。

重试读在异步 I/O 和非阻塞 I/O 中比较常见。它们允许内核中断一个读请求。这样一来,程序提交的


后续读请求看起来会与前面被中断的读请求相重叠。如图 6 所示。

图6 重试读(retried reads)

Linux 2.6.22 无法理解这种情况,于是把它误判为随机读。这里的问题在于“读请求”并不代表读取


操作实实在在的发生了。预读的决策依据应为后者而非前者。最新发布的 2.6.23 对此作了改进。新的算
法以当前读取的页面状态为主要决策依据,并为此新增了一个页面标志位:PG_readahead,它是“请作异
步预读”的一个提示。在每次进行新预读时,算法都会选择其中的一个新页面并标记之。预读规则相应
的改为:

 当读到缺失页面(missing page),进行同步预读;

 当读到预读页面(PG_readahead page),进行异步预读。

这样一来,ahead 预读窗口就不需要了:它实际上是把预读大小和提前量两者作了不必要的绑定。新
的标记机制允许我们灵活而精确地控制预读的提前量,这有助于将来引入对笔记本省电模式的支持。

新算法带来的另一个好处是消除了缓存命中带来的预读开销。前面我们一直假设 pagecache 的初始状


态是空。然而实际情况是常用的文件/页面会被缓存:这正是我们期待 pagecache 完成的首要功能。这些
文件会以很高的频率被重复访问。每次新的访问都将激活预读算法,并引发很多的无效操作。老算法对
此作了一个简单的限制:当检测到连续命中页面数超过 256(在 x86 上就是 1MB)时,禁止预读。显然这
只对大文件有效。而新的预读触发规则完全避免了这一问题:当有缓存命中时,预读函数根本就不会被
调用。这带来了约 2%的速度提升。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 43


开源社区

图 7 Linux 2.6.23 预读算法的工作动态

另一个越来越突出的问题来自于交织读(interleaved read)。这一读模式常见于多媒体/多线程应用。
如图 8 所示。当在一个打开的文件中同时进行多个流(stream)的读取时,它们的读取请求会相互交织在一
起,在内核看来好像是很多的随机读。更严重的是,目前的内核只能在一个打开的文件描述符中跟踪一
个流的预读状态。因而即使内核对两个流进行预读,它们会相互覆盖和破坏对方的预读状态信息。对此,
我们将在即将发布的 2.6.24 中作一定改进,利用页面和 pagecache 所提供的状态信息来支持多个流的交织
读。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 44


开源社区

图 8 两个流的交织读

Linux 预读算法小记
日期 版本号 作者 功能

2002-4 2.5.8 Andrew Morton 统一的预读架构;预读算法的雏形

2003-2 2.5.60 Andrew Morton 引入 posix_fadvise64()

2003-7 2.5.75 Linus Torvalds 独立的 mmap read-around 算法:更快更简单

2004-5 2.6.7 Andrew Morton 改进多线程并发读

2005-1 2.6.11 Steven Pratt, Ram 引入读大小参数:代码简化及优化;支持随机读


Pai

2005-3 2.6.12 Oleg Nesterov 支持非对齐顺序读

2005-9 (2.6.13) Fengguang Wu 自适应预读算法 V1 (http://lwn.net/Articles/155510/)

2006-5 2.6.17-mm Fengguang Wu 自适应预读算法 V12 (http://kerneltrap.org/node/6642)

2007-5 2.6.22-mm Fengguang Wu 简化的自适应预读 (http://lwn.net/Articles/235164/)

2007-7 2.6.23 Fengguang Wu 引入页面状态:代码简化及优化;改进重试读、预读抖动

2007-10 2.6.24 Fengguang Wu 引入 pagecache 状态:改进多线程交织读

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 45


开源社区

相关链接

自适应预读算法

http://kerneltrap.org/node/6642

http://lwn.net/Articles/155510/

http://lwn.net/Articles/235164/

Linux 版本 2.6.12 之前的预读补丁

http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Fold-2.6-
bkcvs.git&a=search&h=HEAD&st=commit&s=readahead

近两年的预读补丁

http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds
%2Flinux-2.6.git&a=search&h=HEAD&st=commit&s=readahead

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 46


开源社区

开源虚拟化技术的结构概述与发展

田坤 蒋运宏 董耀祖

虚拟化技术是当下非常火热的一个领域,而开源社区的活力给这项技术加上了飞翔的翅膀。随着开
源思想的深入人心,尤其是 Linux 内核的成熟提供了最佳的借鉴平台,开发者将他们的想法付诸实现变得
越发容易。如今开源社区中的虚拟化产品是百花齐放,各具风采,有的已经形成了非常成熟的开发社区
和广泛的用户,例如 Xen;有的刚一提出便成为开源社区的焦点,譬如 KVM;还有的另辟蹊径,选择不
同的虚拟对象,如容器技术。本文首先给予虚拟化技术一个基本的介绍,给读者展示当前开源社区中的
几种主要虚拟化产品的特点,然后以 Linux 内核为例阐述虚拟化技术的发展对传统操作系统结构带来的影
响。通过这些介绍,我们希望展示给读者一项新的技术如何在开源社区中发展,尤其是不同开源结构之
间的相互影响和促进。

虚拟化技术的发展
虚拟化本身不是一个新的概念,早在上世纪 60 年代虚拟机的名称就已经诞生,从这个程度上来说,
这是一个和操作系统有着同样悠久历史的领域。在虚拟化技术发展的几十年历程中,它经历了数次大幅
度的起落,人们不断被虚拟化技术潜在的功能所吸引,然后又因客观技术上的限制而放弃。但是随着近
年来处理器技术和性能的迅猛发展,虚拟化技术成熟的时机真正到来。尤其是硬件虚拟化技术的诞生
(例如 Intel®VT 和 AMD SVM 技术),极大的扩展了虚拟化技术的应用范围。基本上虚拟化技术从实现
途径上来说,由两种典型的派别:泛虚拟化和完全虚拟化。前者通过修改客户操作系统来配合虚拟化的
环境,从而达到较高的性能,但也付出了兼容性和维护性方面的限制;而完全虚拟化技术常常需要得到
处理器级别的硬件支持(也称硬件虚拟化),或者通过对客户机执行代码进行动态二进制代码转换
(Binary translation),然后可以无需修改的直接运行一个已有的操作系统,使得虚拟化技术的应用更加
容易。事实上,当前一些主流的虚拟化产品都同时支持这两种模式。

XEN
Xen 是由英国剑桥大学开发的一个成熟的开源虚拟化产品,最初只支持 32 位 X86 体系结构上的泛虚
拟化客户操作系统。这种泛虚拟化是通过引入管理接口(Hypercalls)和事件(Events)机制来实现的,
这实际上在客户操作系统上引入了一个修改过的 X86 体系架构,尽管这种修改极其轻微。同时客户机和
虚拟机监控程序(hypervisor)之间的高效共享内存数据交换机制都使得新的客户机体系架构(XEN 架构)
具有更高的总体性能。最近在 Intel®开源技术中心的帮助下,Xen 实现了对硬件虚拟化技术的支持,从而

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 47


开源社区

可以支持未经修改的客户操作系统(例如 Windows)的运行。今天 Xen 也支持 64 位的 X86 体系结构以及


Intel®安腾架构和 IBM PowerPC 架构。
Xen 体系结构如图 1 所示。Xen 将客户机称之为虚拟域(Domain),其中虚拟域 0 比较特殊,因为它
拥有大部分 IO 资源,从而提供对其他普通虚拟域的设备虚拟化。虚拟机监控程序(hypervisor)管理处理
器和内存,并提供相关资源的虚拟化,它同时拥有部分关键硬件 IO 资源,例如定时器和处理器间中断 IPI
等。普通的虚拟域分为两类,一种是泛虚拟化域(Para-virtualized Virtual Machine, 或 PVM ),而另一种
是硬件虚拟域(Hardware Virtual Machine, 或 HVM)。对于 PVM,其上运行的客户操作系统内核(例如
Linux)添加了对上述修改过的 X86 结构的支持;对于 HVM,用户则可以在其中运行任何已有的操作系
统,而无需修改。

虚拟域0 虚拟域1 虚拟域2


(privileged domain
) (privileged domain
) (Non-privileged domain
)

设备管理器和控制台软件 未经修改的用户软件 未经修改的用户软件


(Device Manager and (Unmodified User (Unmodified User
Control Panel S /W) Software ) Software )

客户OS 客户OS 客户OS


(XenLinux) (XenLinux) (XenLinux)
后端设备驱动(Back-End) 后端设备驱动(Back-End)

前端设备驱动
Native Device Native Device (Front-End
Driver Driver Device Drivers )

XEN Hypervisor

图 1:Xen3.0 泛虚拟化体系结构

基本上说来,Xen 的优点在于其已经拥有一个成熟的开源社区,无论是其功能,还是相关的配套
结构都已发展得比较完善,主流 OSV(例如 SuSE 和 Redhat)都已将 Xen 集成到他们最新的发布版本中。
所以,Xen 无愧于当前开源虚拟化产品中的一个主打兵。

KVM
KVM 最早是在 2006 年 10 月 19 日出现在 Linux 内核的邮件列表(Mailing list)上,并迅速被集成到

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 48


开源社区

了 2.6.20 内核版本中。最初的 KVM 采用的是基于 Intel®VT 技术的硬件虚拟化方法,并结合另外一个老资


格开源代表 Qemu 来提供设备虚拟化(Device Model)。最近 Linux 社区中的重要人物 Ingo Molnar 又发布
了 KVM 的泛虚拟化扩展。KVM 的实现初衷是将 Linux 内核扩展为具备虚拟机监控器(VMM)的能力,
从而借助 Linux 内核自身成熟的结构来提供一个可靠的 VMM。这种方式得到了大部分 Linux 社区成员的
青睐。
KVM 的核心是通过加载一个 Linux 内核驱动程序,来使用处理器提供的硬件虚拟化技术。这个驱动
实现了对客户机的管理,并通过一种新的字符设备(/dev/kvm)来与用户态的 Device Model 通信。对于主
机 Linux 来说,每个 Qemu 进程就代表了一个客户机。KVM 引入了一个新的执行模式:客户机模式。在
这种模式下,客户机拥有自己的地址空间实现客户机地址的映射。但是所有 I/O 空间的存取都会导致从客
户机模式到内核模式的上下文切换,然后用户态 Qemu 进程得到通知开始模拟。而当 Qemu 准备向客户机
注入中断时,流程正好相反。当然,这也是硬件虚拟化技术的一个基本模型,如图 2 所示:

Apps
QEMU
App App
kernel
s s
ioctl
Vmexit Vmentry
Linux Kernel guest
KVM module
User
Hardware with virtualization support kernel

图 2:KVM 下的三种执行模式

现在 KVM 仍然处于早期开发过程,但是由于众多 Linux 内核开发者的加入,其发展非常迅速。


Linux 内核的结构化细分将会允许更多不适用于虚拟化的功能可配置;另一方面,如何使得 Linux 内核在
作为 VMM 方面表现优异,也是一个有意义而长期的过程,例如任务调度、内存管理等操作系统重要部
分,都会逐渐覆盖对虚拟化的特定优化。

UML
UML (User Mode Linux),顾名思义,将 Linux 内核运行在用户模式。它是第一个被接收进标准 Linux
内核的虚拟化技术,它本身被看作是 Linux 内核所支持的众多处理器结构中的一个,区别在于这是一个虚
拟的结构。UML 的内核是从标准 Linux 内核源代码编译出来,保持了大部分基本的通用功能,例如虚拟
文件系统,内存管理,等等。但是和正常的 Linux 内核(例如基于 x86 的版本)相比,最明显的区别在于
UML 将底层硬件相关的接口全部转化成了用户级别的系统调用,从而允许 UML Linux 本身可以作为一个

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 49


开源社区

用户进程运行。图 3 展示了一个典型的 UML 运行环境:

进程 1 … 进程 N UML

通用内核( VFS, Process, …… )

进程 1 … 进程 N UML 接口 驱动

通用内核( VFS, Process, …… ) Linux


Kernel
平台相关接口 驱动

硬件(处理器、内存、外设……)

图 3:UML 运行环境

UML 的用户态和内核态实际上都处于同一个级别,硬件无法自动保证 UML 内部的上下文切换。


UML 采用了 Linux 中调试工具使用的方法,创建了一个监控进程。这个监控进程是 UML 内部所有进程的
父进程,从而可以通过 ptrace 接口来截获 UML 进程的系统调用,然后帮助 UML 进程切换到内核态。另
外,UML 采用了信号的方式来虚拟设备中断和异常。基本上说来,通过用户态接口来抽象底层结构,
Linux 内核的通用功能都被保持下来,从而允许开发者进行方便的调试和诊断。但是也正是因为 UML 的
实现方式都在用户态,其效率就不可避免的受到了影响,尤其在内存管理,上下文切换等方面。目前
UML 社区也正在着手提高效率,以及添加一些新的功能,例如硬件虚拟化技术支持、多处理器支持、内
存/CPU 热插拔以及内核加速模块等等。
不过 UML 的简单易用使得它成为在内核开发和调试中的好帮手。因为 UML 本身只是一个进程,所
以还可以使用已有的调试工具例如 GDB 来调试崩溃时的状态。另外,我们也可以使用 UML 搭建一个虚
拟网络环境,从而方便的测试各种服务是否工作正常。在教学上,UML 也是一个不错的选择。

容器(Container)虚拟化技术
容器虚拟化技术,也被看作是一种操作系统级别的虚拟化。它和前面所述各类开源虚拟化产品的主
要区别在于,虚拟化的对象不是实际的物理资源(处理器、内存和外设),而是从用户角度出发而抽象
的操作系统内部资源,例如:
● 独立的根文件系统
● 独立的权限控制,例如用户和组管理

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 50


开源社区

● 独立的进程集合,例如进程号
● 独立的网络访问能力
● 独立的 IPC 对象
上述模块的分离需要操作系统内核的配合,因为它们和内核内部的功能逻辑紧密相关。例如进程号
在 Linux 内核中就只是一个全局的名字空间,类似的例子还有根文件系统。 Linux 内核本身需要逐
步在类似资源上允许多个名字空间的存在,然后才能真正给每个用户模拟出单独的用户空间。事实上,
就象前面介绍的泛虚拟化技术一样,容器技术在 2006 年的 OLS 内核峰会上也是一个讨论热点。这方面的
几大代表(例如 Linux-VServer 和 OpenVZ)最终同意共同努力,定义出一个通用的架构,来增强 Linux
内核在容器技术方面的支持。
基于上面的介绍,容器技术的优点在于效率,因为它更多体现在操作系统本身在资源管理上的隔离。
但是其缺点也显而易见,无法支持不同操作系统的同时运行,因为容器技术并不涉及对内核级别的虚拟
化。如果用户只希望基于单一操作系统,例如 Linux 来构建虚拟环境,容器技术是不错的选择。而如何使
容器技术成为一个跨操作系统的标准,现在还没有看到明显的答案。

虚拟化技术对Linux内核的影响
前面我们提到,虚拟化技术有两大方向:泛虚拟化和完全虚拟化。对于完全虚拟化技术来说,客户
操作系统仍然认为自己运行在一个真实的硬件平台上,所以并不需要修改。但是对于泛虚拟化技术而言,
客户操作系统的配合好坏决定了最终的效率高低。而开源 Linux 为这方面的实践提供了最佳平台。事实
上早期对泛虚拟化的研究也主要在 Linux 上进行,英国剑桥大学的 Xen 项目就是一个典型。
对 Xen 的研究,尤其是它比二进制翻译(Binary Translation)良好的性能,引起了众多的操作系统
及虚拟机研究人员的注意。目前最大的虚拟化解决方案提供商 Vmware 公司(此前以二进制翻译为主要虚
拟化方法)也开始研究泛虚拟化技术,并在 2005 年的 OLS(Ottawa Linux Symposium)上提出了标准虚拟
化接口(Virtual Machine Interface 简称 VMI)的问题。通过 VMI, 泛虚拟化的客户机操作系统可以运
行在不同的 hypervisor 上如图 4 所示。同样的,假如 VMI 也能被微软接受的话,将来的 Linux 和 Windows
就可以在不同的 hypervisor 上运行。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 51


开源社区

采用标准虚拟机接口的操作系统
(VMI OS)

VMI layer for VMI layer for


VMI layer for native Hypervisor 1 Hypervisor 2
(e.x. Xen) (e.x. Vmware)

Xen hypervisor Vmware hypervisor

物理机器 物理机器 物理机器


(Native Machine) (Native Machine) (Native Machine)

图 4:标准虚拟机接口下的虚拟化实现

VMI 问题引起了 Linux 掌门 Linus Torvalds, Andrew Morton 等人的兴趣,和在 OSDL(Open


Source Development Lab)及其他不同场合的讨论。问题的核心在于泛虚拟化的方法可以千差万别,又
如何定义一种标准的方案?VMI 设计的出发点是在用一个 VMI 函数去替换传统 X86 体系结构中的不可虚拟
化指令(non-virtualizable instruction),因此该方案也常被称为指令级别泛虚拟化(Instruction
Level para-virtualization)。而以 Xen 为代表的方案则在较高层次上实现泛虚拟化以追求更好的性能,
因此也被称为 API 级别泛虚拟化(Application Interface level para-virtualization)。 不管是 Xen
方案还是 VMI 方案都需要对那些与系统性能紧密相关的设备如页表、中断控制器、定时器等设备提供较
高层次上的虚拟化。
Xen 和 Vmware 的不同泛虚拟化方法讨论在 2006 年的 Linux 内核高峰会(Kernel Summit)和 OLS 上引
起了普遍的关注,双方谁也无法说服对方,直到 IBM 的 Rusty Russell 提出了一个称之为 paravirt_ops
的方法。Rusty 建议 Linux 内核实现一个通用结构,来抽象 Linux 中所有与泛虚拟化相关的部分,像上面
的提到的 MMU 管理和上下文切换等等。这个抽象结构由函数指针构成,被称作 paravirt_ops 结构。当 Li
nux 运行在虚拟环境里时,它通过特定的检测方式来确定下面的虚拟机监控器的类型,然后动态注册与之
匹配的一组泛虚拟化接口。从而实现同一客户机操作系统运行在不同的 hypervisor 甚或 Native 上。para
virt_ops 方法得到了大多数参加内核高峰会议人士的接受,如今已被包括在最新的 Linux 2.6.20 版本中。
事实上,这个抽象层诞生的目的很快就得到了体现。例如前面提到的对 KVM 的泛虚拟化支持,就是
基于这个抽象层而迅速开发出来。另外一个例子是 Lguest,它自称为世界上最简单的虚拟机监控器,它也

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 52


开源社区

是使用了 KVM 类似的结构,并基于 paravirt_ops 直观的实现了对泛虚拟化的支持。


通过上述介绍,相信读者已经对虚拟化技术有了一定了解,尤其是开源社区为虚拟化技术的发展提
供了一个最好的平台。另一方面,Linux 对虚拟化技术的主动变化也值得关注。我们可以预见,随着开源
虚拟化技术的发展,Linux 内核的结构还会有更大的变化,这种变化既表现在如何成为更高效的客户操作
系统方面,也表现为在成熟虚拟机监控器方面的努力。

作者简介
田坤,现任职于 Intel 开源软件技术中心(Intel Open Source Technology Center), 具有 3 年 Linux
内核和开源软件开发经验,目前主要从事虚拟技术相关的研发工作。
蒋运宏,现任职于 Intel 开源软件技术中心(Intel Open Source Technology Center), 具有 3 年
Linux 内核和开源软件开发经验,目前主要从事虚拟技术相关的研发工作。
董耀祖,现任职于 Intel 开源软件技术中心(Intel Open Source Technology Center), 长期从事嵌入
式系统和操作系统内核开发,目前主要从事虚拟技术相关的研发工作。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 53


知识学堂

知 识 学 堂

解读 Linux 编程库
曹江华

随着 Linux 性能的不断提升和逐渐普及,会有越来越多的人在 Linux 下从事应用软件的开发。这里笔


者根据从事 Linux 应用程序开发的经验,介绍 Linux 编程库使用的一些基础知识。

库的定义和种类

所谓编程库就是指始终可以被多个 Linux 软件项目重复使用的代码集。库是 Linux 软件开发所追求的


目标,C 语言就是一个例子,它包含了几百个可以重复使用的例程和调试程序的工具代码,其中包括函数。
如果每次编写新程序都要重新写这些函数会感到非常麻烦。使用编程库有两个主要优点,一是可以简化
编程,实现代码重复使用;二是可以直接使用许多经过调试的测试和调试工具。
Linux 下的库文件分为共享库和静态库两大类,它们两者的差别仅在程序执行时所需的代码是在运行
时动态加载的,还是在编译时静态加载的。
Linux 的库一般在/lib 或/usr/lib 目录下。lib 是库(Library)的英文缩写,它主要存放系统的链接库文
件,没有该目录则系统就无法正常运行。/lib 目录中存储着程序运行时使用的共享库。通过共享库,许多
程序可以重复使用相同的代码,并且这些库可以存储在一个公共的位置上,因此能减小运行程序的大小。
这个目录包含程序在链接时使用的各种库。图 1 是笔者/usr/lib(Red Hat Linux 9.0)目录快照。
区分库类型最好的方法是看它们的文件后缀,通常共享库以.so(Shared Object 的缩写)结尾,静态链接
库通常以.a 结尾(Archive 的缩写)。在终端缺省情况下,共享库通常为绿色,而静态库为黑色。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 54


知识学堂

图1

库的命名和编号

Linux 下开发应用程序时,绝大多数情况使用的都是 C 语言,目前 Linux 下最常用的 C 语言编译器是


GCC,它的全称是 GNU Compiler Collection,下文中的库介绍都以它为例。GCC 是直接建立在内核基础
上的,是 Linux 操作系统外层的图形界面开发工具(Qt、GTK+)和网络应用开发工具
(PHP、Prel、Python)的基础和过渡。掌握了底层开发工具,可以加快和优化外层应用开发,从而达到
开发速度和开发质量的和谐统一。
Glibc 2.3.2 是最新版的 GNU C 库。它目前不需要修改就可以在 GNU Hurd、Linux i386、m68k,以及
Alpha 系统上执行,并且从 2.1 版开始加入了对 Linux PowerPC、MIPS、Sparc、Sparc 64 等系统的支持。
如果想查看自己 Linux 计算机的 Glibc 版本可以使用下面命令:
rpm -qa|grep glibc
glibc-common-2.3.2-11.9
glibc-2.3.2-11.9
glibc-devel-2.3.2-11.9
由上可见,Red Hat Linux 9.0 使用的 Glibc 版本是 2.3.2。
1.库的命名
库的命名比较简单,第一个特点是所有的库以 lib 开头,GCC 命令在在-l 选项所指定的文件名前会
自动加入 lib。第二个特点文件名以.a 结尾的库是静态库。第三个特点文件名是.so 的库为共享库。默认情
况下,GCC 在链接时优先使用共享库,只有当共享库不存在时才考虑使用静态库。
2.库的编号

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 55


知识学堂

库的编号格式如下: library_name.major.num.minor_.min.pathch_num
例如,笔者 Red Hat Linux 9.0 的 GUN 数据库是 libgdbm.so.0.0.2,详细表述如下:
● library_name 是 libc.so(标准 C 库);
● major_num 是 2(主版本号);
● minor_.min 是 0(次版本号);
● pathch_num 是 0(补丁级别号又称发行号)。
libgdbm.so.0.0.2 所在目录是/usr/lib,其大小是 24576 字节,这是一个 ELF(Executable and Linking
Format)格式的二进制格式文件,运行时由系统将其装入内存开始执行。
ELF 有三种主要类型:
● 适于连接的可重定位文件(Relocatable File),可与其它目标文件一起创建可执行文件和共享目标文
件。
● 适于执行的可执行文件(Executable File),用于提供程序的进程映像,加载的内存执行
● 共享目标文件(Shared Object File),连接器可将它与其它可重定位文件和共享目标文件连接成其它的
目标文件;动态连接器又可将它与可执行文件和其它共享目标文件结合起来创建一个进程映像。

库操作命令
Linux 库操作可以使用命令完成,目前常用的命令是 ldd 和 ldconfig。
1.ldd
ldd 是 Library Dependency Display 缩写,它的作用是显示一个可执行程序必须使用的共享库。
(1)命令格式 ldd [选项] 文件名
(2)主要参数 -d 执行重定位并报告丢失的函数。
-r 执行对函数和数据对象的重定位,并报告丢失的函数和数据对象。
(3)应用实例
Perl 语言是开发者喜欢使用的一种“胶水语言”(能够将许多元素连接在一起,因此它具有极强的适
应性),如果需要查询有哪些共享库,则可以首先使用 find 命令查询这个程序的绝对路径,然后使用 ldd
命令:
#find -name perl
ldd /usr/bin/perl
其结果见图 2 所示。图 2 中,箭头左边的一列显示的是 Prel 语言所需的.so 文件名, 箭头右边的一列显示是
库的真实库名称。应用程序链接到库的 so 名字是到实际库的符号链接。以第二行为例,最后的
0x40014000 是库 libperl.so 的加载地址。由此可以看到,运行 Perl 语言需要 9 个共享库。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 56


知识学堂

图2

2.ldconfig
ldconfig 命令的作用是决定位于目录/usr/lib 和/lib 下的共享库所需的运行链接。这些链接保存在的
Libs 保存在/et/ld.so.conf 文件中。搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入
程序(ld.so)所需的链接和缓存文件。缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名
字列表。
(1)命令格式 ldconfig [选项] [libs]
(2)主要选项
-v 或--verbose ldconfig 将显示正在扫描的目录、搜索到的动态链接库,以及它所创建的连接的名字。
-f CONF 指定动态链接库的配置文件为 CONF,系统默认为/etc/ld.so.conf。
-C CACHE 指定生成的缓存文件为 CACHE,系统默认的是/etc/ld.so.cache,文件存放已排好序的可共享的
动态链接库的列表。
-p 或--print-cache 让 ldconfig 打印出当前缓存文件所保存的所有共享库的名字。
-r ROOT 改变应用程序的根目录为 ROOT。
-n ldconfig 仅扫描命令行指定的目录,不扫描默认目录(/lib、/usr/lib),也不扫描配置文件/etc/ld.so.conf 所
列的目录。
没有选项的 ldconfig 命令时,用于更新高速缓冲文件。这个命令主要用于高速缓冲 DNS 服务器
(Caching DNS Server)。高速缓冲 DNS 服务器的原理是提供查询的历史记录,并且利用这些记录来提高查
询的效率。当某个查询是第一次被发送到高速缓冲 DNS 服务器时,高速缓冲 DNS 服务器就将此查询的整

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 57


知识学堂

个过程记录下来,在一定的时期内用它来回答所有相同的查询,从而减少整个 DNS 系统的负担并且提高


查询速度。
(3)应用实例
如果用户想知道系统中有哪些动态链接库,或者想知道系统中有没有某个动态链接库时,可用-p 选
项让 ldconfig 输出缓存文件中的动态链接库列表,从而查询得到。
ldconfig -p
998 libs found in cache `/etc/ld.so.cache'
libzvt.so.2 (libc6) => /usr/lib/libzvt.so.2
libzvt.so (libc6) => /usr/lib/libzvt.so
……
ldconfig 命令输出结果表明,在缓存文件/etc/ld.so.cache 中找到 998 个共享库,下一行开始便是一系列
共享库的名字及其全名(绝对路径)。因为实际输出结果很多,为节省篇幅以“……”表示省略的部分。

库的升级
Linux 系统软件更新很快,新的核心几乎每几个星期就公布一次,其它软件的更新也是非常频繁。多
数情况下,盲目跟随潮流的升级并不必要,如果确实需要新版本的特性时再升级。换句话说,不要为了
升级而升级。Linux 系统中多数软件都是用共享库来编译的,其中包含了在不同程序之间共享的公用子例
程。
在运行某个程序时,如果看到如下信息:“Incompatible library version.”则表明需要将该库升级到
程序所需要的版本。库是向下兼容的,也就是说,用老版本库编译的程序可以在新安装的版本库上运行,
反之则不行。
Linux 库函数的升级是一项重要的工作,往往与其它软件包的升级有一定关联作用,所以操作前一定
要备份文件。下面看一下如何把 Glibc 2.2.4.13 升级至 2.3.2 版本,其过程如下:

1.下载.gz 压缩文件并解压
在 GUN C 网站下载的四个.gz 压缩文件,解压至一临时目录中:
cd /usr/caolinux
tar xzvf glibc-2.3.2.tar.gz
cd glibc-2.3.2
tar xzvf ../glibc-linuxthreads-2.3.2.tar.gz
tar xzvf ../glibc-crypt-2.3.2.tar.gz
tar xzvf ../glibc-localedata-2.3.2.tar.gz
2.建立库函数的安装目录

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 58


知识学堂

mkdir /usr/higlibc
cd /usr/higlibc
3.建立编译目录
mkdir cao
cd cao
./configure --enable-add-ons=linuxthreads,crypt,localedata -prefix
=/usr/higlibc
4.编译与安装
make
make check
make install
编译与安装过程根据计算机硬件配置不同,从 10 分钟到几十分钟不等。
5.改变数据库的链接
ln -s /usr/higlibc/lib/ld-linux.so.2 /lib/ld-linux.so.2
然后,修改/etc/ld.so.conf,加入一行/usr/higlibc/lib,执行下面代码:
ldconfig -v
更新/etc/ld.so.cache 的内容,列出每个库的版本号,扫描目录和所要创建及更新的链接。
6.更改 GCC 设置
cd /usr/lib/gcc-lib
cp -r i386-redhat-linux higlibc
7.更新符号链接
cd /usr/higlibc/include
ln -s /usr/src/linux/include/linux
ln -s /usr/src/linux/include/asm
ln -s /usr/X11R6/include/X11
8.测试
编写一个简单的 C 程序测试一下,除了头文件只需一条 printf 语句即可:
#include <stdio.h>
int main(void)
{ printf ("Hello , Linux !\n");
return 0;}
然后用 GCC 编译一次,当程序出现如下运行结果,则说明已经正确地升级了。
“Hello, Linux !”
以上五部分分别介绍了 Linux 库的定义属性、“标准”库的命名和编号约定、经常使用的库、与库
操作相关命令的作用,以及库升级的步骤,希望能对初学 Linux 的开发者有所帮助。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 59


知识学堂

重读 2.4 内核(2)

贺永利(来自 Linuxpk.com 程序设计版主 hyl)

这是很早的时候看的两个文件,extable.c ioremap.c. 如果是单看这里的说明许感觉过于简单,其实在


论坛里充斥了对 .fixup section 的讨论,注意去寻找下。
一./arch/i386/extable.c
内核总要和用户打交道,比如从用户提供的 buffer 中拷贝数据等等。为了保证 kernel 的安全,这
种操作需要格外小心。 有可能用户提供的 buffer 没有初始化,或者是空指针,无论如何内核都应该能应
对这种事情。

看一个例子,arch/i386/lib/usercopy.c
#define __do_strncpy_from_user \
do { \
int __d0, __d1, __d2; \
__asm__ __volatile__( \
" testl %1,%1\n" \
" jz 2f\n" \
"0: lodsb\n" \
" stosb\n" \
" testb %%al,%%al\n" \
" jz 1f\n" \
" decl %1\n" \
" jnz 0b\n" \
"1: subl %1,%0\n" \
"2:\n" \
".section .fixup,\"ax\"\n" \
"3: movl %5,%0\n" \
" jmp 2b\n" \
".previous\n" \
".section __ex_table,\"a\"\n" \
" .align 4\n" \
" .long 0b,3b\n" \
".previous" \
: "=d"(res), "=c"(count), "=&a" (__d0), "=&S" (__d1), \

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 60


知识学堂

"=&D" (__d2) \
: "i"(-EFAULT), "0"(count), "1"(count), "3"(src), "4"(dst) \
: "memory"); \
} while (0)

首先注意到.section .fixup 链接指令将修复内核的代码放入代码断.fixup, 将一个对应关系 0b,3b(这是


内嵌汇编的 label)放入 section __ex_table, 意思是说,如果 0b 出现 page fault,GP 错误等就跳转到 3b 执行。
而/arch/i386/extable.c 正是实现在__ex_table 中查找 0b 返回 3b 的功能.代码极为简单不再列举代码. 只
是注意,内核模块也是内核的一部分,也会有这种事情需要处理,这个文件中也有对模块进行搜索查找。
文件提供的函数 search_exception_table 在 do_page_fault,do_trap,do_general_protection 都有使用,正是这
一机制的具体实现。

二.arch/i386/ioremap.c
参考 LDD2, ch8, Software-Mapped I/O Memory。
比如 isa 设备和 pci 设备,或者是 fb,硬件的跳线或者是物理连接方式决定了硬件上的内存影射到的
cpu 物理地址。
在内核访问这些地址必须分配给这段内存以虚拟地址,这正是__ioremap 的意义所在,需要注意的是,
物理内存已经"存在"了,无需 alloc page 给这段地址了。
文件中的注释也是比较详尽的,并且只暴露了__ioremap,iounmap 两个函数供其他模块调用,函数
remap_area_pte,remap_area_pmd,remap_area_pages 只为__ioremap 所用.
/*
* 映射指定的物理地址的一段内存到内核的虚拟地址.
* 内核如果需要直接访问 high address 的内存则也需要这个函数先映射一下.
*
* NOTE! We need to allow non-page-aligned mappings too: we will obviously
* have to convert them into an offset in a page-aligned mapping, but the
* caller shouldn't need to know that small detail.
*/
void * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags)
{
void * addr;
struct vm_struct * area;
unsigned long offset, last_addr;

/*先做各种检查*/
/* Don't allow wraparound or zero size */

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 61


知识学堂

last_addr = phys_addr + size - 1;


if (!size || last_addr < phys_addr)
return NULL;
/*
* Don't remap the low PCI/ISA area, it's always mapped..
*/
if (phys_addr >= 0xA0000 && last_addr < 0x100000)
return phys_to_virt(phys_addr);
/*
* Don't allow anybody to remap normal RAM that we're using..
*/
if (phys_addr < virt_to_phys(high_memory)) {
//by the way :virt_to_phys 只能用于 HIGH MEM 以下
//如果要映射小于 HIMEM 的物理地址,绝对要禁止映射普通的 ram
char *t_addr, *t_end;
struct page *page;
t_addr = __va(phys_addr);
t_end = t_addr + (size - 1);
for(page = virt_to_page(t_addr); page <= virt_to_page(t_end); page++)
if(!PageReserved(page)) //只容许映射 reserved 的页面
return NULL;
}
/*
* 然后对映射地址页对齐
*/
offset = phys_addr & ~PAGE_MASK;
phys_addr &= PAGE_MASK;
size = PAGE_ALIGN(last_addr) - phys_addr;
/*
* 接下来,分配虚拟地址给这段物理内存
*/
area = get_vm_area(size, VM_IOREMAP);
if (!area)
return NULL;
addr = area->addr;
/* 最后,遍历设置这段空间所涉及的 pgd, pmd, pte

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 62


知识学堂

* 则大功告成.
*/
if (remap_area_pages(VMALLOC_VMADDR(addr), phys_addr, size, flags)) {
vfree(addr);
return NULL;
}
return (void *) (offset + (char *)addr);
}
就不深入进去细说 remap_area_pte,remap_area_pmd,remap_area_pages 了。
顺便说说内存的划分和管理. linux 内核在 3G(PAGE_OFFSET)以上, 如果全部映射为普通 ram 也只能
管理 1G 的物理内存. 所以就保留了 vmalloc 的空间,最多容许映射 MAX_MEM 的物理内存. 参见 arch/i386/
kernel/setup.c 的定义:
#define MAXMEM (unsigned long)(-PAGE_OFFSET-VMALLOC_RESERVE)
#define MAXMEM_PFN PFN_DOWN(MAXMEM)

内核使用的缓冲区可以使用 vmallc 分配,如果需要直接访问某个 MAX_MEM 地址以上


的物理地址,也可以映射到这段空间,如这里的 ioremap.
virt_to_phys 只能应用在 high_memory 以下的虚拟地址上. 变量 high_memory 是在系统启动过程中初
始化的. 见 arch/i386/kernel/setup.c 函数 setup_arch 679 行
max_low_pfn = max_pfn;
if (max_low_pfn > MAXMEM_PFN) {
max_low_pfn = MAXMEM_PFN; //最多映射 MAXMEM_PFN 个物理页面
................
(注意 max_low_pfn 这里是局部变量)
如果系统拥有超过 MAXMEM 的物理内存,内核则无法直接映射(即 virt_to_phys 失效).max_low_pfn 如
果大于 MAXMEM_PFN(即物理地址>MAXMEM,映射不了了)就只映射 MAXMEM_PFN 个页面,如果系统
中还没到这么多内存,则有多少映射多少.
max_low_pfn 在 setup_arch 712 行:传递给 init_bootmem
...............
bootmap_size = init_bootmem(start_pfn, max_low_pfn);
...............
init_bootmem 随后赋值给变量 max_low_pfn(bootmem.c 的全局变量). 最后,
arch/i386/mm/init.c 函数 mem_init, 568 行,
................

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 63


知识学堂

high_memory = (void *) __va(max_low_pfn * PAGE_SIZE);


................

将 max_low_pfn 转换成虚拟地址赋予 high_memory.


回到__ioremap 中来看看这段检查.
...................
/*
*Don't allow anybody to remap normal RAM that we're using..
*/
if (phys_addr < virt_to_phys(high_memory)) {
//by the way :virt_to_phys 只能用于 HIGH MEM 以下
//如果要映射小于 HIMEM 的物理地址,绝对要禁止映射普通的 ram
...................
原作者注释 Don't allow anybody to remap normal RAM that we're using..
什么是 RAM that we're using..?
根据以上分析,如果 phys_addr 小于 virt_to_phys(high_memory)意为着正在映射内核已经映射了的物理
页面,除非页面是 Reserved 属性(保留页,如 bios 数据区). 已经映射过了, 内核"随时使用",当然不容许再次映
射. 如果 phys_addr>virt_to_phys(high_memory),内核通过 vmalloc 使用,ioremap 也容许映射这些 ram 页面,不
过有点怪怪的,应该禁止。

以上通过对 HIGHMME 的简单分析解释 virt_to_phys 的使用范围,并解释 ioremap 所作检查的意义. 下


面回到 linux 内存的话题上,来注意一个问题:
虽然 virt_to_phys 不能处理 high_memory 以上的虚拟地址,但是那些不能映射的物理页面的管理结构
page,依然在 mem_map 的数组里. 那些虚拟地址只有通过 pte 来获取真正的物理地址.而 page 的虚拟地址也
不适用 phys_to_virt,只能通过 page->virtual 获得。
void iounmap(void *addr)
{
if (addr > high_memory) //get_vm_area 获取的虚拟地址必然大于 high_memory
return vfree((void *) (PAGE_MASK & (unsigned long) addr));
}

其实就是 vfree 啦.代码参见 mm/vmalloc.c,这里不再罗列. 和 remap_area_pages 类似,遍历涉及到的


pgd,pmd,pte 释放相关页面.只需要看看这个 static inline void free_area_pte(pmd_t * pmd, unsigned long
address, unsigned long size)

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 64


知识学堂

{
pte_t * pte;
unsigned long end;
if (pmd_none(*pmd))
return;
if (pmd_bad(*pmd)) {
pmd_ERROR(*pmd);
pmd_clear(pmd);
return;
}
pte = pte_offset(pmd, address);
address &= ~PMD_MASK;
end = address + size;
if (end > PMD_SIZE)
end = PMD_SIZE;
do {
pte_t page;
page = ptep_get_and_clear(pte);
address += PAGE_SIZE;
pte++;
if (pte_none(page))
continue;
if (pte_present(page)) {
struct page *ptpage = pte_page(page);
if (VALID_PAGE(ptpage) && (!PageReserved(ptpage)))
//VALID_PAGE 检查此区域是否分配了 ram 页面,
//ioremap 可以影射 vm_area 为 io 内存
//如果是 VALID_PAGE(pagenr<max_mapnr)
__free_page(ptpage);
continue;
}
printk(KERN_CRIT "Whee.. Swapped out page in kernel page table\n");
} while (address < end);
}
只来关心一下其中加了注释的一小段,
.........

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 65


知识学堂

if (VALID_PAGE(ptpage) && (!PageReserved(ptpage)))


//VALID_PAGE 检查此区域是否分配了 ram 页面,ioremap 可以影射
//vm_area 为 io 内存
//如果是 VALID_PAGE(pagenr<max_mapnr)
__free_page(ptpage);
........
如果对应 ioremap 的操作可以知道,vmalloc 的空间被 ioremap"借用",所以这段虚拟地址上可能出现
reseved 的页面,也可能出现 not valid 之页面,也可能出现 ram 页面(vmalloc). 所以 vfree 释放页面的时候需要
检查,只释放"真正的 RAM"页面即那些 HIGHMEM 页面.VALID_PAGE 确保页面的 mapnr 在 mem_map 数组
空间范围之内,亦即,页面是在所有 RAM 页面构成的地址范围内.这个范围中可能存在 reseved 的页面. 除去
这些保留页,就可以放心的 free 了。
再注意一下,虽然地址大于 virt_to_phy(high_memory)的物理页面无法使用,phy_to_virt,virt_to_phy 互
相转换,但是依然在 mem_map 的管理之下。
小提一下 pmd_bad,个人认为此宏是一个例行 check,理由如下:
1、没有任何内核代码将一个 pmd 写成非法等着 pmd_bad 去检查
2、出现 pmd 错误则产生一个 log 信息,足以证明此猜想.

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 66


桌面应用

桌 面 应 用

《Linux 一句话精彩问答》是 Linux 初学者很好的入门文档,想必很多朋友当时都是边看该文档,边


敲打键盘,玩着 Linux 过来的。该文档由本刊副总编陈绪主编,迄今已经收录近千个精彩问答。从本期
开始将在桌面应用栏目进行连载,希望能帮助到更多刚接触到 Linux 的朋友们。

Linux 一句话精彩问答 ——系统配置篇(1)

陈绪
鉴于目前中国 linux 的发展水平,90%以上的问题均可以用一句话作答,此为本文初衷。
1001 修改主机名
vi /etc/sysconfig/network,修改 HOSTNAME 一行为"HOSTNAME=主机名"(没有这行?那就添加这一行吧),
然后运行命令"hostname 主机名"。一般还要修改/etc/hosts 文件中的主机名。这样,无论你是否重启,
主机名都修改成功。
1002 修改 linux 启动方式(文本方式或 xwindow 方式)
vi /etc/inittab,找到 id:x:initdefault:一行,x=3 为文本方式 x=5 为 xwindow 方式,重启机器即可
生效。
1003 linux 的自动升级更新问题
对于 redhat,在 www.redhat.com/corp/support/errata/找到补丁,6.1 以后的版本带有一个工具
up2date,它能够测定哪些 rpm 包需要升级,然后自动从 redhat 的站点下载并完成安装。 升级除 kernel
外的 rpm: up2date –u
升级包括 kernel 在内的 rpm: up2date -u –f
最新的 redhat 和 fedora 可以使用 yum 命令或者 yumex 图形前端来升级更新。
Gentoo 升级方法
更新 portage tree: emerge –sync
更新/安装软件包: emerge [软件包名] (如安装 vim: emerge vim)
Debian 跟别的发行版还是有很大的差别的,用 Debian 做服务器维护更加方便。Debian 下升级软件:
apt-get update
apt-get upgrade
前提:配置好网络和/etc/apt/sources.list,也可以用 apt-setup 设置。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 67


桌面应用

1004 windows 下查看 linux 分区的软件


Paragon.Ext2FS.Anywhere.2.5.rar 和 explore2fs-1.00-pre4.zip
现在不少 Linux 发行版安装时缺省基于 LVM 建分区,所以 explore2fs 也与时俱进地开始支持 LVM2:
http://www.chrysocome.net/downloads/explore2fs-1.08beta9.zip
1005 mount 用法
fat32 分区 mount -o codepage=936,iocharset=cp936 /dev/hda7 /mnt/cdrom
ntfs 分区 mount -t ntfs -o codepage=936,iocharset=cp936 /dev/hda7 /mnt/cdrom
iso 文件 mount -o loop /abc.iso /mnt/cdrom
软盘 mount /dev/fd0 /mnt/floppy
usb mount /dev/sda1 /mnt/cdrom
cd 光驱 mount -t iso9660 -o iocharset=cp936,ro /dev/cdrom /mnt/cdrom
dvd 光驱 mount -t iso9660 -o iocharset=cp936,ro /dev/dvd /mnt/cdrom 或 mount -t udf
/dev/dvd /mnt/cdrom
注意:dvd 的格式一般为 iso9660 或 udf 之一
在有 scsi 硬盘的计算机上,应该先用 fdisk -l /dev/sd? 来看看到底 usb 闪存盘是在哪个设备下(通常
会是 sdb1 或者 sdc1)。
所有/etc/fstab 内容 mount –a,此命令还可以指定文件格式"-t 格式", 格式可以为 vfat, ext2,
ext3 等
例如,要自动将 windows 的 d 盘挂到/mnt/d 上,用 vi 打开/etc/fstab,加入以下一行
/dev/hda5 /mnt/d vfat defaults,codepage=936,iocharset=cp936 0 0
注意,先得手工建立一个/mnt/d 目录
1006 访问远程共享的目录
将如下的行放到/etc/fstab 中:
//ip/share1 /mnt/d smbfs defaults,auto,username=name,password= pass 0 0
其中 ip 是远程机器的 ip 地址,是 share1 该机器共享目录的共享名,/mnt/d 是要将该分区 mount 到本地
linux 的目录,name 和 pass 是可以访问该共享目录的用户名和密码。
1007.a 删除名为-a 的文件
1 rm ./-a
2 rm -- -a,--告诉 rm 这是一个选项,具体参见 getopt
3 ls -i 列出 inum,然后用 find . -inum inum_of_thisfile -exec rm '{}' \;
1007.b 删除名为\a 的文件
rm \\a

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 68


桌面应用

1007.c 删除名字带的/和‘\0'文件
这些字符是正常文件系统所不允许的字符,但可能在文件名中产生,如 unix 下的 nfs 文件系统在 Mac 系
统上使用
1 把 nfs 文件系统在挂到不过滤'/'字符的系统下,删除含特殊文件名的文件;
2 将错误文件名的目录其它文件移走,ls -id 显示含该文件目录的 inum,umount 文件系统,clri 清除
该目录的 inum,fsck,mount,检查 lost+found 目录,将其中的文件更名。
另外,可以通过 windows ftp 过去删除任何文件名的文件
1007.d 删除名字带不可见字符的文件
列出文件名并转储到文件:ls -l > del.sh
然后编辑文件的内容加入 rm 命令使其内容成为删除上述文件的格式:
vi del.sh
rm -rf *******
执行 sh del.sh
1007.e 删除文件大小为零的文件
1 rm -i `find ./ -size 0`
2 find ./ -size 0 -exec rm {} \;
3 find ./ -size 0 | xargs rm -f &
4 for file in * #自己定义需要删除的文件类型
do
if [ ! -s ${file} ]
then
rm ${file}
echo "rm $file Success!"
fi
done
1008 redhat 设置滚轮鼠标
1 进入 x 后,选择鼠标的配置,选择 wheel mouse (ps/2)就可以了,如果鼠标表现异常,重启计算机即
可;
2 直接 su, vi /etc/X11/XF86Config, 把 PS/2 改成 ImPS/2。
1009 加装 xwindow
用 linux 光盘启动,选择升级,然后单独选择包,安装即可。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 69


桌面应用

1010 删除 linux 分区
1 做一张 partition magic 的启动软盘,启动后删除;
2 用 win2000 的启动光盘启动,然后删除。
1011 如何退出 man
q
1012 不编译内核,mount ntfs 分区
找到对应内核版本(uname -a)的 ntfsrpm,安装即可。
以原装 rh8 为例,未升级或编译内核
1. 上 google.com 搜索并下载 kernel-ntfs-2.4.18-14.i686.rpm
2. rpm -ivh kernel-ntfs-2.4.18-14.i686.rpm
3. mkdir /mnt/c
4. mount -t ntfs /dev/hda1 /mnt/c

Read only: http://linux-ntfs.sourceforge.net/
Read/Write: http://www.jankratochvil.net/project/captive/
1013 tar 分卷压缩和合并
以每卷 500M 为例
tar 分卷压缩:tar cvzpf - somedir | split -d -b 500m (-d 不是 split 的选项,是 shell 的选项,表
示将 tar 命令的输出作为 split 的输入)
tar 多卷合并:cat x* > mytarfile.tar.gz
1014 使用 lilo/grub 时找回忘记了的 root 口令
1.在系统进入单用户状态,直接用 passwd root 去更改;
2.用安装光盘引导系统,进入 linux rescue 状态,将原来/分区挂接上来,命令如下:
cd /mnt
mkdir hd
mount -t auto /dev/hdaX(原来分区所在的分区号) hd
cd hd
chroot ./
passwd root
这样可以搞定;
3.将本机的硬盘拿下来,挂到其他的 linux 系统上,采用的办法与第二种相同
以 rh8 为例,演示第 1 种方法如下:

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 70


桌面应用

一. lilo
1 在出现 lilo: 提示时键入 linux single
画面显示 lilo: linux single
2 回车可直接进入 linux 命令行
3 vi /etc/shadow
将第一行,即以 root 开头的一行中 root:后和下一个:前的内容删除,
第一行将类似于
root::......
保存
4 reboot 重启,root 密码为空
二. grub
1 在出现 grub 画面时,用上下键选中你平时启动 linux 的那一项(别选 dos),然后按 e 键;
2 再次用上下键选中你平时启动 linux 的那一项(类似于 kernel /boot/vmlinuz-2.4.18-14 ro
root=LABEL=/),然后按 e 键;
3 修改你现在见到的命令行,加入 single,结果如下:
kernel /boot/vmlinuz-2.4.18-14 single ro root=LABEL=/
4 回车返回,然后按 b 键启动,即可直接进入 linux 命令行
5 vi /etc/shadow
将第一行,即以 root 开头的一行中 root:后和下一个:前的内容删除,
第一行将类似于
root::......
保存
6 reboot 重启,root 密码为空。
1015 使 ctrl+alt+del 失效
vi /etc/inittab
将 ca::ctrlaltdel:/sbin/shutdown -t3 -r now 这行注释掉。
1016 查看 redhat 的版本号
cat /proc/version 或 cat /etc/redhat-release 或 cat /etc/issue。
1017 查文件属于哪个 rpm
上 www.rpmfind.net 上搜,或者 rpm -qf 文件名得到。
1018 将 man 或 info 的信息存为文本文件
以 rpm 命令为例:

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 71


桌面应用

man rpm | col -b > rpm.txt


info rpm -o rpm.txt –s
1019 利用两个现存文件,生成一个新的文件
1. 取出两个文件的并集(重复的行只保留一份)
cat file1 file2 | sort | uniq
2. 取出两个文件的交集(只留下同时存在于两个文件中的文件)
cat file1 file2 | sort | uniq -d
3. 删除交集,留下其他的行
cat file1 file2 | sort | uniq –u
1020 设置 com1 口,让超级终端通过 com1 口进行登录
第一步:确认有/sbin/agetty,编辑/etc/inittab,添加
7:2345:respawn:/sbin/agetty /dev/ttyS0 9600
9600bps 是因为连路由器时缺省一般都是这种速率,也可以设成
19200、38400、57600、115200
第二步:修改/etc/securetty,添加一行:ttyS0,确保 root 用户能登录
第三步:重启机器,就可以拔掉鼠标键盘显示器(启动时最好还是要看看输出信息)了

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 72


桌面应用

开源世界中的 FreeProxy

Kakaryan

在开源世界中有很多软件能实现代理功能,从 iptables 之类的防火墙到 squid 之类的代理软件都能实


现各种各样的代理功能,但是它们配置难度比较大,而且在很多时候都显得是大材小用,有没有什么办
法能够快速方便的定制出自己需要的代理服务器呢?下文将为您介绍一些更加方便快捷的代理软件。

一.kingate
kingate 是一款国人开发的代理服务器。

我们先看看 kingate 的介绍:


kingate 是一个代理服务器,能代理多种协议,包括:http,https,socks,ftp,pop3,smtp,telnet,dns。能运行在
linux,freebsd,...及其它类 unix,还有 windows(最新版本要求 nt 4.0 以上)操作系统上
kingate 是一个多线程的程序(采用线程池的方式),所以短时间内大量的连接请求,kingate 还能保持很高
的性能。
kingate 还支持 tcp 端口映射,可以实现别人访问你的内网主机。
kingate 有强大的规则控制,包括源 IP 地址,目的 IP 地址,目的端口,及采用的代理协议。
kingate 也支持时间控制。即可以设置什么时间内,所设置的规则才有效。
kingate 内置了用户认证,以及记录用户的使用情况,包括用户的使用时间,接收和发送的数据量,
可以很容易实现对用户的记费。
kingate 采用 http 来进行管理,使得管理 kingate 及查看运行信息变得一件很轻松的事情,也可以远程
管理。
kingate 还支持内存及硬盘共二级缓存(仅限 http 代理).
最新版本的 kingate 还可以用来加速 web 服务器(采用缓存原理)。提升你的 web 服务器的性能。

我们可以在 http://sourceforge.net/projects/kingate/ 下载到它的最新版本,最新版本是 1.6


解压,安装:
#tar zxvf kingate-1.6.tar.gz
#cd kingate-1.6
#./configure
#make
#make install

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 73


桌面应用

修改配置文件:
vim /usr/local/etc/kingate.conf
具体的配置里面有较详细的说明,我说说几个需要注意的地方:
#if you don't want open one service ,please set it off
http on
ftp on
pop3 on
smtp on
telnet on
socks on
mms on
rtsp on
manage on
如需关闭某项服务,直接把 on 改为 off 就可以了
#bind_addr 这个是你需要绑定的 ip 地址
max_per_ip 0 这个用来限制每 ip 同时最多的连接数,0 表示不限制
http_port 8082 这是 http 代理端口,其他的也一样设置
socks5_user off 设置是否在 socks 中运用用户认证
其他的自己设置合理的端口以及端口重定向功能等
现在可以启动 kingate 了。
#/usr/local/bin/kingate
如图 1 表示成功运行了。

停止服务运行
#/usr/local/bin/kingate -q
我们用 QQ 测试下代理是否可用。如图 2 代理已成功配置并运行了

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 74


桌面应用

kingate 还为我们提供了非常方便的 HTTP 的管理方式


先修改下配置文件
#vim /usr/local/etc/access.conf
first deny
model deny
{ manage * 10.1.72.30 * }
model allow
{****}
把自己的 ip 加进去,重起下 kingate.就可以通过 http://kingate 代理服务器 IP 地址:manage 代理端口/
进行控制了。
如图 3

二.tinyproxy
tinyproxy 是一个小型的基于 GPL 的 http/ssl 代理程序,在非常适合小型网络而且便于快速部署。这个代理
程序的最大优点是占用系统资源比较少。
tinyproxy 的安装和普通 Linux 程序的安装方法一样
都是这样三步
./configure
在 configure 的时候常用的几个参数
--enable-debug 调试选项
--enable-socks 打开 socks 支持
--enable-filter 允许 tinyproxy 过滤一些指定的网站

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 75


桌面应用

--enable-upstream 允许二级代理
--enable-transparent-proxy 允许作为一个转发代理
然后 make 和 make install
安装成功后启动程序在/usr/local/sbin/tinyproxy,但是要先配置其配置文
档/usr/local/etc/tinyproxy/tinyproxy.conf
## 下面是一些必须的配置
● 启动 tinyproxy 守护进程使用的用户和用户组
User nobody
Group nogroup
● 监听端口
Port 1080
● 如果你使用了双网卡,你就要为 tinyproxy 指定其中一个网卡的 IP,一般是能够连接外网的 IP
Listen 10.1.27.10
● 指定允许连接代理的 IP 和 IP 段
Allow 127.0.0.1
Allow 192.168.1.0/25
Allow 10.1.72.91
Allow 10.1.72.30
Allow 10.1.200.12

完成配置以后可以 netstat -an|grep 1080 来看看端口是否打开


tcp4 0 0 10.1.27.10.1080 *.* LISTEN
就表示端口已经打开了,测试能不能连接。
也可以让 tinuproxy 开机启动
ln -s /usr/local/sbin/tinyproxy /etc/rc.d/

三.socks5
在北大天网搜索 socks5-v1.0r11.tar.gz 有很多 socks 的安装包。
我们下到我们的 linux 服务器上
解压,安装:
#tar zxvf socks5-v1.0r11.tar.gz
#cd socks5-v1.0r11
#./configure
#make

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 76


桌面应用

#make install
建立配置文件
#cd examples
#cp socks5.conf.singlehomed /etc/socks5.conf
这个配置文件是实现的匿名 socks5 的代理。里面的配置非常的简单,大家可以自行修改。
我们启动代理
#socks5 -t
如果需要关闭代理,运行
#stopsocks -KILL
代理也就关闭了
我们测试下这个代理是否生效,默认的端口是 1080
测试通过,我这就不截图了。

4.tsocks
tsocks 也是现在 sourceforge 上比较流行的一个代理程序,配置简单,功能也一点不少。
tar zxvf tsocks-<version>.tar.gz
然后运行./configure,make,make install 还是这样的几步。
主要了解一下配置文档:
● 设置连接的 IP 或者 IP 段
local = 192.168.0.0/255.255.255.0
local = 10.0.0.0/255.0.0.0
● 监听 IP
server = 192.168.0.1
● tsocks 默认使用 socks4 协议,我们需要制定使用 socks5
server_type = 5
● 监听端口
server_port = 1080

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 77


桌面应用

逐渐成熟的桌面 Linux

微电脑世界 刘超

在桌面 Linux 的一阵泡沫过去以后,国内的 GNU/Linux 厂商们把自己的市场战略方向纷纷转向了嵌


入式系统开发、定制服务以及 OEM 市场,希望藉此来获取利润,等待市场的复苏。因为在嵌入和定制服
务方面正是 GNU/Linux 的优势所在。OEM 则是通过在台式 PC 上预装桌面版的 GNU/Linux 操作系统来代
替 Windows 操作系统,所以有不少 Linux 厂商试图在被 Windows 占领已久的市场上抢得一席之地。最近,
我们从一部分 Linux 厂商公布的数据中得知,该 OEM 市场的增长情况非常可观。期待桌面 Linux 大放光
彩的人们一边为之庆幸,一边又不得不冷静下来细想:GNU/Linux 究竟发展到了什么样的程度?它还需
要做哪些方面的工作才能走向大规模的市场化?

自由的利弊与 Linux 架构
不管桌面 Linux 市场如何变化,自由软件世界的开发者们总是充满热情,他们按照 GNU 的思想把
GNU/Linux 和许多自由软件发展下去,一点点地走向成熟,就像以前 Linux 在服务器市场获得的巨大成功
一样。自由是 Linux 开发中最大的优点,同时也是最大的不足。优点在于,Linux 的开发可以不受太多外
界因素的影响,从而得到非常健康的发展;缺点是开发者们由于对外界经常采取不太理会的态度,从而
在软件的人性化方面会让普通用户很难接受,这会导致缺乏 OEM 厂商的支持。一种操作系统软件不管拥
有多少先进的特性,如果缺少与用户的亲和力,则很难取得成功。
好在 GNU/Linux 从起步到现在,其每一个新版本的发布以及最近的很多迹象都在表明 GNU/Linux 在
软件界面的人性化方面不断进步着。下面我们将从一个完整的 Linux 系统架构来分析其发展趋势。在这之
前,我们先需要从图 1 中了解桌面 Linux 的系统架构。

图1

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 78


桌面应用

在图 1 中可以看到,图形化的 Linux 是一个类 Unix 操作系统。必需采用 X-Windows,绕过系统核心直


接操作硬件,才能实现高效率的图形能力。与其他桌面操作系统一样,桌面化的 Linux 也需要大量应用程序
的支持,而当前 Linux 欠缺的就是易用的桌面环境和其上的应用程序,以及对各种在桌面系统中常用硬件
的支持。

GNU/Linux 核心的变化
当 GNU/Linux 的核心发展到 2.4 版本的时候,其结构已经非常清晰和稳定。在接下来的时间里,
GNU/Linux 的开发者们会不断地为其增加新的驱动程序和新的特性,包括输入设备和多媒体设备的支持。
他们希望 GNU/Linux 除了能在服务器市场一展身手以外,还能真正地成为一个可以放到桌面上来使用的
操作系统,也就是它不但需要增强图形界面的易用性,系统底层的功能也要能跟上。这从其核心的 2.4.5
到 2.5 版本的发展就能看出来,在更加明确地为设备分类,稳定已有代码的同时,也协调好了类 Unix 的
设备访问方法,保持了系统和软件的一致性,同时也大范围地增加了系统所能支持的硬件设备种类。作
为整个操作系统的最底层,这些都为更好地支持基于其上的各种应用做好了铺垫。

图形界面的优化
在发展的初期,GNU/Linux 与 Windows 明显不同的是,它作为一个类 Unix 的操作系统不是最注重图
形界面的易用性,而是把前期开发的重点放在了内存管理、进程调度等系统的基础部分。由于受类 Unix
系统的传统影响,GNU/Linux 在核心里面并没有直接实现桌面系统所必需的图形驱动能力,这对于今天
已经离不开图形化界面的普通用户来说,简直是不可思议的。虽然 GNU/Linux 核心的 2.2 版本之后都提供
了 FrameBuffer Console 设备,但是也只能提供一些简单的图形能力。值得庆幸的是,与传统的 Unix 系统
一样,自由软件世界的 X 窗口系统——XFree86 给 GNU/Linux 赋予了实现图形用户界面的能力。
XFree86 通过绕过操作系统直接访问硬件的方式来驱动图形设备,获得高效率的加速能力,从这一点
来说它非常像一个图形设备驱动程序而不是一个窗口系统,但同时又提供简单的 ATOM 管理和消息处理
的能力,让开发者不至于工作在最原始的环境下。而整个 XFree86 基于 TCP/IP 的 C/S 结构,能够很轻易
地把系统的处理分布化。同时 X 窗口系统开放的工业标准正是其在 Unix 世界长盛不衰的原因,但是
XFree86 却不具备现在大多数流行的图形化操作系统所必需的桌面管理和提供快速开发接口的功能。开发
XFree86 下的应用程序,很多细节完全需要由开发者自己来完成,这造成了在 GNU/Linux 平台下应用软
件的缺乏。所以在 XFree86 上的应用一直局限于某些专业领域,自由软件世界的开发者们看到了这些不
足,在发展过程中,KDE/GNOME(the K Desktop Environment /GNU,s Network Object Model
Environment,K 桌面环境/GNU 网络对象模型环境)就应运而生。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 79


桌面应用

基于应用的桌面环境

我们在各个时期的 GNU/Linux 发行版本中可以看到,从 GNU/Linux 上发展起来的 KDE/GNOME 和其


前辈 CDE 一样,都能够在 X 窗口系统下提供良好的开发接口和友好的图形用户界面(不同的是,KDE 的
底层调用的是商业化的 QT,而 GNOME 是完全开放的 GLIB;KDE 比较注重界面的华丽,GNOME 则比
较实用),这不但能够给 Linux 用户提供一个完整的图形界面,同时还给软件开发提供了一条捷径。事实
上针对 KDE/GNOME 也已涌现出越来越多的应用程序。
随着时间的推移,开发者们越来越意识到图形界面的重要性,他们在开发过程中融入了很多其他图
形化操作系统的优点,包括 Windows 的统一资源管理和一致的用户界面、Mac OS 易用的菜单条等。这已
经在新版本的 GNOME 2/KDE3 里体现出来了(图 2),我们从中可以看到,除了与早期的软件保持兼容
以外,包括打印、图形支持和集中式资源管理都已经初具雏形。而在笔者试用的过程中,新版本不管是
易用性还是外观,各方面比起以前的版本都有了非常大的提高。这意味着我们不久就可以看到一些应用
界面非常接近现在流行的图形化操作系统的全新 GNU/Linux 桌面操作系统。

图2

另外,现在有一些像 Sun 公司这样的大厂商介入到 GNU/Linux 下应用程序的开发中,而且不断地有


各种基于 Linux 的应用软件计划在启动,这会使用户最常使用到的字处理、多媒体播放、实时通信和网络
浏览器等软件越来越丰富,功能越来越完善(图 3)。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 80


桌面应用

图3

GNU/Linux 标准化的道路

最近,几家比较大的厂商扛着建立 GNU/Linux 标准的旗号,想联合其他相关厂商成立联盟,以让


GNU/Linux 走向标准化,从而推动这个行业的发展。那么,标准化的意义何在?
标准化固然有不少很好的地方:可以让开发者更好地去适应平台,并让更多的软件厂商加入这个阵
营,更好地发掘 GNU/Linux 的价值,毕竟 GNU/Linux 的很多推广工作是由这些厂商来做的。但是从目前
的情况看来,这些举动更多地是想保护各个厂商自己的利益,对自由软件世界不能带来多大的影响。首
先,在刚开始建立标准的时候就出现了两大阵营,这样会不会造成恶性竞争?其次,在自由软件世界里
面,很多开放的、没有标准化的约定都得到大多数开发者的遵守,这也是 GNU/Linux 能发展到今天的一
个最重要的条件; 另外,虽然 Red Hat 是很多自由软件开发计划的支持者,但是大多数开发者对这些所谓
的标准阵营没有任何的响应。甚至在他们的网站上找不到任何的相关消息,这也意味着他们不关心这些
举动带来的影响。因为 GNU/Linux 毕竟是一个很特殊的领域。为什么这样说呢?因为开放和自由对于自
由软件世界的拥护者来说,Linux 并不是惟一的目标,他们眼中的开放更多的是指开放的系统平台,也就
是说各种不同平台间的软件能在源代码这一层做到兼容。这样可以经常最大程度地避免在编写代码过程
中的重复劳动。很多自由软件在这些方面都做得非常好,包括 GNOME/KDE,它们除了能在 Linux 下工
作以外,还可以在现存的绝大多数操作系统下运行,甚至包括 Windows。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 81


桌面应用

今后的主要任务

要想把 GNU/Linux 桌面化,软件厂商就要去协调硬件厂商,通过合作开发让更多的设备能够在 GNU/


Linux 下工作,并且提供很好的系统管理工具,消除用户对 GNU/Linux“难用”的看法。如果能够联合一
些国内外的独立软件开发商,发展基于 GNU/Linux 的应用软件,就能完全体现出 GNU/Linux 的价值,让
更多的用户接受 GNU/Linux。
在国内,虽然有很多厂商推出所谓的工作站/桌面版本,充其量也就是削减了服务软件,在易用性方
面和 Windows 相比还是远远不够。也许国内的厂商并没有意识到这一点,在其桌面 Linux 发行版中主要
是做了中文化方面的工作,其他方面还需要相当多的努力。如果国内的 Linux 厂商迅速地掌握好时机,推
出能够胜任桌面工作的 GNU/Linux 发行版本,就会慢慢让 GNU/Linux 在国内的桌面化应用进入一个实质
阶段。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 82


桌面应用

MediaPortal,除了 Microsoft Media Center 之外的选择

张宓

目前大多数开源软件都是基于 Linux 系统的,Windows 开源软件的开发者仍然被笼罩在 Microsoft 的


阴影下,但 Windows 开源软件并不乏优秀之作,而 MediaPortal 则是 Microsoft Media Center 强有力的竞争
对手。MediaPortal 目前最新版本是 MediaPortal 0.2.0.0 RC4 ,能够将你的个人计算机魔术般的变成多媒体
中心。MediaPortal 使用 C#编写,是一款开放源代码的软件,任何人都可以帮助开发、优化、本地化或者
再发布这款软件,当然这也带来了一些问题。
图 1:Media Portal 提供了视频、DVD、音频播放器和电视功能

不要担心软件设置的问题,它提供了一个方便的向导程序帮助你进行各项设置,比如指定多媒体文
件的存放位置、设置 TV 或收音机的频道等。除了使用鼠标和键盘操作外,还可以使用遥控器,操作计算
机就像看电视一样方便。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 83


桌面应用

图 2 遥控器选择

给计算机添加特殊的硬件,比如使用 ATI 或者 Pinnacle 的多媒体卡就可以方便的通过 Mediaportal 观


看有线电视、卫星电视甚至 HDTV 电视节目。在观看电视节目时支持暂停,还可以按照计划录制电视节
目,并选择适合的编码保存到硬盘上,而这仅仅取决于硬盘的大小。在播放 DVD 和其他音频视频文件时,
MediaPortal 使用 Media Player Classic 各种解码器,完全不用为不能解码视频文件而担心。它还能够自动
从 IMDB 下载各种信息并建立自己的数据库,并且可以通过播放列表组织各种多媒体文件,编排播放顺
序。MeidaPortal 还提供天气预报,从 weather.com 下载当地最新的天气信息。而浏览图片、播放电台节目、
内置游戏等 Media Center 的基本功能则样样具全。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 84


桌面应用

图 3:播放 DVD,自动从互联网下载 CD 信息

MediaPortal 还提供插件功能,通过插件可以方便的扩展 MediaPortal。比如 MyAlarm 可以设定一个定


时的闹钟;MyTorrents 可以方便的管理 bt 种子文件;Mymail 为它增加 e-mail 客户端的功能。这些都可以
在 http://www.team-mediaportal.com/mpwiki/MediaPortalPlugins 获得。
推荐的计算机配置为:
CPU 2Ghz 或更高的;
512MB RAM;
200MB 空余磁盘空间;
支持 DirectX9 显卡,128MB 显存;
宽带连接。
必备的软件环境为:
Windows XP with SP2 ;
Windows Media Player 9 或更高;
Microsoft .NET Framework Version 2.0 。
软件主页:http://mediaportal.sourceforge.net
下载地址:http://www.team-mediaportal.com/files/Download/MainProgram/

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 85


桌面应用

Ubuntu 笔记本电源管理优化指南

Linux 宝库

看到许多朋友抱怨 linux 电源管理很糟糕,说什么电池使用比 win 下短了很多。实际上 linux 提供很多


电源优化的功能,只不过默认情况下的设置没有考虑电源使用罢了。下面我以 ubuntu edgy 为例,系统的
讨论一下笔记本电源管理优化。
目标:最长的电池使用时间
概述
笔记本由许多不同的组件组成,各个组件的耗电不用。我们可以看到主要的耗电部件是液晶显示器、
CPU、芯片组和硬盘。虽然我们可以在 BIOS 里面设置操作系统无关的电源管理模式,但是在操作系统之
上我们可以设置一些更 smart 的电源管理模式自动适应各种环境。
本文分下面几个部分分别讨论各个部件的电源管理优化。
1.前提
  在讨论各个设备的电源管理优化之前,先确定我们是否满足下面一些前提条件。
BOIS
  首先你要检查一下你的 BOIS 的电源管理设置,先关闭所有 bois 支持的电源管理方式,只通过操作系
统设置电源管理,然后再恢复 BOIS 的电源管理。
Kernel
  acpi 支持,edgy 默认内核是支持 acpi 的,如果你自定义编译了内核,记住要把电源管理相关的模块
选上
Power Management Options --->
[*] Power Management Support
[ ] Software Suspend
ACPI( Advanced Configuration and Power Interface ) Support --->
[*] ACPI Support
[ ] Sleep States
[] /proc/acpi/sleep (deprecated)
[*] AC Adapter
[*] Battery
Button
Video

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 86


桌面应用

[ ] Generic Hotkey
Fan
Processor
Thermal Zone
< > ASUS/Medion Laptop Extras
< > IBM ThinkPad Laptop Extras
< > Toshiba Laptop Extras
(0) Disable ACPI for systems before Jan 1st this year
[ ] Debug Statements
[*] Power Management Timer Support
< > ACPI0004,PNP0A05 and PNP0A06 Container Driver (EXPERIMENTAL)
CPU Frequency Scaling --->
[*] CPU Frequency scaling
[ ] Enable CPUfreq debugging
< > CPU frequency translation statistics
[] CPU frequency translation statistics details
Default CPUFreq governor (userspace)
<*> 'performance' governor
<*> 'powersave' governor
<*> 'ondemand' cpufreq policy governor
<*> 'conservative' cpufreq governor
<*> CPU frequency table helpers
ACPI Processor P-States driver
<*> CPUFreq driver for your processor

2.显示器
如上所示,LCD 是最耗电的部件,这一节我们讨论如何降低 LCD 的耗电。
首先,尽可能调低亮度,这个不多说手动调节就可以了;然后设置 DPMS(Display Power
Management Signaling)
修改 sudo vi /etc/X11/xorg.conf 文件:
Section "ServerLayout"
Identifier [...]
[...]

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 87


桌面应用

Option "BlankTime" "5" # Blank the screen after 5 minutes (Fake)


Option "StandbyTime" "10" # Turn off screen after 10 minutes (DPMS)
Option "SuspendTime" "20" # Full suspend after 20 minutes
Option "OffTime" "30" # Turn off after half an hour
[...]
EndSection
[...]
Section "Monitor"
Identifier [...]
Option "DPMS" "true"
[...]
EndSection
但似乎 xorg 的 dpms 有 bug 不能关闭 LCD,只能把屏幕变黑。
google 搜索了一下发现是和 acpi 冲突只要重新启动 acpi 就可以了,手动设置屏幕关闭:
sudo /etc/init.d/acpid restart
xset dpms force off

3.CPU
移动版本的 CPU 支持频率和电压的动态调整,在大多数情况下你的 CPU 是没必要全速运行的,尤其
在电池支持下,我们可以强制使 CPU 运行在最低频率。
linux 2.6 以后的内核就支持 cpu 频率的动态调整,有下面 5 种模式:
● performance 将 CPU 频率设定在支持的最高频率,而不动态调节;
● powersave 将 CPU 频率设置为最低;
● ondemand 快速动态调整 CPU 频率, Pentuim M 的 CPU 可以使用;
● conservative 与 ondemand 不同,平滑地调整 CPU 频率,适合于用电池工作时;
● userspace 用户模式,也就是长期以来都在用的那个模式。可以通过手动编辑配置文件进行配置;
先安装相关软件 cpufrequtils: sudo apt-get install cpufrequtils
查看你的 cpu 所支持的频率:
cpufreq-info
cpufrequtils 002: cpufreq-info (C) Dominik Brodowski 2004-2006
Report errors and bugs to linux@brodo.de, please.
analyzing CPU 0:
driver: powernow-k8

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 88


桌面应用

CPUs which need to switch frequency at the same time: 0


hardware limits: 800 MHz - 1.60 GHz
available frequency steps: 1.60 GHz, 800 MHz
available cpufreq governors: userspace, powersave, ondemand, conservative, performance
current policy: frequency should be within 800 MHz and 1.60 GHz.
The governor "ondemand" may decide which speed to use
within this range.
current CPU frequency is 800 MHz.
需要进入那个模式直接修改 proc 文件,比如要进入 powersave 模式:
sudo -s
echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
其实有个实用程序 laptop-mode 可以方便的设置,在后面硬盘一节统一介绍。如果是用迅驰 cpu,支
持多个频率,你可以用 powernowd 更细化的调节 cpu 频率。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 89


企业应用

企 业 应 用

本文介绍如何通过架设基于策略解析的 DNS 服务器来解决 CERNET 和 CHINANET 以及网通电信之


间的带宽瓶颈等问题,使网站可以被所有用户以最快的速度访问。

多网络出口下基于策略解析的 DNS 服务器

靳建平

需求分析
从 1969 年美国国防部创建基于分组交换的 ARPANET 到现在基于 TCP/IP 的 Internet,不到四十年的
时间,我们的生活已经越来越离不开网络了。我国在 80 年代后期才开始发展网络,目前已有四大骨干网
络,基本满足了使用网络的需求,但由于网络建设的阶段性,没有一个完全统一的网络,跨网络访问的
速度还有待提高,因此很多单位就租用不同的线路来满足高速访问不同网络的需要。
众所周知,原中国电信集团按南北地域分家,成立了新的中国电信和网通集团,互联网的骨干网也
被一分为二了,北有网通、南有中国电信。此后,网络访问就出现了一些问题,有些经常访问的网站速
度就一下子慢了下来,有时候还有访问不上去需要多次刷新的情况出现。如笔者所在的北方地区访问服
务器在网通机房的网站很快,而访问在南方电信的网站就很慢。据分析,产生这种问题的原因是中国电
信分家之后,骨干网连接存在一定的问题,虽然信息产业部已经在做互联互通的计划并在实施中,但估
计在相当长的一段时间内,南北网速差异的问题还会存在。
笔者所在的学校网络有两个出口,教育科研网千兆线路和网通百兆线路。通过采用双出口,校园网
访问公网速度慢的问题得到了解决,但反过来公网访问校园网慢的问题却更加突出。学校服务器大多使
用的是教育网的域名和 IP 地址,所有对校园网服务器的访问都要走 CERNET 链路,因此,尽管校园网拥
有高速的公网链路,但公网用户却只能通过教育网链路才能访问到校园网的资源,这无疑是对公网出口
链路的浪费。因此学校申请了教育网和公网的域名,教育网、公网用户分布使用教育网域名、公网域名
访问我们的网站,速度会很快,但这依然存在问题,用户如何知道要这样来访问会达到最好的效果?
大致的解决方法有如下几种:
一、把网站首页做成提示页面,让用户选择使用哪个镜像,但这就要求用户清楚自己的网络属于哪
种网络,否则用户无法做出选择。
二、程序自动判断用户 IP 之后跳转到相应页面,对用户来说是“透明”的,但细心的用户会发现,
自己输入的网址自动切换成了其他的地址,对于普通用户来说,这也有点莫名其妙。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 90


企业应用

三、本文将重点介绍一种对用户来说完全“透明”的方法:基于策略解析的 DNS 服务器,针对用户


的 IP 分布解析为教育网和公网的 IP,用户根本不知道他们访问的服务器是不一样的。

解决思路
先了解一下 DNS 的作用。DNS 是域名系统(Domain Name System)的缩写,它负责将域名解析为 IP
地址。IP 地址是因特网上每个主机的唯一身份标识,与它们通信必须通过 IP 地址,但当我们与某台主机
通信,比如浏览一个网站,我们不可能更不愿意去记忆 32 位长的二进制主机地址,即使是用点分十进制
IP 地址也不容易记忆,相反大家都能接受以名字的形式来访问。
早在 ARPANET 时代,因为当时网络上的计算机很少,因此使用一个记录所有主机名字和 IP 对应的
文件 hosts 就可以解决问题,但随着网络发展到了 Internet,hosts 文件根本不可能去记录整个因特网上的
主机名字与 IP 的对应关系了,这就需要 DNS 来解决了。因特网的域名系统 DNS 被设计成为一个联机分
布式数据库系统,采用客户服务器方式,做这个工作的程序放在专门的 DNS 服务器上。当一个应用进程
需要将主机名解析为 IP 地址时,如访问一个网站的时候,该应用进程成 DNS 的一个客户,将域名放在
DNS 请求报文中,以 UDP 数据报方式发给本地 DNS 服务器,本地 DNS 服务器查询之后将结果放在回答
报文中返回,若本地 DNS 服务器无法回答该请求,则它将暂时作为上一级 DNS 服务器的客户,向上级
DNS 服务器发送查询请求,这种操作直至找到能够解析该域名的服务器为止。
目前国内的 DNS 域名解析主要由各大 ISP 构建的公用 DNS 服务器来负责解析。这些公用 DNS 服务
器大都只能负责把申请的域名解析成一个 IP 地址,要么是网通的 IP 地址,要么是电信的 IP 地址。如果你
的 IP 地址是电信的 IP 地址,那么处在电信网络的用户访问您的主机速度就比较快,处在网通网络的用户
访问就非常慢了。于是我们可以在主机上设置电信网通的 IP 各一个,或者两台服务器各用一个地址,这
样可以使两个网络的用户都可以快速访问你的主机了,但这有个前提是这些用户通过 IP 地址来访问,如
果用域名访问,因为域名被解析成了网通或电信的 IP,还是不行的,如何解决哪?从 DNS 上下手,如果
DNS 能根据用户的 IP 地址来解析成对应的 IP,那样访问就没问题了,下面我们就在 FreeBSD 上架设一个
基于策略解析的 DNS 服务器。

实战演练
首先,安装 FreeBSD 系统,目前版本是 6.1Release,安装的方法可参看 FreeBSD 的 Handbook,http://
www.freebsd.org.cn/snap/doc/zh_CN.GB2312/books/handbook/ ,FreeBSD 下安装软件推荐使用 ports 安装,
在安装软件之前最好 cvsup 一下,跟服务器上保持一致,保证安装的是最新的软件。方法如下:
ee /etc/make.conf
内容为:
MASTER_SITE_OVERRIDE?= \
http://ports.hshh.org/${DIST_SUBDIR}/\

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 91


企业应用

ftp://ftp.freebsd.org.cn/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/ \
ftp://ftp2.cn.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/ \
ftp://ftp2.tsinghua.edu.cn/mirror/FreeBSD/distfiles/${DIST_SUBDIR}/ \
ftp://ibm.tju.edu.cn/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/
这只是告诉系统安装软件的时候首先从这几个地址寻找需要的文件,当然在这个文件里面可以加入
其他的优化选项,本文不做详述。
然后开始安装 cvsup 这个软件,服务器端一般我们都不会安装桌面的,都是字符界面,因此安装
cvsup-without-gui。
cd /usr/ports/net/cvsup-without-gui
make install clean;
安装了 cvsup 之后就可以更新 ports 了,在命令行下输入以下命令:
cvsup -g -L 2 /usr/share/examples/cvsup/ports-supfile
关于如何使用 cvsup,可参看 Handbook 的相关章节。
下面我们开始安装 BIND (Berkeley Internet Name Domain),这是目前最为流行的 DNS 协议实现,
关于 bind 的详细资料,可到其官方网站 http://www.isc.org/ 查询。
cd /usr/ports/dns/bind9
make install clean
系统会下载最新的源文件,然后编译、安装,最后屏幕上会出现下图:

图 1 安装完成提示
大意如下:如果你使用 FREEBSD 4.X,请浏览 http://people.freebsd.org/~dougb/randomness.html 得到
更多的信息,如果是 FREEBSD 5.X 则不需要执行这一步,如果你想要 bind 9 运行在 chroot 环境,必须把

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 92


企业应用

/dev/random 设备 chroot,还要运行“rndc-confgen –a”来生成一个正确的配置文件――随机密钥。


默认情况下系统是以/usr/local 为根目录的,所以 BIND9 的命令文件都放到/usr/local/sbin 目录里
面和/usr/local/bin 目录里面。系统在安装完成 bind 9 后,会自动建立 uid 为 53 的“bind”用户和 gid
为 53 的“bind”群组,以供 bind 服务用。
cd /etc/namedb
chmod +x make-localhost
./make-localhost
会在/etc/namedb/master 目录生成一个 localhost.rev 和 localhost-v6.rev。
我们现在开始配置 bind 9,根据提示,我们首先要生成一个密钥,/usr/local/sbin/rndc-confgen
>/usr/local/etc/rndc.conf,打开 rndc.conf,把# Use with the following in named.conf,
adjusting the allow list as needed:
......
# End of named.conf
之间的内容,去掉注释#,添加到 named.conf 中。
key "rndc-key" {
algorithm hmac-md5;
secret "BNBjuQWLaaU45oVZLvatTA==";
};
controls {
inet 127.0.0.1 port 953
allow { 127.0.0.1; } keys { "rndc-key"; };
};
同时要把下面这些内容用/* */注释掉:
zone "." {
type hint;
file "named.root";
};

zone "0.0.127.IN-ADDR.ARPA" {
type master;
file "master/localhost.rev";
};
// RFC 3152
zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA" {
type master;
file "master/localhost-v6.rev";
};
为了让 DNS 服务器可以解析所有的域名,还需要在 named.conf 中做一个改动,把
forwarders {
127.0.0.1;
};

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 93


企业应用

中的 127.0.0.1 换成上一级的 dns 服务器地址,这样的话,如果你访问的域名 dns 无法解析就会到这些地


址里面去查询。
接下来就是本文的重头戏了,看看怎么来实现策略解析,把下面的内容,原封不动的添加到
named.conf 的最后。
acl "CERNET" {
166.111.0.0/16;
202.4.128.0/19;
202.112.64.0/18;
202.112.128.0/17;
………………
};

view "view_cernet" {
match-clients { CERNET; };
zone "." {
type hint;
file "named.root";
};

zone "0.0.127.IN-ADDR.ARPA" {
type master;
file "master/localhost.rev";
allow-update { none; };
};

include "master/cernet.def";
};

view "view_any" {
match-clients { any; };
zone "." {
type hint;
file "named.root";
};

zone "0.0.127.IN-ADDR.ARPA" {
type master;
file "master/localhost.rev";
};

include "master/other.def";
};
添加完这些内容以后,保存 named.conf,我们先来测试一下看是否可以启动 bind 了。
cd /etc/namedb/master
touch cernet.def
touch other.def

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 94


企业应用

/usr/local/sbin/named -gc /etc/namedb/named.conf


正常的情况下你会看到下面的信息:
11-Jul-2006 09:23:38.711 starting BIND 9.3.2 -gc /etc/namedb/named.conf
11-Jul-2006 09:23:38.735 loading configuration from '/etc/namedb/named.conf'
11-Jul-2006 09:23:38.744 listening on IPv4 interface lo0, 127.0.0.1#53
11-Jul-2006 09:23:38.820 running
只要有最后一行,那么你的配置就算是基本成功了。
按一下键盘的 Ctrl+c,先把 BIND 9 停掉。
下面我们需要做的工作就是添加自己的域名了。
cd /etc/namedb/master
mkdir cernet
mkdir other
ee cernet.def

内容如下:
zone "yourdomain.edu.cn" {
type master;
file "master/cernet/yourdomain.edu.cn";
};

zone "yourdomain.cn" {
type master;
file "master/cernet/yourdomain.cn";
};

ee other.def

内容如下:
zone "yourdomain.edu.cn" {
type master;
file "master/other/yourdomain.edu.cn";
};

zone "yourdomain.cn" {
type master;
file "master/other/yourdomain.cn";
};

ee cernet/yourdomain.edu.cn

内容如下:
$ttl 86400
$ORIGIN yourdomain.edu.cn.
@ IN SOA dns.yourdomain.edu.cn. root.yourdomain.edu.cn. (
20060711 ; Serial
3600 ; Refresh
900 ; Retry
604800 ; Expire

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 95


企业应用

86400 ) ; Minimum
@ IN NS dns.yourdomain.edu.cn.
www.yourdomain.edu.cn. IN A 1.2.3.4
ee cernet/yourdomain.cn

内容如下:
$ttl 86400
$ORIGIN yourdomain.cn.
@ IN SOA dns.yourdomain.cn. root.yourdomain.cn. (
20060711 ; Serial
3600 ; Refresh
900 ; Retry
604800 ; Expire
86400 ) ; Minimum
@ IN NS dns.yourdomain.cn.
www.yourdomain.cn. IN A 1.2.3.4
ee other/yourdomain.edu.cn

内容如下:
$ttl 86400
$ORIGIN yourdomain.edu.cn.
@ IN SOA dns.yourdomain.edu.cn. root.yourdomain.edu.cn. (
20060711 ; Serial
3600 ; Refresh
900 ; Retry
604800 ; Expire
86400 ) ; Minimum
@ IN NS dns.yourdomain.edu.cn.
www.yourdomain.edu.cn. IN A 4.3.2.1
ee other/yourdomain.cn

内容如下:
$ttl 86400
$ORIGIN yourdomain.cn.
@ IN SOA dns.yourdomain.cn. root.yourdomain.cn. (
20060711 ; Serial
3600 ; Refresh
900 ; Retry
604800 ; Expire
86400 ) ; Minimum

@ IN NS dns.yourdomain.cn.

www.yourdomain.cn. IN A 4.3.2.1

添加一个脚本,用于在系统启动的时候自动把 DNS 服务器启起来


mkdir -p /usr/local/etc/rc.d
ee /usr/local/etc/rc.d/named.sh

添加内容
#!/bin/sh

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 96


企业应用

/usr/local/sbin/named -c /etc/namedb/named.conf &

chmod 777 /usr/local/etc/rc.d/named.sh

把服务器启起来
/usr/local/etc/rc.d/named.sh

OK,到此你的 DNS 服务器就算是跑起来了。下面我们开始测试,看是否如我们想像中的那样。


# nslookup
> server 127.0.0.1
Default server: 127.0.0.1
Address: 127.0.0.1#53
> www.yourdomain.edu.cn
Server: 127.0.0.1
Address: 127.0.0.1#53

Name: www.yourdomain.edu.cn
Address: 4.3.2.1
> www.yourdomain.cn
Server: 127.0.0.1
Address: 127.0.0.1#53

Name: www.yourdomain.cn
Address: 4.3.2.1

可以看出来,这个 IP 地址访问两个域名解析的地址都是我设定的 4.3.2.1,而这个功能的实现就是靠


我们在 named.conf 里面设置的 acl 和 view。

现在 DNS 服务器已经设置好了,我们还需要把 WWW 服务器上做一下设置,如果您的 WWW 服务器


本来就是两个,分别用的教育网和公网地址,内容完全一样,那么这一步可以省略,如果您和我这里一
样也是双网卡,配置教育网和公网两个地址,那么你就需要设置一下系统的路由,把目的地址是教育网
的地址都路由到教育网的网卡,默认的路由到公网网卡上,具体的命令根据操作系统的不同有些差别,
本文就不再赘述,只是需要提醒各位读者注意的是服务器上面根据的教育网的地址段一定要和
named.conf 里面的 acl 一致,否则不一致的那些 IP 将无法访问您的服务器了,比如你给他返回的是公网的
地址,那么他就从公网网卡来访问您的服务器,但服务器却针对他的 IP 要从教育网的网卡返回数据,这
样他就访问不到了,这一点要注意,两个地方要同时更新。教育网的网段列表可以从教育科研网
http://www.edu.cn/获取。

本文到此就已经将如何实现基于策略解析的 DNS 服务器的架设方法介绍完了,下面简单说一下常见


的貌似策略域名解析的域名解析方式。
首先是多个域名对应一个 IP 地址:这种情况一般用于实现虚拟主机。只用一个 IP 地址就可以实现多

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 97


企业应用

个拥有不同域名的站点,这对那种 IP 地址资源短缺但又想拥有多个站点的情形非常有用。 其次是一个域


名对应多个 IP 地址:在域名服务的配置里有一种实现服务器负载均衡的方法,DNS 配置文件中一般会有
类似下面的内容:
www.youdomain.edu.cn IN A 1.2.3.1
www.youdomain.edu.cn IN A 1.2.3.2
  ……
www.youdomain.edu.cn IN A 1.2.3.N
这种方法适用多台内容相同的服务器分流。在这种查询方式中,DNS 服务器是以轮循的方式回应请
求的,即对第一个请求回应的是地址 1.2.3.1,下一个请求回应地址就是 1.2.3.2,依此类推。
尽管上面两种方式可以将一个域名解析成几个不同的 IP 地址,或将多个不同的域名解析成一个 IP 地
址,但它们仍然不能算作策略域名解析。这是因为,我们做的策略域名解析与上面的两种方式相比要智
能得多,它是基于策略的,根据客户端所在网络的不同 ,返回不同的解析结果;
本文只是以简单的例子来演示了如何架设一台基于策略解析的 DNS 服务器,DNS 服务器的其他设置读
者如果感兴趣,可参看相关书籍或网络上的文章,限于篇幅,本文不再涉及。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 98


企业应用

HTTP 代理获取设计

李俊良(来自 Linuxpk.com 程序设计版主 Cnangel)

1 前言
这里先说一些基础概念,主要给还不是特别清楚的同志一些学习的机会。

1. 1 标准 ISO7498——开放式系统互联参考模型(ISO/RM)
有国际标准化组织定义的一个模型,包含了硬件与软件的组织与设计所必须遵循的规定。
● 物理层:媒介;用于建立、保持和断开物理接口。
● 数据链路层:主要负责数据链路的建立、维持的拆除等。
● 网络层:又名通信子网。控制子网的运行。
● 传输层:在经济而又有效的前提下保证通信的质量。
● 会话层:提供一种有效方法,以组织并协商两个表示层进程之间的会话,并管理它们之间的数据
交换。
● 表示层:解决用户信息的语法表示问题。
● 应用层:ISO 最高层,直接面向用户,是利用网络资源,唯一向应用程序提供服务的层。

1.2 TCP/IP
ISO/RM 的一个子类,构筑在物理层硬件概念性层次基础之上。
1. 应用层:提供一组常用的应用程序,主要有文件传输协议、远程访问协议及其电子邮件协议等,
负责接收和发送数据,并把数据按传输层格式组织好向下层传输。
2. 传输层:基本任务是提供应用程序之间端到端的通信,并把数据分组可靠地传给下一层。
3. 网间网层:负责相邻计算机之间的通信。其功能主要是处理来自传输层的分组发送请求,并将该
分组装入 IP 数据报中,再把它交给下一层。网间网层具有路径选择、流量控制、拥塞和差错报告
等功能。
4. 网络接口层:对应于 OSI 的数据链路层和物理层,包含了各种逻辑链路控制和介质访问协议,实
现了不同网络间的物理层连接。

1.3 超文本传输协议(HTTP 协议)

• 用于在客户端和服务器间请求和应答的协议,它并不是 TCP/IP 的子集。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 99


企业应用

o HTTP 并不局限于使用网络协议(TCP/IP)及其相关支持层,尽管这是它在互联网上最为

流行的应用程序。 事实上,HTTP 可以“在任何其他互联网协议之上执行,或者在其他网


络上执行。HTTP 只认可可靠的传输,任何能够提供这种保证的协议都可以被其使用,详
情见 HTTP 协议的几个重要概念。
• 请求信息,发出的请求信息包括以下几个:

1. 请求行,例如 GET /images/logo.gif HTTP/1.1,表示从/images 目录下请求 logo.gif


这个文件。
2. 标题,例如 Accept-Language: en
3. 空行,请求行和标题必须以 作为结尾
4. 可选信息
• 请求方法,HTTP 定义了八种方法来指示确认的资源执行所需的行为:
1.HEAD

 要求与 GET 请求相应的回复一样的应答,但是没有回应的内容。这对找回写在回


应标题中的 meta-infomation 有帮助,不需要传输整个内容。
2.GET

 请求某个特殊的资源,是目前网上最通用的方法。不应该用于一些会造成副作用
的操作中(在网络软件中使用是一个常见的错误用法)。参看下个目录的安全方
法。
3.POST

 向确定的资源提交需要处理的数据。这些数据包括在请求的内容里。这可以造成
新资源的产生和更新已有资源。
4.PUT

 上传特定资源
5.DELETE

 删除特定资源
6.TRACE

 返回接收的请求,客户端可因此察看在请求过程中什么中间服务器被加进来或者
有所改变。
7.OPTIONS

 返回服务器支持的 HTTP 方法,这可以用来检查网络服务器的功能。


8.CONNECT

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 100


企业应用

 将请求连接转换成透明的 TCP/IP 通道,通常通过非加密的 HTTP 代理利用 SSL-加


密通讯(HTTPS)。

1.4 HTTP 代理
• 代理就等于一个网络中转站。举个例子,A 页面要访问 B 页面,但是 A 页面无法直接访问,代理
可以直接访问 B 页面,而 A 页面又可以直接访问代理,那么通过代理中转 A 页面仍然可以访问到 B
页面,有点类似 ssh tunnel 。

• HTTP 代理按匿名功能(是否具有隐藏 IP 的功能)分类。


1. 非匿名代理:不具有匿名功能。
2. 匿名代理。使用此种代理时,虽然被访问的网站不能知道你的 IP 地址,但仍然可以知道
你在使用代理,有些侦测 IP 的网页也仍然可以查到你的 IP。
3. 高度匿名代理:使用此种代理时,被访问的网站不知道你的 IP 地址,也不知道你在使用
代理进行访问。此种代理的隐藏 IP 地址的功能最强。
• 按请求信息的安全性分类
1. 全匿名代理:不改变你的 request fields,使服务器端看来就像有个真正的客户浏览器
在访问它。当然,你的真实 IP 是隐藏起来的。服务器的网管不会认为你使用了代理。
2. 普通匿名代理:能隐藏你的真实 IP,但会更改你的 request fields,有可能会被认为使
用了代理,但仅仅是可能,一般说来是没问题的。不过不要受它的名字的误导,其安全性
可能比全匿名代理更高,有的代理会剥离你的部分信息(就好比防火墙的 stealth
mode),使服务器端探测不到你的操作系统版本和浏览器版本。
3. elite 代理:匿名隐藏性更高,可隐藏系统及浏览器资料信息等。此种代理安全性特强。
4. 透明代理(简单代理):透明代理的意思是客户端根本不需要知道有代理服务器的存在,
它改编你的 request fields(报文),并会传送真实 IP。注意,加密的透明代理则是属
于匿名代理,意思是不用设置使用代理了,例如 Garden 2 程序。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 101


企业应用

• 代理通用格式,以 218.249.83.87:8080@HTTP$6&94,1024,1209#北京市电信通 例子为例

o 218.249.83.87 表示为代理服务器的 IP 地址为 218.249.83.87


o :8080 表示“:”后的 8080 表示该代理服务器的服务端口为
8080(21、23、80、81、1080、3128、8080 等)
o @HTTP 表示“@”后的 HTTP 表示该代理服务器的类型为 HTTP 代理
(HTTP、FTP、SOCKS4/5、TELNET 五类)
o $ 表示“$”后的数值表示代理服务器验证状态
 $4:正在验证
 $5:验证超时(网络连接太慢,再校验多几次会有所发现)
 $6:免费的(这才是我们所要的^.^)
 $7:要密码(可以用 demo/demo、guest/gues、temp/temp、share/ahare、test/
test 作为口令/密码试试)
 $8:不合符协议
 $9:不匹配(如果代理服务器太忙也会出现这种情况)
 $10:不支持的协议
 $11:无法确定
o &94,1024,1209 表示“&”后的以 “,” 分隔的三个数值是反映该代理本地连接的三个时
间特性,第一个是反应速度,第二个是校验时间,第三个是连接时间,所以当然也就是数
值越小的代理就是越快的。
o #北京市电信通 表示代理为北京市电信通(自定义)。

1.5 举例及工具

• 通过 HTTP 协议直接访问网站,在 Dos 窗口或者 Shell 环境下,直接输入:

telnet www.yahoo.cn 80
GET / HTTP/1.1
Host: www.yahoo.cn

会有什么结果?就会发现和在打开浏览器 http://www.yahoo.cn 首页的源码一模一样,这个是没有


任何封装的效果,简单的完成一次服务器与客户端的通信。 代理是通过什么方式呢?其实也很简单,在
Dos 窗口或者 Shell 环境下,直接输入:

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 102


企业应用

telnet 124.133.37.248 8080


GET / HTTP/1.1
Host: www.yahoo.cn

发现除了连接目标和返回的 HTTP 头文件不同外,其他内容都是一样的,都是返回雅虎全能搜索的


html 源代码,从返回的头来看说明这个代理是可用的,在这里,就有人会问道,有什么好的工具来检测
一下传输的协议以及数据包和数据流呢?

• 这里顺便介绍一下一个强劲的是一个协议分析器/包嗅探应用程序工具: Wireshark 。

• Wireshark
o 关于 Wireshark ,其实就是以前的 Ethereal , 关于为什么更名感兴趣的可以参考一下

http://blog.ijliao.info/archives/2006/06/10/2358/,这里就不多说了。
o Wireshark 有 Unix 版本也有 Windows 版本,是开源的,可以去

http://www.wireshark.org/download.html 下载最新的版本,里面也有很多的 Third-


Party Packages。

o 这里介绍一下 Wireshark 简单的用法,对下面分析很有帮助,首先,打开


Wireshark ,界面如图:
初始界面:

选择菜单:

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 103


企业应用

选择网卡:

选择 filter:

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 104


企业应用

GET 请求监控:

服务器响应请求并返回:

几张图下来估计大家都会使用了,这里不再累述,进入正式的代理获取吧。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 105


企业应用

2 抓取代理
2.1 构造代理

 和以前做过抓取的同事沟通以及以往做代理的经验,总结了两种方案可行:
 种子站点查找法
■ 此方式是利用已知网页所提供的代理来得到代理,这种方式比较容易获得代理,只需要抓
取种子站点的页面进行文档分析即可。但有一个缺点,不能保证所以的代理都能使用,而
且针对服务器来说根本不知道该代理服务器的速度等情况,需要进行下步验证。
 IP 段扫描法
■ 针对对一段 IP 段和 http 常用端口进行扫描,扫描的过程中对 ip 进行即时验证,该方案
能比较全面的验证代理,缺点是扫描时间比较长,比较难获得代理。其实一些大型代理网
站的代理除了人为提供外,基本上都采用此方式;
 由于寻找大量代理并不是我们的目的,于是采用第一种方案。

2.2 抓取代理

 由于需求量小,我们直接从一些提供代理的网站抓取,比如:proxycn.com,获取一些具有代理
的页面,这样简单而有效获得了一个代理列表;
 利用 Perl 的强大的正则将代理抠出来,生成一个列表。

3 验证代理
• 整个流程最关键的部分,以前介绍的都是为验证代理做铺垫;

3.1 验证方案

• 抓取代理流程中生成的一个代理列表,每日逐个对其进行速率、日有效积累次数的验证;
• 使用 Perl 脚本对其简单验证如下:

#!/usr/bin/perl

# simple.pl By Cnangel

use strict;
use warnings;

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 106


企业应用

if (@ARGV != 1) { print "$0 <proxy>\n";exit; }

my $proxy = $ARGV[0];
&chooseproxy($proxy);

sub chooseproxy
{
my $proxy = shift;

my $url = 'http://fans.huhoo.net/log/getlog.php';
my $ref = &gethtml($url, $proxy);

my $thiscont = join("", @$ref);


my $contpos = index($thiscont, "\r\n\r\n");
my $content = substr($thiscont, $contpos + 4);
print "ok, $proxy is right proxy!\n" ($$ref && $$ref =~ /(\d+\.){3}\d+/ && $$ref !~ /
101\.1\.23\.33/); #自己的 IP 地址
}

sub gethtml
{
my ($url, $proxy) = @_;
eval("use Socket;");

my ($host, $port, $rhost, $rport, $path);


if ($proxy ne '' && $proxy ne 'direct')
{
($rhost, $rport) = split(/:/, $proxy);
$rport ||= 80;
$path = $url;
$path =~ s/^http:\/\///i;
($host, undef) = split(/\//, $path);
($host, $port) = split(/:/, $host);
$port ||= 80;
$path = $url !~ /^http:\/\//i ? "http://$url" : $url;
}
else
{
$url =~ s/^http:\/\///i;
($host, undef) = split(/\//, $url);
$path = $url;
$path =~ s/^$host//iso;
($host, $port) = split(/:/, $host);
$port ||= 80;
$path = "/$path" if ($path !~ /^\//);
}

my ($name, $aliases, $type, $len, @thataddr, $a, $b, $c, $d, $that);

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 107


企业应用

($name, $aliases, $type, $len, @thataddr) = gethostbyname($rhost);


print "$rhost:$rport\n";
($a, $b, $c, $d) = unpack("C4", $thataddr[0]);
$that = pack('S n C4 x8', 2, $rport, $a, $b, $c, $d);

return "" unless (socket(S, 2, 1, 0));


select(S);
$| = 1;
select(STDOUT);
return "" unless (connect(S, $that));

print S "GET $path HTTP/1.0\r\n";


print S "Host: $host\r\n";
print S "Accept: */*\r\n";
print S "User-Agent: Mozilla/4.0 (compatible; MSIE 6.00; Windows NT 5.1)\r\n";
print S "Pragma: no-cache\r\n";
print S "Cache-Control: no-cache\r\n";
print S "Connection: close\r\n";
print S "\r\n";

my @results = <S>;
close(S);

return \@results;
}

● 其中 http://fans.huhoo.net/log/getlog.php 是返回一个 $_SERVER['REMOTE_ADDR'] 的值,


整个流程就是返回整个值是否是一个 ip,且不能为本机 ip;
● arrayref gethtml(string $url, string $proxy)
1. 如果没有代理,则直接通过 socket 进行连接;
2. 如果使用代理,则使用代理进行 socket 通信,并将 HTTP 协议响应头与内容作为数组引用返
回;
3. 在请求的协议头里,如果$host 值为代理 host,则是寻找透明代理。
4. 如果 GET 部分使用 HTTP1.1 协议进行请求,如果服务器返回 “Transfer-Encoding:
chunked” 字样的头,返回的主体信息有两个部分:
i. 第一部分的第一行是该主题信息 chunk 的长度和单位(单位一般省略),接着是 chunk 的内容;
ii. 最后部分的第一行是该尾部信息 chunk 的长度和单位(单位也一般省略),一般情况而言,该尾
部信息是没有的,所以结果只能看到一个 0 字符。

3.2 各种不同的方式验证代理

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 108


企业应用

• 上面的举例是最原始的验证代理方式,也是直接接触 HTTP 协议的方法,这里举集中其他方式验


证代理的方法,供大家灵活选用。
• C 使用 libcurl 库 :

#include <stdio.h>
#include <stdlib.h>
#include <curl/curl.h>

static char errorBuffer[CURL_ERROR_SIZE];

int main(int argc, char *argv[])


{
CURL *curl;
CURLcode res;
if (argc != 2)
{
fprintf(stderr, "Usage: %s <proxy>\n", argv[0]);
exit(EXIT_FAILURE);
}
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if (curl)
{
res = curl_easy_setopt(curl, CURLOPT_URL, "http://fans.huhoo.net/log/getlog.php");
if (res != CURLE_OK)
{
fprintf(stderr, "Failed to set URL [%s]\n", errorBuffer);
exit(EXIT_FAILURE);
}
res = curl_easy_setopt(curl, CURLOPT_PROXY, argv[1]);
if (res != CURLE_OK)
{
fprintf(stderr, "Failed to connect Proxy [%s]\n", errorBuffer);
exit(EXIT_FAILURE);
}
res = curl_easy_perform(curl);

curl_easy_cleanup(curl);
}
return 0;
}

• perl 的 LWP 模块:

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 109


企业应用

#!/usr/bin/perl

use strict;
use warnings;

if (@ARGV != 1) { print "$0 <proxy>\n";exit; }


my $proxy = $ARGV[0];
$res = getpage($proxy);
print $$res;
exit;

sub getpage
{
my ($url, $proxy) = @_;
my $content = '';

eval("use LWP::UserAgent");
my $ua = LWP::UserAgent->new;
$ua->timeout(10);
# $ua->proxy(['http', 'ftp'], 'http://'.$proxy);
$ua->proxy('http', 'http://' . $proxy) if ($proxy);
# 也可以使用环境变量进行指定相应的代理
# if($proxy)
# {
# $ENV{HTTP_PROXY} = $proxy;
# $ua->env_proxy;
# }
my $res = $ua->get($url);
if ($res->is_success)
{
$content = $res->content;
}
return \$content;
}

• Perl 的 Curl 模块(基于 libcurl)

方法类似 C 语言的 curl,不再累述。

• PHP 的常见连接代理方式
o fsockopen 方式

<?php
$content= '';
$proxy = '124.133.37.247:8080';

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 110


企业应用

$url = 'http://fans.huhoo.net/log/getlog.php';
getpage($url, $content, $proxy);
echo $content;

function getpage($url, &$content, $proxy = '', $timeout = 30)


{
# 分析 Url 构成
$path = '/';
$port = 80;
$hostpos = strpos($url, ':');
$host = $hostpos !== false ? substr($url, $hostpos + 3) : $url;
$pathpos = strpos($host, '/');
if ($pathpos !== false)
{
$path = substr($host, $pathpos);
$host = substr($host, 0, $pathpos);
}
$portpos = strpos($host, ':');
if ($portpos !== false)
{
$port = substr($host, $portpos + 1);
$host = substr($host, 0, $portpos);
}
$fp = '';
if (empty($proxy))
{
$fp = fsockopen($host, $port, &$errno, &$errstr, $timeout);
}
else
{
$rportpos = strpos($proxy, ':');
if ($rportpos !== false)
{
$rport = substr($proxy, $rportpos + 1);
$rhost = substr($proxy, 0, $rportpos);
}
$fp = fsockopen($rhost, $rport, &$errno, &$errstr, $timeout);
}
# 打开一个 socket 连接
if (!$fp)
{
echo "$errstr ($errno)<br />\n";
}
else
{
fputs($fp, "GET $path HTTP/1.1\r\n");
fputs($fp, "Host: $host\r\n");
fputs($fp, "Accept: */*\r\n");

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 111


企业应用

fputs($fp, "Referer: http://$host/\r\n");


fputs($fp, "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;
SV1)\r\n");
fputs($fp, "Connection: Close\r\n\r\n");
}
while ($str = fread($fp, 4096))
{
$content .= $str;
}
fclose($fp);
return;
}

?>

o curl 方式

见上面的 C 语言举例或 php 手册 curl 函数部分,这里也不再累述。

4 代理的使用

• 这里主要介绍怎么使用代理列表,我们经常去抓百度、Google 等站点的页面和图片,抓取频度过
高会导致 IP 被封,这时候代理列表就起到作用了,
• 其实,上面的验证代理部分已经详细说明了如果通过代理访问其它页面,从而得到想要的数据,
这里不再累述,通过前面的实例可以很清楚的使用各种你最熟悉的语言运用了。

5 参考文档

• 《计算机网络基础》
• Hypertext Transfer Protocol -- HTTP/1.1
• libcurl 官方文档
• PHP 官方手册(中文)
• HTTP 协议大全(中文)

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 112


混源新视界

混 源 新 视 界

混源:一种需求 一种策略

彭敏 陈杰

开源软件和闭源软件提供商都不能回避的一个事实是,绝大部分用户先前采用的都是闭源的私权软
件,他们在考虑并真正采用开源软件的过程中,并不倾向于完全置换、完全取代的策略,而是执行了一
个从尝试到循序渐进地采用、由少及多的步骤。混源即是这种步骤自然而然的结果,并成为一种流行的
用户软件设施环境。

尽管,混源并不意味着开源软件和闭源软件竞争的结束,
也不能简单视为双方妥协的一种产物。但是,混源代表了一种
新视界:重新洞悉用户的需求,审视软件界格局变幻。

混源在流行

长久以来,软件提供商们在“开源、闭源软件谁更优劣”的问题上一直争论不休。如今,用户
的软件设施环境却既不是纯开源,或者纯闭源,而是混源状态。

作为最近两年才出现的词汇,混源是英文“mixed source”的中文译语。顾名思义,混源是相对于
闭源软件(closed source)和开源软件(open source)而言的,它是兼有闭源软件和开源软件的一种
混合体。

任何采用了开源软件(不管量有多大)的企业用户的软件设施环境均可以视作混源环境。事实上,
由于完全采用开源软件的用户数量极少,绝大部分用户先前采用的都是闭源的私权软件,他们在考虑并
真正采用开源软件的过程中,并不倾向于完全置换、完全取代的策略,而是执行了一个从尝试到循序渐

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 113


混源新视界

进地采用、由少及多的步骤。混源即是这种步骤自然而然的结果,也是今天一种流行的用户软件设施环
境。

推力

Linux 发行商之一的 Novell 与闭源软件巨头微软的合作,让混源变成了一个引人瞩目的流行语。此


前,混源这一说法就已经出现,但是并不广为人知。

2006 年 11 月,Novell 与微软签订了“以互操作性为中心”的合作协议,引起全球 IT 界剧烈震动,


开源界、私权软件界都议论纷纷。

不久,2006 年 12 月 28 日,新上任 6 个星期的 Novell 亚太区主席 Maarten Koster 对媒体宣称,


Novell 是一家“混源公司”,“大多数 Novell 客户都处在一种混源 IT 环境之中”,从而区别于红帽和
微软们。尽管并不是所有的开源软件提供商像 Novell 那样同时拥有开源和闭源软件,但是,从用户的角
度来看,Koster 点破了现实:在不少用户的 IT 环境中,并不完全采用闭源软件,也不是全部使用开源软
件,而是将这两者结合起来使用,即混源模式。

在与微软签订合作协议后至今的几个月内,Novell“捷报频传”,沃尔玛、雪佛龙、德意志银行、
香港汇丰银行等相继基于 Novell 与微软的合作协
议而采用 Suse Linux。这些令人羡慕的合作成果
表明,现实正如他们当初向媒体解释合作理由时
表示的那样,用户希望在使用闭源软件的同时,
能够同时使用开源软件。

当然,在此之前,不少知名的大公司已经有
采用开源软件来改善业务的经历,比如雅虎、
Google 等等,但是他们并没有全盘采用开源软件,
所以,他们主要处于一种混源的 IT 环境中。如今,出于节省费用的目的,一些大型零售商、银行、电信
公司也开始对开源软件感兴趣,特别是当他们面临大规模应用的时候,如果几十台甚至几百台服务器都
使用开放源代码软件的话,仅仅是所节省的费用就很可观。

悄然盛行

从统计的数据来看,用户的数据中心大量呈现出一种混源状态:Gartner 一项名叫“运行在数据中心
上的 Linux 持续增长“的报告显示,40%的数据中心混合运行 Mainframe、UNIX、Linux 和 Windows;24%的

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 114


混源新视界

数据中心混合运行 UNIX、Linux 和 Windows;4%的数据中心混合运行 Linux 和 Windows;仅有 4%的数据中心


仅仅运行一种服务器操作系统:Windows Servers。这样,综合起来看,67%的数据中心会运行 Linux。

另外,开源软件在市场上的占有率也在逐年攀升。在数据库方面,第三方市场调查机构 Evans 数据
公司最近公布的一系列客户调查数据显示,在过去两年里,MySQL 在所有开发者使用的数据库中获得了
25%的市场份额;在浏览器上,Firefox 在全球的市场占有率也达到了 25%。值得一提的是,上述统计结果,
并没有将从社区上自行下载开源软件来进行进一步开发的众多开发者计算在内。

混合开发模式

说混源模式是指用户的软件设施环境中既有开源软件也有闭源软件,主要是从最终用户的角度来讲。
但是,如果从软件提供商的角度来看的话,混合的开发模式也应该包括在内。

微软大中华区平台战略总监李科研认为:“混源”作为闭源软件和开源软件的并存,有三个层面的意
思:一是表面意思,即商业软件产品和开源软件产品的并存;一是软件开发模式的并存;另外还有一个互操
作问题,互联协作的能力与可靠性和安全性一样重要。

在混合开发模式上,微软已经参与社区。李科研说:“微软不与开源的开发模式竞争,相反我们在与
社区和合作伙伴一起参与开源的开发模式”。比如,微软在开放源代码项目库网站 Source-Forge
(www.sourceforge.net)上公布了 Windows Installer XML、Windows Template Library、 FlexWiki 等
项目,逐步“向中间靠拢”。

同时,微软和 Novell 合作的一个重点是要突破互操作的难题,双方已经开始在虚拟化、混合系统管


理、文档格式兼容性方面进行合作开发。

另外一个举起混合开发模式大旗的厂商是 BEA。2006 年 2 月,BEA 宣布开源其持久性引擎 BEA Kodo 的


重要部分,该开源项目称为 Open JPA。

其实,将 Solaris 和 JAVA 开源的 Sun,支持 eclipse 社区开发的 IBM,对 Linux 提供支持和服务的甲
骨文等等公司都可以视作正在实施一种混合开发模式。同样,在产品上能够不同程度上支持、兼容开源
软件的闭源软件提供商也在参与互操作性这一工作,他们均可视为是混源模式的参与者。显然,这样的
厂商正愈来愈多。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 115


混源新视界

一场谋略的博弈

混源并不意味着开源软件和闭源软件竞争的结束,也不能简单视作双方妥协的一种产物,而是
更像一场谋略的博弈。

当 Novell 与微软宣布合作消息时,双方一致解释合作的理由乃是因为客户的需要。没错,混源模式
的出现也是客户的需要,但是这只是原因之一,甚至很难称得上是主导因素。

用户动机

说到客户的需要,其实是企业 CIO 的需要,因为 CIO 是决定采用何种 IT 设施仅次于企业一把手的人


物,而且他们的技术能力往往比较强。出于对当前的规划和未来的考虑,企业 CIO 在采用开源软件方面
的心态如何?Novell 大中华区总经理张先民认为,至少有以下几种心态促使他们采用开源软件,从而加
入到混源的 IT 环境中来:

第一种,主观上非常希望尝试开源软件。这种 CIO 属于较快接受新事物的那种人,他通过各种渠道


了解到了开源软件的诸多优点,主观的动机来尝试。

第二种,客观上为节约 IT 成本。比如用户本身不是赢利较大的企业,或者一把手总是责怪为什么 IT
预算总是那样高居不下。那么,为了节约成本,开源成可选。

第三种,竞争所致。比如同行业的竞争对手企业采用某开源软件促进了其某些业务的增长,为追赶
或者超过该竞争对手,也要采用开源。

第四种,重视安全。许多国家的政府机关弃用 Windows 而用 Linux 多是出于安全方面的考虑。

上述这些心态往往促使企业采用开源软件,但是他们并不会将原有系统全部换上开源软件,而是遵
循了一种循序渐进的步骤。事实上,企业核心的业务往往采用的是稳定性和安全性较高的专有系统上,
比如 IBM 的 Z 系列主机系统。而开源软件的采用是从边缘业务开始的,比如银行的前端业务。

这些心理使得用户更加倾向于混源模式,他们希望通过尝试来发现开源是否真正适合自己。

战略之战

那么,混源的出现就是软件提供商完全服从于用户意愿的结果吗?事实并非如此简单。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 116


混源新视界

表面上来看,微软等闭源软件提供商们“屈服”、“服从”用户的需求和愿望,“接受”混源环境
的事实,实际上,“买东西的人没有卖东西的人精明”:在企业信息化历程中,用户被厂商牵着鼻子走的
情形并不少见,用户在是否采用开源软件的问题上讲究战略,而软件提供商更是用心良苦。

闭源软件和开源软件之间的竞争从来没有停止过,即使 Novell 和微软携手合作,这种竞争也还没有


结束。微软大中华区平台战略总监李科研说:“微软不与开源的开发模式竞争,相反我们在与社区和合作
伙伴一起参与开源模式。在市场上,微软的业务是提供商业软件为用户提供价值,与提供开源产品的厂
商竞争。”Novell 大中华区总经理张先民也信奉“没有永远的朋友,没有永远的敌人,只有永远的利
益”,他说:“尽管 Novell 与微软合作了,双方还有竞争的关系,而且竞争的成分更重一些。”

企业用户希望在原有的闭源环境中加入开放的因素,采用开源软件,这种愿望已是无法抵挡。作为
闭源软件提供商,微软不得不面对这一事实,但是这并不意味着它接受了这一事实。当记者问及微软与
Novell 合作事件是否意味着微软承认混源模式存在的意义时,李科研这样回答:“开源和商业软件的本质
区别在于软件产品的开发和维护模式。由于开发维护模式的不同,用户使用产品的体验就不同。开源软
件具有高度的用户可修改性,但同时带来版本混乱,难于维护的弊端;商业软件强调使用产品本身的设计
功能和开发接口来满足需要,具有版本统一和维护统一的优势,但达不到在源程序层面上的可修改性。
这两种流程各有利弊,用户应该根据自己的情况进行选择。”

而张先民告诉记者,Novell 连续获得大单,业内许多人就此以为是 Novell 从微软身上得到的好处要


大于微软从 Novell 身上所得的好处,其实并不如此。“比如汇丰银行、德意志银行等大单,表面上看由
于这些银行是微软的客户,所以说是 Novell 通过微软得了好处。实际上,微软不是没有自己的用心,微
软希望借助 Linux 进入银行业的核心业务领域,因为 IBM 的 z 系列主机系统才是目前这个市场的绝对占有
者。”

微软与 Novell 的合作也让 IBM 和红帽走得更近了。2007 年 3 月,IBM 和红帽联合发布了双方合作开


发的成果:三项集成到 Linux 内核的新技术,即虚拟化、提供数据保护的高安全性、以及实时 Linux 技术。
红帽最新版本的 Linux 5 也随后发布。据悉,2007 年夏,IBM 的 X 系列服务器,即 PC 服务器也将能够捆
绑红帽的 Linux 5 进行销售,至此,IBM 的 Z 系列、P 系列到 X 系列三线服务器将全部与红帽 Linux 实现
捆绑销售。

由此可见,混源并不意味着开源软件和闭源软件竞争的结束,也不能简单视作双方妥协的一种产物。
也许,若干年后回头再看这一段历史时,我们会发现,混源仅仅是一场谋略的博弈,不论是在用户与厂
商之间,还是厂商与厂商之间。

www.linuxpk.com 投稿邮箱:opensource@linuxpk.com 合作邮箱:xiaoli@Linuxpk.com 《开源》 117