Professional Documents
Culture Documents
卷首语
大师的到来与中国的开源
二月的北京,气候开始转暖,经过一个喜庆春节的洗礼,人们又投入到忙碌的工作当中。在 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 这样基金会性质的组织“瞄”上中国,我们还可以更多的理解为开源的“公益”
《开源》 版权页
2008 年 2 月 第二期
主办:Linux 宝库
网址:http://www.linuxpk.com
主编:陈杰
副主编:陈绪
运营总监:晓黎
校验排版:邱风
封面设计:张亚运
编辑部:曹金成
投稿邮箱:opensource@linuxpk.com
合作邮箱:xiaoli@linuxpk.com
声明:杂志部分内容来自开源社区及互联网,目的是加强开源文化交流及开源应用传播,如
有版权问题,敬请联系,我们将在第一时间作出处理。
致谢:本电子杂志由 Openoffice.org 制作,并直接导出 PDF 文件,在此表示感谢。
《开源》第一期创刊号一经推出,得到了开源爱好者热烈的欢迎,
仅 Linux 宝库单点下载就超过两万余次,这让我们在惊喜的同时,
也感到了身上的责任。第一期混源新视界栏目的《探讨“混源应用”
发展之道》作者为刘志勇,链接地址为:
http://stlzy.blog.51cto.com/69882/37770,由于我们编辑部没能
找到文章原地址,因此对文章没有进行署名,该作者及时的联系到
本刊,特此在第二期进行说明,并对作者表示歉意,希望广大作者
踊跃投稿,为我们的兴趣、爱好、事业贡献一份开源的力量。
目录
卷首语..................................................................................................................................................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 月 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 商业方案与软件战略部主管 Margaret Lewis 说,通过在 SourceForge.net 上开设开源项目,AMD
可以让程序员对软件进行定制与优化,以便其兼容 Linux,Windows 和 Solaris 的编译器。
专家们认为,为开发者门创建针对多核处理器的优化根据是业界目前面临的最大挑战。
Lewis 说,尤其是多媒体程序,通过优化代码,多媒体程序在多核处理器平台上的性能会得到极大提高。
Sun 收购 innotek
博 客 文 摘
(写在“2008Linux 开发者研讨会-中国”之前)
中国开源软件推进联盟主席 陆首群
博客地址:http://www.lupaworld.com/16128/
成熟。
Michael Tiemann
博客地址:http://michaeltiemann.lupaworld.com
对微软标准我所坚持的观点
胡才勇
博客地址:http://blog.sina.com.cn/hucaiyong
一、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 的互用性,这
二、OOXML 缺少可供第三方实现的实施指南
我们的格式兼容实践表明,办公软件文档格式仅能够确保文档的格式和内容被正确记载,但无法做
到精确的版式兼容。如果版面算法不一致,跑版现象是难以克服的。Ecma 并没有公布 OOXML 相应的实
现指南,特别是版面算法,因此,OOXML 的初衷,即通过 OOXML 让众多的实现人员能够忠实的再现
以前的所有办公文档将成为空话。
ODF 有开源的 OpenOffice 作为参考实现使人们得以分析其版面算法,但 Microsoft Office 则不能。由
于缺少真正的实施指南,微软 Office2007 就成为了 OOXML 的唯一实施标准。微软制定了一个“开放”
的标准,但所提供的实施标准就是 Office2007;由于 Office2007 的封闭性,反过来决定了微软是 OOXML
的唯一实现者。
而另一个更为严峻的问题在于,现在的 OOXML 按照各方的要求修改后,微软 Office2007 是否也能
随之修改,使其能继续符合 OOXML 标准。由于缺少符合性测试案例,我们甚至无法确认 Office2007 是
否符合该标准。换言之,完全可能出现的情况是:在 OOXML 成为国际标准后,市场上根本就不存在完
全符合该标准的产品。
2、电子表格中的密码哈希算法是依赖于机器的
电子表格中的密码哈希算法定义由 5 页纸的 C 语言代码来定义,似乎是从 Excel 中直接提取的。然而,
代码中的位控制又是依赖于机器的,根据处理器的不同会给出不同的结果。在一个机器上建立的文档可
能在另一个机器上不可阅读。关于此功能,OOXML 没有提供一个便捷的定义。OOXML 的平台依赖性对
国产操作系统和国产芯片都将是致命的打击。在确保微软 OOXML 能成为与平台无关的真正开放的标准
前,我们必须对此标准持反对态度。
结语:
之前 OOXML 自身存在的问题和我们反对 OOXML 成为国际标准的理由仍然存在,并未随着微软的
回复而得到根本性的解决。我们认为此前中国政府在投票过程中的建议是非常理性、合理的:DIS
29500(即 OOXML)不适合快速通道,应转变快速通道为常规程序,或延长评审期限。
给“Linux 志愿者”一个名分
袁萌
博客地址:http://blog.csdn.net/yuanmeng001
开 源 社 区
项目动态
文泉驿正黑夸父(测试版)发布
经过将近半年的优化和改进,文泉驿正黑下一个里程碑版本(夸父)的测试版(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 朋友,这个字体中对常用汉字的改进有很大一部分得益于他的劳动。
正如这个字体版本号所表明的那样,我们的字体与完美尚有相当的距离。但就像我以前所说,这是
一个充满生命力的字体,它每一天都在成长,只要大家都来关心和支持,相信有一天,这个字体将成为
大家最为钟爱的字体。
首先,祝大家新春愉快,合家欢乐,鼠年行好运,发大财。下面我简单的说下情况,具体的发布通
告慢慢补充吧。
说个大概情况,由于这两年添加了不少东西,这样还实现 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 版本没有来得及打包,根据测试情况再决定正式版使用哪个版本。
关于目前已知的一些问题:
● 安装程序(即 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 中,已经引入了 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 发布
● 可打开双窗口,在分窗口中又可打开多个子窗口,允许快捷切换全屏显示模式(F11),支持鼠标滚
轮改变文档显示比例等;
● 提供数个特色功能,如邻
行互换位置、宏功能等。
现在网上有很多文件编辑器,
这个却是不可多得的一款,不论是
日常使用还是手写编程代码,都能
让你体会到它独有的优势和方便。
基于 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 包。
引言:当博客已经成为时下最火的网络应用,当人们通过博客来分享知识、获取信息、交流情感、
传播新闻时,WordPress 这款开源博客系统也渐渐成为了博客系统的主流,成为人们关注的焦点。本文以
WordPress 让博客更精彩
朱珠
WordPress 是一个开源的 PHP+MySQL 博客发布系统,以 GPL 协议发布,以功能强大、运行稳定、安
全高效而广受博客作者的喜爱。它支持多种语言,拥有丰富的插件与模板资源,目前已成为全球使用最
广泛的博客发布系统之一。
历史背景
WordPress 这个名字是由 Christine Selleck(该项目领导人 Matt Mullenweg 的一位朋友)提出的。
WordPress 是 b2\cafelog 的官方替代项目,现在有非常兴盛的用户群和开发者社区。WordPress 目前支持
独立的博客或独立站点的安装,官方站点(如图 1 所示)上也提供了一个多用户的版本。实际上即使不
使用多用户博客,用户仍然可以有多个博客在同一服务器上,使用相同的数据库,只需要把文件放置到
不同的目录就可以实现。(图 1 WordPress 官方站点)
社区文化
同其他开源项目一样,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 充分满足自己的需求。
图 3 灵活的插件管理
多元应用
WordPress 的主要应用是个人博客系统,但是用户可以将它变成一个个人门户,一个商业门户,当然
这需要有特定的插件支持和一个优良的外观模板。结合其他相关自由软件项目,比如 Drupal、PHPBB 等
甚至可以建立自己的大型网络社区。给笔者印象最深的是知名的 Web 设置专家 Eric Meyer 的个人站点,
如图 4 所示,充分发挥 WordPress 的功能,加上良好的导航结构和优秀的外观样式设计,使任何访问过该
站点的人都会对他充满敬意。
发展方向
从最初的几个开发者到现在规模庞大的开发者社区,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
Linux 内核的文件预读
中国科技大学 吴峰光
引言
从寄存器、L1/L2 高速缓存、内存、闪存,到磁盘/光盘/磁带/存储网络,计算机的各级存储器硬
件组成了一个金字塔结构。越是底层存储容量越大。然而访问速度也越慢,具体表现为更小的带宽和更
大的延迟。因而这很自然的便成为一个金字塔形的逐层缓存结构。由此产生了三类基本的缓存管理和优
化问题:
● 预取(prefetching)算法 从慢速存储中加载数据到缓存
● 替换(replacement)算法 从缓存中丢弃无用数据
● 写回(writeback)算法 把脏数据从缓存中保存到慢速存储
其中的预取算法,在磁盘这一层次尤为重要。磁盘的机械臂+旋转盘片的数据定位与读取方式,决
定了它最突出的性能特点:擅长顺序读写,不善于随机 I/O;I/O 延迟非常大。由此而产生了两个方面的
预读需求。
来自磁盘的需求
1、数据定位
平均定位时间主要由两部分组成:平均寻道时间和平均转动延迟。寻道时间的典型值是 4.6ms。转动
延迟则取决于磁盘的转速:普通 7200RPM 桌面硬盘的转动延迟是 4.2ms,而高端 10000RPM 的是 3ms。
这些数字多年来一直徘徊不前,大概今后也无法有大的改善了。在下文中,我们不妨使用 8ms 作为典型
定位时间。
2、数据传输
持续传输率主要取决于盘片的转速(线速度)和存储密度,最新的典型值为 80MB/s。虽然磁盘转速
难以提高,但是存储密度却在逐年改善。巨磁阻、垂直磁记录等一系列新技术的采用,不但大大提高了
磁盘容量,也同时带来了更高的持续传输率。
显然,I/O 的粒度越大,传输时间在总时间中的比重就会越大,因而磁盘利用率和吞吐量就会越大。
表 1 随机读大小与磁盘性能的关系
来自程序的需求
应用程序处理数据的一个典型流程是这样的:while(!done) { read(); compute(); }
假设这个循环要重复 5 次,总共处理 5 批数据,则程序运行的时序图可能如图 1 所示。
图 1 典型的 I/O 时序图
图 2 预读的流水线作业
注意!在这里我们并没有改变应用程序的行为:程序的下一个读请求仍然是在处理完当前的数据之
后才发出的。只是这时候的被请求的数据可能已经在内核缓存中了,无须等待,直接就能复制过来用
(详见预读架构一节)。在这里,异步预读的功能是对上层应用程序“隐藏”磁盘 I/O 的大延迟。虽然延
迟事实上仍然存在,但是应用程序看不到了,因而运行的更流畅。
预读的概念
预取算法的涵义和应用非常广泛。它存在于 CPU、硬盘、内核、应用程序以及网络的各个层次。预
取有两种方案:启发性的(heuristic prefetching)和知情的(informed prefetching)。前者自动自发的进行预读
决策,对上层应用是透明的,但是对算法的要求较高,存在命中率的问题;后者则简单的提供 API 接口,
而由上层程序给予明确的预读指示。在磁盘这个层次,Linux 为我们提供了三个 API 接口:
posix_fadvise(2), readahead(2), madvise(2)。表 2 详细列出了 fadvise 可以完成的功能。
预读建议(advice) 涵义 内核动作
预读(readahead)算法预测即将访问的页面,并提前把它们批量的读入缓存。
它的主要功能和任务可以用三个关键词来概括:
- 预测 这是预读算法的核心任务。前两个功能的达成都有赖于准确的预测能力。当前包括 Linux,
FreeBSD, Solaris 等主流操作系统都遵循了一个简单有效的原则:把读模式分为随机读和顺序读两大类,
并只对顺序读进行预读。这一原则相对保守,但是可以保证很高的预读命中率,同时有效率/覆盖率也
很好。因为顺序读是最简单而普遍的,而随机读在内核来说也确实是难以预测的。
Linux 的预读架构
图 3 以 pagecache 为中心的读和预读
预读算法概要
- 顺序性检测
这是文件被打开后的第一次读,并且读的是文件首部;
当前的读请求与前一(记录的)读请求在文件内的位置是连续的。
如果不满足上述顺序性条件,就判定为随机读。任何一个随机读都将终止当前的顺序序列,从而终
止预读行为(而不是缩减预读大小)。注意这里的空间顺序性说的是文件内的偏移量,而不是指物理磁
盘扇区的连续性。在这里 Linux 作了一种简化,它行之有效的基本前提是文件在磁盘上是基本连续存储的,
没有严重的碎片化。
- 流水线预读
- 预读的大小
当确定了要进行顺序预读(sequential readahead)时,就需要决定合适的预读大小。预读粒度太小的话,
达不到应有的性能提升效果;预读太多,又有可能载入太多程序不需要的页面,造成资源浪费。为此,
Linux 采用了一个快速的窗口扩张过程:
预读窗口的初始值是读大小的二到四倍。这意味着在您的程序中使用较大的读粒度(比如 32KB)可
以稍稍提升 I/O 效率。
2. 后续预读: readahead_size *= 2;
后续的预读窗口将逐次倍增,直到达到系统设定的最大预读大小,其缺省值是 128KB。这个缺省值
已经沿用至少五年了,在当前更快的硬盘和大容量内存面前,显得太过保守。比如西部数据公司近年推
出的 WD Raptor 猛禽 10000RPM SATA 硬盘,在进行 128KB 随机读的时候,只能达到 16%的磁盘利用率
(图 5)。所以如果您运行着 Linux 服务器或者桌面系统,不妨试着用如下命令把最大预读值提升到 1MB
看看,或许会有惊喜:
重新发现顺序读
上一节我们解决了是否/何时进行预读,以及读多少的基本问题。由于现实的复杂性,上述算法并不
总能奏效,即使是对于顺序读的情况。例如最近发现的重试读(retried read)的问题。
图6 重试读(retried reads)
当读到缺失页面(missing page),进行同步预读;
当读到预读页面(PG_readahead page),进行异步预读。
这样一来,ahead 预读窗口就不需要了:它实际上是把预读大小和提前量两者作了不必要的绑定。新
的标记机制允许我们灵活而精确地控制预读的提前量,这有助于将来引入对笔记本省电模式的支持。
另一个越来越突出的问题来自于交织读(interleaved read)。这一读模式常见于多媒体/多线程应用。
如图 8 所示。当在一个打开的文件中同时进行多个流(stream)的读取时,它们的读取请求会相互交织在一
起,在内核看来好像是很多的随机读。更严重的是,目前的内核只能在一个打开的文件描述符中跟踪一
个流的预读状态。因而即使内核对两个流进行预读,它们会相互覆盖和破坏对方的预读状态信息。对此,
我们将在即将发布的 2.6.24 中作一定改进,利用页面和 pagecache 所提供的状态信息来支持多个流的交织
读。
图 8 两个流的交织读
Linux 预读算法小记
日期 版本号 作者 功能
相关链接
自适应预读算法
http://kerneltrap.org/node/6642
http://lwn.net/Articles/155510/
http://lwn.net/Articles/235164/
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
开源虚拟化技术的结构概述与发展
田坤 蒋运宏 董耀祖
虚拟化技术是当下非常火热的一个领域,而开源社区的活力给这项技术加上了飞翔的翅膀。随着开
源思想的深入人心,尤其是 Linux 内核的成熟提供了最佳的借鉴平台,开发者将他们的想法付诸实现变得
越发容易。如今开源社区中的虚拟化产品是百花齐放,各具风采,有的已经形成了非常成熟的开发社区
和广泛的用户,例如 Xen;有的刚一提出便成为开源社区的焦点,譬如 KVM;还有的另辟蹊径,选择不
同的虚拟对象,如容器技术。本文首先给予虚拟化技术一个基本的介绍,给读者展示当前开源社区中的
几种主要虚拟化产品的特点,然后以 Linux 内核为例阐述虚拟化技术的发展对传统操作系统结构带来的影
响。通过这些介绍,我们希望展示给读者一项新的技术如何在开源社区中发展,尤其是不同开源结构之
间的相互影响和促进。
虚拟化技术的发展
虚拟化本身不是一个新的概念,早在上世纪 60 年代虚拟机的名称就已经诞生,从这个程度上来说,
这是一个和操作系统有着同样悠久历史的领域。在虚拟化技术发展的几十年历程中,它经历了数次大幅
度的起落,人们不断被虚拟化技术潜在的功能所吸引,然后又因客观技术上的限制而放弃。但是随着近
年来处理器技术和性能的迅猛发展,虚拟化技术成熟的时机真正到来。尤其是硬件虚拟化技术的诞生
(例如 Intel®VT 和 AMD SVM 技术),极大的扩展了虚拟化技术的应用范围。基本上虚拟化技术从实现
途径上来说,由两种典型的派别:泛虚拟化和完全虚拟化。前者通过修改客户操作系统来配合虚拟化的
环境,从而达到较高的性能,但也付出了兼容性和维护性方面的限制;而完全虚拟化技术常常需要得到
处理器级别的硬件支持(也称硬件虚拟化),或者通过对客户机执行代码进行动态二进制代码转换
(Binary translation),然后可以无需修改的直接运行一个已有的操作系统,使得虚拟化技术的应用更加
容易。事实上,当前一些主流的虚拟化产品都同时支持这两种模式。
XEN
Xen 是由英国剑桥大学开发的一个成熟的开源虚拟化产品,最初只支持 32 位 X86 体系结构上的泛虚
拟化客户操作系统。这种泛虚拟化是通过引入管理接口(Hypercalls)和事件(Events)机制来实现的,
这实际上在客户操作系统上引入了一个修改过的 X86 体系架构,尽管这种修改极其轻微。同时客户机和
虚拟机监控程序(hypervisor)之间的高效共享内存数据交换机制都使得新的客户机体系架构(XEN 架构)
具有更高的总体性能。最近在 Intel®开源技术中心的帮助下,Xen 实现了对硬件虚拟化技术的支持,从而
前端设备驱动
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)上,并迅速被集成到
Apps
QEMU
App App
kernel
s s
ioctl
Vmexit Vmentry
Linux Kernel guest
KVM module
User
Hardware with virtualization support kernel
图 2:KVM 下的三种执行模式
UML
UML (User Mode Linux),顾名思义,将 Linux 内核运行在用户模式。它是第一个被接收进标准 Linux
内核的虚拟化技术,它本身被看作是 Linux 内核所支持的众多处理器结构中的一个,区别在于这是一个虚
拟的结构。UML 的内核是从标准 Linux 内核源代码编译出来,保持了大部分基本的通用功能,例如虚拟
文件系统,内存管理,等等。但是和正常的 Linux 内核(例如基于 x86 的版本)相比,最明显的区别在于
UML 将底层硬件相关的接口全部转化成了用户级别的系统调用,从而允许 UML Linux 本身可以作为一个
进程 1 … 进程 N UML
进程 1 … 进程 N UML 接口 驱动
硬件(处理器、内存、外设……)
图 3:UML 运行环境
容器(Container)虚拟化技术
容器虚拟化技术,也被看作是一种操作系统级别的虚拟化。它和前面所述各类开源虚拟化产品的主
要区别在于,虚拟化的对象不是实际的物理资源(处理器、内存和外设),而是从用户角度出发而抽象
的操作系统内部资源,例如:
● 独立的根文件系统
● 独立的权限控制,例如用户和组管理
● 独立的进程集合,例如进程号
● 独立的网络访问能力
● 独立的 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 上运行。
采用标准虚拟机接口的操作系统
(VMI OS)
图 4:标准虚拟机接口下的虚拟化实现
作者简介
田坤,现任职于 Intel 开源软件技术中心(Intel Open Source Technology Center), 具有 3 年 Linux
内核和开源软件开发经验,目前主要从事虚拟技术相关的研发工作。
蒋运宏,现任职于 Intel 开源软件技术中心(Intel Open Source Technology Center), 具有 3 年
Linux 内核和开源软件开发经验,目前主要从事虚拟技术相关的研发工作。
董耀祖,现任职于 Intel 开源软件技术中心(Intel Open Source Technology Center), 长期从事嵌入
式系统和操作系统内核开发,目前主要从事虚拟技术相关的研发工作。
知 识 学 堂
解读 Linux 编程库
曹江华
库的定义和种类
图1
库的命名和编号
库的编号格式如下: 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 个共享库。
图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 服务器就将此查询的整
库的升级
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.建立库函数的安装目录
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 的开发者有所帮助。
重读 2.4 内核(2)
看一个例子,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), \
"=&D" (__d2) \
: "i"(-EFAULT), "0"(count), "1"(count), "3"(src), "4"(dst) \
: "memory"); \
} while (0)
二.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 */
* 则大功告成.
*/
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)
{
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);
}
只来关心一下其中加了注释的一小段,
.........
桌 面 应 用
陈绪
鉴于目前中国 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 设置。
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 光盘启动,选择升级,然后单独选择包,安装即可。
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 种方法如下:
一. 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 命令为例:
开源世界中的 FreeProxy
Kakaryan
一.kingate
kingate 是一款国人开发的代理服务器。
修改配置文件:
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 代理已成功配置并运行了
二.tinyproxy
tinyproxy 是一个小型的基于 GPL 的 http/ssl 代理程序,在非常适合小型网络而且便于快速部署。这个代理
程序的最大优点是占用系统资源比较少。
tinyproxy 的安装和普通 Linux 程序的安装方法一样
都是这样三步
./configure
在 configure 的时候常用的几个参数
--enable-debug 调试选项
--enable-socks 打开 socks 支持
--enable-filter 允许 tinyproxy 过滤一些指定的网站
--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
三.socks5
在北大天网搜索 socks5-v1.0r11.tar.gz 有很多 socks 的安装包。
我们下到我们的 linux 服务器上
解压,安装:
#tar zxvf socks5-v1.0r11.tar.gz
#cd socks5-v1.0r11
#./configure
#make
#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
逐渐成熟的桌面 Linux
微电脑世界 刘超
自由的利弊与 Linux 架构
不管桌面 Linux 市场如何变化,自由软件世界的开发者们总是充满热情,他们按照 GNU 的思想把
GNU/Linux 和许多自由软件发展下去,一点点地走向成熟,就像以前 Linux 在服务器市场获得的巨大成功
一样。自由是 Linux 开发中最大的优点,同时也是最大的不足。优点在于,Linux 的开发可以不受太多外
界因素的影响,从而得到非常健康的发展;缺点是开发者们由于对外界经常采取不太理会的态度,从而
在软件的人性化方面会让普通用户很难接受,这会导致缺乏 OEM 厂商的支持。一种操作系统软件不管拥
有多少先进的特性,如果缺少与用户的亲和力,则很难取得成功。
好在 GNU/Linux 从起步到现在,其每一个新版本的发布以及最近的很多迹象都在表明 GNU/Linux 在
软件界面的人性化方面不断进步着。下面我们将从一个完整的 Linux 系统架构来分析其发展趋势。在这之
前,我们先需要从图 1 中了解桌面 Linux 的系统架构。
图1
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 网络对象模型环境)就应运而生。
基于应用的桌面环境
图2
图3
GNU/Linux 标准化的道路
今后的主要任务
张宓
不要担心软件设置的问题,它提供了一个方便的向导程序帮助你进行各项设置,比如指定多媒体文
件的存放位置、设置 TV 或收音机的频道等。除了使用鼠标和键盘操作外,还可以使用遥控器,操作计算
机就像看电视一样方便。
图 2 遥控器选择
图 3:播放 DVD,自动从互联网下载 CD 信息
Ubuntu 笔记本电源管理优化指南
Linux 宝库
[ ] 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 [...]
[...]
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
企 业 应 用
靳建平
需求分析
从 1969 年美国国防部创建基于分组交换的 ARPANET 到现在基于 TCP/IP 的 Internet,不到四十年的
时间,我们的生活已经越来越离不开网络了。我国在 80 年代后期才开始发展网络,目前已有四大骨干网
络,基本满足了使用网络的需求,但由于网络建设的阶段性,没有一个完全统一的网络,跨网络访问的
速度还有待提高,因此很多单位就租用不同的线路来满足高速访问不同网络的需要。
众所周知,原中国电信集团按南北地域分家,成立了新的中国电信和网通集团,互联网的骨干网也
被一分为二了,北有网通、南有中国电信。此后,网络访问就出现了一些问题,有些经常访问的网站速
度就一下子慢了下来,有时候还有访问不上去需要多次刷新的情况出现。如笔者所在的北方地区访问服
务器在网通机房的网站很快,而访问在南方电信的网站就很慢。据分析,产生这种问题的原因是中国电
信分家之后,骨干网连接存在一定的问题,虽然信息产业部已经在做互联互通的计划并在实施中,但估
计在相当长的一段时间内,南北网速差异的问题还会存在。
笔者所在的学校网络有两个出口,教育科研网千兆线路和网通百兆线路。通过采用双出口,校园网
访问公网速度慢的问题得到了解决,但反过来公网访问校园网慢的问题却更加突出。学校服务器大多使
用的是教育网的域名和 IP 地址,所有对校园网服务器的访问都要走 CERNET 链路,因此,尽管校园网拥
有高速的公网链路,但公网用户却只能通过教育网链路才能访问到校园网的资源,这无疑是对公网出口
链路的浪费。因此学校申请了教育网和公网的域名,教育网、公网用户分布使用教育网域名、公网域名
访问我们的网站,速度会很快,但这依然存在问题,用户如何知道要这样来访问会达到最好的效果?
大致的解决方法有如下几种:
一、把网站首页做成提示页面,让用户选择使用哪个镜像,但这就要求用户清楚自己的网络属于哪
种网络,否则用户无法做出选择。
二、程序自动判断用户 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}/\
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 环境,必须把
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;
};
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
内容如下:
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
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
添加内容
#!/bin/sh
把服务器启起来
/usr/local/etc/rc.d/named.sh
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
HTTP 代理获取设计
1 前言
这里先说一些基础概念,主要给还不是特别清楚的同志一些学习的机会。
1. 1 标准 ISO7498——开放式系统互联参考模型(ISO/RM)
有国际标准化组织定义的一个模型,包含了硬件与软件的组织与设计所必须遵循的规定。
● 物理层:媒介;用于建立、保持和断开物理接口。
● 数据链路层:主要负责数据链路的建立、维持的拆除等。
● 网络层:又名通信子网。控制子网的运行。
● 传输层:在经济而又有效的前提下保证通信的质量。
● 会话层:提供一种有效方法,以组织并协商两个表示层进程之间的会话,并管理它们之间的数据
交换。
● 表示层:解决用户信息的语法表示问题。
● 应用层:ISO 最高层,直接面向用户,是利用网络资源,唯一向应用程序提供服务的层。
1.2 TCP/IP
ISO/RM 的一个子类,构筑在物理层硬件概念性层次基础之上。
1. 应用层:提供一组常用的应用程序,主要有文件传输协议、远程访问协议及其电子邮件协议等,
负责接收和发送数据,并把数据按传输层格式组织好向下层传输。
2. 传输层:基本任务是提供应用程序之间端到端的通信,并把数据分组可靠地传给下一层。
3. 网间网层:负责相邻计算机之间的通信。其功能主要是处理来自传输层的分组发送请求,并将该
分组装入 IP 数据报中,再把它交给下一层。网间网层具有路径选择、流量控制、拥塞和差错报告
等功能。
4. 网络接口层:对应于 OSI 的数据链路层和物理层,包含了各种逻辑链路控制和介质访问协议,实
现了不同网络间的物理层连接。
o HTTP 并不局限于使用网络协议(TCP/IP)及其相关支持层,尽管这是它在互联网上最为
请求某个特殊的资源,是目前网上最通用的方法。不应该用于一些会造成副作用
的操作中(在网络软件中使用是一个常见的错误用法)。参看下个目录的安全方
法。
3.POST
向确定的资源提交需要处理的数据。这些数据包括在请求的内容里。这可以造成
新资源的产生和更新已有资源。
4.PUT
上传特定资源
5.DELETE
删除特定资源
6.TRACE
返回接收的请求,客户端可因此察看在请求过程中什么中间服务器被加进来或者
有所改变。
7.OPTIONS
1.4 HTTP 代理
• 代理就等于一个网络中转站。举个例子,A 页面要访问 B 页面,但是 A 页面无法直接访问,代理
可以直接访问 B 页面,而 A 页面又可以直接访问代理,那么通过代理中转 A 页面仍然可以访问到 B
页面,有点类似 ssh tunnel 。
1.5 举例及工具
telnet www.yahoo.cn 80
GET / HTTP/1.1
Host: www.yahoo.cn
• 这里顺便介绍一下一个强劲的是一个协议分析器/包嗅探应用程序工具: Wireshark 。
• Wireshark
o 关于 Wireshark ,其实就是以前的 Ethereal , 关于为什么更名感兴趣的可以参考一下
http://blog.ijliao.info/archives/2006/06/10/2358/,这里就不多说了。
o Wireshark 有 Unix 版本也有 Windows 版本,是开源的,可以去
选择菜单:
选择网卡:
选择 filter:
GET 请求监控:
服务器响应请求并返回:
几张图下来估计大家都会使用了,这里不再累述,进入正式的代理获取吧。
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;
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);
sub gethtml
{
my ($url, $proxy) = @_;
eval("use Socket;");
my ($name, $aliases, $type, $len, @thataddr, $a, $b, $c, $d, $that);
my @results = <S>;
close(S);
return \@results;
}
3.2 各种不同的方式验证代理
#include <stdio.h>
#include <stdlib.h>
#include <curl/curl.h>
curl_easy_cleanup(curl);
}
return 0;
}
#!/usr/bin/perl
use strict;
use warnings;
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;
}
• PHP 的常见连接代理方式
o fsockopen 方式
<?php
$content= '';
$proxy = '124.133.37.247:8080';
$url = 'http://fans.huhoo.net/log/getlog.php';
getpage($url, $content, $proxy);
echo $content;
?>
o curl 方式
4 代理的使用
• 这里主要介绍怎么使用代理列表,我们经常去抓百度、Google 等站点的页面和图片,抓取频度过
高会导致 IP 被封,这时候代理列表就起到作用了,
• 其实,上面的验证代理部分已经详细说明了如果通过代理访问其它页面,从而得到想要的数据,
这里不再累述,通过前面的实例可以很清楚的使用各种你最熟悉的语言运用了。
5 参考文档
• 《计算机网络基础》
• Hypertext Transfer Protocol -- HTTP/1.1
• libcurl 官方文档
• PHP 官方手册(中文)
• HTTP 协议大全(中文)
混 源 新 视 界
混源:一种需求 一种策略
彭敏 陈杰
开源软件和闭源软件提供商都不能回避的一个事实是,绝大部分用户先前采用的都是闭源的私权软
件,他们在考虑并真正采用开源软件的过程中,并不倾向于完全置换、完全取代的策略,而是执行了一
个从尝试到循序渐进地采用、由少及多的步骤。混源即是这种步骤自然而然的结果,并成为一种流行的
用户软件设施环境。
尽管,混源并不意味着开源软件和闭源软件竞争的结束,
也不能简单视为双方妥协的一种产物。但是,混源代表了一种
新视界:重新洞悉用户的需求,审视软件界格局变幻。
混源在流行
长久以来,软件提供商们在“开源、闭源软件谁更优劣”的问题上一直争论不休。如今,用户
的软件设施环境却既不是纯开源,或者纯闭源,而是混源状态。
作为最近两年才出现的词汇,混源是英文“mixed source”的中文译语。顾名思义,混源是相对于
闭源软件(closed source)和开源软件(open source)而言的,它是兼有闭源软件和开源软件的一种
混合体。
任何采用了开源软件(不管量有多大)的企业用户的软件设施环境均可以视作混源环境。事实上,
由于完全采用开源软件的用户数量极少,绝大部分用户先前采用的都是闭源的私权软件,他们在考虑并
真正采用开源软件的过程中,并不倾向于完全置换、完全取代的策略,而是执行了一个从尝试到循序渐
进地采用、由少及多的步骤。混源即是这种步骤自然而然的结果,也是今天一种流行的用户软件设施环
境。
推力
在与微软签订合作协议后至今的几个月内,Novell“捷报频传”,沃尔玛、雪佛龙、德意志银行、
香港汇丰银行等相继基于 Novell 与微软的合作协
议而采用 Suse Linux。这些令人羡慕的合作成果
表明,现实正如他们当初向媒体解释合作理由时
表示的那样,用户希望在使用闭源软件的同时,
能够同时使用开源软件。
当然,在此之前,不少知名的大公司已经有
采用开源软件来改善业务的经历,比如雅虎、
Google 等等,但是他们并没有全盘采用开源软件,
所以,他们主要处于一种混源的 IT 环境中。如今,出于节省费用的目的,一些大型零售商、银行、电信
公司也开始对开源软件感兴趣,特别是当他们面临大规模应用的时候,如果几十台甚至几百台服务器都
使用开放源代码软件的话,仅仅是所节省的费用就很可观。
悄然盛行
从统计的数据来看,用户的数据中心大量呈现出一种混源状态:Gartner 一项名叫“运行在数据中心
上的 Linux 持续增长“的报告显示,40%的数据中心混合运行 Mainframe、UNIX、Linux 和 Windows;24%的
另外,开源软件在市场上的占有率也在逐年攀升。在数据库方面,第三方市场调查机构 Evans 数据
公司最近公布的一系列客户调查数据显示,在过去两年里,MySQL 在所有开发者使用的数据库中获得了
25%的市场份额;在浏览器上,Firefox 在全球的市场占有率也达到了 25%。值得一提的是,上述统计结果,
并没有将从社区上自行下载开源软件来进行进一步开发的众多开发者计算在内。
混合开发模式
说混源模式是指用户的软件设施环境中既有开源软件也有闭源软件,主要是从最终用户的角度来讲。
但是,如果从软件提供商的角度来看的话,混合的开发模式也应该包括在内。
微软大中华区平台战略总监李科研认为:“混源”作为闭源软件和开源软件的并存,有三个层面的意
思:一是表面意思,即商业软件产品和开源软件产品的并存;一是软件开发模式的并存;另外还有一个互操
作问题,互联协作的能力与可靠性和安全性一样重要。
在混合开发模式上,微软已经参与社区。李科研说:“微软不与开源的开发模式竞争,相反我们在与
社区和合作伙伴一起参与开源的开发模式”。比如,微软在开放源代码项目库网站 Source-Forge
(www.sourceforge.net)上公布了 Windows Installer XML、Windows Template Library、 FlexWiki 等
项目,逐步“向中间靠拢”。
其实,将 Solaris 和 JAVA 开源的 Sun,支持 eclipse 社区开发的 IBM,对 Linux 提供支持和服务的甲
骨文等等公司都可以视作正在实施一种混合开发模式。同样,在产品上能够不同程度上支持、兼容开源
软件的闭源软件提供商也在参与互操作性这一工作,他们均可视为是混源模式的参与者。显然,这样的
厂商正愈来愈多。
一场谋略的博弈
混源并不意味着开源软件和闭源软件竞争的结束,也不能简单视作双方妥协的一种产物,而是
更像一场谋略的博弈。
当 Novell 与微软宣布合作消息时,双方一致解释合作的理由乃是因为客户的需要。没错,混源模式
的出现也是客户的需要,但是这只是原因之一,甚至很难称得上是主导因素。
用户动机
第二种,客观上为节约 IT 成本。比如用户本身不是赢利较大的企业,或者一把手总是责怪为什么 IT
预算总是那样高居不下。那么,为了节约成本,开源成可选。
第三种,竞争所致。比如同行业的竞争对手企业采用某开源软件促进了其某些业务的增长,为追赶
或者超过该竞争对手,也要采用开源。
上述这些心态往往促使企业采用开源软件,但是他们并不会将原有系统全部换上开源软件,而是遵
循了一种循序渐进的步骤。事实上,企业核心的业务往往采用的是稳定性和安全性较高的专有系统上,
比如 IBM 的 Z 系列主机系统。而开源软件的采用是从边缘业务开始的,比如银行的前端业务。
这些心理使得用户更加倾向于混源模式,他们希望通过尝试来发现开源是否真正适合自己。
战略之战
那么,混源的出现就是软件提供商完全服从于用户意愿的结果吗?事实并非如此简单。
表面上来看,微软等闭源软件提供商们“屈服”、“服从”用户的需求和愿望,“接受”混源环境
的事实,实际上,“买东西的人没有卖东西的人精明”:在企业信息化历程中,用户被厂商牵着鼻子走的
情形并不少见,用户在是否采用开源软件的问题上讲究战略,而软件提供商更是用心良苦。
企业用户希望在原有的闭源环境中加入开放的因素,采用开源软件,这种愿望已是无法抵挡。作为
闭源软件提供商,微软不得不面对这一事实,但是这并不意味着它接受了这一事实。当记者问及微软与
Novell 合作事件是否意味着微软承认混源模式存在的意义时,李科研这样回答:“开源和商业软件的本质
区别在于软件产品的开发和维护模式。由于开发维护模式的不同,用户使用产品的体验就不同。开源软
件具有高度的用户可修改性,但同时带来版本混乱,难于维护的弊端;商业软件强调使用产品本身的设计
功能和开发接口来满足需要,具有版本统一和维护统一的优势,但达不到在源程序层面上的可修改性。
这两种流程各有利弊,用户应该根据自己的情况进行选择。”
由此可见,混源并不意味着开源软件和闭源软件竞争的结束,也不能简单视作双方妥协的一种产物。
也许,若干年后回头再看这一段历史时,我们会发现,混源仅仅是一场谋略的博弈,不论是在用户与厂
商之间,还是厂商与厂商之间。