You are on page 1of 156

封面

卷首语

谁是敌人? 微软选择开源软件
互联网上流传着这么一段话:“微软说要做操作系统,苹果倒下了;微软说要
做互联网,网景倒下了;微软说要做开发工具,Borland 倒下了;微软说要垄断
IT,微软倒下了。”

从这么一段话中,我们不难看出,曾经,苹果、网景、Borland 都是微软不同
时期不同业务层面的敌人,但是命运都是一样:被微软战胜或者征服了。

到了今天,谁是微软的敌人?微软 CEO 鲍尔默曾经在一个小范围的会议上提到


了这个话题,并按照他的设想,微软的敌人有三个:第一是 Google、第二还是
Google、第三是开源软件。对于为什么第一和第二都是 Google,我也产生了疑问,
后来琢磨出来,也许这句话的本意是想强调目前的 Google 已经非常强大,将其列为
前两号“通缉”的对象,也是体现微软对 Google 崛起的重视程度。

Google 的强大已经毋容置疑了,至少在目前,微软和 Google 还没有太多直接


的交锋。而今年,尤其是最近,微软高层在不同场合提到了开源软件,我们也许能从
中看出一些风向的变化。

今 年 五 月 , 微 软 公 司 首 席 软 件 设 计 师 雷 · 奥 兹 在 纽 约 举 行 的 Sanford C.
Bernstein 战略决策会议上发表演讲时表示,尽管谷歌公司是其特别强大的竞争对
手,但开放源代码对微软公司的商业模式却更具有潜在的杀伤力。

而就在 10 月,鲍尔默在接受 Gartner 分析师采访时称,尽管谷歌在搜索市场


领先于微软,但谷歌还算不上微软的最大劲敌。相反,鲍尔默认为 :“OpenOffice
和 StarOffice 对微软的威胁更大。”

微软的重视来自于开源软件的发展。 10 月中旬,万众期待的开源办公套件
OpenOffice.org 3.0.0 版本正式发布,在发布当日,由于下载量过大,导致服
务器当机。10 月下旬,备受欢迎的 Linux 桌面发行版 Ubuntu 8.10 如期发布,在
兼容性、易用性上取得显著提高。而最近炒得沸沸扬扬的番茄花园事件、微软“黑屏


oss.linuxpk.com 源 2008 年第 11 期 2
卷首语
”事件,国内舆论普遍进行了关注,并且权威媒体 CCTV 首次两度将视角瞄准了开源
软件。

这是一股势头,既包括了公众的选择,也涵盖了自身的超越,来自开源世界的
这些变化不得不让微软开始操心起来。据一业内人士透露,微软的 Office 业务在微
软的总收入中占据了 1/3 的显要位置,从中我们就不难理解鲍尔默为什么会有如此
的言论。OpenOffice 经过数年的发展,在兼容性和稳定性上取得了长足进步,尤
其最近两年,关于文档格式的问题也得到了各界的广泛关注。各大标准组织、
Office 厂商(包括微软)都在积极的为文档格式的标准、互操作的兼容性进行着各
种尝试和努力,OpenOffice 得到更大范围的普及、更多人群的应用是顺理成章的
事情。

但 OpenOffice 的发展已经让微软达到寝食难安的程度了吗?需要将其重要性
凌驾于 Google、甚至其他开源项目之上了吗?我觉得我们有必要回顾一下历史:
1999 年,Sun 收购了一家德国公司 StarDivision,这是一家研发了办公套件
StarOffice 的公司, 2000 年 7 月, StarOffice 办公套件通过两种授权协议
(LGP 与 Sun Industry Standards Source License, SISSL)公开释放,
目的是通过提供低价、优质、开源的特性,打破 Microsoft Office 的市场垄断。
随后不久,Sun 开始在美国司法部和欧盟分别状告 Microsoft Office 垄断与
Java 虚拟化不兼容(OpenOffice 是基于 Java 套件),当时的微软官司缠身,为
了对付这些接二连三的诉讼,微软决定与 Sun 达成和解,时任 Sun CEO 的 Scott
Mcnealy 与 Bill Gates 举行了一次私人会谈(也可能是吃了次饭),会面后微软
决定一次性给 Sun 16 亿美金,具体条件当时并未公布,但是再此之后,Sun 停止了
对微软的诉讼。

回顾这段历史,我们不难看出,微软与 OpenOffice 已经有过一次正面的交锋


了,当时,微软怕的是官司,因此“花钱消灾”进行了和解。那此番,微软又提出
OpenOffice 是微软最大的劲敌,我们是不是又得想一想,真的是 OpenOffice 已
经 发 展 到 能 和 Microsoft Office 抗 衡 的 地 步 了 么 ? 我 想 , 虽 然
OpenOffice.org 3.0.0 取得了很大的进步,但目前,无论是质量还是兼容性,


oss.linuxpk.com 源 2008 年第 11 期 3
卷首语
都还远远不能让微软头疼,即使放在开源领域,OpenOffice 的使用者绝对远低于
Firefox 和 Apache,前者微软有 IE,后者微软同样有 IIS。那微软为什么还如此
惧 怕 OpenOffice 呢 , 我 认 为 还 是 怕 有 人 拿 着 OpenOffice“ 说 事 ” , 说
Microsoft Office 不开放,不开源,甚至垄断,这才是微软真正怕的东西。

无论如何,开源软件给了用户更多的一个选择,并且开源软件经过自身的发展 ,
应用上已经开始大范围的普及,并且开源软件的开发模式有别于传统的商业软件公司,
其开发人员不依赖于任何一个股东,并且积聚了更多人的智慧与力量,微软将开源软
件作为头号敌人是有理论依据的。同时,开放源代码也促使了微软对其产品进行修改,
提高与开源软件的互操作性,这一方面使得微软更加强大,另一方面也加大了开源软
件的普及应用,至少到那时,将没人拿微软垄断“说事”了。


oss.linuxpk.com 源 2008 年第 11 期 4
主办:Linux 宝库
网址:www.linuxpk.com
官方下载地址:oss.linuxpk.com

主席:陆首群
专家委员会(按姓氏拼音为序)
陈怀临 宫敏 毛德操 倪光南 许洪波 袁萌
顾问委员会(按姓氏拼音为序)
白剑波 曹冬 陈绪 贾栋 李科研 毛文波

主编:陈杰
副主编:陈伟
排版:邹洋
封面设计:张亚运
编辑部:高延斌 姚欣宇 顾宏军
校对:戴彬 沈佩琪 王文龙 李彦荣 赵龙

声 明 :杂志部分内容来自开源社区及互联网,目的是加强开源文
化交流和开源应用传播,如存在版权问题,敬请联系,我们将在第一
时间进行处理。
致谢:本电子杂志由 OpenOffice 制作,并直接导出 PDF
文档,在此表示感谢 。
投稿信箱:opensource@linuxpk.com
目录

内容目录
卷首语
谁是敌人? 微软选择开源软件...............................................................................................2
产业聚集
“PHP 语言——Web 2.0 开发的利器”讲座成功举办...........................................................8
英特尔内核团队获中日韩论坛“特殊贡献"大奖...................................................................9
Linuxpk.com 开通开源 SNS 社区..............................................................................................9
Facebook 应对外界指责 公开软件源代码............................................................................10
红帽 CEO:经济危机加速开源发展.........................................................................................10
第三届 Linux 内核开发者大会在京召开................................................................................11
凝聚全球力量 绽放开源梦想.................................................................................................12
“开源技术在中国”沙龙成功举办.......................................................................................13
金融危机 开源软件行业迎来春天.......................................................................................14
Gnome 峰会第一次到中国......................................................................................................14
Linux 基金会:Linux 核心价值 14 亿美元...............................................................................15
Intel:Linux 将统治 Netbook 和 MID 市场............................................................................16
“屏”黑了 我们还能选择 Linux——《东方时空》直击微软“黑屏”计划..................17
专家谈“微软黑屏”事件:国人被微软“劫持”...............................................................27
Sun 开源和微软开源的不同 ..................................................................................................28
开源通讯
红旗 2000 中标 2008 年度电子信息产业发展基金................................................................29
中标软件二次进藏 .................................................................................................................29
2008 云计算、可信计算 国际研讨会在三峡顺利召开 ......................................................29
汕头大学 Linux 之夜 红旗 Linux 抢眼亮相 ........................................................................30
2008 网络文化节成功举办 ....................................................................................................30
Novell 宣布广泛支持 VMware Ready 虚拟应用 .................................................................30
红旗软件援非培训在贵州落下帷幕 .....................................................................................30
Intel 携 Moblin 理念北交大授课 ...........................................................................................31
神舟软件为航空信息化安全建设保驾护航 .........................................................................31
Wyse 和 Novell 联合发布首个企业级 Linux 瘦客户端 .......................................................31
恩信加盟合作伙伴认证查询系统开通 .................................................................................32
开源社区
Ubuntu 8.10 (Intrepid Ibex) 正式版发布.................................................................................33
OpenOffice.org 3.0.0 中文正式版发布....................................................................................34
openSUSE 11.1 Beta 3 发布 ...................................................................................................35
Linux 终于迎来了“同等”的 Flash 播放器..........................................................................36
Apache HTTP Server 2.2.10 发布............................................................................................36


oss.linuxpk.com 2008 年第 11 期 6

目录
Magic Linux 2.1 RC3 发布.......................................................................................................37
Mandriva Linux 2009 正式版发布...........................................................................................38
系统比拼 Linux 系统究竟比 Vista 好在哪里.........................................................................39
Intel 开源技术中心:1,2,3,4,5,6,Go!....................................................................41
Vista 与 Ubuntu 8.10 的基准测试比较....................................................................................42
Mandriva 2009,我看到希望和勇气......................................................................................44
“我们一直在为内核贡献代码!” .....................................................................................46
知识学堂
Linux 内核中 Kprobes 调试技术的实现.................................................................................50
Slackware Linux 与创始人 Patrick Volkerding........................................................................64
经验技巧
Linux 一句话精彩问答 ..........................................................................................................70
虚拟机应用入门——初识 VirtualBox....................................................................................75
rhythmbox——享受听觉盛宴.................................................................................................87
mysqldump 的几个主要选项探究...........................................................................................91
浅谈 Linux 操作系统的安全设置............................................................................................95
Debian 镜像巧实现..................................................................................................................98
SSH2 让登陆更安全.................................................................................................................99
给 Linux 系统带上 Windows 面纱.........................................................................................102
穿过 MSProxy 上网也不难....................................................................................................105
企业应用
dbcached──分布式 key-value 数据库内存缓存系统...........................................................108
Linux 内核性能评测...............................................................................................................112
Wine Server 在兼容内核的应用............................................................................................119
嵌入式
Linux 武装新型滑翔机..........................................................................................................126
ARM 系统启动代码的——分析和开发...............................................................................130
布道开源
开源"圣经":大教堂和市集....................................................................................................138
编读往来
Linuxpk.com 十月十大热门帖 ............................................................................................155


oss.linuxpk.com 2008 年第 11 期 7

产业聚焦

“PHP 语言——Web 2.0 开发的利器”


讲座成功举办
由中科院自动化所自由软件协会、 Intel
开源技术中心和 LinuxPK 社区合办的每月一期
讲 座 暨 第 三 十 五 次 讲 座 “ PHP 语 言 — — Web
2.0 开发的利器”于 10 月 28 日晚在中科院自
动化大楼成功举办。

PHP 语言做为当今互联网最流行的开发语言,
被全世界超过 2000 万的网站使用着, PHP 语言
作 为 成 熟 的 开 源 体 系 — — LAMP ( Linux 、
Apache 、 MySQL 、 PHP )的重要一员,以其
简单性、开放性、低成本、安全性和适用性等特
点,正受到越来越多的 Web 程序员的青睐。本期 讲座主要内容包括:
讲师陈龙是康盛创想(北京)科技有限公司
● PHP 语言的特点及应用领域
PHPChina 事业部技术经理,通过本次的讲座,
使大家对 PHP 语言有一个基本的了解并可以自己 ● PHP 基本语法简介
动手编写简单的小程序。 ● PHP 语言应用实例:文件管理系统
来自 PHPChina 的李明也在此次讲座中对 ● PHP 语言学习资源
大家的择业、就业等问题进行了指导。最后,由
下期讲座将在 11 月下旬举行,具体情况将
Intel 开源经理和本杂志顾问陈绪博士抽出了
在 bbs.linuxpk.com 进行通知,希望大家密切
本次讲座的幸运观众,获得了由机械工业出版社
关注并踊跃参与。
提供的《零基础学 PHP》和最新的《代码之美》。
附 : 本 期 讲 座 资 料 下 载 地 址 :
http://bbs.linuxpk.com/thread-
35867-1-1.html


oss.linuxpk.com 2008 年第 11 期 8

产业聚焦

英特尔内核团队获中日韩
论坛“特殊贡献"大奖
核团队的"Linux 内核 2.6.27 项目"拔得头筹。
2008 年 10 月 31 日,该项目荣获第七届东北亚
开源软件(OSS)推进论坛的"特殊贡献奖(技术
类)",而备受开源业内人士尊重的中国开源软
件推荐联盟主席陆首群教授获得"特殊贡献奖
(战略类)"。作为中方 4 个"开源贡献奖"的杰
出代表,内核团队经理傅文庆 (右起第二位) 先
生在无锡第七届东北亚开源软件(OSS)推进论坛

10 月 24 日,在共创软件联盟举办的“2008 上做了精彩演讲,阐述了内核团队在最新 Linux

中国开源软件竞赛活动暨开源软件创新与企业应 内核中做出的巨大贡献,获得中日韩三国官员和

用大赛”决赛中,"英特尔开源技术中心"中国内 代表的一致认可。

Linuxpk.com 开通开源 SNS 社区


服 务 。 近 年 来 , SNS 社 区 得 到 长 足 发 展 ,
Facebook、MySpace 等社区的成功更为 SNS 注
入了新的增长动力。Linuxpk.com 推出的 SNS
社区,将以开源为主题,以开源为己任,通过“
熟人的熟人”模式发展开源、推广开源,也为社
区朋友提供了一个新的娱乐交友平台。

新 推 出 的 SNS 社 区 采 用 全 新 的 子 域 名 :
http://sns.linuxpk.com,除了传统的 SNS
近 日 , Linuxpk.com 推 出 了 自 己 的 开 源 社区功能外,增加了许多好玩的小游戏,反恐精
SNS 社区,为广大的开源爱好者提供了一个全新 英、疯狂出租车这些可玩性很强的小游戏不仅放
的 SNS 娱 乐 交 友 社 区 。 SNS 全 称 Social 松了心情,也在娱乐的同时结交到志同道合的朋
Networking Services,即社会性网络服务, 友,而中国开源校园联盟更为广大的在校大学生
专指旨在帮助人们建立社会性网络的互联网应用 们提供了一个校园交友平台。注册方式:
http://bbs.linuxpk.com/register.php


oss.linuxpk.com 2008 年第 11 期 9

产业聚焦
,注册后用户名与密码即可在 linuxpk.com 中 一站通用!

Facebook 应对外界指责 公开软件源代码


源代码的力度。就 Scribe 而言,该产品可帮助
Facebook 处 理 服 务 器 上 的 大 量 数 据 。
Facebook 对 此 的 表 述 是 : “ 如 果 你 经 常 登 录
Facebook 网 站 , 实 际 上 就 是 在 使 用 Scribe
。”

换句话说,Scribe 本身是一款服务器软件,

10 月 27 日,美国知名社交网站 Facebook 它能实时收集 Facebook 用户各种活动信息。因

表示,将面向开放源代码社区发布公司内部开发 此对于普通 Facebook 用户而言,Scribe 的开

的 Scribe 软件源代码。 源对他们意义不大。但面向开源社区公布


Scribe 源代码后,将有利于改变 Facebook 不
长期以来,Facebook 在开放产品源代码事
愿公布源代码的企业形象。截止目前,
宜上态度一直较为勉强,并为此受到开源社区指
Facebook 全球活跃用户已超过 1 亿。
责;但最近数月中,该公司加强了对外开放软件

红帽 CEO:经济危机加速开源发展
一个非常好的机遇,开源软件可能因此得到长足
发展,Red Hat 首席执行官 Jim Whitehurst
在访问澳大利亚时发表了上述言论。

Jim Whitehurst 在澳大利亚访问时接受


ZDNet 采访时,称全球性的经济危机导致人们不
得不减少开支,而开源软件是他们最好的选择。

Whitehurst 表示:“坏消息是手头紧时,
人们对未来的投资会缩减。预料新软件的支出可
能放缓。”不过,他认为,基于节约开支的考虑,
Red Hat 首席执行官 Jim Whitehurst
更多企业会开始考虑选择开源软件。
持续不断的全球经济危机将给开源软件提供


oss.linuxpk.com
源 2008 年第 11 期 10
产业聚焦
Whitehurst 认为:“金融危机过后,相对 ”同时他指出,这是因为开源软件提供一种更好
于专属软件而言,开源软件的情况会比以前更好 的软件制作模式。

第三届 Linux 内核开发者大会在京召开


支持,派出多名工程师进行了技术演讲并与大家
广泛进行了交流。英特尔开源技术中心上海研发
总监冯晓焰为本次大会致辞。工程师张锐就
“Linux 下的快速启动和待机”这一主题,与大
家交流分享了 Intel 在 Linux 的启动和待机速
度优化上做出的成果,并做了精彩演示,当全场
有秩序地数着“1.2.3.4.5”的时候,Linux 成
功启动到了图形界面,博得了大家的阵阵掌声。
而吴锋光则是内核大会的常客了,作为中国开源
社区对国际开源社区的贡献项目,吴峰光的“内
核文件预读”可以说是硕果仅存的几个项目之一
英特尔开源技术中心上海研发总监冯晓焰 了,并且收录进了最新的内核。吴峰光是唯一一
10 月 25 日,第三届 Linux 内核开发者大会 位参加过全部 3 届大会的演讲者,前两届作为开
在北京清华大学 FIT 楼二层会议厅隆重召开,宫 源社区的代表参加,而如今的他也是英特尔开源
敏、章峰、苏哲、冯晓焰、陈绪等十几位嘉宾出 技术中心的一员,同时,据了解,吴峰光加入
席了大会,并和与会人员进行了充分而愉快的交 intel 后 , 被 赋 予 充 分 的 自 由 , 能 延 续 与
流。此次大会报名 400 多人,实际参会人员达 Andrew Morton 的内核合作项目。吴锋光在大
278 人,由于现场座位数量有限,在加座 50 位 会上做了“Linux 中的页面回写队列”的主题演
的情况下,还是有很多人站着听完全场,交流讨 讲 , 让 每 一 位 与 会 者 都 体 验 到 了 在 Linux
论不绝于耳,会场气氛热烈。 Kernel 的技术领域里,技术爱好者们对于知识

本次大会得到了英特尔开源技术中心的大力 的渴望。


oss.linuxpk.com
源 2008 年第 11 期 11
产业聚焦

凝聚全球力量 绽放开源梦想

——2008 年第 6 届 OpenOffice.org 世界开源大会召开新闻发布会


沟通”的精神,历届会议都吸引了众多世界高端
开源专家参与研讨世界开源的未来发展。

本次发布会中,北京软件与信息服务业促进
中心主任兼长风开放标准平台软件联盟理事长胡
青华、OpenOffice.org 国际社区代表 Peter
Junge、中国数码集团副总经理张安然、红旗
2000 总经理胡才勇、北京大学软件与微电子学
院院长陈钟等政府领导、行业协会负责人、第 6
届 OOo 世界开源大会承办方负责人等将作为嘉宾
出席并致辞,向世界开源界展现我国政府对开源
的支持力度,展现我国的开源事业发展风貌。

通 过 本 次 新 闻 发 布 会 , 作 为
OpenOffice.org 世界开源大会承办方,红旗
2000 总 经 理 胡 才 勇 将 为 媒 体 介 绍 本 届
OpenOffice.org 世界开源大会的筹备工作和第
6 届 OpenOffice.org 世界开源大会的主要看
点,以及大会召开的成果预期等。参会嘉宾也将
就 OpenOffice.org 世界开源大会背景及在世
界 和 中 国 开 源 界 的 深 远 影 响 , 2008 年 第 6 届
OpenOffice.org 国际社区代表 Peter Junge
OpenOffice.org 世界开源大会首次选定在中
10 月 28 日,红旗中文贰仟软件技术有限公
国北京举办,对于中国开源产业将带来的影响等
司(简称:红旗 2000)将在北京新世纪日航饭
议题在新闻发布会的发言中通过媒体逐一对外介
店二层江苏厅举行隆重的新闻发布会,届时,将
绍。
通 过 媒 体 对 外 宣 布 2008 年 第 6 届
OpenOffice.org 世界开源大会将于 11 月 5 日 透过新闻发布会,红旗 2000 总经理胡才勇
盛装开幕。 表 示 将 通 过 2008 年 第 6 届 OpenOffice.org
世界开源大会的召开,以及开源技术对我国 IT
OpenOffice.org 世界开源大会自 2003 年
产业将产生的深远影响,表达红旗 2000 公司为
创办以来,经过五年的发展,已成为开源领域影
中国的软件事业,为全球的绿色 IT 付出更多努
响最大的国际盛会之一。秉承“自由 参与 奉献


oss.linuxpk.com
源 2008 年第 11 期 12
产业聚焦
力的必胜决心。 进行了提问,peter 表示可能由于时间的问题,
两个版本发布时间较短,Ubuntu 8.10 不能对
同时,《开源》杂志记者受邀参加了此次发
布会,并对最新的 Ubuntu 8.10 发布为何没使 OpenOffice 3.0 进行更多的稳定性测试导致

用 最 新 的 OpenOffice 3.0 版 本 向 来 自 的这么一个情况,同时他表示 OpenOffice 3.0

OpenOffice.org 国际社区代表 Peter Junge 已经非常稳定,希望各大 Linux 发行版都能采用


最新的版本,以期获得更好的用户体验。

“开源技术在中国”沙龙成功举办

Sun 开源推广中心主任白剑波受邀担任《开源》杂志顾问
子学院、北京红旗中文贰仟软件技术有限公司共
同举办的主题为“奉献·创新·超越——开源技术
在中国”沙龙于 10 月 28 日北京新世纪日航饭店
二层四川厅举行。

本次沙龙邀请到北大软件与微电子学院副院
长吴中海、信息产业部软件与集成电路促进中心
(CSIP)主任助理刘龙庚,中企开源信息技术有
限公司总经理张斌、红旗 2000 总经理胡才勇、
Sun 公司大中华区开源推广中心主任白剑波、
Sun 公司中国区标准事务经理丁蔚、IBM 中国公
司 Linux 合作项目高级工程师田勇、《开源》杂
志主编陈杰等国际国内开源业界人士,以及北京
大学、北京交通大学常宏达共 10 位知名专家学
者及师生代表出席本次活动并参与讨论。

本次沙龙上,与会嘉宾就开源技术在中国的
推广、开源技术在高校的普及进行了深入探讨。
来自高校的教师为大家详细描述了中国高校开源
教师代表团访问美国期间的具体情况,并着重指
出参观访问 Sun、Intel、IBM 期间,了解到他
Sun 公司大中华区开源推广中心主任白剑波
们对开源领域的巨大贡献。
由 OpenOffice.org、北京大学软件与微电


oss.linuxpk.com
源 2008 年第 11 期 13
产业聚焦
会后,陈杰主编向来自 Sun 和 IBM 的朋友详 广中心主任白剑波担任《开源》杂志顾问,白剑
细介绍了 Linuxpk.com 开源社区和《开源》杂 波主任在了解情况后欣然接受了邀请,并对杂志
志的具体情况,并邀请 Sun 公司大中华区开源推 提出了一些建议和美好的祝愿 。

金融危机 开源软件行业迎来春天
了生机。财经网站创纪录的浏览量、产品热销的
保险箱制造和经营商、受热捧的“省钱学习班”
乃至忙碌的心理诊所等,都在“享受”着因金融
危机而带来的益处。

席卷全球的金融危机也波及到了 IT 行业,但
业内人士却认为,可供免费使用的开源操作系统
及开源软件将迎来春天。

经济景气时期,各大公司不吝惜花费重金购
买昂贵的操作系统和软件,但经过金融危机的洗
礼后,使用物美价廉的开源软件的企业用户无疑
会增多,因为这意味着节省一大笔开支。全球最
大的开源组织 Linux 基金会主席 Jim Zemlin
就对开源产品的前景非常乐观,并称将把握住金
融危机所带来的机遇开拓市场,“Linux 基金会
将在华尔街召开一个会议,相信会非常成功。那
些金融公司的老板会意识到,通过使用免费或低
Jim Zemlin 与本刊主编陈杰 06 年初的一张合影
价的开源产品,他们能把节省下来的钱用到刀刃
银行倒闭、股市下跌、楼市低迷……金融危机
上。”Jim Zemlin 说。事实证明在以往的经济
让众多行业陷入危机时,却也给另一些行业带来
衰退之后,IT 业总是最快复苏的行业之一。

Gnome 峰会第一次到中国
在 Gnome 2.24 发布后一个月,Gnome 峰会 社区首位受聘的全职员工,Stormy Peters 在
首次登陆亚洲,并选择在中国举办。作为 Gnome 10 月 18 日开幕的 Gnome.Asia 峰会上演讲的主


oss.linuxpk.com
源 2008 年第 11 期 14
产业聚焦
题是“社区建立的软件如何改变世界”。在接受 峰会首次在亚洲举行,而举办地选择在中国北京
《 开 源 》 杂 志 特 约 记 者 李 虹 专 访 时 , Stormy 航 空 航 天 大 学 。 正 如 Stormy Peters 所 言 ,
Peters 表示,开源软件在中国有很大用户群, Gnome 本 次 峰 会 的 目 标 便 是 在 亚 洲 建 立 一 个
但社区群还比较少。 Gnome 的社区,这也代表着 Gnome 正式宣布在
亚洲区发展社区。除了 Gnome 委员会本身,北京
目前,Gnome 是流行的桌面环境之一,它的
Linux 用 户 群 、 北 航 及 北 邮 学 生 、
背后有非常活跃的社区和基金会在支持,而
Gnome 基金会的资金来源包括 Sun、Redhat、 OpenSolaris 用户组都参与了这次峰会的筹办。

Nokia( 诺 基 亚 ) 、 MOTOROLA( 摩 托 罗 拉 ) 、 而本次的峰会的主题也主要集中在 Gnome 的开发、

Google 等支持开源软件的厂商。Gnome 不仅被 社区、应用、桌面辅助软件、移动应用以及国际


化和本地化等问题展开。同时,“英特尔开源技
一些重要的发行版作为默认的桌面,而且在移动
术中心”中国 Linux 和开源战略经理陈绪博士应
设备领域也开始展露头脚。
邀做了“Moblin 移动 Linux 开源社区及其 UI
框架 clutter”的讲座,为中国的 Gnome 开源爱
好者普及和宣传 Linux 开源技术社区,并讲解了
英特尔的开源战略和贡献,与听众热情互动,获
得爱好者的赞许。

Stormy Peters 从 OpenLogic 加 入


GNOME 基金会(OpenLogic 是她创建的专家社
区)。在这之前 Stormy 在惠普创建并主管开源
程序办公室,该办公室负责惠普的开源战略,政
策和商业实践活动。Stormy 在获得赖斯大学计

Stormy Peters-GNOME 基金会执行总监 算机科学学士学位后加入惠普的 Unix 开发实验

从 10 月 18 日到 19 日,为期两天的 Gnome 室,任职软件工程师。

Linux 基金会:Linux 核心价值 14 亿美元


Linux 基金会发布了他们关于估算 Linux 平
台金融价值的研究结果,研究结果表明,如果从
零开始开发 Linux 核心至少需要花费 14 亿美元,
而开发一个完整的平台要花 108 亿美元。基金会
的这项研究方法由 David Wheeler 设计的,他
开发了一个使用“建设性花费模型(COCOMO)”来
设计评估方法的 David Wheeler


oss.linuxpk.com
源 2008 年第 11 期 15
产业聚焦
估算软件的价值的工具。这个工具的估算方式, 已经提升到 108 亿美元。此外他们还公布了一些
是通过代码行数,开发员的平均薪水,和其他方 统计资料,要重写 Fedora 中包含的 2.04 亿行
面的花费等方面来进行分析的。 代码,需要同时使用 6 万人花一年来开发。

6 年前他曾使用这个工具来分析整个 Fedora Fedora 平台拥有最高数量的源代码行数,在它

的源代码,并估算出当时这个平台价值为 12 亿 的各组件中,Linux 核心包含最多的源代码行

美元。 数 , 为 596 万 行 , 前 十 位 中 还 包 括 GNU


Compiler Collection 、 OpenOffice.org
随着代码行数和软件包数量的增加,Linux
套装 、Eclipse IDE、 Mono .NET runtime
基金会用同样的工具分析 Fedora 时,它的价值
和 Firefox 浏览器等。

Intel:Linux 将统治 Netbook 和 MID 市场


此,根据其首席执行官 Paul Otellini 的说法,
这一切都是为了将互联网推广到新的领域。

Intel 正在寻找微软之外的软件合作伙伴,
计划在 Netbook 和 MID 设备上使用 Linux 操作
系统,因为这将比使用 Windows Vista 便宜的
多,而且节省了很多其他资源。Otellini 说:
“Vista 占用了太大的内存,而且对显卡要求很
高,价格也很昂贵。我们看好 Linux,相信它能
对 Netbook 和 MID 产生命性的影响,就像它对
手机市场的影响一样。”

与此同时,Intel 还投入了大量资金在美国
intel CEO Paul Otellinii 和日本建设 WiMax 网络,Otellini 说:“我们
最近一些时日,Netbook 和 MID(移动互联 不会变身成为网络运营商,那不在我们的能力范
网设备)日渐风靡,Intel 也很看好这一市场, 围,但是作为一种帮助数以万计的高端移动设备
不仅拥有自己的基于 Atom 处理器的生产线,而 接入互联网的方法,我们认为这种投资是值得的。
且还购买了无线网络,不过 Intel 并没有止步于


oss.linuxpk.com
源 2008 年第 11 期 16
产业聚焦

“屏”黑了 我们还能选择 Linux


——《东方时空》直击微软“黑屏”计划

10 月 21 日,微软中国公司开始对一些中国用户实施两个分别叫做 WGA 和 OGA 的计划。使用这两个计


划之后,国内一些使用盗版微软软件的用户电脑会发生一些变化。电脑桌面每隔一个小时,就变成带有
反盗版标识的全黑色,另外,在使用 Office 软件中,凡是没有授权的软件用户也会不间断地接收到来自
微软反盗版的提醒。这一计划被一些网友简称为黑屏计划。计划一提出,就在业内和网友中引发了一场
轩然大波。可以说,这是微软第一次采用这种方式来打击盗版。有业内人士说,微软此前打击盗版的对
象都是企业和集团用户以及软件盗版商,而这一次,是直接把矛头对准了普通的个人用户。那么,作为
微软实施这两项计划的头一天,这两项计划究竟有没有对中国用户们产生影响?什么样的用户受到了影
响?

一、体验黑屏
记者:现在是 2008 年 10 月 20 日午夜 23 点 30 分,距微软公司对盗版使用软件的用户进行身份验
证和黑屏显示的时间还有半个小时。我们现在走进这个网吧,看看半个小时之后这里的电脑将发生什么
情况?


oss.linuxpk.com
源 2008 年第 11 期 17
产业聚焦
在 10 月 21 号的 0 点,网吧中的电脑并没有发现如微软所说的正版验证提示和黑屏显示。这里的网
管不愿意接受我们的采访,但还是给我们解释了这种情况出现的原因。他说,微软的验证是分批次,第
一个星期只有 5%的用户得到验证。这位网管还说,即使他所在地区的电脑是第一批被验证的,他相信自
己的电脑也不会出现黑屏,因为两年前在使用微软软件的时候,他们已经将自动更新选项选为关闭,这
样,微软用于验证和黑屏显示等的软件包就不可能进入自己的电脑,当然也就不会产生影响了。当天晚
上记者还走访了位于北京市不同地方的网吧,他们的电脑也都没有受到任何影响。

网友自制黑屏界面
今天零点左右,有人在论坛中写道“还有 2 分钟,速度,看看黑屏是什么,”“什么都没有啊”“
怎么没黑呢?我是用的盗版啊”“睡觉了。不陪微软玩了!”从今天 0 点左右网友的反应来看,大部分
网友似乎没有收到想象中的黑屏的侵扰。

微软的黑屏计划于今日凌晨实施。那么,微软的验证计划对于一些品牌机的销售有影响吗?随即记
者走访了联想、惠普、戴尔和华硕等几家品牌电脑专卖店。销售人员普遍反映,由于他们销售的电脑安
装的是正版软件,不会受太大的影响。不过,根据他们介绍,15 号微软的验证计划公布之后,有很多旧
客户都把笔记本带过来让我们重新安装系统,他们之前因为个人需要,改装了 xp 的盗版系统,同时,最
近买电脑的人都有咨询黑屏这样的问题,在他们的解释之下,一些人选择购买正版软件。显然,对于使
用正版软件的品牌机经销商来说,微软针对反盗版的验证计划并没有对他们造成影响。

二、黑屏计划会不会对电脑运行产生影响?


oss.linuxpk.com
源 2008 年第 11 期 18
产业聚焦
从目前的结果来看,微软的黑屏计划给电脑用户带来的影响,并没有人们原来想象的那样严重。不
过,网上关于“黑屏”二字的传播却轰轰烈烈。那么网友所说的黑屏计划到底是什么计划?会不会对我
们的电脑运行产生影响?我们的记者来到了微软公司。

林聪悟:我必须澄清,其实黑屏是网络上流传的一些字眼,准确的做法应该是桌面背景变成黑色,
原先桌面上的这些程序、文档,跟所有的东西都还是在的,也不影响所有的程序的使用,包括您使用的
这些应用程序,包括聊天的程序,游戏的程序等等,都可以正常地运作,这是没有问题的,所以造成目
前大家的一些恐慌可能是有所误解了,其实就是一个黑色背景,而且用户可以再把它改回去。

微软中国有限公司的客户端产品商业市场总监林聪悟先生,向记者演示了这个计划实施在电脑上会
显示的效果:

林聪悟:首先微软正版增值计划的通知包括 Windows 跟 Office,透过两个途径来进行发布,第一


个是透过微软的更新网站,另外是透过自动更新。第二步自动更新里面要接受 Windows 正版增值计划的
通知,以及 Office 正版增值计划的通知,只有当你选择这两个的时候,这个通知才会下载到你的电脑
端上。第三个就是一旦这个通知下载到你电脑之前,你必须接受,才会正式下载,然后进行网站的验证,
所以有三个步骤,必须是用户自愿去点选,才能够下载这样的通知,这个是验证 windows,如果验证失
败的话,会看到屏幕右下角的讯息以及包括登陆时候的一个提示,您可能是软件盗版的哪个受害者,进
来之后,桌面的背景会变成黑色,但是所有这些程序跟文件都不受影响,你可以再把这个颜色改回去,
但是 60 分钟又改成黑色。

记者:最关键的是我在做事的时候会不会受到影响?

林聪悟:完全不受影响,这个是 Office 的经验,如果正版认证没有通过,Office 验证失败的用户


在之后 30 天内,每天将会受到两次的对话框的提醒,他们目前运行的 Office 不是正版,一天两次,这
是 30 天之前,30 天之后如果您还是属于非正版的状态,会有一个视觉化的标记,告诉你说,你不是正
版的用户。

那么,微软方面为什么在这个时候突然向中国用户实施这样的计划呢?

林聪悟:其实是一个非常简单的想法,希望协助用户去辨别目前电脑上的 Windows 操作系统跟


Office 应用软件是不是正版,特别是很多是在不知情的情况下购买安装使用盗版软件的用户,其实我们
有第三方的调研指出,在中国,20%的盗版软件用户不知道他用的是盗版,情况相当严重。

有人说,微软此举并不是明智的,因为这样的做法直接得罪了最广大的微软客户。昨天,北京的一
位律师还向公安部发出举报信,指控微软“未经计算机用户同意和司法裁判就私自侵入计算机用户电脑
系统并干扰破坏的行为,是无视用户物权和法律尊严的行为,微软的行为已经成为中国最大的"黑客攻
击"行为”。他建议司法机关立即展开侦查,追究微软公司“黑屏”计划的刑事责任,并叫停“黑屏”计
划。


oss.linuxpk.com
源 2008 年第 11 期 19
产业聚焦
记者:对现在媒体的反映,包括有些专家,网上有一些质疑的声音,所谓的舆论压力是您想像当中
的吗?您做好了面对这些压力心理准备吗?

林聪悟:作为推出这样一个计划的步骤,我们当然会跟各个方面进行说明和沟通,我们过去也做了
很多,包括通过我们业务单位的代表,面向不同的客户,来进行说明,跟合作伙伴进行说明,让大家了
解到这次 WGA、OGA 微软增值计划的内容,目前听到的计划还是正面的,我们会持续做相关的沟通工作,
让那些不理解的人能够理解,这是什么样一个活动。

三、众说纷纭“黑屏计划”
微软方面强调,黑屏计划不会影响用户正常使用电脑,用户电脑中的资料更不会丢失。这样做的用
意仅仅是给用户一个善意的提醒,让某些在不知情状态下买了盗版软件的用户,能够通过这一方式验证
自己的软件是否为盗版。如果使用的是盗版软件,就会出现一个提示的对话框。但并不会影响电脑中其
他程序的运行。但是,对这样的说法,还是不能获得某些业内人士的认同。

方兴东,长期从事互联网的研究、分析和评论,也是第一个把博客引入中国的人,被誉为“中国信
息产业最具影响力的独立评论家”。他对微软的这个做法有什么评价呢?

方兴东:我觉得可能一个最本质的问题,微软是不是操作了用户的电脑,是不是侵犯了电脑的使用
权,我们做一个简单的比喻,家里面可能我们未经授权使用了一个物品,然后这个主人是不是就有权利


oss.linuxpk.com
源 2008 年第 11 期 20
产业聚焦
直接未经你的许可直接到你们家里来,我觉得这个性质是非常严重的。我们一台电脑里面有几百种,几
千种软件,每个厂商都用这种措施,那么我们觉得整个互联网和电脑都不是我们的了,你说每个软件都
有提醒功能,我们每天处理提醒就忙不过来了,所以我觉得这个先例是不应该这么做的,我觉得整个软
件业的规则就开始改变了。

然而,另外一位业内人士,却表达了不同的看法。我们在中国开源软件联盟秘书长袁萌教授的博客
上,我们的确看到一篇题为“微软中国”蒙冤记的文章。原来,袁萌教授专门在 10 月 17 日去了一趟微
软了解情况:

袁萌:我早晨很早就去了微软,然后一个产品经理上来我就问,黑屏是怎么回事,他给我解释了,
我说不行,你拿一个笔记本演示给我看,他就请了一个女士演示给我看,很耐心地一条一条地给我演示,
我才明白了,微软采取这个行动,并不是说对我们国家所有的个人的 XP 用户都有直接的控制能力,因为
我不同意,你怎么也进不来,因此就不能说微软对我们国家那些装了盗版软件的电脑有一种控制能力,,
我觉得这个理解是不对的,也就是说,我们让微软受了点委屈,冤枉了它。

不过,对于使用黑色桌面背景,袁萌认为微软的做法还是欠考虑的:

袁萌:黑字中文里面是不好听的,你搞个黄屏,搞个蓝屏也行,他非要搞个黑屏,黑屏在国外的文
化背景也不知道跟中文是不是一样。

记者:所以就他们处理的意识上面还是缺乏一些。

袁萌:各个地区民族文化的背景不同,可以用不同的办法,比如亚洲地区和美洲地区不一样,中国
人的文化里,鬼都是晚上出来,到了外国去,中午 12 点妖怪才出来,他跟中国的文化背景是不一样的。

袁萌教授说,他之所以支持微软打击盗版的行动,是因为这样的行动能够提高人们的知识产权保护
意识,促进人们更多选择正版软件,从而对整个软件行业的盗版现象得到遏制微软方面称,这也正是他
们开展此项行动的最终目的。今年 8 月,我国国家版权局和公安部、信息产业部联合展开打击网络盗版
侵权专项行动,在这场行动中,盗版微软操作系统的番茄花园站长洪磊被拘。这些行动表明,对待盗版
问题,无论是我国政府还是微软,都采取了明确而坚决的态度。在这样的环境下,对于我们普通消费者
来说,选择正版软件,已经是大势所趋。

在某家电子城,软件销售商告诉我们:微软为了配合本次打击盗版的计划,在软件的价格上似乎进
行了调整:微软本次特意推出了 199 元的学生版 Office 软件。同时,价格在 1000 元以下的版本也都
有,包括 699 元的学生版彩色包 Office 软件。330 元 windowsxp 系统家庭版和 815 元的专业版,而
价格在 3680 元的相对较高的 xp 专业版,主要是提供给企业和公司。不过尽管价格虽然有所回落,但是
相对于盗版来说,这个价位还是让不少的消费者望而却步,大多数的消费者只限于了解情况,对于是否
会买正版软件,还是持观望态度。


oss.linuxpk.com
源 2008 年第 11 期 21
产业聚焦
四、黑屏计划:其它操作系统的机会?
微软产品的价格一直以来为很多人所诟病,因为采取全球统一价策略,微软正版产品的价格让部分
人群认为不能接受。有人说了,我也想用正版软件,可我还是接受不了微软正版软件的价格,怎么办呢?
还有更好的解决办法吗?

小新:它这个界面是非常人性化的,这是办公的程序,这是上网的程序。。。。

小新今年 29 岁,是一名计算机爱好者。他使用的电脑操作系统不是微软的 windows,而是开源的


Linux。Linux 来源于一个芬兰人的名字,1991 年,芬兰人 Linus 设计了一个系统,并且把这个系统
的源代码放在互联网上,同时宣布这是一个免费的系统,希望大家共同来开发完善它。20 多年来,世界
各国的计算机爱好者都对 Linux 系统进行了创新和完善,小新使用的这个版本的 Linux 是从网上免费下
载的。小新说,之所以使用 Linux 操作系统而不使用 windows,是因为 Linux 和 windows 相比,运行
速度快,病毒、木马程序少,更重要的是,Linux 操作系统是自由软件。

小新:我觉得不是说免费的就叫自由软件。自由软件是一种自由的态度,就是我完全可以定制它,
我想要什么东西,我让它实现什么,它就给我实现什么,我通过自己的设置,我自己的操作,让它变成
一个完全属于我个人的操作系统。就像在家里装修一样,家里是一个小的环境,我想把家里弄得符合我
的个性,我在里边住得舒服,我上网是个虚拟的空间,这个是个小家,我把它做成一个类似家的感觉,


oss.linuxpk.com
源 2008 年第 11 期 22
产业聚焦
我也会觉得很舒服,这样生活的乐趣就会更多一些。

Linux 是开放了源代码的软件,开放源代码之后,软件就没有了版权的概念,属于全人类共享的软
件,任何人可以根据自己的爱好去改动这个软件,使之更符合自己的使用要求。当然,这需要一定的计
算机知识,因此,目前使用 Linux 的人群大多集中在计算机爱好者和大学生群体。

记者:我已经习惯了用 Windows,那我现在要转而去使用英文了,这个转变会不会很难?

小新:就好像是我习惯了左手拿勺,我现在要是右手拿勺,可能刚开始不太习惯,但是我适应了一
阵就习惯了,它的功能跟我左手拿勺没什么区别,这是一样的。

小新说,在 Linux 操作系统下也可以使用 msn,QQ 等常用聊天工具,对于普通的办公操作,Linux


操作系统完全可以胜任。

技术人员:有很多种效果,可以实现 vista 底下的作用,还可以像立方体一样的,还可以把几个窗


口一块摆在桌面上,还可以这样,这是多桌面集合,刚才四个立方体是一样的,把它扩展成一个平面。


oss.linuxpk.com
源 2008 年第 11 期 23
产业聚焦
这是另外一个版本的 Linux 操作系统,中科红旗版。2000 年,我国中科院与信息产业部联合成立
中科红旗公司,研发 Linux 操作系统。目前,中科红旗 Linux 操作系统是占有我国市场份额最高的国产
操作系统,也是最有能力与微软操作系统进行抗衡的国产操作系统软件。

贾栋接受东方时空采访

记者:您刚看到微软“黑屏计划”新闻的时候,您当时是怎么想的?

中科红旗公司总裁贾栋:很多人问我,你是不是感觉到这是一个机会?我觉得这确实是一个机会,
但是作为一个厂家,我们只有做好我们的事情,引导消费者去体验一下,因为本身是开源的,我也希望
用户能够借这个机会,体验一下开源文化能给他带来今后工作上的方便,我只能是给盗版用户这么一个
建议,因为我也不想说要抓着机会跟人家微软竞争,一切都取决于用户怎么想,怎么做,个人用户要量
入为出,考虑自己的经济情况才能做这些事情。我们不能逼着消费者让你必须买我的,这个是不现实。

贾栋表示,虽然红旗 Linux 在价格上比微软有优势。一套个人版 Linux 的操作系统卖不到 100 元,


但这个操作系统软件却很难与冲击微软的市场份额。因为目前最困扰红旗 Linux 发展的就是一些重要应
用软件与他们的合作。比如,几乎没有任何一款游戏软件是为 Linux 平台开发的,这就造成在 Linux
操作系统下不能玩电脑游戏,这就让很多客户放弃了使用 Linux 的打算。

贾栋:因为我们做操作市场是提供平台的,平台提供商尽量提供一个完善的平台,把我们自己的市
场占有率增加,只有市场率增加的情况下,才会吸引那些应用软件开发商,也就是说有一些游戏软件会
好一点,像 QQ 这些,很多网友用的这些应用软件,这些开发商他会投入一部分力量来做(英文)版本的迁
移,这样的话,只有我们的平台做大,而且应用开发商看到了这个平台今后的市场,他会投入一部分,


oss.linuxpk.com
源 2008 年第 11 期 24
产业聚焦
这是双向的。

微软黑屏事件被媒体报道后,有人在网上评论说,微软黑屏事件,用户慌了,金山笑了。作为微软
Office 办公软件的老对手,金山公司的副总裁葛柯表示,微软黑屏事件,对于金山公司的 wps 来说,
是一个重要的发展契机。

葛柯:客观上来讲是一个机会,其实无疑提醒老百姓去购买正版软件,这个时候发现买国外产品,
依然还会有一个免费的正版的 WPS 在备份,会增加老百姓对 WPS 的认识,或者对 WPS 的使用,我想在市
场上会提高。我想这样一个契机,未来依然还会有。

工作人员演示:这个是 wps,这个是 Office,现在我把两个都打开,界面是非常相似的。我在这边


做一个文档,在这边打开,两个保存的文件格式都是一样的。

金山旗下的国产 wps 办公软件曾经一度占领过中国市场。上个世纪 90 年代初期,大多数中国人使用


的办公软件还不是微软的 Office 办公软件,而是国产的 wps 办公软件。而在 1992 年微软进入中国以
后,wps 办公软件就被微软的 Office 软件逐渐抢夺了大部分的市场份额,尤其是微软的盗版软件,让
wps 在价格上失掉了竞争优势。为了谋求发展,wps 的生产厂商金山软件公司不得不把软件业务拓展到
杀毒,游戏等领域。但是,wps 办公软件仍然在坚持不断创新和发展,如今,wps2007 版已经能做到与
微软的 Office 软件不相上下。微软采用技术手段打击盗版,促进软件市场的正版化,这无疑给 wps 营
造了更加公平竞争的机会。

葛柯:我们做了二十年,不管从技术积累、用户习惯还是技术先进性非常非常接近国外同行业的软
件产品,而且我们从 2005 年坚定不移地承诺对个人用户,就是非商业使用用户,我们是免费的。那么这
样一个选择,其实对老百姓来讲,其实是一个更容易接受的一个正版解决方案,我觉得未尝不去尝试一
下呢,与其用盗版软件有这么多的风险,倒不如用 WPS Office。

葛柯说,现在的软件业销售模式越来越倾向于先使用,然后再根据需要选择性付费的模式,而微软
目前的销售模式还停留在原来的先付费后使用的模式,这也是造成微软产品盗版盛行的一个原因。葛柯
说,如何避免盗版,金山也曾研究过很多种方法,但与微软的做法不同。

葛柯:金山本身,并不倾向于采取一些特别过激的方法,或者让用户产生困扰的方法去解决盗版问
题,我们更倾向于采取鼓励用户使用正版,通过各式各样的优惠政策,各式各样的营销方式也好,鼓励
用户使用正版。

业内人士方兴东也认为,免费其实已经是互联网的趋势,必须创新开拓出新的利润增长模式:在中
国用户电脑里面 78%的软件是共享软件,就是不需要我们花钱,也不需要我们授权的,真正像微软这样
的软件,需要厂商授权你才能使用的软件,目前只占 22%,跟几年前相比,这个数字已经大幅度提高了,
软件已经不再像微软一样去买他,

消费产品跟服务收费这个模式在发生快速的变化,而且这种变化可能就是三五年就会出现一个重大


oss.linuxpk.com
源 2008 年第 11 期 25
产业聚焦
转机,那个时候可能微软就会被这个趋势抛在一边了。

记者:其实它已经完全不符合我们现在比较主流的互联网的行为模式了,是不是?

方兴东:对,互联网时代的免费模式就是免费使用,然后通过服务建立商业模式,因为我们知道,
比如 IBM,SAP 等大部分软件公司已经不像微软这样了,微软已经变成互联网时代的一个恐龙。

虽然网络业内人士对微软的产品价格,销售模式有争议,网友们也对微软的反盗版措施有不满,但
是,一个不可动摇的前提是,微软是自己产品的版权所有者,他有权在法律范围内,采用各种手段维护
自己的合法权益。而这件事,也确实敲醒了很多知识产权保护意识淡薄的用户,一些此前使用盗版软件
的用户已经开始转向使用正版软件。这样的结果,无论对微软,还是国内软件厂商来说,都是一个可喜
的现象。但是在反盗版过程中,如何采取一个恰到好处,更符合实情的沟通方式,还是值得商榷的。


oss.linuxpk.com
源 2008 年第 11 期 26
产业聚焦

专家谈“微软黑屏”事件:国人被微软“劫持”

中国工程院院士 倪光南
2008 年 10 月 17 日 , 南 京 , “ Windows XP” 标 记 和 “ 小 心 黑 屏 ” 的 警 示 。 继 上 月 打 击 盗 版
Windows XP 后,微软又针对盗版发出“最后通牒”。据微软中国公司消息, 10 月 20 日起,该公司将
每隔 1 个小时对未通过正版验证的 Windows XP 被黑屏一次的手段,让正在使用 XP 的用户“知道自己
使用的是不是正版”。微软公司强调,此举“与市场份额目标无关”。市场普遍认为,这是微软维护其
正版操作系统利益的又一举措。

“中国人一定会永远告别‘黑屏’”,就“微软黑屏”事件,著名计算机专家、中国工程院院士倪
光南今天在接受采访时这样表示。

“劫持”,倪院士在谈到微软此次行为时,用了这样一个词,“微软说,我一小时只让你‘黑屏’
一次,而且只黑背景,不影响使用,这么一来,大家倒是应该感谢微软对我们手下留情、网开一面了!
但人们不禁要想,假如不是一小时而是一秒钟,不是黑了背景而是黑了使用屏幕,那这个电脑还能用吗?
假如干脆被停了机又怎么办呢?……可悲的是,一切只能听由微软摆布,用户已经掌握不了自己电脑的命
运了。”“有人会说,向微软买正版就行了,可是,只要你是用微软的软件,它总有操控你电脑的能力,
总要经常检测你电脑的信息,总要经常检验你软件的版本。”

“没有自主可控的软件,要保障信息安全只是空话。”倪院士有些激动地对记者说,多年以来反复
强调,像操作系统、Office 这样的基础软件,必须用自主可控的国产软件或开源软件,有人还不以为然。


oss.linuxpk.com
源 2008 年第 11 期 27
产业聚焦
这次被“黑屏”了,才意识到自主软件的重要性。

倪院士认为,发展自主软件,首先要增强对国产软件的信心。目前 ,操作系统、Office 这类软件既


买得到,又被垄断,又有盗版,国产软件的成功就很难,而“黑屏”事件正是一个机遇,它促使广大用
户去尝试国产软件,使国产软件有出头之日。

现为中科院计算所研究员、曾任联想集团首任总工程师的倪院士建议,根据大量用户经验,从盗版
切换到国产 Office,大多数用户都能成功。现在一天中下载免费国产 Office 的数量最高已达百万份。
Linux 的下载量也在增加。如果只上网和做文字、邮件、多媒体处理等工作,也能满足需求。使用软件
数量多的用户可以考虑作个过渡,先在电脑中装双系统——兼装 Linux 和 Windows,随着使用的过程,
逐步从 Windows 切换到 Linux。

倪院士告诉记者,根据《国家中长期科学技术发展规划纲要 (2006-2020 年)》的部署,信息领域的


“核高基”重大专项最近已付诸实施,其中包括发展自主的 Linux 操作系统和 Office 等等基础软件。
“相信不久后,在专项的支持下,大多数中国人都将用上自主可控的基础软件,中国人一定会永远告别
‘黑屏’!”。

Sun 开源和微软开源的不同
白剑波
有人问我 Sun 开源和微软开源的不同,下面是我的简单回复:

Sun 公司是个为客户提供系统的公司,这个系统的概念包括了服务器,存贮产品,基础软件产品和
服务。

Sun 公司把几乎所有软件开源以后,开发人员可以很容易地得到源代码,可以很容易地下载软件的
免费版本(社区版),这会方便他们的开发过程和部署过程,同时也促进了 Sun 的技术的更广泛的使用。
Sun 希望通过这样的方式来扩大市场占有份额,然后通过销售更多的系统来获得更多的收入。

Sun 公司把源代码贡献给社区,同时提供免费的社区版本(二进制)供下载使用,把 Sun 公司最新


的发明创造带到了社区,对整个软件业的发展,对软件互操作的发展,都起到了极大的推动作用。

这和微软的开源在本质上是不同的,微软抛向开源的橄榄枝,是为了增强互操作性,更好地销售其
软件产品。微软一直承认,开放源代码对微软公司的商业模式最具有杀伤力。但是开源也将是促使微软
提高其软件的互操作性和产品质量的强大动力,这也会促进微软继续前进。


oss.linuxpk.com
源 2008 年第 11 期 28
开源通讯

红旗 2000 中标 2008 年度 2008 云计算、可信计算


电子信息产业发展基金 国际研讨会在三峡顺利召开
为了规范我国办公文档的信息处理格式,促 由中国开源软件推进联盟和中国可信计算产
进基于国家标准标文通(UOF)配套软件的产业 业联盟共同举办“2008 云计算、可信计算国际
化及其广泛应用,信息产业部(原)利用 2008 研讨会”已于 10 月 14 日至 16 日在三峡顺利召
年度电子信息产业发展基金设立“基于标文通( 开,会上来自欧美的有关专家作了精彩的演讲,
UOF)标准的国产办公套件优化”招标项目。 发言目录如下:

红旗 2000 公司作为 UOF 的主要制定者和参 中国开源软件推进联盟主席陆首群教授《推


与者,积极致力于 UOF 的推广应用,努力提高 动云计算、可信计算的发展》
RedOffice 对 UOF 符合性以及不同产品间的兼 中国可信计算联盟理事长宁家骏《信息安全
容性,并以此为内容积极参与该招标项目。9 月 与可信计算》
公布的《工业和信息化部 2008 年度电子信息产
IBM 公 司 安 全 架 构 师 Paul Karger 博 士
业发展基金招标项目中标单位通知》表明,红旗
《虚拟机管理器的安全问题》
2000 公司成功赢得此次项目招标,获得 400 万
发展基金支持,在该项目招标中排名第一。 Google 公司资深工程师王咏刚《Google 和
云计算》

Intel 公 司 首 席 安 全 架 构 师 David
Grawrock 博士《多核对 TXT 技术的影响》
中标软件二次进藏
微软大中华区首席信息安全顾问江明灶博士
继西藏自治区拉萨市、那曲地区前四期中标 《从可信计算到端到端信任,一次工业界的对话
普华藏文办公系统培训班的成功举办、培训 大纲》
1000 多名西藏政府工作人员和教育工作者之后,
HP 公 司 系 统 安 全 实 验 室 经 理 Richard
2008 年 9 月 19 日-25 日,上海中标软件有限公
Brown《安全虚拟化》
司(简称中标软件)又相继在西藏日喀则、山南
地区开展了第五至第八期培训班,本次培训是中 EMC 公司 Burt Kaliski 博士《面向多用户
标软件继 2008 年 1 月,上海市副市长杨雄代表 租赁的云计算存储的需求与实现》
上海市政府向西藏自治区赠送了 3.2 万套、价值 得克萨斯大学徐寿怀博士《如何管理安全框
1500 万元我国自主研发的首款藏文办公软件后, 架和服务的可信赖性》
中标软件第二次大规模的进藏培训活动,接下来
复旦大学软件学院院长臧斌宇教授《硬件虚
中标软件还将在阿里、昌都等地区进行中标普华
拟化技术在可信云计算中的作用》
藏文办公软件的培训和推广活动。


oss.linuxpk.com
源 2008 年第 11 期 29
开源通讯
武汉大学计算机学院张焕国教授《中国可信 2008 网络文化节成功举办
计算研究状况及展望》
10 月 21 日,在北京信息科技大学的“2008
瑞达公司董事长刘毅博士《瑞达可信计算机
网络文化节”的开幕式中,“英特尔开源技术中
的研究与发展》
心”北京研发总监杨继国博士以“英特尔移动
来自美国的 Intel 首席安全架构师 David Linux Moblin 社区”为题做了精彩主题演讲,
Grawrock 博士做了精彩演讲并出席了小组讨论 并为与会学生抽取奖品,获得阵阵掌声。10 月
(panel discussion)。“英特尔开源技术 29 日,在“网络文化节”的系列讲座中,“英特
中心”上海虚拟化团队的资深工程师王庆先生在 尔开源技术中心”中国 Linux 和开源战略经理陈
虚拟化展台上展示了 TXT 和 TBOOT 技术,引起 绪博士做了“Moblin 移动 Linux 开源社区及其
与会专家的高度兴趣。 UI 框架 clutter”的讲座,为在校学生普及和宣
传 Linux 开源技术社区。

汕头大学 Linux 之夜
红旗 Linux 抢眼亮相 Novell 宣布广泛支持 VMware

9 月 28 日,汕头大学社团之夜在汕头大学热 Ready 虚拟应用


闹开场,Linux 协会借社团之夜大力宣传 Linux 近 日 , Novell 宣 布 广 泛 支 持 VMware
文化和技术,让更多的同学接触并了解 Linux, Ready 计 划 和 VMware Studio , 同 时 SUSE
成为 Linux 家庭的新成员。红旗软件一直关注校 Linux Enterprise 已通过 VMware Ready 验
园 Linux 的推广和普及,此次更是义不容辞地赞 证,成为得到全面支持的访客操作系统。另外
助了 Linux 之夜。 Novell 还宣布已与 VMware 达成重分配协议,
允 许 独 立 软 件 厂 商 ( ISV ) 通 过 VMware
社团之夜期间,全校 40 多个社团在校园各主
Virtual Appliance Marketplace 下 载 、
要步行街设台摆铺,开展具有协会特色的展示、
游戏和表演等活动,散发传单,招募新成员。 配置和分发评估版 SUSE Linux Enterprise

Linux 协会台前人潮如涌,很多同学表现出对 。 同 时 , 声 明 还 确 保 利 用 VMware Studio 和

Linux 的兴趣,竟排起长队领取宣传单和红旗桌 SUSE Linux Enterprise 建立虚拟应用的客

面 6 的测试盘,共同感受红旗桌面 6 的操作风采。 户将能够充分利用 VMware 平台,实现简化部署、


更轻松的管理和更强的安全性。
Linux 协会作为汕头大学的重要社团之一,
一直致力于 Linux 文化在汕头大学的推广,目前
会员增加到 100 人左右,他们对校园 Linux 的
普及起到很好的推波助澜作用。 红旗软件援非培训在贵州落下帷幕
中秋期间,应国家商务部的邀请,中科红旗


oss.linuxpk.com
源 2008 年第 11 期 30
开源通讯
软件技术有限公司(简称红旗软件)教育学院高 神舟软件为航空信息化
级讲师淮晋阳老师抵达贵州,对非洲国家的 35
安全建设保驾护航
名官员和技术人员进行了为期两天的红旗 Linux
培训。他们分别来自埃及、阿尔及利亚、埃塞俄 近日,由航空 621 所发起,神舟软件承办的
比亚、津巴布韦、马达加斯加、纳米比亚、南非 “航空信息化建设研讨会”在北京香青园商务会
等 21 个国家。学习 Linux,引进 Linux 文化和 馆召开。与会嘉宾包括来自航空 303 所、航空
技术,提高本国的信息安全,摆脱本国软件被垄 304 所、航空 232 厂、航空 625 所、航空 628
断的局面,是各个国家的代表此次抵达中国的目 所、航空 503 厂、中航技、航空规划设计院、航
的。 空 634 所等多家厂所的信息化主管领导,对于此
次会议的召开与会代表表达了高度认可与赞同。
据悉,此次培训由贵州省对外科技交流中心
会上,代表们介绍了各自单位的信息化建设现状,
承办。中科红旗作为国产操作的代表,成立于
并重点讨论了在加速信息化建设的同时,如何全
2000 年 6 月 , 一 直 致 力 于 为 用 户 开 发 和 推 广
面做好信息安全保密工作。
Linux 的操作系统及多平台应用软件,并日益壮
大,拥有了立体的销售渠道和遍布全国的服务网 会议中,率先通过分级保护测评并得到测评
络,以及教育培训体系。此次培训更是配合国家 单位高度认可的航空 304 所,重点介绍了其在信
政策,承担着国产操作系统走出国门,支援非洲 息系统安全保密方面的经验。航空 304 所应用的
信息化的重任。 神舟 OA 办公自动化系统该系统完全基于国产神舟
OSCAR 数据库,做到了自底向上都采用拥有涉密
资质的国产软件系统,保证了其信息系统从采购、
Intel 携 Moblin 理念 建设到后期维护、服务都不会存在安全隐患,在
系统方面彻底杜绝了泄密问题;基于安全数据库
北交大授课
的 OA 系统在分级保护测评中得到高度认可与好
10 月 22 日,受北京交通大学软件学院吴玥 评,提高了测评综合分数。
老师之约,同时作为研究生的课外教育课程,“
英特尔开源技术中心”中国 Linux 和开源战略经
理 陈 绪 博 士 应 邀 在 思 源 楼 109 报 告 厅 , 做 了
Wyse 和 Novell 联合发布首个
“Moblin 移动 Linux 开源社区”的讲座,为研
一的学生普及 Linux 和开源技术,讲述开源历史,
企业级 Linux 瘦客户端
引起了讲师和学生的普遍兴趣。 近日,Wyse Technology 公司和 Novell
宣 布 联 合 推 出 Wyse Enhanced SUSE Linux
Enterprise,这是为精简型计算环境而设计的,
只在 Wyse 桌面和移动瘦客户端设备上运行的下
一代 Linux 操作系统。 Wyse Enhanced SUSE
Linux Enterprise 是 Wyse 在精 简计 算方 面


oss.linuxpk.com
源 2008 年第 11 期 31
开源通讯
的 广 泛 经 验 与 易 于 使 用 、 灵 活 且 安 全 的 SUSE
Linux Enterprise 的 强 力 结 合 。 Wyse 恩信加盟合作伙伴认证查询系统开通
Enhanced SUSE Linux Enterprise 将 于
恩信科技开源 ERP 商务模式推广一年多以来,
2008 年第四季度预装在 Wyse 瘦客户端设备上上
得到了广大合作伙伴的响应和客户的热情支持,
市。
但是市场上也出现了极不和谐的声音,某些未经
根据 2008 IDC 报告,Linux 瘦客户端市场 恩信科技授权,也未参加恩信科技任何培训的公
将从 2008 年的近百万个单元增加到 2011 年的 司为了牟取利益盗用恩信科技合作伙伴的名义向
180 万 个 单 元 。 2011 年 在 瘦 客 户 端 设 备 市 场 客户销售或变相销售恩信科技开源 ERP 软件,并
Linux 将占所有操作系统出货量的 30.5%。基于 且也没有任何能力为客户提供实施、培训、二次
Linux 的瘦客户端的市场渗透率不断提高是由于 开发等服务工作,在市场上造成恶劣影响。因此
其具有降低拥有总成本的能力,同时能帮助企业 恩信科技推出了加盟合作伙伴认证查询服务,任
获得更加安全和灵活的计算环境。 何客户有权要求服务商出示恩信科技的相关认证
文件,同时可以根据认证文件的编号在本系统中
进行查询,系统会帮助客户识别服务商的真实身
份。


oss.linuxpk.com
源 2008 年第 11 期 32
开源社区

Ubuntu 8.10 (Intrepid Ibex) 正式版发布


最新版,包括具有标签页浏览支持的
Nautilus 文件管理器、更多存档格式支
持的 File Roller 等程序的增强版本。

● X.Org 7.4 - 带来了更好的输入硬


件设备的热插拔支持。

● Linux kernel 2.6.27 - 对 硬 件


具有更好的支持。

● 能够对私人目录进行加密处理,使个人
的数据更加安全。
历 经 半 年 的 开 发 , Ubuntu 8.10── 代 号
“Intrepid Ibex”(无畏的北部高地山羊)─ ● 客户会话支持。
─终于在今天正式发布了。与往次发布一样,本 ● Network Manager 0.7,含 3G 支持
次发布也包括桌面版本和服务器版本,分别面向
● "Last successful boot" 恢 复 菜
桌面终端用户和服务器终端用户。同时,包括
单。
Kubuntu 、 Xubuntu 、 Edubuntu 、
UbuntuStudio 在内的衍生版也一同发布了。 ● DKMS 允许你自动重新编译内核驱动。

● Samba 3.2。

一、Ubuntu 8.10 新特性 ● PAM 授权框架。

虽然在以往的文章中我们多次谈到了 ● Totem BBC 插件。


Ubuntu 8.10 的新增特性,不过为了给大家一
● 支持制作 Live USB。
个全面的参考,我们将在此再作一个总结:
● 新的主题和壁纸。
● GNOME 2.24 - GNOME 桌面环境的

二、如何升级
作为现有的 Ubuntu 用户,可以不用下载新的 8.10 ISO 映像而直接升级到新版本。具体步骤是:

点击“System/Administration/Software Sources”菜单;

选 择 “ Updates” 标 签 , 并 将 “ Show new distribution release” 更 改 为 “ Normal


oss.linuxpk.com 2008 年第 11 期 33

开源社区
releases”;

启动“System/Administration/Update Manager ”;

点击“Check”按钮要选择新的更新;

如果有更新需要安装,则使用“Install Updates”按钮来安装;完成后,再次点击“Check”。

三、下载 Ubuntu 8.10


如果是新的 Ubuntu 用户,那么可以从以下地址下载其 ISO 映像全新安装:
http://releases.ubuntu.com/releases/8.10

OpenOffice.org 3.0.0 中文正式版发布


性的软件,里面包含了许许多多的工具,其功能
绝对不比微软的 MS Office 还差,不但可以有
Word 一样的字处理,制作简单的图形,更有功
能强大的图表功能,也能编写网页,还可以做出
MS Office 中很难处理的数学符号等等,支持了
XML、微软的 doc、Excel、ppt 文件等格式。

OpenOffice.org 3.0.0 版在核心方面包


括以下 14 项重大更新:
10 月 10 日 , 开 源 集 成 办 公 套 件
● Mac OS X 支持
OpenOffice.org 更 新 至 3.0.0 。
OpenOffice.org 包含文字处理、电子表格、 ● ODF 1.2 支持
演示制作、图形编辑及数据库等多个组件,可满 ● Microsoft Office 2007 Import
Filters
足各方面的需要。
● Solver
OpenOffice 原 是 Sun 公 司 的 一 套 商 业 级
● 图表得到了增强
Office 软件-StarOffice,经过 Sun 公司公
开程序码之后,正式命名为 OpenOffice 发展计 ● 改进了 Draw 和 Impress 中的裁剪
划,并由许许多多热心于自由软件的人士共同来 功能
维持。让大家能在 MS OFFICE 之外,还能有免 ● 电子表格支持多用户协同工作
费的 Office 可以使用。OpenOffice 是个整合
● Calc 支持 1024 列


oss.linuxpk.com 2008 年第 11 期 34

开源社区
● Writer 支持同时显示多个页面 ● 新的启动中心

● 改善了 Writer 中的注解功能 ● Impress 支持原生表格

● 全新的图标集 ● 增 强 了 XML 支 持 并 更 新 了 XSLT


based filters

OpenOffice.org 3.0.0 下载地址

For Linux : ftp://ftp5.gwdg.de/pub/openoffice/localized/zh-


cn/3.0.0/OOo_3.0.0_LinuxIntel_install_wJRE_zh-cn.tar.gz

For Windows : ftp://ftp5.gwdg.de/pub/openoffice/localized/zh-


cn/3.0.0/OOo_3.0.0_Win32Intel_install_wJRE_zh-cn.exe

openSUSE 11.1 Beta 3 发布


面环境,显著地简化并开放其开发及打包过程以
使 openSUSE 成为 Linux 开发人员及软件提供
商所选择的平台。

近日,openSUSE 11.1 的第三个 Beta 测


试版已放出。自 Beta 1 以来,本版本的主要变
化包括:
● Live CDs for x86 and GNOME
and KDE
● OpenOffice.org 3.0
● Mono 2.0 Final
openSUSE 项目是 Novell 公司资助的社区
● Linux 2.6.27.1 (fixes e1000e
计划。为在方方面面促进 Linux 的普及应用,该
issue)
计划提供了对 openSUSE 这份完整 Linux 发行
● CUPS 1.3.9
的免费、简便的获取访问。openSUSE 项目有三
● Parts of 11.1 branding are
个主要目标:让 openSUSE 成为任何人都能最容 now in place
易获得且最广泛使用的 Linux 发行,利用开源软 ● Amarok 2.0 beta 2
件的联合来使 openSUSE 成为世界上可用性最强 ● Banshee 1.3.2
的 Linux 发行及新手和资深 Linux 用户们的桌 ● GNOME 2.24

KDE 版 本 下 载 地 址 : http://download.opensuse.org/distribution/11.1-
Beta3/iso/openSUSE-11.1-Beta3-KDE4-LiveCD-i386.iso


oss.linuxpk.com 2008 年第 11 期 35

开源社区

Linux 终于迎来了“同等”的
Flash 播放器
在过去 Linux 在这个领域只能算是二流的 Flash 可以在移动设备上和桌面市场一样被广泛
成 员 , 得 不 到 Flash 播 放 器 的 青 睐 , 2007 年 使用。
Linux 用户就是在其他主流平台使用 Flash 9
在 Microsoft Silverlight 发 布 不 久 ,
长达 6 个月之后,才迎来 Linux 版本。
mono 小组就开始了 linux 下的 Silverlight
如 今 , 当 微 软 决 定 将 Linux 平 台 实现,名称叫 Moonlight,代码 olive,也就
Silverlight 技 术 推 迟 发 布 之 后 , Adobe 给 是在短短的一个月左右的时间,Moonlight 已
Linux 平 台 带 来 了 “ 平 等 ” 的 播 放 器 , 并 称 经可以运行。
“Flash 播放器已经占据了互联网桌面市场 98% GNOME 的 创 始 人 Miguel de Icaza 称 ,
的 份 额 ” 。 同 时 , “ 80% 的 在 线 视 频 均 采 用 Flash 还不能在免费和开源软件社区大出风头,
Adobe 的 Flash 技 术” ,而 且在 9 个 月之 后, 作为一个非盈利的组织,肯定担心 Abobe 在多媒
Flash9 将占据互联网桌面市场 90%的份额。 体获得太多的控制权。他们已经开发了 Flash 的
Flash Player10 是 配 合 Adobe 替代品 Gnash,只使用免费授权的软件和编解码
Creative Suite(CS)4 发布的客户端软件, 器。
提供了对 Photoshop 和 Illustrator 创建矢 Flash 10 已 经 发 布 了 支 持 Linux,
量 绘 图 的 支 持 , 并 支 持 2D 和 3D 多 种 特 效 。 Windows, 和 Macintosh 平 台 的 版 本 , 支 持
Adobe 反 复 强 调 他 的 “ Open Screen Solaris 的版本将在年底发布。同时 Flash10
Project”,在今年 5 月份他就提出这个计划, 还支持 Adobe AIR。
称 他 们 将 免 费 开 放 的 文 件 格 式 和 API , 使 得

Apache HTTP Server 2.2.10 发布


近日,Apache HTTP Server 2.2.10 版 全免费,源代码完全开放,如果你需要创建一个
本发布。Apache 是最流行的 HTTP 服务器软件 每天有数百万人访问的 Web 服务器,Apache 将
之一,具有快速、可靠、可通过简单的 API 扩展, 是最佳选择。
Perl/Python 解释器可被编译到服务器中,完


oss.linuxpk.com 2008 年第 11 期 36

开源社区

Magic Linux 2.1 RC3 发布


继 Magic Linux 2.1 RC2 在上月推出之 更新了 xorg-x11-server 的情况下,才
后,近日,Magic Linux 项目小组紧接着发布 能更新这个包)。
了 2.1 RC3。Magic Linux 2.1 RC3 的主要
● 再 次 更 新 amarok, 添 加 两 个 依 赖
更新如下: libnjb/libmtp

● 更新 amarok 到 1.4.10 ● 更新 wx-gtk2-uniicode 到 2.8.9

● 更新 lrcShow-II 到 0.9.0 ● 更新 gtk2/glib/cairo/pango 以相


关的包。
● 更新仓库的 firefox 到 3.0.1
● 更新 gparted
● 更 新 magic-system-config 和
mxd,修正普通用户 adsl 拨号问题。 ● 降 级 bluez 到 3.36, 以 配 合
kdebluetooth.
● 更新 alsa-lib/alsa-
● kdepim/kdesdk/kdevelop 修 正
utils/alsa-drivers 到 1.0.18rc3,
bug。
普通用户的声卡问题仍在。
● 更新内核到 2.6.25.17,同时更新相
● 更新 pam,修正了普通用户声卡的问题。
关模块。
● 再次更新 pam,修正普通用户 iso 挂载
● 更新 Xorg 整体到 7.4
问题。
● 更新 hal/dbus/udev
● 更 新 libdrm/libXp/mesa/xorg-
x11-server。 ● 更新 gtk2 及相关包。

● 更新 kdebase,修正 kdm 自动登录认 ● 更新 firefox 到 3.0.3


证失败的问题

● 更新 magiconf,添加 mccModules

● 更新 kdeutils,移除无用 patch.

● 更新 wine 到 1.1.4,输入中文问题仍
然存在。

● 更新 sudo,修正 sudo 无法使用的问


题。

● 更 新 xorg-x11-driver , 配 合
xorg-x11-server 的更新(注意,仅在


oss.linuxpk.com 2008 年第 11 期 37

开源社区
本次发布提供 DVD 和 CD 版本,另包括使用兼容内核、使用 glibc 2.7、及 使用 Xfce 4 等三
个衍生版本。详细说明及已知 bug 和问题,请见 Magic Linux 2.1 RC3 发布公告。

Magic Linux 2.1 RC3 下载地址:

DVD:http://apt.magiclinux.org/iso/MagicLinux-2.1.rc3.dvd-1.iso

CD:http://apt.magiclinux.org/iso/MagicLinux-2.1.rc3.cd-1.iso

Mandriva Linux 2009 正式版发布


laptop 将 会 从 内 核 中 删 除 , 原 因 是 kernel-
laptop 与 kernel-desktop 已经差别不大了,
没 有 必 要 再 保 留 下 来 。 其 次 , 现 在 Mandriva
Linux One 版已经可以支持 4GB 的大内存了,而
且硬件的支持也更好了。

下面来看看 Mandriva Linux 2009 中的


亮点:

● 改进的控制中心

● 重新设计的安装器
Mandriva Linux ( 原 先 的
Mandrakelinux)创建于 1998 年,其宗旨是让 ● 更快的启动速度
Linux 对 所 有 人 都 更 易 于 使 用 。 Mandriva ● 支持更多的网络摄像头
Linux 是 一 个 使 用 RPM(Red Hat Package
● 增 强 的 DKMS(Dynamic Kernel
Manager)软件包的管理器系统。在经过两个 RC
Module Support)管理器
版之后,今天 Mandriva Linux 2009 正式版
发布了,该版本包含了三个桌面:GNOME 2.24 ● Live Upgrade(像 Ubuntu 的更新工
、KDE 4.1.2 和 lXDE。在这个版本中,还是有 具一样)
不少变化的,首先,以前长期存在的 kernel- ● 还有在美工方面的改进

下载:
ftp://ftp.u-
strasbg.fr/pub/linux/distributions/Mandriva/official/iso/2009.0/


oss.linuxpk.com 2008 年第 11 期 38

开源社区

系统比拼 Linux 系统究竟比 Vista 好在哪里


阅读提示:爱好者常常称赞 Linux 是最好的操作系统,自 Vista 上市后这种声音更加高涨了,因为尽管微
软一再乐观预言和表态,但 Vista 远没有达到预期的效果。
原因有很多:价钱、缺乏驱动支持、较早的应用无法在 Vista 运行等。Linux 真的比 Vista 好吗?当然
了,Linux 是免费的,而 Vista 最低的是 99.95 美元,最高的 399.95 美元;Linux 有可爱的吉祥物——小
企鹅,Vista 有吗?即使有,它有小企鹅可爱吗?言归正传,Linux 至少有五大点比 Vista 更好:

一、硬件要求
Linux 并不需要太多的存储空间和强劲的硬件内核,Vista 却要求很高:需要“现代”处理器(最
不济也要奔腾 4)和 512M 的 RAM(这里指内存),甚至推荐 1G 的 RAM。安装 Vista 机子怎么也得有 60G
的硬盘和 64M 的显卡。


oss.linuxpk.com 2008 年第 11 期 39

开源社区
相比较而言,一些版本的 Linux 甚至可以运行在 64M 内存和 486 处理器的机子上,而且这样的
Linux 也有图形用户界面。通常的 Linux 版本也只占 1.5G 的系统盘。

Vista 的用户界面很漂亮,但是不简捷。由于占用系统资源所以用户响应很慢。Vista 使用 GPU 而


不是 CPU 来呈现图形,而 GPU 很占存储,仅仅是屏幕渲染(screen rendering)Vista 就需要 256M
更不用说整个图形界面了。

二、安全性
Linux 机几乎不需要防病毒软件或应用,Vista 却必不可少。通常来说,之所以 Linux 更安全是因
为大多数病毒制造者将攻击对象定位为 Windows。

三、没有限制
Linux 没有严格规定系统内的内容如何使用,而 Vista 约束很多。

Vista 的数位版权管理(Digital Rights Management),降低了电脑的速度,而且需要技术支


持,存在跟硬件和软件造成不兼容、冲突现象的可能性。这些说简单就像升级一样简单,说复杂就像替
换硬盘一样复杂,如 Vista 的 HD-DVD 和蓝牙的 copy 保护技术。

在 Linux 中,音乐、电影都可以流畅地播放,软件可以运行, Linux 不会干预用户自由使用软件和


应用的权利,而 Vista 对自我的这种保护会消耗 CPU。

四、Linux 没有 Linux Genuine Advantage


无论安装的是哪个 Linux 版本,Linux 都会运转,没有功能不可用的担忧。而 Vista,依赖
Windows Genuine Advantage 服务器来验证序列号。当服务器宕机了,全世界的 Vista 用户莫名地
被剥夺了合法使用 Vista 的权利。而 Linux,从不会发生这个。

五、越来越多的 Linux 应用
Linux 应用的增加已经使我们可以远离 Windows 这个繁冗的操作系统。

不喜欢 Microsoft Office 的束缚?使用 Open Office;Vista 使用透光不均匀的 Paint 作为


图像编辑器,而大部分 Linux 使用的是 GIMP 2.2——具备 Photoshop 性能的强大应用;IE 浏览器带给
我们多少安全、性能困扰?使用 Linux 使用 Mozilla 吧。


oss.linuxpk.com 2008 年第 11 期 40

开源社区

Intel 开源技术中心:1,2,3,4,5,6,Go!
袁萌
10 月 27 日下午,在友人联络安排下,我去 Intel 开源技术
中心(北京分部)拜访陈绪博士(策略总监),有感。

大家知道,现今 PC 时代的光辉已经黯淡了。“上网本”
(”Netbook”),就像一颗明星,闪烁在夜空,尤其是基于
Ubuntu 的各类上网本。上网本体积不大不小,非常轻巧,而且便
于携带。近期,HP、Dell 和 Lenovo 等 PC 巨头在上网本方面都
会有自己的(大)动作。微软必须面对这一挑战,因为,Vista
体积太大,装不进去,而且启动速度太慢,让人受不了。

上网本有一个新特点,快速启动(”Instant-On”模式),
加电之后,几秒钟就可启动完毕(出现图形界面)。Linux 快速
启动技术是两位 Intel 程序大师的最新杰作。这种技术,非常神
奇,令人神往。据说,微软 Windows 7 的启动速度就比 Vista
快多了(不是快一点儿)。

在访问期间,Intel 陈绪博士拿出一台上网本(Acer Aspire One 品牌),其中预装 Linpus 操


作系统(台湾百资 Linux 发行版),就有这种快速启动技术。陈绪博士打开上网本的机盖之后,一按电
源开关,口中数着:1,2,3,4,5,6,go!只用了 5~6 秒钟,上网本的显示屏上就出现一幅图形界
面,表示一切启动准备完毕!真神了。我都不相信自己的眼睛,在过去,我从来没有见过如此之快就启
动的计算机。眼见为实,名不虚传。陈绪博士对我说,这种快速启动技术是一项“开源技术”,他们已
经转给 Ubuntu 开发团队了。这句话,我听了,特别入耳。据传,明年发布的 Ubuntu 9.04 版本就会
用上它。

陈绪博士还给我看一个黑色的“小东西”,叫做“MID”。MID 就是 Mobile Internet Device


的字头缩写词,意思是移动互联网设备。它是韩国生产的,品牌是 Compal,基于 MIDinux 操作系统,
意思是 MID(一种硬件的名称)专用的 Linux 发行版,用 MID 取代 Linux 中的字母 L 组成的,通常写
为“Midinux”。这个“小东西”,有一个滑动盖,下面有一个小小的键盘,显示屏具有触摸功能,十分
精巧可爱。(据说,Midinux 基于 Asianux,不支持 GNOME,我不喜欢。)

过去,我总以为 Intel 是个硬件厂商,只会生产 CPU。现在看来,这种印象是完全错了。Intel 在


中国有个 OTC(开源技术中心),有 150 多个专职开发工程师,100 个工程师在上海,50 个工程师在北


oss.linuxpk.com 2008 年第 11 期 41

开源社区
京。Intel 的这个 OTC,专门从事开源技术的基础研究和应用开发,比如:Linux 内核、各类硬件驱动
(程序)、虚拟化技术、嵌入式 Linux,等等。这个 OTC 吃定了 Intel,本身没有盈利指标。我感到很
奇怪,这个 Intel 的 OTC 在我们国内所发挥的作用,比如:凝聚开源力量,培养开源人才,(实实在在
地)推广开源技术,本来应该是我们自己来做的,为什么由 Intel 来做,而且做得很好,很到位?

这使我想起一件事情。2003 年上半年,国家(信产部)决定通过招标方式组建一个面向全国的“开
源中心”,当时,我作为扬帆开源股份公司的董事长,组织人力,用 OpenOffice.org 1.2 版本做了
126 页的标书(排版很困难),参与投标(未中)。结果呢?就是现在的 CSIP(国家软件和集成电路中
心)!CSIP 究竟做了什么工作,大家心里面都明白。于是,我在想,今后我国的 Linux 开源事务交给
Intel 办岂不更好?Linux 靠 Intel,Windows 靠微软,两只领头羊,不是很好吗?微软和 Intel 的
中国总部,我都去过,里面并不可怕(没有阴谋)。我很怀疑,所谓的“国产基础软件”是在忽悠谁?连
个通用的编译器都没有,谈何“自主软件”?软件开发依靠忽悠是不行的。把国家的钱(科研经费)当
成“盈利收入”,是可忍,孰不可忍?每说到这里,我的气就不打一处来。

Vista 与 Ubuntu 8.10 的基准测试比较


袁萌

自从 Ubuntu 8.10 发布之后,评论文章很多,但是,多半是个人研究结果,不是性能基准测试的


硬指标。10 月 30 日,《IT Channel News》公布了一些数字,很有意思。(请见:Ubuntu 8.10


oss.linuxpk.com 2008 年第 11 期 42

开源社区
Is The Real Deal(by Edward F. Moltzen,ChannelWeb 记者)一文。)

10 月 30 日,在《Primate 实验室》进行了一次有关 Vista Business 和 Ubuntu 8.10 性能的


基准测试对比,使用了跨平台测试工具软件(Geekbench 2.0.19 版本)。Geekbench 特别适合于多
核处理器、多线程和 64 位(包括 32 位)操作系统的基准测试。这项测试是在该实验室“测试中心”的
PC 测试实验台上进行的,基本硬件配置是,CPU 是 Intel 双核处理器 E7200,主频 2.53GHz,Intel
图形显卡及 G31T-M 主板,2GB 内存。测试结果如下:Vista Business 的性能指标为 2838(该指标
涉及许多方面,比较抽象),Ubuntu 8.10 为 3367,显著高于 Vista,比如说,Vista 启动时间为
56 秒,而 Ubuntu 8.10 为 50 秒,等等。

无线上网曾经是 Linux 的弱项,Linux 内核新版本(2.6.27)大大改变了这种情况。在 WiFi 和


3G 支持方面,Ubuntu 8.10 操作之简便,明显优于 Vista。同时,《Primate 实验室》公开说明,根
据他们的实际测试经验,Ubuntu 8.10 的性能确实高于其他 Linux 发行版,据此,该实验室特向 VAR
供应商推荐 Ubuntu 8.10 版本。看到这个结论,我想,“你和我,心连心”(奥运歌词),感觉都一
样。

11 月 1 日,根据 www.w3counter.com 公布的数字,在全球范围内,Vista 所占份额从 9 月份的


12.30%下降到 10 月份的 12.14%,好笑的是,XP 却不降反而上升,从 9 月份的 73.04%上升到
73.80%。与此同时,Linux 从 9 月份的 1.99%上升到 10 月份的 2.09%。这大概是大量的“上网本
”出货闹的。难怪微软 Ballmer 最近向媒体说,人们可以越过 Vista,等待 Windows 7 的发布。看来,
Ubuntu 8.10 的真正对手不是 Vista,而是 XP,特别是番茄花园的修改版 XP!不仅这样,微软也怕修
改版 XP,关闭自动更新功能,抵制正版验证,看你能够拿我奈何!誓将盗版进行到底的铁杆分子,你们
“死定了”(韩国人喜欢这么说,里面有点说不出来的意思,反正含义并不很坏)。

我在想一个问题,盗版者为什么拼死要用修改版 XP 呢?改用 Ubuntu 不是很好么?他们说,你根本


不懂“XP 上瘾”是个什么滋味。世界上,哪里有“XP 上瘾”戒毒所?这个“毒”有多么深?怎么戒这个
“毒”呢?我恨番茄花园洪磊搞修改版 XP 害了这么多人。这个摊子不知怎么收场才好。我看,《全球反
盗版日》就是改为《全球反盗版年》也不行。今天晚上 6 点半,上海电视台要在《头脑风暴》节目对我
采访(有关“黑屏”事件,这也许是事先录制,不是直播),如有可能,我还得批一批番茄花园,不批
不解气。明天上午去 Intel 上海总部 OTC 询问自启动 U 盘事情,下午回京,后天早上,一定与大家分享。

注:近期不少著名的国外专家预测,由于 Intel 工程师贡献了一种快速启动补丁,明年基于 Linux 的快速启动


计算机的全球发货量将会超过(outship)Windows 计算机。Ubuntu 9.04 将包含这种快速启动功能。国内
厂家如不及早注意这些进展,肯定要吃大亏。)


oss.linuxpk.com 2008 年第 11 期 43

开源社区

Mandriva 2009,我看到希望和勇气

--谨以此文与 Mandriva 爱好者互勉


夏羽翀

热闹的大街,忙碌的人群,去了又回,我存在如无物。往事前生,浮于眼前,挥之不去,我存在如
蝶梦。真不明白,我到底是怎么的就站到了这个地方?

一切拥有过的都要打上“曾经”的烙印,得到的必将失去。生命的热情不可逆转的从身体的散发开
去,漾在无尽的虚空,荡不起半点浪花。哭的、笑的、恨的、爱的,我怎么就听不到半点的回音?
我不能回头,转身的刹那,一切拥有过的又要被打上“陌生”的烙印。孤单的影子伴随,我行走在无尽
的虚空里。恐惧在心头悄悄滋生,我已经背负太多,抛掉吧。

我必须义无反顾的向前走去,希望的星光摇曳不定,微茫中现出未知的美丽,我还不想放弃。走向
哪里?没有路,没有灯,我只能用生命的热情去点亮湿冷的火把,见证我的希望又一次的破灭,就这样
苦苦支撑。

人已老去,心开始犹豫,我还是在寻找,就这样漫无目的,就这样惶恐不已。时间带走一切,我颓
然倒地,我哭了,忧郁得像个孩子!

前几天逛些 linux 论坛,忽有贴问人已三十,能学 linux 否?猛然间发觉自己也过了三十而立之年,


童年的无忧无虑,高中的煎熬折磨,大学的书生意气, 工作的艰难坎坷,生活的遥不可及,忽然的妻儿
老小,近来的父辈逝去,将来我呢?我是什么?一个容器,容纳一切,最终失去,空无一物?

人已渐渐木然,没有也不愿一丝改变。哪怕 Mandriva 2009 出来,似乎也不愿轻易尝试。何必要


把 Mandriva 2008.1 变成 Mandriva 2009,何必要把 Windows XP 换成 Mandriva Linux?勇气
一天天丧失,有人说这是成熟,其实是衰老,可怕呀!

终 于 还 是 下 了 mandriva-linux-one-2009-KDE4- jp-zh-cdrom-i586.iso , 还 是 在
virtualbox 中体验了 Mandriva 2009,我也深深明白许多 mandriva 爱好者的失望。可是我还是要
向 Mandriva 2009 表示我最大的敬意,不为别的,就为它百折不饶的毅力,就为它改变自我的勇气!


oss.linuxpk.com 2008 年第 11 期 44

开源社区
Mandriva 活的不易,蹒跚起步,中遭大难,一度领先,继而落寞。在中国, Mandriva 再多些落
寞又有什么关系呢。何必那么高,“高处不胜寒”!Linux 不也如此吗?有人捧诸高天,有人摔之地底,
而 Linux 还是 Linux,慢慢成长。

Mandriva 2009 改变太多太多,尤其默认采用 KDE 4.1.2 这个本来就不是为现在准备的桌面环境。


可就是这样的惊鸿一瞥,我看到了未来的光芒:Mandriva 能有多大的变化,KDE 4 会是怎样的精彩,
QQ 也有了 linux 版本,永中 Office 也推出免费个人版……一切一切,都为未来积蓄力量。涓涓溪流,
终成大海。

我们现在能做的就是等待再等待。


oss.linuxpk.com 2008 年第 11 期 45

开源社区

“我们一直在为内核贡献代码!”

——独家对话 Intel OTC 中国内核团队


陈杰
中日韩 IT 司局长会议暨东北亚开源推软件推进论坛已经在中国、日本、韩国轮流成功地举办了六届 ,
今年第七届于 10 月 30~31 日在中国无锡市太湖饭店举行。此次大会上颁布了由共创软件联盟举办的
“2008 中国开源软件竞赛活动暨开源软件创新与企业应用大赛”决赛获奖名单,来自英特尔开源技术中
心 中 国 内 核 团 队 的 “ Linux 内 核 2.6.27 项 目 ” 获 得 第 一 名 , 而 Intel OTC ( Open Source
Technology)的内核团队被选举为此次东北亚开源推软件推进论坛中方的“特别贡献奖”。一直以内 ,
人们的惯性思维就是 Intel 是一家硬件公司,他们关注的是生成芯片、销售芯片,而软件来自于不同领
域,这和 Intel 是毫不相干的事情。事实上,在软件领域,尤其是开源软件领域,Intel 做出了很多的
贡献,很明显的一组数据就是在英特尔中国,专门从事开源软件研发的就有 150 个工程师左右,这些工
程师做的每一件事情都与开源软件有关,并且都回馈与开源社区。此次代表中国开源社区获得大奖,也
体现了对他们做出贡献的一种肯定。《开源》杂志在第一时间采访了 Intel OTC 内核团队的负责人傅文
庆经理以及他所带领的内核开发团队。

《开源》:首先介绍一下你们内核团队的历史,目前都有哪些成员?如何分工,分别侧重哪些方向?


oss.linuxpk.com 2008 年第 11 期 46

开源社区
傅文庆:OTC 的 Linux 内核开发团队最初成立于 2003 年,目前有 15 个工程师,工作在以下领域:

● Linux 核心支持,主要是对最新的 CPU,芯片组的功能提供 Linux 内核的支持。还包括对内核


性能的优化。特别是我们有一个开源的项目叫 LKP(Linux Kernel Performance), 主要工
作就是不断测试 Linux 的最新内核版本,已确定哪个最新引入的补丁会导致内核性能的下降,并
且与社区开发者沟通,提出解决方案,以不断提高 Linux 最新版本的性能。

● Linux 电源管理 ACPI 系统。通过我们的工程师的努力,在很短的时间里,修正了 250 多个


Bug, 使 Linux ACPI 的稳定性有了极大的改善。

● Intel 显卡驱动程序。

● Intel 无限网卡驱动。在开发对无线网络支持的同时,我们开发的无线网络(WIFI)协议栈也被
Linux 接受成为 Linux 内核中的标准的 WIFI 协议栈。

● Netbook 的支持。我们的工程师在加速 Netbook 启动的过程中也做出了重要贡献,以实现在


Netbook 上 5 秒启动的里程碑。

《开源》:你们这个 team 已经存在多年,做出了哪些成果,对 Intel、对开源社区都有哪些方面


的贡献?

傅文庆:我们在内核平台配置和电源管理(ACPI),内核性能优化,无线网络协议栈及驱动, PCI
子系统功能实现,Kexec/KDump,SystemTap 方面都有贡献。譬如,我们显著改善了内核休眠和唤醒
的用户体验,致力于追踪内核性能损失并及时更正,贡献了第一个开源的无线协议栈等。在开源社区方
面,我们多次代表从中国来的开发人员在国际知名内核开发会议上发表论文讲座。积极参加国内开源社
区,特别是内核开发社区,为推动社区发展贡献自己的一份力量,比如我们积极参加北京内核开发研讨
会,阿卡内核开发者大会并贡献讲座,我们的成员积极国内内核开发者聚集较多的 linuxforum,zh-
kernel 等论坛或邮件列表,积极参与讨论,为初学者解惑答疑。

《开源》:祝贺下你们这个 Team 代表中国获奖在中日韩论坛大会上获得“特殊贡献”大奖,这体


oss.linuxpk.com 2008 年第 11 期 47

开源社区
现了你们的价值,也可以看做是中国开源界对您们的一种肯定,对于获奖,您们都有一些什么想法?

傅文庆:对于获奖,我们一是感到欣慰,能通过自己的工作,向其他国家展示中国对 Linux 开发的


贡献和影响。二是感到一种鞭策,以激励我们能够把工作做得更好,对 Linux 的贡献更大。同时我们也
是希望能够和国内从事 Linux 内核开发的工作者能够有更多的交流合作。

《开源》:很多人告诉我,Intel OTC 的工程师具有双重属性,一方面是 Intel 的员工,另一方


面在为开源社区做着贡献,从而具备了社区属性,你们是如何认识这样的问题的?

傅文庆:确实,OTC 的工作模式就是典型的开源软件开发的模式,虽然我们也会做些内部的开发计
划和进度的跟踪,但是我们的工程师都是以符和开源软件的开发模式进行工作的。工程师们开发的代码
都是按补丁的形式,由他们以个人的名义提交到相应的开源软件的邮件列表,通过在邮件列表上的讨论
(甚至争论),取得项目维护者(Maintainer)的赞同,并经过代码的审查(Review),修正,最终
被并入相应的代码树中。在公司内部,他们是 Intel 的员工,在开源软件的项目的开发中,他们就是一
个开发的个体,为开源社区作出他们的贡献。

《开源》:你们对于中国的开源爱好者,社区的参与者都有哪些方面的建议?

傅文庆:下面是一些我们团队对有志于内核开发者的开源爱好者的建议和心得。

邹南海:我觉得主要是要多看代码。看书要看讲操作系统原理性的书,如果是纯粹讲代码的书,还
不如直接看代码。

林铭:我觉得看书和看代码都很有帮助。刚开始学习 Linux 的时候,曾经徘徊过,是看书还是看代


码。对于刚开始做内核编程的开发者来说,Understanding Linux Kernel 是一本很好的入门书籍,
它讲的比较细,然而和代码又有一些差别,对照着最新的代码来读,可以达到知其然并知其所以然的效
果。另外就是要有耐心。我开始上手的时候,内核有些代码,看一会可能会觉得没意思,就想跳过去。
看了一年感觉没太大效果,但后来坚持和 Understanding Linux Kernel 结合,从头看,仔细学,
半年时间就感觉收获很大。参与开发,可以从把一个 bug 描述清楚开始,这需要去做一些调查,摸清楚
一个 bug 怎么重现,表象上是什么样的,有什么特别之处,这些特别之处又对应着源代码的那些部分,
等等。等把这些在邮件列表或 Bugzilla 上描述清楚了,回头再看看,往往离解决这个问题已经不远了。

李少华:如果是想做内核开发者,需要扎实的基础知识,比如 C 语言,计算机体系结构等。如果觉
得这些方面的知识都很吃力,建议尽量不要过早的去看内核。要循序渐进,先熟悉掌握这些方面的知识
刚开始做 Linux 内核开发的话,kernel janitor 是个不错的开始。

赵亚奎:我来说一个我的个人体验,选定内核的一个方面的主题,多去看它的代码,去理解它怎么
工作的,同时参与社区的讨论。

黄瀛:做开源软件开发,可以从用开源软件开始。遇到问题或者不满意的部分,去看他的代码,不


oss.linuxpk.com 2008 年第 11 期 48

开源社区
要只是作为普通用户去抱怨。然后去社区反应问题,参与讨论。要虚心听取别人意见,俗话说,有人骂
比没人理要好。参与社区讨论,关键是心态要好,开始的时候,不要太在意是否会被接受。

王 振宇 :做 开源 软件 的开 发, 个人 体验 是, 开始 的时 候, 不要 定太 大的 目标 ,要 去开 发什 么
feature 啦,要去做什么大项目啦。从审阅(review)别人的工作开始,不是简单的读代码。看看是
否能看的懂,是否能提出改进意见。如果和读代码结合,会更有效率。

吴峰光:对自己感兴趣的部分的代码,可以直接去看邮件列表里的相关的 patch。patch 里往往都


会有描述,可以帮助理解。看 patch 演化的过程往往比直接看最后结果会更有效。

张衍民:我的心得是,初学者从 bug fix 入手最好。从小问题开始,不要怕问题小。从小到大,比


较容易被接受,而且可以逐步建立自己的 credit,熟悉开发社区的氛围,为将来做更大的 feature 或
项目打下基础。此外,对内核开发者而言,硬件知识也很重要。

马凌:我这里提一点学习内核的心得。可以从点到面。比如说我在做图形方面的工作。入手的时候 ,
就从直接看到的 i915 DRM 驱动看,又看到调用到的 AGPGART 驱动上的东西。然后又看到 PCI 总线驱
动相关的东西。因为这些只是和图形驱动相关,所以看到一定深度就不看了。比如对 sysfs 方面的调用,
我只要假定这个函数调用能工作就行了。对初学者来说,深度优先的看法是比较危险的。容易陷入到死
胡同,又没有高手指点迷津。对于自己暂时不感兴趣的东西,可以大概知道是什么意思就好了。

傅文庆:关于中国的初学者比较“怕”的和开源社区共同方面,我们的心得是,对初学者确实是会
有些语言方面的障碍,譬如有时候有很多话想说,可到时候又写不出很好的句子表达,就偷懒只写两句
拉到了。有些时候邮件列表上的一些表述,对我们没有英文背景的开发者来说,也搞不清楚他们的态度
到底是怎么样的。我们的建议是:

- 开始不要考虑语法,不行就使用 1,2,3 这样一条一条的列。反正老外英语好,他们能看懂的。

- 又想说的就要多说,就想 BBS 上灌水一样,要养成和别人交流的乐趣。

- 对邮件列表上表述不清楚的,直接回复问对方是什么意思。不要回避。

- 还有一点很关键,做开源开发,不要本着做产品的态度去做。很多做产品的项目一直想着利用开
源,把东西做完就好了。但如果要做开源的开发者,就必须有着开放的态度。


oss.linuxpk.com 2008 年第 11 期 49

知识学堂

Linux 内核中 Kprobes 调试技术的实现


归剑峰
内核开发者一直在试图寻找一种快捷高效的内核调试手段,用于内核开发之中。高效的调试技术有
利 于 提 高 内 核 开 发 效 率 , 缩 短 内 核 开 发 周 期 。 本 文 研 究 了 一 种 新 型 的 内 核 调 试 技 术 ― Kprobes,
Kprobes 是一个轻量级的内核调试工具,利用 Kprobes 技术可以在运行的内核中动态的插入探测点,
在探测点处执行用户预定义的操作。本文首先根据 Kprobes 在 Linux 内核中的源码实现,针对 Linux
CPU 异常技术,single-step 技术,Loadable Kernel Module 技术以及 RCU 同步技术在 Kprobes
中的应用进行了研究。其次,针对 Kprobes 目前所支持的 kprobe,jprobe,kretprobe 等三种调试
手段的实现进行了详细的分析研究。

一、Kprobes 调试技术

Kprobes 调试技术概述
一直以来,内核开发者一直在试图寻找一种快捷高效的内核调试手段,用于内核开发之中。从 2.6
版本的 Linux 开始,一种新的内核调试技术出现了,这就是 Kprobes 技术。

Kprobes 最早是源于 IBM 的 Dprobe 项目发展起来的,Dprobe 是一个 IBM 公司开发的内核调试工


具。从 2.6.9 Linux 内核开始,Kprobes 被加入内核源码,并处于不断完善之中,越来越多的功能被
添加到 Kprobes 内核调试技术中来。 Kprobes 目前已经能在 i386,x86_64, ppc64, ia64,
sparc64 等 CPU 平台上正常工作。

目前,大多发行版本都包含一个内核调试工具 SystemTap。SystemTap 可以通过编写脚本调试内


核 , 该 工 具 正 是 依 托 Kprobes 来 实 现 的 。 Kprobes 是 一 个 轻 量 级 的 内 核 调 试 工 具 , 也 就 是 说 ,
Kprobes 的运行基本不会影响到正常内核执行的流程。

利用 Kprobes 技术可以在运行的内核中动态的插入探测点,当内核运行到该探测点后可以执行用户
预定义的回调函数。当执行完用户函数后又会回到正常的内核执行流程,开始新一轮的调试工作。

Kprobes 支持三种探测方式:第一种是最基本的探测方式称为 kprobe,该探测方式支持在内核的


任意位置放置探测点(除了与 Kprobes 实现相关的代码)。第二种调试方式称之为 jprobe,该探测方
式主要用于调试函数传入的参数。第三种调试方式称之为 kretprobe,该调试方式是在函数返回时执行
用户回调函数,利用该方式可以调试内核函数返回值。以上讨论的后两种调试方式都是基于第一种


oss.linuxpk.com 源 2008 年第 11 期 50
知识学堂
kprobe 调试方式实现的。Kprobes 还支持三种回调函数类型:第一种叫做 pre_handler,该回调函
数用于在执行被探测指令前执行。第二种叫 post_handler,该回调函数用于在执行完被探测指令后执
行。第三种叫 fault_handler,此函数用于在出现内存访问错误时进行处理。

目前 Kprobes 内核调试技术已经被很多内核开发者所采用,并使用在内核开发过程的各个阶段。
Kprobes 的开发还在不断的进行之中,目前的 SystemTap 社区负责对该调试技术的维护以及新功能的
开发,主要由 IBM,Intel,Redhat 等公司维护。

Kprobes 配置说明
使用 Kprobes 进行内核调试前,先要对被调试内核进行相关配置。以 Linux 2.6.20.3 版本
Linux 内核为例:

首先,需要把 Kprobes 相关代码编译进内核,进入内核目录运行 make menuconfig 命令,在


Instrumentation Support 项目中选择 Kprobes。

其 次 , 选 择 Configure standard kernel features 中 的 Include all symbols in


kallsyms 项,该项用于启用 kallsyms_lookup_name()函数,这个函数用于检索内核函数的地址。
在最新版本的 Kprobes 实现中已经支持直接利用函数名来进行注册。

第三,选择 Loadable module support 中的 Enable Loadable module support 项,该项


用于启用内核的可插入模块功能。因为 Kprobes 的调试是通过模块插入实现的,调试者需要编写调试模
块并插入内核方式进行内核调试,因此必须选择该选项。

Kprobes 中的关键技术
Kprobes 不只是纯软件的实现方案,该技术与具体硬件紧密相连,用到了一些硬件的特性。因此
Kprobes 的实现框架分为两个部分实现:第一部分是 Kprobes 的管理,这部分是与体系结构无关的代
码。第二部分是与具体 CPU 体系结构相关的实现代码,比如准备单步执行环境等。这些代码与具体 CPU
体系结构紧密相连,因此在不同 CPU 上各有不同的实现方式。本文以下所有的讨论都是基于 Intel
IA32 CPU 架构,2.6.20.3 内核。下文讨论用于支持 Kprobes 实现的四种关键技术。

Linux CPU 异常处理技术以及在 Kprobes 中的应用

CPU 异常是在 CPU 运行期间,由于外围硬件发出中断信号或是执行 CPU 异常指令等情况所引发的。


CPU 异常可分为硬件异常和软件异常。

硬件异常也称为硬件中断,一般是有外围硬件设备发出中断信号引起。当外围设备发出一个中断信
号,该信号被发往中断处理器仲裁,比较有名的是 8259 中断处理芯片,目前 Intel 的 CPU 一般采用


oss.linuxpk.com 源 2008 年第 11 期 51
知识学堂
APIC(Advanced Programmable Interrupt Controllers)来实现。中断处理器仲裁后发往 CPU
的中断引脚,这时 CPU 会开始一次中断处理流程。

软件异常不是由外围设备发出的,而是由程序员写入程序里的一些 CPU 异常指令引起的,比如


int,int3 这类指令就会引起一次软件异常。在早期的 CPU 上 Linux 系统调用的实现就是利用 int 指
令。当 CPU 执行到这些异常指令时,同样会开始一次异常处理流程。

操作系统 CPU 异常处理的实现是和特定 CPU 体系结构紧密相关的。Intel IA32 体系的 CPU 的每个


中断或是异常都有一个向量号,这些向量号从 0 到 255。Linux 内核中,每一个中断向量号都对应中断
描述符表(IDT)中的一项,因此中断描述符表一共有 256 项。IDT 每一项包含 8 个字节,这 8 个字节的
其中一部分是中断处理函数的地址。表项的其他字段的含义这里不再介绍,可以从 Intel IA32 程序员
手册中查到。Linux 内核在初始化阶段用 set_trap_gate()宏初始中断描述符表。

Linux 内核中,异常处理是通过两级跳转实现的。比如,如果当 CPU 运行过程中接收到一次异常信


号,此时 CPU 会到根据中断向量号到中断描述符表中找到对应项,再跳转到表项中所指的地址去执行。
这里跳转到的地址一般情况下对应源文件 linux/arch/i386/kernel/entry.S 中的某个汇编函数入
口。汇编函数经过一定的初始化工作后再跳转到 C 函数中去执行。这里的 C 函数才是真正的异常处理函
数,当从 C 函数返回到原来的汇编函数后,汇编函数还会做一部分后续工作。最后汇编函数执行 iret 指
令从中断上下文中返回到被中断的代码中继续执行。这是 Linux 内核处理异常一般过程,因此称 Linux
的异常处理过程是两次跳转实现的。

在 Kprobes 的实现中同样也用到了 CPU 异常,当插入一个探测点的时候,Kprobes 处理例程会把


插入点处的指令保存起来,然后用 int3 指令代替。当 CPU 运行到插入的 int3 指令时,Linux 内核就
进入了异常处理流程,之后再运行调试者预定义的回调函数。利用 CPU 异常来实现探测点的触发并处理
是 Kprobes 实现的关键。

single-step 技术及在 Kprobes 中应用


调试器的单独执行功能是非常有用的,程序员可以通过单步执行代码来确定程序执行的流程,随时
掌握变量变化情况,从而精确定位程序错误发生的位置。可以说单步执行功能是一个调试器必须具备的
功能。single-step 技术就是为了调试器的单步执行而设计的。

single-step 技术的主要思想是,当程序执行到某条想要单独执行 CPU 指令时,在执行之前产生


一次 CPU 异常,此时把异常返回时的 CPU 的 EFLAGS 寄存器的 TF(调试位)位置为 1,把 IF(中断屏蔽位)
标志位置为 0,然后把 EIP 指向单步执行的指令。当单步指令执行完成后,CPU 会自动产生一次调试异
常(由于 TF 被置位)。此时,调试器一般都会把控制权又交回调试器,回到交互模式。

在 Kprobes 实现中同样也用到了 single-step 技术,但目的不是为了回到交互模式,而是把控制


oss.linuxpk.com 源 2008 年第 11 期 52
知识学堂
权交回 Kprobes 控制流程。当 Kprobes 完成 pre_handler()处理后,就会利用 single-step 技术
执行被调试指令。此时,Kprobes 会利用 debug 异常,执行 post_handler()。这是 single-step
技术在 Kprobes 的主要应用。

loadable kernel module 技术及在 Kprobes 中的应用


loadable kernel module(LKM)技术是 Linux 内核的又一强大特性。

在 LKM 技术出现以前,添加内核代码只能通过修改内核源码,然后重新编译内核再重启后才能生效 。
当 LKM 技术出现后,内核编程变的简单许多,内核开发者只需要把代码写成内核模块形式,再插入内核
就可以作为内核的一部分运行。确切来讲,LKM 技术为内核开发者提供了在内核运行过程中动态插入和
卸载内核模块的功能。LKM 技术在不用重新编译内核的情况下,可以扩展内核的功能。目前,大量的设
备驱动程序利用 LKM 技术实现。驱动开发者把驱动程序写成模块的形式,并在内核启动时自动加载入内
核,当然这也可以通过手动加载方式实现。

LKM 技术的出现带来了两个好处:第一,LKM 技术使得驱动程序的开发和调试变得异常简单,很大


程度上提高了驱动开发的效率。第二,LKM 技术的出现使得内核镜像不至于过于庞大,因为大部分的内
核代码可以写成模块形式,使用时才加载。这样不会使得内核在系统内存中占用太多空间而影响系统性
能。

在利用 Kprobes 进行内核调试时同样用到了 LKM 技术。调试者需要把调试代码写成模块形式并插入


内核。当调试模块被插入内核后就进入调试阶段,而当调试模块从内核中卸载时,也就意味着调试过程
的结束。可以说 LKM 技术是 Kprobes 技术进行内核调试基础。

RCU 技术及在 Kprobes 中的应用


Linux 内核有时会访问到一些全局的数据结构,如果此时内核被抢占并且数据被修改,又或者在
SMP 系统(即多处理器系统)上运行,可能会有多个 CPU 同时访问同一块内存的情况,此时内核数据就
可能产生不一致性。为了避免这种情况,内核使用了一些同步机制,比如利用信号量同步,利用自旋锁
同步等方法。在 2.6 版本的内核中又引入了一种新的内核同步机制 RCU,这是 Read Copy Update 的
缩写。RCU 的主要思想是分为两个部分,第一部分是防止其他访问者对被保护对象写入,第二部分是真
正展开写入行为。读者可以随时访问被 RCU 保护的对象而不用获得任何锁。写者先对对象的副本修改,
在所有读者都退出时再执行写入行为,不同的写者之间需要同步。RCU 同步机制适用于存在大量读操作
而很少写操作的情况。因为这种情况下,读操作不用获得任何锁就可以对共享对象进行读操作,极大提
高了效率。

在 Kprobes 对探测点数据结构的操作中也是大量存在读操作而只有很少部分写操作。为了提高效率 ,


oss.linuxpk.com 源 2008 年第 11 期 53
知识学堂
Kprobes 的实现中也引入了 RCU 机制。当发生探测点注册或是注销时,或是在执行探测点的回调函数时,
探测点数据结构 struct kprobe 就会被 RCU 机制保护起来。根据 RCU 的原理,写者的操作是被延迟的,
而如果读者发生了阻塞,那写者的操作直到读者被唤醒后才进行,这会大大降低 RCU 的效率。因此在执
行 Kprobes 回调函数时内核的抢占以及 CPU 中断都被禁用了。对于 Kprobes 来说,用 RCU 机制实现回
调函数访问也极大的提高了 SMP 系统上多探测点探测的效率,因为可以并行的执行回调函数。但在这样
的机制下,回调函数必须被设计成可重入的函数。

Kprobes 调试技术体系结构分析
根据 Kprobes 的源码实现,从逻辑上基本可以把 Kprobes 分为 3 个部分:第一部分是注册探测点
部分,第二部分是调试处理部分,第三部分是注销探测点部分。第一部分主要功能是进行一些安全性检
查,并根据要求安装探测点等工作。第二部分是 Kprobes 实现的关键,该部分根据探测类型执行预定的
操作。这里的探测类型主要有三种:kprobe,jprobe 和 kretprobe。这部分还会完成被探测指令单
步执行等操作。第三部分是当调试者撤销探测要求时,对探测点的注销操作,主要是恢复被探测指令等
工作。

图 1: Kprobes 执行逻辑图

下面分别介绍 kprobe,jprobe 和 kretprobe 的实现机制。

3.1 kprobe 的实现

3.1.1 相关数据结构与函数分析


oss.linuxpk.com 源 2008 年第 11 期 54
知识学堂
1) struct kprobe 结构

该数据结构是整个 Kprobes 体系的基础,所有 Kprobes 的行为都是围绕该结构展开。以下是


struct kprobe 结构的主要成员:

struct hlist_node hlist; //该成员用于把 struct kprobe 结构加入 kprobe_table 表中。


struct list_head list; //该成员用于把探测地址相同的 kprobe 组织成链表。
kprobe_opcode_t *addr; //该成员用于保存探测点地址。
char *symbol_name; //该成员表示探测函数名。
kprobe_pre_handler_t pre_handler; //定义的探测前回调函数。
kprobe_post_handler_t post_handler; //该成员是用户定义的探测后回调函数。
kprobe_break_handler_t break_handler; //该成员在处理 jprobe 时使用。

2) struct notifier_block 结构

该 结 构 用 于 注 册 异 常 发 生 时 调 用 的 回 调 函 数 。 int (*notifier_call)(struct
notifier_block *, unsigned long, void *)成员是回调函数指针,int priority 成员用于
设置调用优先级。Kprobes 中定义的优先级为最高优先级,确保注册的回调函数被首先调用到。

3) register_kprobe()函数

该函数用于完成 struct kprobe 结构的注册,插入探测点等操作。

4) kprobe_handler()函数

该函数用于处理由 kprobe 引发的 int3 异常。

5) post_kprobe_handler ()函数

该函数用于处理由 kprobe 引发的 debug 异常。

kprobe 处理流程分析
kprobe 是 Kprobes 实现体系中最底层也是最基本的一种探测方式,jprobe 和 kretprobe 探测
方式都是通过 kprobe 来实现的。kprobe 的主要处理流程如下图所示:


oss.linuxpk.com 源 2008 年第 11 期 55
知识学堂

图 2: Kprobe 处理流程图

1)kprobe 的注册过程

当 调 试 者 向 内 核 插 入 一 个 kprobe 模 块 时 , 首 先 会 执 行 注 册 探 测 点 操 作 。 该 操 作 主 要 由
register_kprobe()函数完成,在下文中都称该函数为注册器。注册器的参数中包含一个 struct
kprobe 结构,该结构由调试者在调试模块中创建。

首先,注册器会进行一些正确性检查工作,判断传入的 struct kprobe 结构中 symbol_name 和


addr 是 否 同 时 存 在 , 如 果 是 则 返 回 错 误 。 之 后 还 会 判 断 探 测 地 址 是 否 在 内 核 代 码 段 中 并 且 不 在
Kprobes 实现相关的代码中。这样的检查是很必要的,如果探测地址出现在 Kprobes 实现相关代码中
就会造成递归现象。如果被探测的地址已经被注册过,则会在 kprobe_table 中以链表形式组织。

其次,注册器会保存被探测地址的指令码到 struct kprobe 结构的 ainsn.ainsn 中去,以便以


后进行 single-step 操作。对 kprobe 初始化完成后,注册器会把传入的 struct kprobe 结构指针


oss.linuxpk.com 源 2008 年第 11 期 56
知识学堂
插入哈希表中。最后,注册器把被探测的指令的第一个字节替换成 int3 指令。到这里,kprobe 的注册
工作就完成了。

2)kprobe int3 异常处理过程

完成注册后 kprobe 的准备工作就完成了,一旦内核执行到被探测的指令,也就是注册时被替换成


的 int3 指令时,就会引发一次软件异常。CPU 会根据中断描述符表执行中断处理函数,int3 的中断处
理函数在/linux/arch/i386/kernel/entry.S 中实现,KPROBE_ENTRY(int3)就是该中断处理函
数 的入 口。 汇编 中断 处理 函数 会调 用 do_int3() 函数 ,作 为 int3 中断 处理 的 C 语言 处理 函数 。
do_int3()函数一开始就会去调用 notify_die()函数,该函数的主要作用是调用内核代码注册的异常
的 回 调 函 数 。 在 Kprobes 的 初 始 化 代 码 ( init_Kprobes() 函 数 ) 中 调 用 了
register_die_notifier() 用 于 注 册 异 常 回 调 函 数 。 Kprobes 注 册 的 异 常 回 调 函 数 为
kprobe_exceptions_notify()。

此时执行权交到 Kprobes 之中,kprobe_exception_notify()函数开始执行。该函数的参数中


有一个参数 val,该参数可以用于判断当前回调函数由有什么异常产生的。这里异常由 int3 指令产生,
因 此 接 收 到 的 参 数 应 该 为 “ DIE_INT3” 。 此 时 , 又 会 调 用 kprobe_handler() 函 数 , 该 函 数 是
Kprobes 处理 int3 异常的主要实现函数。该函数首先会把发生异常的地址记录下来,因为该地址就是
注册探测点的地址。为了防止内核被抢占,该函数禁止内核抢占功能。在 i386 CPU 上,进入 int3 中
断处理时已经关闭 CPU 中断,目前 Kprobes 的实现中只有 i386 体系上会关闭 CPU 中断,在其他体系上
的实现都没有这样做。

接 着, 开始 检查 此次 int3 异 常是 否是 由前 一次 Kprobes 处 理流 程引 发的 ,如 果是 由前 一次
Kprobes 处理流程引发,则有两种可能性。第一是该次 Kprobes 处理由于前一次回调函数执行了被探
测代码造成的,第二种可能性是由于 jprobe 造成的,这部分将在 jprobe 的实现一节中详细讨论。如
果 int3 异常不是由前一次 Kprobes 处理流程引发的,根据先前记录下来的探测点地址到哈希表中找到
已注册的 struct kprobe 结构。如果该结构中包含了 pre_handler 函数指针,则执行该预定的函数。

执行完用户定义的 pre_handler 函数时,已经完成了一部分的调试工作。接下来,就开始准备


single-step 步骤,该步骤用 prepare_singlestep()函数完成。这个函数与体系结构相关,下面
是 prepare_singlestep()函数在 i386 体系 CPU 上的主要实现代码:

程序 1  prepare_singlestep()函数部分代码
01 regs->eflags |= TF_MASK;
02 regs->eflags &= ~IF_MASK;
03 regs->eip = (unsigned long)p->ainsn.insn;

上面的代码中设置了 EFLAGS 中的 TF 位并清空 IF 位,同时把异常返回的指令寄存器地址改为保存


oss.linuxpk.com 源 2008 年第 11 期 57
知识学堂
起来的原探测指令处,当异常返回时这些设置就会生效。single-step 技术已经在上文中讨论过,这里
不再赘述。执行完被探测的指令后,由于 CPU 的标志寄存器被置位,此时又会引发一次 CPU 异常,该异
常在 Linux 内核中被称为 DEBUG 异常。

3)Kprobe DEBUG 异常处理

Linux 内核中对 DEBUG 异常的处理方式与处理 int3 异常很类似。DEGUG 异常的中断处理函数也是


在/linux/arch/i386/kernel/entry.S 中实现,KPROBE_ENTRY(debug)就是该异常的中断处理
函数的入口。该函数会调用 do_debug()函数进一步处理 DEBUG 异常,同样的 notify_die()函数被
调用。与 int3 异常不同的是此时传入 notify_die()函数的第一个参数是“DIE_DEBUG”。

最 终 , notify_die() 函 数 会 调 用 Kprobes 初 始 化 时 注 册 的 回 调 函 数
kprobe_exceptions_notify() 。 此 时 , 控 制 权 又 一 次 交 回 Kprobes 。
kprobe_exceptions_notify() 判 断 传 入 的 类 型 为 DIE_DEBUG , 这 时 会 去 调 用
post_kprobe_handler ()函数。post_kprobe_handler ()首先判断用户定义的 post_handler
回调函数是否存在,如果存在则执行之。

之后,会调用 resume_execution()函数做一些会做恢复工作,该函数会把 EFLAGES 寄存器的


TF 为 清 空 , 并 根 据 被 探 测 指 令 类 型 的 不 同 , 做 不 同 的 处 理 。 在 resume_execution() 返 回 后 ,
post_kprobe_handler () 函 数 就 会 启 用 在 int3 异 常 处 理 中 被 禁 止 的 内 核 抢 占 功 能 。 到 这 里 ,
Kprobes 对 DEBUG 异常的处理基本完成了,又把控制权交回内核。

以上是 kprobe 执行的主要流程,可以看出 kprobe 利用了两次 CPU 异常的方式执行了用户定义的


pre_handler 和 post_handler 回调函数。并通过 single-step 技术执行了被探测指令。当一次
kprobe 执 行 周 期 完 成 后 , 又 开 始 等 待 新 一 轮 执 行 周 期 的 到 来 。 只 有 当 调 试 者 卸 载 了 调 试 模 块 后 ,
kprobe 的生命周期才算结束。

jprobe 的实现

相关数据结构与函数分析

1) struct jprobe 结构

该结构在注册 jprobe 探测点时使用,它包含两个成员:

struct kprobe kp;//这是 jprobe 一个内嵌的 struct kprobe 结构成员,因为 jprobe 是基


于 kprobe 实现的。

kprobe_opcode_t *entry;//这是被探测函数的代理函数。

2) setjmp_pre_handler()函数

该函数作为 jprobe 内嵌 kprobe 的 pre_handler,在探测点被触发时首先会被调用到。


oss.linuxpk.com 源 2008 年第 11 期 58
知识学堂
3) longjmp_break_handler()函数

该函数作为 jprobe 内嵌 kprobe 的 break_handler,当再次进入 int3 异常时被调用。

jprobe 处理流程分析

jprobe 是 Kprobes 中实现的另一种调试方式,该调试方式主要为了满足调试内核函数传递的参数


的情况。jprobe 是基于 kprobe 实现的,是 kprobe 调试的一种扩展形式。

jprobe 的基本原理是利用了一个探测代理函数来接收传入参数,做相应处理后再把控制权交回被调
试函数。下图为 jprobe 的执行流程图:

图 3: jprobe 执行流程图

1)jprobe 的注册过程


oss.linuxpk.com 源 2008 年第 11 期 59
知识学堂
由于 jprobe 用于调试传入参数情况,用户在编写 jprobe 探测模块时与编写 kprobe 模块有所不
同。jprobe 结构定义时只要给 entry 成员赋值成调试代理函数,该函数的参数类型必须与被探测函数
完 全 相 同 。 当 一 个 jprobe 探 测 模 块 插 入 内 核 后 , jprobe 的 注 册 过 程 会 被 启 动 。 首 先 , jp-
>kp.pre_handler 会 被 设 置 成 setjmp_pre_handler , jp->kp.break_handler 被 设 置 成
longjmp_break_handler,这两个函数会在以后讨论。之后会调用 kprobe 的注册函数进行探测点的
插入。在之前的章节中已经详细分析了 kprobe 的注册过程,这里不再重复。

2)jprobe 探测点触发过程

与 kprobe 相 同 , 当 内 核 执 行 到 由 jprobe 插 入 的 探 测 点 时 同 样 会 产 生 int3 CPU 异 常 。 在


kprobe 实现一节,已经详细的分析了 kprobe 对 int3 CPU 异常的处理方式。最终 pre_handler 函
数 会 被 调 用 。 在 jprobe 中 , pre_handler 不 是 由 调 试 者 定 义 的 , 而 是 在 注 册 时 被 赋 值 成 了
setjmp_pre_handler 函数。该函数会把异常发生时的堆栈内容保存起来,并且把异常返回时的 EIP
值设为调试代理函数的地址。

经过以上处理,int3 中断返回时就会去执行调试代理函数而不是被探测的函数。代理函数执行完用
户定义操作后必须调用 jprobe_return()函数,目的是为了确保执行流程能回到被探测的函数中。
jprobe_return()函数利用内嵌汇编再次执行 int3 指令,此时又会发生一次 int3 CPU 异常处理。
当异常处理执行到 kprobe_handler()函数进行判断是否有 kprobe 正在运行时,发现目前有 kprobe
正 在 运 行 , 而 此 时 产 生 异 常 的 地 址 并 没 有 被 注 册 过 。 这 种 情 况 下 , struct kprobe 结 构 中 的
break_handler 函数会被调用,也就是在 jprobe 注册阶段注册的 longjmp_break_handler()函
数开始执行。该函数主要作用是把在 setjmp_pre_handler 函数中保存起来的堆栈内容以及寄存器进
行恢复,当异常返回时其环境与 jprobe 探测点异常发生时完全相同。

接着 kprobe_handler()又会准备好单步执行的环境,并单步执行被探测指令,同时产生 Debug
异常。在 kprobe 实现一节已经详细分析了 Debug 异常处理过程。当 Debug 异常返回时也就回到了
jprobe 探测指令的下一条指令的位置继续执行。

通过以上分析可以看出,jprobe 是基于 kprobe 调试方式实现的,jprobe 利用了三次 CPU 异常,


产生的前两次 CPU 异常都是 int3 异常,第三次产生了 Debug 异常。jprobe 主要通过代理函数的方式
来实现传入参数的调试,并利用修改异常返回地址的方式来控制执行的流程。

kretprobe 的实现

相关数据结构与函数分析

1) struct kretprobe 结构

该结构是 kretprobe 实现的基础数据结构,以下是该结构的成员:

struct kprobe kp; //该成员是 kretprobe 内嵌的 struct kprobe 结构。


oss.linuxpk.com 源 2008 年第 11 期 60
知识学堂
kretprobe_handler_t handler;//该成员是调试者定义的回调函数。

int maxactive;//该成员是最多支持的返回地址实例数。

int nmissed;//该成员记录有多少次该函数返回没有被回调函数处理。
struct hlist_head free_instances;

用于链接未使用的返回地址实例,在注册时初始化。

struct hlist_head used_instances;//该成员是正在被使用的返回地址实例链表。

2) struct kretprobe_instance 结构

该结构表示一个返回地址实例。因为函数每次被调用的地方不同,这造成了返回地址不同,因此需
要为每一次发生的调用记录在这样一个结构里面。以下是该结构的成员:
struct hlist_node uflist;

该成员被链接入 kretprobe 的 used_instances 或是 free_instances 链表。

struct kretprobe *rp;//该成员指向所属的 kretprobe 结构。

kprobe_opcode_t *ret_addr;//该成员用于记录被探测函数正真的返回地址。

struct task_struct *task;//该成员记录当时运行的进程。

3) pre_handler_kretprobe()函数

该函数在 kretprobe 探测点被执行到后,用于修改被探测函数的返回地址。

4) trampoline_handler()函数

该函数用于执行调试者定义的回调函数以及把被探测函数的返回地址修改回原来的返回地址。

kretprobe 处理流程分析

kretprobe 探测方式是基于 kprobe 实现的又一种内核探测方式,该探测方式主要用于在函数返回


时进行探测,获得内核函数的返回值,还可以用于计算函数执行时间等方面。


oss.linuxpk.com 源 2008 年第 11 期 61
知识学堂

图 4: kretprobe 执行流程图

1) kretprobe 的注册过程

调 试 者 要 进 行 kretprobe 调 试 首 先 要 注 册 处 理 , 这 需 要 在 调 试 模 块 中 调 用
register_kretprobe() , 下 文 中 称 该 函 数 为 kretprobe 注 册 器 。 kretprobe 注 册 器 对 传 入 的
kretprobe 结构的中 kprobe.pre_handler 赋值为 pre_handler_kretprobe()函数,用于在探测
点被触发时被调用。接着,kretprobe 注册器还会初始化 kretprobe 的一些成员,比如分配返回地址
实例的空间等操作。最后,kretprobe 注册器会利用 kretprobe 内嵌的 struct kprobe 结构进行
kropbe 的注册。自此,kretprobe 注册过程就完成了。

2) kretprobe 探测点的触发过程

kretprobe 触发是在刚进入被探测函数的第一条汇编指令时发生的,因为 kretprobe 注册时把该


地址修改位 int3 指令。

此时发生了一次 CPU 异常处理,这与 kprobe 探测点被触发相同。但与 kprobe 处理不同的是,这


里并不是运行用户定义的 pre_handler 函数,而是执行 pre_handler_kretprobe()函数,该函数
又会调用 arch_prepare_kretprobe()函数。arch_prepare_kretprobe()函数的主要功能是把
被探测函数的返回地址变换为&kretprobe_trampoline 所在的地址,这是一个汇编地址标签。这个标
签 的 地 址 在 kretprobe_trampoline_holder() 中 用 汇 编 伪 指 令 定 义 。 替 换 函 数 返 回 地 址 是


oss.linuxpk.com 源 2008 年第 11 期 62
知识学堂
kretprobe 实现的关键。当被探测函数返回时,返回到&kretprobe_trampoline 地址处开始运行。

接着,在一些保护现场的处理后,又去调用 trampoline_handler()函数。该函数的主要有两个
作用,一是根据当前的实例去运行用户定义的调试函数,也就是 kretprobe 结构中的 handler 所指向
的函数,二是把返回值设成被探测函数正真的返回地址。最后,在进行一些堆栈的处理后,被探测函数
又返回到了正常执行流程中去。

以上讨论的就是 kretprobe 的执行过程,可以看出,该调试方式的关键点在于修改被探测函数的返


回地址到 kprobes 的控制流程中,之后再把返回地址修改到原来的返回地址并使得该函数继续正常执行。

结束语

Kprobes 内核调试技术的优势是显而易见的:调试者可以通过 Kprobes 提供的简单接口对 Kprobes 探测点进


行注册,通过编写回调函数就可以实现调试,使用起来非常简便。利用 Kprobes 调试时,可以以内核模块的形
式编 写调 试代 码。 这样 做可 以在 不重新编 译内 核的情况下实现内 核调 试,大大提高了调试的 效率。目前
Kprobes 提供了三种调试手段:kprobe,jprobe,kretprobe,这三种手段可以满足不同的调试目的。同时,
Kprobes 支持除了与 Kprobes 实现相关代码外的任意内核代码的调试,能满足大多数调试需要。Kprobes 的
分为体系结构无关和体系结构相关两部分代码实现,这样做增加了 Kprobes 的可扩展性。虽然优势明显,但
Kprobes 还是存在一些不足。比如,Kprobes 虽然提供了丰富的调试手段,但调试者无法对插入的调试模块有
效的控制和管理。另外,Kprobes 是一个汇编级的调试技术,只能对寄存器以及内存地址级别进行调试,目前
还无法对内核函数中的局部变量等,也就是源码级别进行有效的调试。目前 Kprobes 还不能支持所有的 CPU 架
构。这些不足在一定程度上限制了 Kprobes 的使用。


oss.linuxpk.com 源 2008 年第 11 期 63
知识学堂

Slackware Linux 与创始人 Patrick Volkerding


李洋

从 Slackware Linux 1.0 版发布到现在已经有十年的时间了。而事实上,这个项目的部分开发最早可追溯


到 1992 年。因此,Slackeware 可谓是目前市场存活时间最长的 Linux 发行版之一。Slackware 是创始人
Patrick Volkerding 主持设计,并发行的一个高级 Linux 操作系统版本,以易用和稳定为设计宗旨,其原
形基于一个称作 SLS(Soft Landing Systems)的 Linux 项目。
Patrick Volkerding 1993 年毕业于美国明尼苏达州的 Moorhead 大学计算机专业。Slackware 获得成功
时,年仅 27 岁。作为 Slackware 项目的创始人,他多年来为该项目倾注了大量的心血,因此在
Slackware 社区及使用者中树立了很高的威信。直到现在,在有关 Slackware 的论坛中,仍可以看到很多
崇拜他的言语,他们甚至把他称作“英雄”。

一、计算机情结


oss.linuxpk.com 源 2008 年第 11 期 64
知识学堂
Patrick Volkerding 初次接触计算机是在 1973 年。当时他还是个小孩子,有次与同学一起参观
North Dakota 州立大学的计算机系。来到机房,那里存放的机器令他震惊了—许多闪着指示灯快速运
转着的“大家伙”塞满了整间屋子,并存放着成排的大型磁盘驱动器。管理员还向他们展示了如何操作
一台带有打字机的终端。这些使他一下就迷上了计算机。

但是在那时,Volkerding 没有任何途径能获得一台家用计算机,甚至都不敢想象会有这种事情。
因此,他开始对电子学产生了兴趣,因为它显得更实际。过了几年,第一批个人计算机开始陆续出现,
如 TRS-80、苹果Ⅱ和 Atari 400/800 等。Volkerding 就跑到出售这些计算机的商店里打工,但是
他仍旧买不起计算机。幸运的是,有位商店的老板允许他使用他们的机器。从此, Volkerding 开始自
学 BASIC,并时不时地为商店编写一些小演示程序,以期能够继续留在那里。

1980 年,Volkerding 终于获得了一台当时十分热门的苹果Ⅱ计算机。这台机器他使用了很长时间 ,


还在这台机器上安装了 C 编译器和类 Unix 的操作系统,但后者与 Linux 还不太搭边。

二、接触 Linux
1992 年末,Volkerding 从一位朋友那里听说了 Linux,但当时并没有立即下载试用。直到有一
天,学校的一个项目需要一个 LISP 解释器,他才突然记起有人曾提过的 Linux 上面有类似的东西。因
此,他下载了一个 SLS Linux(最早的商业 Linux 发行版之一)。

Volkerding 开始并没有想过要去搞一个 Linux 发行版。人工智能学教授让 Volkerding 给他展


示如何安装 Linux,以便于他可以在家里的机器上使用,并与一些已毕业的在 LISP 上很有研究的学生
分享使用心得。因此,Volkerding 和他的教授一起去 PC 实验室安装 SLS Linux。


oss.linuxpk.com 源 2008 年第 11 期 65
知识学堂
三、项目悄然诞生
在接触了 SLS Linux 几周以后,Volkerding 发现安装后的这个操作系统有很多地方需要修改,
多到不得不列上一个长单子来进行记录。Volkerding 自己动手基本修改了单子上所列的问题,并为其
编写了一些基本的软件。他的教授询问道:“有没有办法把它原先安装盘上的程序修改一下?这样每次
安装新机器的时候就不必那么费事了。”这一语惊醒梦中人,也促成了 Slackware 项目的开始。
Volkerding 开始修改部分 SLS 的原始安装脚本及一些漏洞,并增添了新的功能,使得系统可以自动安
装共享库和内核映像等软件包。此外,他还编辑了一些描述文件,使得介绍安装的内容更加详实。更重
要的一点是,Volkerding 深入到那些软件包中,把能够找到的问题都修改了一遍。大部分软件包都能
够良好运行,但仍旧有一些需要改动。在邮件、网络和 UUCP 等应用程序中有大量不正确的文件许可现象,
使这些软件无法正常发挥应有的功能。还有一些程序可能会引起内核阻塞,但系统却没做任何说明。对
于这些,Volkerding 都到网上重新查找并整理了源代码。

当时的 SLS 版本使用的 Linux 内核是 0.98pl4,Volkerding 把改进的版本与 0.99pl9 内核整合


在一起。此时,他已经对这个发行版中将近一半的软件包进行了改进,并对剩余的一半进行了重新确认
针对一些长期存在的问题,Volkerding 还编写了一些代码来解决它们。所以,Slackware 之于 SLS,
不仅仅是装饰的关系。

四、获得认可
1993 年 5 月,Volkerding 把 4.4.1 C 语言库和 Linux 0.99pl11A 内核同 Slackware 整合起
来,使网络功能和系统稳定性方面得到了显著的改善。 Volkerding 的几个密西根州立大学(MSU)的
朋友认为它很棒,强烈要求把它放到 FTP 上。但是,当时 Volkerding 认为 SLS 很快就会推出新的版本,
说不定也会做类似的改善工作,因此迟疑了几个星期。在这期间,他不断地看到许多人在网上询问什么
时候会有一个功能较完善的 Linux 新版本推出。因此,他在网上发出了一个帖子,标题是“有人需要类
似 SLS 的 0.99pl11A 内核的操作系统吗”。不久便得到了无数个回复的帖子。

因此,在征得了密西根州立大学系统管理员的同意后,Volkerding 在大学一台十分老旧的计算机
上搭建了一个可匿名登录的 FTP 服务,并为此做了一份声明。此后,该 FTP 不断获得很多人提供的新镜
像点,还有许多使用过 Slackware 1.0 的用户在网上为它做积极的宣传。很快,FTP 存储空间的问题
也得到了解决—有人联系了 Walnut Creek CDROM 公司,为其提供了存储空间。

这之后,Slackware 的开发队伍开始壮大,一些人帮助了该项目的编写。其中, Savio Lam 负责


编写了创建彩色选单安装界面的会话程序; Ian kluft 整合了 smail 软件包;Vince Shankan 的配
置脚本集合对 elm 和 UUCP 等程序的编译十分有帮助;Louis Labash 贡献了一套工具,用来编译
Perl 脚 本 ; Allen Gwinn 编 写 了 一 个 lpd 软 件 包 。 此 外 , 反 馈 自 使 用 者 的 错 误 报 告 也 帮 助


oss.linuxpk.com 源 2008 年第 11 期 66
知识学堂
Slackware 不断改进。所有这些更加激励了 Volkerding 继续做好 Slackware 项目的决心。

1994 年,Morse 电信公司的 Michael Johnston 主动联系 Volkerding,问他是否有兴趣发行


Slackware 的商业版本。这使他意识到只有这样才能让 Slackware 项目继续走下去,因此接受了合作
的邀请。6 个月后,Volkerding 又为 Slackware 找到了一个合作条件更优惠的合作伙伴—Walnut
Creek 公司。至此,Slackware 开始逐步走上了正轨。

五、重要的贡献者
对于 Slackware Linux,除了 Patrick Volkerding 外,还有几位重要的开发人员,见图 2。

David Cantrell 的全职工作是开发和维护 Slackware Linux,主要负责处理 SPARC 端口、用


邮件进行技术支持、测试及新软件包的开发工作。此外,他还为系统管理员编写了 autoslack 和
protopkg 两个实用的工具。他的个人网站地址是 http://www.burdell.org。

Logan Johnson 肄业于美国乔治亚州科技大学,钟爱音乐和 Linux。他主要负责图形方面的功能


处理,并在组织网站设计及内容维护队伍方面做了大量工作。

Chris Lumens 是最近才真正全职加入到 Slackware 工作中来的。他处理 Slackware Alpha 端


口,并编写了一本《精通 Slackware Linux》的指导性书籍。他有时还使用 PHP 和 MySQL 做一些开发
工作。他真正喜欢的是 Perl,并十分热衷于学一些被人认为是神秘古怪的语言。他的个人主页是
http://bangmoney.org。

六、挑战与机遇并存
10 年的时间或许并不长。但是相对于计算机及 Linux 短暂的历史,10 年的时间可以改变很多事情。
鼎盛与辉煌是那样令人陶醉,但挫折始终是不可避免的。幸运的是,机遇总会与挑战并存。

七、版本回顾
老牌 Linux 用户都记得从前的 Slackware 1.0 是放在 24 张软盘上的,其中 13 张是精髓部分,其
余 11 张包含了 XFree86 和图形应用程序。当时使用的 Linux 内核是 0.99pl11 alpha。一切显得那
么简陋(与现在相比),但是却足以给当时的 Linux 用户带来惊喜。Slackware 1.0 的推出获得了认
可。很快,那一年的 5 个月中又有 6 个新的 Slackware 版本推出。正式的 Slackware Linux 2.0 是
1994 年 7 月面世的。用户可在稳定 Linux 内核 1.0.9 和开发内核 1.1.18 之间进行选择。它还包含了
XFree86 2.1.1。这时,Patrick Volkerding 把 Slackware 发行版带到一个商业层面,与 Morse
电信公司合作,策划将产品刻录在可启动光盘上,并随之发行印刷版文档说明书。这一年, V


oss.linuxpk.com 源 2008 年第 11 期 67
知识学堂
olekerding 刚满 27 岁。

随着 Slackware 进一步得到用户的好评,1995 年 8 月,Slackware Linux 3.0 面世。这之后,


其版本的发行频率趋于减缓。Slackware 4.0 的发布用了 4 年的时间。然而这一趋势并没有延续,5 个
月后,新的 Slackware 发行版再次面世。但是令许多人惊讶的是,这个版本是以 Slackware 7.0 的
名称出现的。Volkerding 对此及时做出了解释:因为那时 Linux 发行版开始逐渐增多,市场竞争激烈
起来,版本号也日益膨胀。为了避免更多用户对产品升级的一再询问,Slackware 将其新产品的版本号
跳至 7.0。在接下来的几年里,Slackware 的版本发放趋于平和,大约每年发布一个版本。 1996 年到
1999 年间,Slackware 达到了其鼎盛时期。

八、挫折
网络泡沫的破灭影响了整个 IT 业,Slackware 的运作形式也受到了冲击。Slackware 原来的主要
发行商 Walnut Creek 公司与 BSDi 合并,之后又被 WindRiver 公司购并。2001 年,该公司称将不再
给予 Slackware 开发进行支持。

受到这个事件的影响,Volekerding 开始着手建立一个公司,以便自己处理发行工作。但是不幸的
是,受当时大环境的影响,Patrick Volkerding 面临破产,虽然可以依靠将现有产品出售给捐赠者
过活,但他还是一度出现没钱支付给合作伙伴的窘境。

九、转机


oss.linuxpk.com 源 2008 年第 11 期 68
知识学堂
幸运的是,事情出现了转机。Patrick Volkerding 与前 Walnut Creek 公司的创始人之一 Bob
Bruce 再度合作,成立了一个公司进行产品的销售。Slackware 通过改变商业模式获得了一笔可观的收
入。

但由于这场变故,Slackware 在市场的占有率也受到了影响(1996 年其发行版市场占有率曾经达


到 90%)。尽管如此,Slackware 在受欢迎程度及服务器开发方面仍旧保持在前五名之列。它的邮件列
表(现在变成了一个在线的用户论坛 userlocal.com)积累下 17 万次的邮件,拥护 Slackware 的网
络社区数量能够与以此著称的 Debian 相媲美。这些都表明,Slackware 仍旧保持着强大的动力。但同
时也告诉我们,市场总是选择优胜者,不管资历如何,始终都要通过其考验。


oss.linuxpk.com 源 2008 年第 11 期 69
经验技巧

Linux 一句话精彩问答
——网络相关篇(1)
陈绪
《Linux 一句话精彩问答》是 Linux 初学者很好的入门文档,想必很多朋友当时都是边看该文档,边敲打
键盘,玩着 Linux 过来的。
该文档由本刊顾问陈绪主编,迄今已经收录近千个精彩问答。从本期开始将在桌面应用栏目进行连载,
希望能帮助到更多刚接触到 Linux 的朋友们。

十、2001 让 apache 的默认字符集变为中文


vi httpd.conf,找到 AddDefaultCharset ISO-8859-1 一行

apache 版本如果是 1.*,改为 AddDefaultCharset GB2312

如果是 2.0.1-2.0.52,改为 AddDefaultCharset off

然后运行/etc/init.d/httpd restart 重启 apache 即可生效。

注意:对于 2.0.53 以上版本,不需要修改任何配置,即可支持中文

十一、2002 永久更改 ip
编 辑 /etc/sysconfig/network-scripts/ifcfg-eth0 文 件 , 修 改 ip , 然 后 执 行 ifdown
eth0; ifup eth0

十二、2003 从 Linux 上远程显示 Windows 桌面


安装 rdesktop 包

十三、2004 手动添加默认网关
以 root 用户,执行: route add default gw 网关的 IP

想更改网关

1 vi /etc/sysconfig/network-scripts/ifcfg-eth0


oss.linuxpk.com 2008 年第 11 期 70

经验技巧
更改 GATEWAY
2 /etc/init.d/network restart

十四、2005 redhat 8.0 上 msn 和 qq


下载 Gaim 0.58 版:
gaim-0.58-2.i386.rpm

下载 QQ 插件 for gcc2.9 版:
libqq-0.0.3-ft-0.58-gcc296.so.gz

将下载的文件放入/temp 目录,然后将系统中已有的 Gaim 删除,即在终端仿真器中键入命令:rpm


-e gaim。

开始安装

打开终端仿真器,继续执行下列命令安装 Gaim 0.58 版,即:

cd /temp         (进入 temp 目录)

rpm -ivh gaim-0.58-2.i386.rpm (安装软件)

当安装成功后,你就可以在 GNOME 或 KDE 桌面建立 Gaim 图标了。

继续安装 QQ 插件,即键入命令:

gunzip libqq-0.0.3-ft-0.58-gcc296.so.gz (解压缩文件)

cp libqq-0.0.3-ft-0.58-gcc296.so /usr/lib/gaim (复制插件到 gaim 库目录中)

软件设置

首次启动 Gaim 0.85 版时,会出现的登录界面。先选择“插件”,在插件对话框中点击“加载”,


分别将 libmsn.so 和 libqq-0.0.3-ft-0.58- gcc296.so 文件装入,确认后关闭。然后再选择“
所有帐号”,在出现的帐号编辑器中继续点击“增加”,当出现的修改帐号页面时,我们就可以输入自
己的 QQ 或 MSN 号了,登录名填写 QQ 号码或 MSN 邮箱,密码填写对应的 QQ 或 MSN 密码,Alias 填写自
己的昵称,协议选择相应的 QQ 或 MSN,其他的设置按默认的即可。当全部设置完成后就可以登录使用了。

Fedora core 5 中的 gaim,缺省对 msn 就可以支持,加上 gaim 的 qq 插件,即可支持 qq

十五、2006 查出 22 端口现在运行什么程序


oss.linuxpk.com 2008 年第 11 期 71

经验技巧
lsof -i :22

十六、2007 查看本机的 IP,gateway,dns


IP:以 root 用户登录,执行 ifconfig。其中 eth0 是第一块网卡,lo 是默认的设备

Gateway:以 root 用户登录,执行 netstat -rn,以 0.0.0.0 开头的一行的 Gateway 为默认


网关

也可以查看/etc/sysconfig/network 文件,里面有指定的地址

DNS:more /etc/resolv.conf,内容指定如下:
nameserver 202.96.69.38
nameserver 202.96.64.38

十七、2008 RH8.0 命令行下改变 ping 的 TTL 值


方法 1(重启后有效):

#sysctl -w net.ipv4.ip_default_ttl=N

(N=0~255),若 N>255,则 ttl=0

方法 2(重启后无效):

#echo N(N 为 0~255) > /proc/sys/net/ipv4/ip_default_ttl

十八、2009 开启 LINUX 的 IP 转发
编辑/etc/sysctl.conf, 例如,将
net.ipv4.ip_forward = 0

变为
net.ipv4.ip_forward = 1

重启后生效,用 sysctl -a 查看可知

十九、2010 mount 局域网上其他 windows 机器共享出的目录


mount -t smbfs -o username=guest,password=guest //machine/path /mnt/cdrom


oss.linuxpk.com 2008 年第 11 期 72

经验技巧
二十、2011 允许|禁止 root 通过 SSH 登陆
修改 sshd_configermitRootLogin no|yes

二十一、2012 让 root 直接 telnet 登陆


方法 1:

编辑/etc/pam.d/login,去掉

auth required /lib/security/pam_securetty.so 这句话

方法 2:
vi /etc/securetty

添加
pts/0
pts/1
...

二十二、2013 在 linux 接 adsl 设备


需要一个运转正常的 Linux + 至少一块网卡 + 宽带设备已经申请完毕,同时已经开通。目前市场
上大概有几种 ADSL 设备,他们工作的方式有一些细微的差别。

就是通过虚拟拨号来完成上网的这一过程,也就是利用 pppoe 设备来进行虚拟拨号的叫作全向猫,


就是一种加电后自动的进行拨号的工作,然后留给我们的接口是 RJ45,大连地区一般留给我们的网关都
是 10.0.0.2,这种设备最容易对付,最后是直接分配给用户一个固定的 IP,相对大家来说也比较容易
对付

1.第一种需要进行拨号:

这几种设备都是通过 eth 接口与计算机进行通讯的,所以先将硬件设备的连接作好,尤其是宽带猫


的,一定要确认无误(否则一会儿要不去可不算我的事情)

然后启动系统,确认系统上是否安装 rp-pppoe 这个软件(通过 rpm -qa|grep pppoe 来查找),


如没有安装的用户,在光盘里或是到网上去 down 一个来,安装上后,以 root 用户执行 adsl-setup,
这样就进入了 adsl 的资料的设定状态,要求输入申请宽带的用户名以及其他一些信息,确认没有问题,
接受直至最后(里面都是 E 文,但是一看即能懂,比较简单,有关一个防火墙的设置,我一般都不用,
选 0,大家可以具体考虑)。


oss.linuxpk.com 2008 年第 11 期 73

经验技巧
配置完成后,以 root 用户执行 adsl-start,这样将进行 adsl 的拨号工作,正常就会一下上线,
如有什么具体问题,去看一下日志(/var/log/messages)里面告诉你什么了。

停掉 adsl,执行 adsl-stop 就可以了(很简单的)

2.另外两种比较容易对付:

全 向 猫 : 只 要 将 你 的 网 卡 的 IP 设 置 成 一 个 10 网 段 的 IP , 然 后 网 关 指 到 全 向 猫 的 IP , 上
(10.0.0.2),基本上不有太大的问题

固定 IP:就像配置本地的网卡一样,将 IP,网关,DNS 都按申请来的填写上就可以搞定了

二十三、2014 让 linux 自动同步时间


vi /etc/crontab

加上一句:
00 0 1 * * root rdate -s time.nist.gov

二十四、2015 linux 的网上资源有哪些


国外

http://lwn.net/
http://www.tldp.org/
http://www.linuxquestions.org/
http://www-106.ibm.com/developerworks/linux/

国内

http://www.linuxpk.com/
http://www.fanqiang.com/
http://www.linuxsir.org/
http://www.chinaunix.net/
http://www.linuxfans.org/(deadcat)
http://www.linuxeden.com/
http://www.linuxforum.net/
http://freesoft.online.sh.cn/
http://www-900.ibm.com/developerWorks/cn/linux/index.shtml


oss.linuxpk.com 2008 年第 11 期 74

经验技巧
二十五、2016 改变 sshd 的端口
在/etc/ssh/sshd_config 中加入一行:Port 2222,/etc/init.d/sshd restart 重启守
护进程

二十六、2017 改变 telnet 的端口


将/etc/services 文件中 telnet 对应的端口号 21 改为你想要的值,/etc/init.d/xinetd
restart 重启守护进程

二十七、2018 终端模式有问题
export TERM=vt100

二十八、2019 模仿超级终端,LINUX 里什么程序连接路由器和交


换机
minicom

二十九、2020 ssh 上来能不能不自动断线


修改自己 HOME 目录下的.bash_profile 文件,加上

export TMOUT=1000000 (以秒为单位)

然后运行 source .bash_profile

虚拟机应用入门——初识 VirtualBox
ghosTM55
在我们学习 Linux 的过程中,如果需要对一个发行版本进行安装实验并进行使用体验,或者是工作
离不开 Windows,想在使用 Linux 的同时使用 Windows,这时该怎么办呢?使用虚拟机就成了最好的选
择。新手可以用虚拟机来一探究竟,资深用户则可以用它来进行各种带有危险性的实验。

究竟什么是虚拟机呢?虚拟技术(Virtualization)是目前最热门的技术之一,通过虚拟机软件,


oss.linuxpk.com 2008 年第 11 期 75

经验技巧
用户能够在当前操作系统下创建一台“新”的计算机,这台计算机就称为虚拟机(Virtual Machine)
。用户可以在虚拟机上对硬盘进行分区、格式化操作,然后安装使用一个或多个操作系统。虚拟机拥有
自己的硬件信息,硬盘空间,内存空间以及一切真实电脑拥有的参数。

虚拟机就好比一台新的计算机,它主要是各种危险实验的试验场所。同时虚拟机也可以让用户熟悉
尚未接触但有兴趣尝试的操作系统。在学习 Linux 的一开始,如果担心安装过程会造成硬盘重要数据的
丢失,那么利用虚拟机先进行安装以及使用体验是非常好的一个方法。

自由软件中不乏优秀的虚拟机软件,VirtualBox 就是其中的代表。VirtualBox 的开源版本叫做


VirtualBox OSE,OSE 就是 OpenSource Edition 的简写。VirtualBox 性能优异,已经成为了开
源社区中口碑最好的虚拟机软件之一。本文就将使用 VirtualBox 对虚拟机的使用进行讲解。

从 VirtualBox 的官方网站 http://www.virtualbox.org 或者各发行版本的软件源(大多数都


有)中下载对应的虚拟机软件安装程序后,就可以开始在系统上安装 VirtualBox 了。VirtualBox 这
个虚拟机软件并不大,所以很快就能完成安装。安装完成后,运行 VirtualBox。

图 1:


oss.linuxpk.com 2008 年第 11 期 76

经验技巧
从图 1 中可以看到 VirtualBox 程序的主界面,左边的列表所列出的是当前用户所设置完成的虚拟
机并显示其运行状态,点选指定的虚拟机会在右边给出该虚拟机的详细设置参数。

现在开始创建我们的第一个虚拟机,大多数虚拟机的创建都会有以下四个要素,它们分别是:内存
的分配,虚拟硬盘的大小,光驱的设置以及网络的设置。

按“New”创建一个新的虚拟机:

图2

这里是欢迎信息,按“Next”进入下一步:


oss.linuxpk.com 2008 年第 11 期 77

经验技巧

图3

这里需要输入你的虚拟机名以及你的操作系统类型,根据自己的需要输入选择完成后进入下一步:

图4

接着,我们需要为新建立的虚拟机分配内存,注意,为虚拟机分配的内存最好不要超过实际内存的
3/4 大小。


oss.linuxpk.com 2008 年第 11 期 78

经验技巧

图5

在完成了虚拟机的内存设置后,就需要为虚拟机创建虚拟硬盘文件了,用户可以选择使用已创建了
的硬盘文件,这里我们选择“New...”来创建新的硬盘文件:

图6

硬盘文件主要有动态可扩展镜像文件与固态镜像文件两种,前者可以根据用户的使用情况自动扩展
硬盘文件的大小直至上限,目前较为常用。选择适合自己的硬盘文件类型后,进入下一步:


oss.linuxpk.com 2008 年第 11 期 79

经验技巧

图7

在这一步中,输入虚拟硬盘文件的文件名,并且设置其大小,然后就能完成虚拟硬盘的设置了。一
路“Next”至“Finnish”,便能完成虚拟机的创建了:


oss.linuxpk.com 2008 年第 11 期 80

经验技巧

图8

可以看到,刚刚创建的虚拟机已经出现在了虚拟机列表中,在启动新的虚拟机之前,还要对其进行
“Settings”,设置一些参数:


oss.linuxpk.com 2008 年第 11 期 81

经验技巧

图9

进入虚拟机的设置界面后,我们发现,在创建虚拟机时设置的绝大多数参数都能进行重新调整。在
这里,我们主要对 CD/DVD ROM 与 Network 选项进行设置:


oss.linuxpk.com 2008 年第 11 期 82

经验技巧

图 10

首先进行的是虚拟机的光驱设置,用户可以选择两种方式来挂载光盘,一种是直接让虚拟机读取光
驱,另一种则是挂载光盘镜像文件,在这里,笔者选择的是直接挂载从网上下载的 iso 镜像文件。


oss.linuxpk.com 2008 年第 11 期 83

经验技巧

图 11

虚 拟 机 的 网 络 连 接 方 式 设 置 也 至 关 重 要 , 在 VirtualBox 中 , 用 户 可 以 选 择 NAT 、 Host


Interface 与 Internal Network 三种连接方式来进行虚拟机的网络连接,这里我们选择 NAT 的连接
方式。

好了,至此,虚拟机的设置已经基本完成了,赶快“Start”,让虚拟机开机,看看效果吧:


oss.linuxpk.com 2008 年第 11 期 84

经验技巧

图 12

开机后,一切就可以像在使用真实的一台计算机一样,进行各种操作。

超真实的虚拟体验之无缝连接模式!

在 VirtualBox 的虚拟机中使用 Windows 操作系统的话还能体验一个非常 Cool 的功能称为无缝连


接(Seamless Mode),废话不用多说,直接看其效果图:


oss.linuxpk.com 2008 年第 11 期 85

经验技巧

图 13

可以看到,Windows 下的程序窗口完美的融合到了 Linux 的桌面环境下,要做到这点很简单,只需


要选择虚拟机窗口菜单栏中的 Devices,然后选择最后一项 Install Guest Additions:

图 14


oss.linuxpk.com 2008 年第 11 期 86

经验技巧
之后 VirtualBox 会自动下载一个安装文件并开始在 Windows 中执行安装程序,安装完成后重启,
就能使用 Host+L 快捷键来切换无缝连接模式了,将窗口“拖出来”用。

至此,VirtualBox 的基本使用方式已经介绍完毕,笔者仍然保留了许多 VirtualBox 的特性与功


能没有提到,等待着读者自行去挖掘探索,然后感叹该开源虚拟机软件的易用与强大之处。

rhythmbox——享受听觉盛宴
ghosTM55
当人们讨论到 Linux 下的音乐播放器时,绝大多数朋友会首先想到 amarok,的确,amarok 是
Linux 操作系统下最强大的播放器之一,但它是基于 QT 库的。在 GNOME 这样基于 gtk 库的桌面环境下,
也有着非常优秀的播放器,就是笔者今天要介绍的 rhythmbox。

rhythmbox 是 GNOME 项 目 下 的 一 个 子 项 目 , 其 官 方 网 站 是 http://www.gnome.org/pro-


jects/rhythmbox。rhythmbox 是基于 GStreamer 多媒体架构的一款强大的音乐播放管理程序。它
的界面设计灵感来源于苹果的 iTunes,有着许多强大的特性,包括了音乐库、搜索、排序、网络收音机、
播放列表、显示专辑信息与歌词信息、CD 曲目抓轨与烧录功能等。现在我们就来看看 rhythmbox 的主
界面:

图1

从图 1 中可以看到笔者 rhythmbox 的音乐库中有超过 1000 首乐曲,并且有着整理得井井有条的歌


曲信息。 rhythmbox 的界面与 iTunes 相仿,极其友好,不需要过多的说明,用户就能开始使用


oss.linuxpk.com 2008 年第 11 期 87

经验技巧
rhythmbox 来欣赏自己所喜爱的音乐了。从左边的边栏总可以看到 rhythmbox 下的音乐库、在线商店、
网络广播、用户建立的播放列表等。

rhythmbox 界面上边栏就是常用的音乐播放控制按钮,这些都非常好理解,与普通的播放器并无多
大差异。在本文中笔者所主要展示的是如何在 rhythmbox 下导入音乐库、修改曲目信息以及 CD 曲目抓
轨。是的,很简单,现在开始。

一、导入音乐库:

图2

音乐库即是用户指定的一个文件夹,由 rhythmbox 进行监控,每当有新的音乐文件被加入或者旧的


音乐文件被移出,将自动更新播放器音乐列表的信息。要对 rhythmbox 的音乐库进行设置,只需进入
“ Edit”菜 单栏 进入 “ Preference” 选项 ,在 “ Music” 的标 签选 项中 ,有 “ Music files are
located in” 的 文 件 夹 选 择 。 对 了 , 这 里 就 是 你 的 “ Library Location” , 设 置 完 成 后 ,
rhythmbox 将自动导入该文件夹下的所有音乐文件至总播放列表里。

在 rhythmbox 中,用户可以方便地通过快捷键“Ctrl+N”来创建自己的播放列表,然后在音乐库
中选中指定任意多个想要添加至播放列表的曲目,右键单击,选择“Add to playlist ...”即可。


oss.linuxpk.com 2008 年第 11 期 88

经验技巧
二、修改曲目信息:
有时,我们从互联网上下载下来的 MP3 歌曲的曲目信息不正确或者是乱码,这个时候就需要用户自
己去修改曲目信息。右键单击任意一首曲目,选择“Properties”可以变更其曲目信息:

图3

从图 3 中可以看到,用户可以针对一首曲目的曲名、艺人、专辑、发布年份等进行任意的调整。如
果我们需要批量对多个曲目进行某一个信息进行集体调整,则可以多选指定的曲目(使用 Ctrl 或 Shift
快捷键配合),然后调整其信息。

三、CD 曲目抓轨与烧录:
当用户将一张 CD 专辑插入光驱后,rhythmbox 会自动从网络上搜索到专辑的信息(当然,如果是乱
码或者是不正确的信息,就需要用户自己去搜索专辑信息并进行修改了),提供给用户将 CD 抓轨成 MP3
格式保存在本地:


oss.linuxpk.com 2008 年第 11 期 89

经验技巧

图4

从图 4 中可以看到,状态栏会显示当前抓轨的进度,抓轨完成后,就可以在用户的音乐库文件夹中
找到对应的音乐文件了:

图5


oss.linuxpk.com 2008 年第 11 期 90

经验技巧
至此,rhythmbox 几个基础的使用特性已经介绍完成,与虚拟机的应用入门一文一样的是,笔者仍
然保留了许多该软件的功能没有介绍,期待着读者们自己去挖掘探索,Have Fun!!!

mysqldump 的几个主要选项探究
MySQL 中文网
叶金荣
本文主要探讨 mysqldump 的几种主要工作方式,并且比较一下和 mk-parralel-dump 的一些差
异,为备份方式的选择提供更多的帮助。

1、mysqldump

首先来看下 mysqldump 的几个主要参数的实际工作方式。

mysqldump 几个主要选项
1). -q

很简单,什么都不做,只是导出时加了一个 SQL_NO_CACHE 来确保不会读取缓存里的数据。


081022 17:39:33 7 Connect root@localhost on
7 Query /*!40100 SET @@SQL_MODE='' */
7 Init DB yejr
7 Query SHOW TABLES LIKE 'yejr'
7 Query LOCK TABLES `yejr` READ /*!32311 LOCAL */
7 Query SET OPTION SQL_QUOTE_SHOW_CREATE=1
7 Query show create table `yejr`
7 Query show fields from `yejr`
7 Query show table status like 'yejr'
7 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `yejr`
7 Query UNLOCK TABLES
7 Quit
2). --lock-tables

跟上面类似,不过多加了一个 READ LOCAL LOCK,该锁不会阻止读,也不会阻止新的数据插入。


081022 17:36:21 5 Connect root@localhost on
5 Query /*!40100 SET @@SQL_MODE='' */
5 Init DB yejr


oss.linuxpk.com 2008 年第 11 期 91

经验技巧
5 Query SHOW TABLES LIKE 'yejr'
5 Query LOCK TABLES `yejr` READ /*!32311 LOCAL */
5 Query SET OPTION SQL_QUOTE_SHOW_CREATE=1
5 Query show create table `yejr`
5 Query show fields from `yejr`
5 Query show table status like 'yejr'
5 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `yejr`
5 Query UNLOCK TABLES
5 Quit
3). --lock-all-tables

这个就有点不太一样了,它请求发起一个全局的读锁,会阻止对所有表的写入操作,以此来确保数
据的一致性。备份完成后,该会话断开,会自动解锁。
081022 17:36:55 6 Connect root@localhost on
6 Query /*!40100 SET @@SQL_MODE='' */
6 Query FLUSH TABLES
6 Query FLUSH TABLES WITH READ LOCK
6 Init DB yejr
6 Query SHOW TABLES LIKE 'yejr'
6 Query SET OPTION SQL_QUOTE_SHOW_CREATE=1
6 Query show create table `yejr`
6 Query show fields from `yejr`
6 Query show table status like 'yejr'
6 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `yejr`
6 Quit
4). --master-data

除了和刚才的 --lock-all-tables 多了个 SHOW MASTER STATUS 之外,没有别的变化。


081022 17:59:02 1 Connect root@localhost on
1 Query /*!40100 SET @@SQL_MODE='' */
1 Query FLUSH TABLES
1 Query FLUSH TABLES WITH READ LOCK
1 Query SHOW MASTER STATUS
1 Init DB yejr
1 Query SHOW TABLES LIKE 'yejr'
1 Query SET OPTION SQL_QUOTE_SHOW_CREATE=1


oss.linuxpk.com 2008 年第 11 期 92

经验技巧
1 Query show create table `yejr`
1 Query show fields from `yejr`
1 Query show table status like 'yejr'
1 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `yejr`
1 Quit
5). --single-transaction

InnoDB 表在备份时,通常启用选项 --single-transaction 来保证备份的一致性,实际上它


的工作原理是设定本次会话的隔离级别为:REPEATABLE READ,以确保本次会话(dump)时,不会看到
其他会话已经提交了的数据。
081022 17:23:35 1 Connect root@localhost on
1 Query /*!40100 SET @@SQL_MODE='' */
1 Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
1 Query BEGIN
1 Query UNLOCK TABLES
1 Init DB yejr
1 Query SHOW TABLES LIKE 'yejr'
1 Query SET OPTION SQL_QUOTE_SHOW_CREATE=1
1 Query show create table `yejr`
1 Query show fields from `yejr`
1 Query show table status like 'yejr'
1 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `yejr`
1 Quit
6). --single-transaction and --master-data

本例中,由于增加了选项 --master-data,因此还需要提交一个快速的全局读锁。在这里,可以
看到和上面的不同之处在于少了发起 BEGIN 来显式声明事务的开始。这里采用 START TRANSACTION
WITH CONSISTENT SNAPSHOT 来代替 BEGIN 的做法的缘故不是太了解,可以看看源代码来分析下。

081022 17:27:07 2 Connect root@localhost on


2 Query /*!40100 SET @@SQL_MODE='' */
2 Query FLUSH TABLES
2 Query FLUSH TABLES WITH READ LOCK
2 Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
2 Query START TRANSACTION WITH CONSISTENT SNAPSHOT
2 Query SHOW MASTER STATUS


oss.linuxpk.com 2008 年第 11 期 93

经验技巧
2 Query UNLOCK TABLES
2 Init DB yejr
2 Query SHOW TABLES LIKE 'yejr'
2 Query SET OPTION SQL_QUOTE_SHOW_CREATE=1
2 Query show create table `yejr`
2 Query show fields from `yejr`
2 Query show table status like 'yejr'
2 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `yejr`
2 Quit

2. mysqldump 和 mk-parralel-dump 的比较

mk-parralel-dump 是开源项目 Maatkit 中的一个工具,主要由 Baron Schwartz 维护。

mk-parralel-dump 是由 perl 开发的,可以实现并发的导出数据表。具体的功能不细说,自己


去看相关文档吧。这里只列出在我的环境下和 mysqldump 的对比数据。

1) mysqldump 常规使用

#导出耗时
time mysqldump -f --single-transaction -B yejr --tables yejr | gzip >
/home/databak/yejr.sql.gz
real 10m15.319s
user 6m47.946s
sys 0m38.496s

#文件大小
608M /home/databak/yejr.sql.gz

#导出期间系统负载
05:00:01 PM all 0.71 0.00 0.61 7.33 91.36
05:10:02 PM all 13.93 0.00 2.21 4.64 79.22
2) mysqldump + gzip --fast

#导出耗时
time mysqldump -f --single-transaction -B yejr --tables yejr | gzip
--fast > /home/databak/yejr_fast.sql.gz
real 9m6.248s
user 4m21.467s
sys 0m37.604s

#文件大小


oss.linuxpk.com 2008 年第 11 期 94

经验技巧
815M Oct 21 17:33 /home/databak/yejr_fast.sql.gz

#导出期间系统负载
05:20:01 PM all 11.94 0.00 2.43 5.69 79.94
05:30:01 PM all 6.46 0.00 1.57 3.95 88.02

3) mk-parallel-dump 常规使用
time ./mk-parallel-dump --database yejr --tables yejr --basedir
/home/databak/
default: 25 tables, 25 chunks, 25 successes, 0
failures, 404.93 wall-clock time, 613.25 dump time
real 6m48.763s
user 4m20.724s
sys 0m38.125s

#文件大小
819M /home/databak/default/yejr/

#导出期间系统负载
05:10:02 PM all 13.93 0.00 2.21 4.64 79.22
05:20:01 PM all 11.94 0.00 2.43 5.69 79.94

可以看到,mk-parallel-dump 尽快确实实现了并发导出,速度相对快多了,却有个致命伤:那
就是它不支持 InnoDB 的一致性备份,目前已经有人提交相关代码了,不过还没实现,期待中。

浅谈 Linux 操作系统的安全设置
如今系统安全变的越来越重要了,这里我想把我平时比较常使用的一些 linux 下的基本的安全措施
写出来和大家探讨一下,让我们的 Linux 系统变得可靠。

一、BIOS 的安全设置
这是最基本的了,也是最简单的了。一定要给你的 BIOS 设置密码,以防止通过在 BIOS 中改变启动
顺序,而可以从软盘启动。这样可以阻止别有用心的试图用特殊的启动盘启动你的系统,还可以阻止别
人进入 BIOS 改动其中的设置,使机器的硬件设置不能被别人随意改动。

二、LILO 的安全设置

oss.linuxpk.com 2008 年第 11 期 95

经验技巧
LILO 是 LInux LOader 的缩写,它是 LINUX 的启动模块。可以通过修改“/etc/lilo.conf”文
件中的内容来进行配置。在/etc/lilo.conf 文件中加如下面两个参数:restricted,password。
这三个参数可以使你的系统在启动 lilo 时就要求密码验证。

第一步:编辑 lilo.conf 文件(vi /etc/lilo.comf),假如或改变这三个参数:

boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt

timeout=00 #把这行该为 00,这样系统启动时将不在等待,而直接启动 LINUX


message=/boot/message
linear
default=linux

restricted #加入这行

password= #加入这行并设置自己的密码
image=/boot/vmlinuz-2.4.2-2
label=linux
root=/dev/hda6
read-only

第二步:因为"/etc/lilo.conf"文件中包含明文密码,所以要把它设置为 root 权限读取。

# chmod 0600 /etc/lilo.conf

第三步:更新系统,以便对“/etc/lilo.conf”文件做的修改起作用。

# /sbin/lilo -v

第四步:使用“chattr”命令使"/etc/lilo.conf"文件变为不可改变。

# chattr +i /etc/lilo.conf

这样可以在一定程度上防止对“/etc/lilo.conf”任何改变(意外或其他原因)

三、让口令更加安全
口令可以说是系统的第一道防线,目前网上的大部分对系统的攻击都是从截获口令或者猜测口令开
始的,所以我们应该选择更加安全的口令。

首先要杜绝不设口令的帐号存在。这可以通过查看/etc/passwd 文件发现。例如,存在的用户名为
test 的帐号,没有设置口令,则在/etc/passwd 文件中就有如下一行:


oss.linuxpk.com 2008 年第 11 期 96

经验技巧
test::100:9::/home/test:/bin/bash

其第二项为空,说明 test 这个帐号没有设置口令,这是非常危险的!

其次,在旧版本的 linux 中,在/etc/passwd 文件中是包含有加密的密码的,这就给系统的安全


性带来了很大的隐患,最简单的方法就是可以用暴力破解的方法来获得口令。可以使用
命/usr/sbin/pwconv 或者/usr /sbin/grpconv 来建立/etc/shadow 或者/etc/gshadow 文件,
这样在/etc/passwd 文件中不再包含加密的密码,而是放在/etc/shadow 文件中,该文件只有超级用
户 root 可读!

第三点是修改一些系统帐号的 Shell 变量,例如 uucp,ftp 和 news 等,还有一些仅仅需要 FTP


功能的帐号,一定不要给他们设置/bin/bash 或者/bin/sh 等 Shell 变量。可以在/etc/passwd 中
将它们的 Shell 变量置空,例如设为 /bin/false 或者/dev/null 等,也可以使用 usermod -s
/dev/nullusername 命 令 来 更 改 username 的 Shell 为 /dev/null 。 这 样 使 用 这 些 帐 号 将 无 法
Telnet 远程登录到系统中来!

第四点是修改缺省的密码长度:在你安装 linux 时默认的密码长度是 5 个字节。但这并不够,要把


它设为 8。修改最短密码长度需要编辑 login.defs 文件(vi/etc/login.defs),把下面这行
PASS_MIN_LEN 5

改为
PASS_MIN_LEN 8

login.defs 文件是 login 程序的配置文件。

四、自动注销帐号的登录
在 unix 系统中 root 账户是具有最高特权的。如果系统管理员在离开系统之前忘记注销 root 账户,
那将会带来很大的安全隐患,应该让系统会自动注销。通过修改账户中“TMOUT”参数,可以实现此功能。
TMOUT 按秒计算。编辑你的 profile 文件(vi/etc/profile),在"HISTFILESIZE="后面加入下
面这行:
TMOUT=300

300,表示 300 秒,也就是表示 5 分钟。这样,如果系统中登陆的用户在 5 分钟内都没有动作,那


么系统会自动注销这个账户。你可以在个别用户的“.bashrc”文件中添加该值,以便系统对该用户实行
特殊的自动注销时间。

改变这项设置后,必须先注销用户,再用该用户登陆才能激活这个功能。


oss.linuxpk.com 2008 年第 11 期 97

经验技巧
五、取消普通用户的控制台访问权限
你应该取消普通用户的控制台访问权限,比如 shutdown、reboot、halt 等命令。

# rm -f /etc/security/console.apps/

是你要注销的程序名。

六、取消并反安装所有不用的服务
取消并反安装所有不用的服务,这样你的担心就会少很多。察看“/etc/inetd.conf”文件,通过
注 释 取 消 所 有 你 不 需 要 的 服 务 ( 在 该 服 务 项 目 之 前 加 一 个 “ #” ) 。 然 后 用 “ sighup” 命 令 升 级
“inetd.conf”文件。

Debian 镜像巧实现
顾宏军
Debian 是一套完全由开源社区维护的 Linux 发行版。它可以使用 APT 方式通过网络在线安装软件,
这就需要可靠、快速的网络连接。但是,在一个局域网内,大家都分别到外部站点在线安装会浪费大量
的网络带宽,而且效率也不高。这时可考虑建立一个本地镜像,供内部人员使用。

使用 debmirror 工具可以很方便地建立一个本地 Debian 镜像。debmirror 是用 Perl 编写的脚


本程序,可接受很多参数,用以指定本地镜像目录、远程服务器地址、网络连接方式和 Debian 的版本
等。

1.安装 debmirror

在用作镜像服务器的计算机上,使用如下命令进行安装:

# apt-get install debmirror

2.启动镜像服务器

安装 debmirror 后,使用如下命令启动 Debian Sarge 的镜像服务器:

#debmirror -a i386 -h mirrors.geekbone.org -d sarge /home/mirror/debian -e ftp


--nosource -p

“-a“参数用来指定软件包支持的平台,比如,i386 和 PPC 等,它能同时指定多个平台,不同平台


之间以逗号隔开即可。


oss.linuxpk.com 2008 年第 11 期 98

经验技巧
“-h”参数用来指定远程下载站点,本例中使用的 mirrore.geekbone.org 是国内一个主要的
Debian 镜像下载站点。

“-d”参数用来指定 Debian 的版本,Sarge 是 Debian 3.1 版的代号。

“/home/mirror/debian”是存放 Debian Package 的本地目录。

“-e”参数用来指定与远程服务器的连接方式,比如,FTP、HFTP 和 HTTP 等。

“-nosource”参数表示不需要下载软件包的源代码。

“-p”参数用于显示下载进度。

debmirror 还有很多其它参数,详细情况可查看它的手册页。

执行以上命令后,debmirror 会自动架设一个 FTP 服务器,将 FTP 目录指定到镜像所在目录,并


开通下载权限。如上例中,已在/home/mirror/debian 目录中做了 Debian 的镜像,则 debmirror
会将 FTP 的匿名用户的预设路径指向/home/mirror/目录。

3.客户端设置

在客户端需要编辑 source.list 文件,在其中添加如下一行:

deb ftp://192.168.20.110/debian/ sarge main non-free contrib //192.168.20.110

192.168.20.110 为刚制作的 Debian 镜像主机的 IP。

执行如下命令就可以使用镜像服务器做升级安装了:

#apt-get updates

SSH2 让登陆更安全
李汉强
许多远程登录程序,比如,telnet、rsh、rlogin 和 rexec 等都使用明文的方式来传送密码和信
息。任何连接到网上的电脑都可以通过软件监听这些程序和服务器之间的通信,轻易地获取密码和重要
信息。因此,给系统带来不少安全危机。

然而,远程登录对于网管日常的管理工作是必不可少的,SSH2 可以让登录更安全。

一、telnet 的替代方案


oss.linuxpk.com 2008 年第 11 期 99

经验技巧
SSH(Secure Shell)会在连接过程中采用主机支持的加密认证方式,使登录过程的保密性大大
提高。即使黑客中途拦截到数据包,所得到的信息也仅是一堆乱码而已。因此,使用 SSH 做远程登录,
减少了黑客入侵的可能性。建议尽量用这种方式来远程管理主机,同时,把 telnet 的端口关掉。

目前广泛使用的是 SSH2,它使用 22 端口。到 http://www.ssh.org、http://www.ssh.com


、http://www.datafellows.com 或 http://rufus.w3.org 上都可以下载 SSH2 的安装包。

要获得更多有关 SSH2 的信息,可以阅读随安装软件包附带的 Readme 文件,或者到官方 FAQ 链接


http://www.ssh.org/faq.html 上阅读相关内容。

二、安装 SSH2
用下列命令将 SSH2 软件包解压缩,并编译、安装:

#tar xvzf ssh*.gz


#cd ssh-2.4.0
#./configure --with-libwrap
#make
#make install

如果操作系统是 FreeBSD,要把 configure 命令后面的“--with-libwrap”参数去掉,否则,


编译时会发生错误。

将“/usr/local/sbin”和“/usr/local/bin”加入.bash_profile 文件的路径中,这样安装
时就会把程序放在这两个目录下。

三、启动 SSH 服务
1.使用 inetd

使用 inetd 启动 SSH 服务,需要在/etc/inetd.conf 文件中加入以下代码:

ssh stream tcp nowait root /usr/sbin/tcpd /usr/local/sbin/sshd2 -i

然后用以下命令重新启动 inetd:

#/etc/rc.d/init.d/inet restart

2.使用 xinetd

使用 xinetd 启动 SSH 服务,需要创建/etc/xinetd.d/ssh 文件,内容如下:

service ssh
{


oss.linuxpk.com
源 2008 年第 11 期 100
经验技巧
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/local/sbin/sshd2
server_args = -i
disable = no
}

同样也需要重新启动 xinetd:

#/etc/rc.d/init.d/xinetd restart

3.inetdconvert 程序

可以利用 xinetd 所附带的 inetdconvert 程序将 inetd.conf 中的 SSH 设置转换成 xinetd 的


配置文件/etc/xinetd.d/ssh。命令格式如下:

#/usr/sbin/inetdxconvert --inetdfile inetd.conf ssh

inetdconvert 程序十分方便,但是,它是用 Python Script 语言编写的,因此,主机中必须装


有 Python 才行。

四、使用方法
1.设定权限

编辑/etc/hosts.allow 文件,加入允许远程登录的 IP 地址。比如:


sshd2 : 192.168.1.0/255.255.255.128 : allow

编辑/etc/hosts.deny 文件,加入如下内容:
sshd2 : All : deny

这样,就只允许/etc/hosts.allow 文件中设定的 IP 进行登录,让 SSH2 更加安全。

2.用命令行登录

一种登录命令的格式如下:

ssh2 -l 账号 主机域名(或 IP 地址)

比如,用 root 用户登录到 IP 为 192.168.1.1 的主机,命令如下:

ssh -l root 192.168.1.1


oss.linuxpk.com
源 2008 年第 11 期 101
经验技巧
在通过系统的密码验证后,即可登录主机,其操作方式和 telnet 很相似。

还可以用如下命令进行登录:

sftp 账号@主机或 IP

用 root 用户登录 IP 地址为 192.168.1.1 的服务器,命令如下:

sftp root@192.168.1.1

这种操作方式和 FTP 很相似。

3.在 Windows 系统下使用

在 Windows 平 台 上 有 很 多 好 用 的 免 费 SSH 客 户 端 软 件 , 比 如 , Putty 、 Tera Term Pro 和


TTSSHd 等。

下载链接分别为
http://www.chiark.greenend. org.uk/~sgtatham/putty.html
http://hp.vector.co.jp/authors/VA002416/teraterm.html
http://www.zip.com.au/~roca/download.html

给 Linux 系统带上 Windows 面纱


白金
网络上的计算机很容易被黑客利用工具或其它手段进行扫描,以寻找系统中的漏洞,然后再针对漏
洞进行攻击。通过伪装 Linux 系统,给黑客设置系统假象,可以加大黑客对系统的分析难度,引诱他们
步入歧途,从而进一步提高计算机系统的安全性。下面以 Red Hat Linux 为例,针对几种黑客常用的
途径介绍一些常用的 Linux 系统伪装的方法。

一、针对 HTTP 服务
通过分析 Web 服务器的类型,大致可以推测出操作系统的类型,比如, Windows 使用 IIS 来提供
HTTP 服务,而 Linux 中最常见的是 Apache。

默认的 Apache 配置里没有任何信息保护机制,并且允许目录浏览。通过目录浏览,通常可以获得


类似“Apache/1.3.27 Server at apache.linuxforum.net Port 80”或“Apache/2.0.49
(Unix) PHP/4.3.8”的信息。

通过修改配置文件中的 ServerTokens 参数,可以将 Apache 的相关信息隐藏起来。但是,Red


oss.linuxpk.com
源 2008 年第 11 期 102
经验技巧
Hat Linux 运行的 Apache 是编译好的程序,提示信息被编译在程序里,要隐藏这些信息需要修改
Apache 的源代码,然后,重新编译安装程序,以实现替换里面的提示内容。

以 Apache 2.0.50 为例,编辑 ap_release.h 文件,修改“#define


AP_SERVER_BASEPRODUCT \"Apache\"”为“#define AP_SERVER_BASEPRODUCT \"Mi-
crosoft-IIS/5.0\"”。编辑 os/unix/os.h 文件,修改“#define PLATFORM \"Unix\"”为
“#define PLATFORM \"Win32\"”。修改完毕后,重新编译、安装 Apache。

Apache 安 装 完 成 后 , 修 改 httpd.conf 配 置 文 件 , 将 “ ServerTokens Full” 改 为


“ServerTokens Prod”;将“ServerSignature On”改为“ServerSignature Off”,然后存
盘退出。重新启动 Apache 后,用工具进行扫描,发现提示信息中已经显示操作系统为 Windows。

二、针对 FTP 服务
通过 FTP 服务,也可以推测操作系统的类型,比如, Windows 下的 FTP 服务多是 Serv-U,而
Linux 下常用 vsftpd、proftpd 和 pureftpd 等软件。

以 proftpd 为例,修改配置文件 proftpd.conf,添加如下内容:

ServerIdent on \"Serv-U FTP Server v5.0 for WinSock ready...\"

存盘退出后,重新启动 proftpd 服务,登录到修改了提示信息的 FTP 服务器进行测试:

C:\\>ftp 192.168.0.1
Connected to 192.168.0.1.
220 Serv-U FTP Server v5.0 for WinSock ready...
User (192.168.0.1:(none)):
331 Password required for (none).
Password:
530 Login incorrect.
Login failed.
ftp > quit
221 Goodbye.

这样从表面上看,服务器就是一个运行着 Serv-U 的 Windows 了。

三、针对 TTL 返回值


可以用 ping 命令去探测一个主机,根据 TTL 基数可以推测操作系统的类型。对于一个没有经过任
何网关和路由的网络,直接 ping 对方系统得到的 TTL 值,被叫做“TTL 基数”。网络中,数据包每经
过一个路由器,TTL 就会减 1,当 TTL 为 0 时,这个数据包就会被丢弃。

通常情况下,Windows 的 TTL 的基数是 128,而早期的 Red Hat Linux 和 Solaris 的 TTL 基数


是 255,FreeBSD 和新版本的 Red Hat Linux 的 TTL 基数是 64。比如,ping 一个 Red Hat 系统,


oss.linuxpk.com
源 2008 年第 11 期 103
经验技巧
显示如下:

Pinging 192.168.0.1 with 32 bytes of data:

Reply from 192.168.0.1: bytes=32 time <10ms TTL=64

Reply from 192.168.0.1: bytes=32 time <10ms TTL=64

Reply from 192.168.0.1: bytes=32 time <10ms TTL=64

Reply from 192.168.0.1: bytes=32 time <10ms TTL=64

Ping statistics for 192.168.0.1:

Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),


Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms

用以下命令修改 Red Hat Linux 的 TTL 基数为 128(本来为 64):

# echo 128 > /proc/sys/net/ipv4/ip_default_ttl

若想使设置永久生效,可以修改/etc/sysctl.conf 配置文件,添加如下一行:

net.ipv4.ip_default_ttl = 128

保存退出后,再 ping 192.168.0.1,TTL 基数就变为 128 了。

四、针对 3389 端口和 22 端口


有时通过扫描 3389 端口和 22 端口,也可以推测操作系统的类型。Windows 下一般利用 TCP 协议
的 3389 端口进行远程控制,而 Linux 可能会用 TCP 协议的 22 端口,提供带有加密传输的 SSH 服务。

为了安全,可以利用 iptables 来限制 22 端口的 SSH 登录,让非授权的 IP 扫描不到 TCP 22 端口


的存在:

#iptables -I INPUT -s ! xx.xx.xx.xx -p tcp --dport 22 -j DROP

利用 iptables,将本机的 TCP 3389 端口转移到其它开有 3389 端口的计算机上,给 Linux 系统


伪装出一个提供服务的 TCP 3389 端口。命令如下:

#echo 1 > /proc/sys/net/ipv4/ip_forward


#iptables -t nat -I PREROUTING -p tcp --dport 3389 -j DNAT --to xx.xx.xx.xx


oss.linuxpk.com
源 2008 年第 11 期 104
经验技巧
#iptables -t nat -I POSTROUTING -p tcp --dport 3389 -j MASQUERADE

第一条命令表示允许数据包转发;第二条命令表示转发 TCP 3389 到 xx.xx.xx.xx;第三条命令


表示使转发数据包实现“双向通路”,给数据包设置一个正确的返回通道。若想使转发永久生效,可以
把以上命令添加到/etc/rc.local 文件中。

这样,当黑客扫描服务器所开端口的时候,就找不到 22 号端口,而是看到一个伪装的 3389 端口,


从而不能正确判断出操作系统的类型。

五、针对 netcraft
netcraft 是一个很厉害的扫描引擎,它通过简单的 TCP 80,就可以知道所测服务器的操作系统、
Web 服务程序和服务器开机时间(Uptime)等信息。

上面介绍的几种方法对 netcraft 来说,均不奏效。针对 netcraft,可利用 iptables 进行系统


伪装,使 netcraft 错误判断操作系统:

#iptables -t nat -I PREROUTING -s 195.92.95.0/24 -p tcp --dport 80 -j DNAT --to


xx.xx.xx.xx
#iptables -t nat -I POSTROUTING -s 195.92.95.0/24 -p tcp --dport 80 -j MASQUERADE

由于通过抓包发现,netcraft 的服务器不止一台,所以需要对它所在网段进行转发欺骗处理。

六、小结
以上方法只能从某种角度上防止和阻挠黑客对系统漏洞的分析,在一定程度上可减少计算机被攻击
的可能性,但仍然是“防君子,不防小人”,仅是给大家提供一个活学活用的新思路。

穿过 MSProxy 上网也不难
苑庆国
在局域网中,MSProxy 是一种被广泛使用的代理服务器。它和客户端浏览器之间采用微软开发的
NTLM 认证方式进行通信。这导致 MSProxy 只支持与 IE 浏览器进行认证通信,其它浏览器因通信格式不
匹配而无法通过它上网。解决此问题有两种方法。一种是修改服务器端的认证方式为明文认证,但这种
方式降低了网络的安全性,而且大多数用户无权对服务器端进行修改。另一种方法是给客户端安装
NTLMAPS,这种方法简单易行,并且支持多种浏览器。下面就介绍一下在 Linux 下使用 NTLMAPS 的方
法。


oss.linuxpk.com
源 2008 年第 11 期 105
经验技巧
一、NTLMAPS 的原理
NTLMAPS(NTLM Authorization Proxy Server)是一种类代理服务器软件。它通过在浏览器
请求数据包的头部分增加 NTLM 认证字符串,将非 IE 浏览器伪装成 IE 浏览器,从而使得其它浏览器能
够通过 MSProxy 上网。

NTLMAPS 是采用 Python 语言的 1.5.2 版本编写的,所以要求系统安装有 1.5.2 或以上版本的


Python 语言解释器。Python 软件包可以到 www.python.org 上下载。

二、配置上网
NTLMAPS 是免费软件,目前的稳定版本为 0.98。该项目主页为 http://ntlmaps.source-
forge.net/,可以直接到 http://sourceforge.net/project/showfiles.php?
group_id=69259 下载 0.98 版的软件包。

1.安装 NTLMAPS

下载完 NTLMAPS 软件包后,直接解压缩到指定路径:

#gzip -d aps098.tar.gz
#tar -xvf aps098.tar

2.配置 NTLMAPS

修改配置文件 server.cfg,具体如下:

[GENERAL]

LISTEN_PORT:5865

PARENT_PROXY:Your MSProxy IP

PARENT_PROXY_PORT:8080

[NTLM_AUTH]

NT_DOMAIN: Your DomainName

USER: UserName

PASSWORD: Password


oss.linuxpk.com
源 2008 年第 11 期 106
经验技巧

以上配置中,“5865”是 NTLMAPS 默认的监听端口;“8080”是 MSProxy 代理服务器的 HTTP 端


口。在“PARENT_PROXY:”后面填入 MSProxy 代理服务器的 IP 地址。在“NT_DOMAIN:”后面填入用
户所在的 Windows 域。在“USER:”后面填入 MSProxy 指定的用户名。在“PASSWORD:”后面填入对应
的密码,如果此项空白,服务器将会在启动的时候要求输入密码。

3.启动 NTLMAPS

完成上面的安装和配置后,用以下命令启动 NTLMAPS:

#./main.py &

注意,运行以上命令前需要在 main.py 中加入 Python 语言的安装路径。

4.修改浏览器配置

启 动 浏 览 器 , 单 击 选 单 “ 编 辑 ( Edit ) → 属 性 ( Preferences ) ” , 然 后 单 击 “ 高 级
(Advanced)”按钮,选择“代理(Proxies)”,在“HTTP:”的框中分别键入“127.0.0.1”和
“5865”(NTLMAPS 的监听端口),单击“确定(OK)”按钮后退出。

至此,Linux 的浏览器就可以顺利通过 MSProxy 代理服务器上网了。

三、小结
由于 NTLMAPS 要对每一个请求数据包都进行处理,同时,还要保持服务器与客户端的稳定连接,因
此,当 NTLMAPS 同时收到针对同一个线程的多个请求包时,这些请求包必须进行排队。如果前面的请求
包出现错误,则后面的请求包不得不等待,直到错误请求因超时被关闭为止。为避免这种情况,建议用
户关闭浏览器的 HTTP 1.1 功能。

打开配置文件 server.cfg 中的调试选项(将“DEBUG”和“BIN_DEBUG”设置为 1),可以监测


NTLMAPS 出现的问题。设置完毕后,重新启动 NTLMAPS,将生成三个 log 文件,分别记录 NTLMAPS 的
行为、客户端的流量和服务器的流量。通过这三个文件,可以对出现的问题进行分析处理。

Mozilla 最新版本已经能够支持 NTLM 认证。


oss.linuxpk.com
源 2008 年第 11 期 107
企业应用

dbcached──分布式 key-value 数据库内存


缓存系统
张宴
dbcached 1.0 beta* 在 Memcached 1.2.4 的基础上编写而成,也是我的第一个开源 C 项目。
编写 dbcached 的目的是为了最大限度的发挥 Memcached 内存缓存的优势,便捷地维护 Memcached
服务器节点哈希列表,智能地支持 Memcached 故障转移,同时保证数据的持久化存储。

dbcached 是什么?

  ● dbcached 是一款基于 Memcached 和 NMDB 的分布式 key-value 数据库内存缓存系统。

  ● dbcached = Memcached + 持久化存储管理器 + NMDB 客户端接口

  ● Memcached 是一款高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负


载,提升访问速度。

  ● NMDB 是一款多协议网络数据库(dbm 类)管理器,它由内存缓存和磁盘存储两部分构成,使


用 QDBM 或 Berkeley DB 作为后端数据库。

  ● QDBM 是一个管理数据库的例程库,它参照 GDBM 为了下述三点而被开发:更高的处理速度,


更小的数据库文件大小,和更简单的 API。QDBM 读写速度比 Berkeley DB 要快。

Memcached 和 dbcached 在功能上一样吗?

    ● 兼 容 : Memcached 能 做 的 , dbcached 都 能 做 。 除 此 之 外 , dbcached 还将


“ Memcached 、 持 久 化 存 储 管 理 器 、 NMDB 客 户 端 接 口 ” 在 一 个 程 序 中 结 合 起 来 , 对 任 何 原 有
Memcached 客户端来讲,dbcached 仍旧是个 Memcached 内存对象缓存系统,但是,它的数据可以
持久存储到本机或其它服务器上的 QDBM 或 Berkeley DB 数据库中。

  ● 性能:前端 dbcached 的并发处理能力跟 Memcached 相同;后端 NMDB 跟 Memcached


一样,采用了 libevent 进行网络 IO 处理,拥有自己的内存缓存机制,性能不相上下。

  ● 写入:当“dbcached 的 Memcached 部分”接收到一个 set(add/replace/...) 请求


并储存 key-value 数据到内存中后,“dbcached 持久化存储管理器”能够将 key-value 数据通


oss.linuxpk.com
源 2008 年第 11 期 108
企业应用
过“NMDB 客户端接口”保存到 QDBM 或 Berkeley DB 数据库中。

    ● 速 度 : 如 果 加 上 “ -z” 参 数 , 采 用 UDP 协议“只发送不接收”模式将


set(add/replace/...) 命令写入的数据传递给 NMDB 服务器端,对 Memcache 客户端写速度的影
响几乎可以忽略不计。在千兆网卡、同一交换机下服务器之间的 UDP 传输丢包率微乎其微。在命中的情
况下,读取数据的速度跟普通的 Memcached 无差别,速度一样快。

  ● 读取:当“dbcached 的 Memcached 部分”接收到一个 get(incr/decr/...) 请求后,


如果“dbcached 的 Memcached 部分”查询自身的内存缓存未命中,则“dbcached 持久化存储管
理器”会通过“NMDB 客户端接口”从 QDBM 或 Berkeley DB 数据库中取出数据,返回给用户,然后
储存到 Memcached 内存中。如果有用户再次请求这个 key,则会直接从 Memcached 内存中返回
Value 值。

  ● 持久:使用 dbcached,不用担心 Memcached 服务器死机、重启而导致数据丢失。


oss.linuxpk.com
源 2008 年第 11 期 109
企业应用
  ● 变更:使用 dbcached,即使因为故障转移,添加、减少 Memcached 服务器节点而破坏了
“key 信息”与对应“Memcached 服务器”的映射关系也不怕。

  ● 分布:dbcached 和 NMDB 既可以安装在同一台服务器上,也可以安装在不同的服务器上,


多台 dbcached 服务器可以对应一台 NMDB 服务器。

  ● 特长:dbcached 对于“读”大于“写”的应用尤其适用。


1. dbcached

1)Installation (安装)

wget http://www.monkey.org/~provos/libevent-1.3e.tar.gz
tar zxvf libevent-1.3e.tar.gz
cd libevent-1.3e/
./configure --prefix=/usr
make && make install
cd ../
wget http://dbcached.googlecode.com/files/dbcached-1.0.beta2.tar.gz
tar zxvf dbcached-1.0.beta2.tar.gz
cd dbcached-1.0.beta2/
./configure --prefix=/usr/local/dbcached --with-libevent=/usr
make && make install
cd ../

2)Run as a daemon (作为守护进程运行)

/usr/local/dbcached/bin/memcached -d -m 256 -p 11211 -c 51200 -u nobody -x


192.168.0.2 -y 26010 -z 26010

  ● -x nmdb 服务器的域名或者 IP 地址,推荐使用 IP 地址

  ● -y <端口号> nmdb 服务器的 TCP 端口号 (默认: 26010) 支持 set/delete/... 等写


命令 和 get 等读命令

  ● -z <端口号> nmdb 服务器的 UDP 端口号 (默认: 26010) 只支持 get 等都命令, 当使用
-z 参数时,将使用 UDP 协议代替 TCP 协议执行 set 操作,执行 get 操作时仍然使用 TCP 协议。
强烈推荐加上 -z 参数。

  ● 其他参数跟 memcached 1.2.4 完全一样,就不再详细说明。

  ● 如果想让 dbcached 通过 NMDB 保存数据时采用 TCP 协议,去掉 -z 参数即可,例如:


(除非因防火墙、NAT 穿透等问题导致 UDP 协议不可用,否则不建议使用 TCP 协议)
/usr/local/dbcached/bin/memcached -d -m 256 -p 11211 -c 51200 -u nobody -
x 192.168.0.2 -y 26010

  ● 如果想让 dbcached 作为普通的 Memcached 运行,去掉 -x、-y、-z 参数即可,例如:


/usr/local/dbcached/bin/memcached -d -m 256 -p 11211 -c 51200 -u nobody
2. QDBM & NMDB


oss.linuxpk.com
源 2008 年第 11 期 110
企业应用
QDBM 和 NMDB 均为原版,可以从它们的官方网站下载最新版本。

1)QDBM Installation (安装)

wget http://qdbm.sourceforge.net/qdbm-1.8.77.tar.gz
tar zxvf qdbm-1.8.77.tar.gz
cd qdbm-1.8.77/
./configure --prefix=/usr
make
make install
cd ../

2)NMDB Installation (安装)

wget http://www.monkey.org/~provos/libevent-1.3e.tar.gz
tar zxvf libevent-1.3e.tar.gz
cd libevent-1.3e/
./configure --prefix=/usr
make && make install
cd ../
wget http://auriga.wearlab.de/~alb/nmdb/files/0.21/nmdb-0.21.tar.gz
tar zxvf nmdb-0.21.tar.gz
cd nmdb-0.21/
make BACKEND=qdbm ENABLE_TIPC=0 ENABLE_SCTP=0 install
cd ../

3)Run as a daemon (作为守护进程运行)

/usr/local/bin/nmdb -d /var/dbcached.db -t 26010 -T 192.168.0.2 -u 26010 -U


192.168.0.2 -c 1024

    ● -d 数 据 库 路 径 ( 这 里 使 用 比 Berkeley DB 更 快 的 QDBM 数据库),例如


/var/dbcached.db

  ● -t TCP 监听端口 (默认:26010)

  ● -T TCP 监听地址 (默认:任何地址)

  ● -u UDP 监听端口 (默认:26010)

  ● -U UDP 监听地址 (默认:任何地址)

  ● -c 最大的缓存对象数目,单位为千 (默认:128)


oss.linuxpk.com
源 2008 年第 11 期 111
企业应用

Linux 内核性能评测
朱兴雄
Linux 以其开放和自由的特性,日益受到人们的关注,并被广泛应用于科学计算、电子商务、并行
运算、辅助教学、大型服务器、嵌入式应用和桌面办公等不同的领域,为我国软件产业的发展带来了契
机。研究 Linux 内核的评测方法、评价工具和评测标准,颇具意义和实用价值,有助于 Linux 国产化发
展,同时也是国家电子基金项目的重要组成部分。

Linux 内核是 Linux 操作系统最核心的部分,其性能直接决定了操作系统的性能。测试内核性能的


方法是针对 Linux 内核五大子系统(进程调度子系统、内存管理子系统、虚拟文件子系统、进程通信子
系统和网络子系统)的自身特点,测量出 Linux 内核完成工作量负载的响应时间、CPU 时间和 CPU 利用
率等参数,作为衡量标准。

Linux 内核测试法

1.Linux 测试项目(LTP)

LTP(Linux test project)套件涵盖了内核的大多数接口,如系统调用、内存、 IPC、I/O、


文件系统和网络。这个项目收集了各种 Linux 内核测试工具和相关资料,当前包括了超过 2900 个测试
用例。

2.可扩展性测试平台(STP)

开放源代码开发实验室 (Open Source Development Labs, OSDL)创建了可扩展测试平台


(Scalable Test Platform,STP)系统。STP 是一个自动化的测试平台, STP 可以构建内核、设
置测试、运行测试,并收集结果,然后进行深入地比较。

3.代码覆盖分析

代码覆盖分析在一个给定的测试运行时,分析出内核中哪些代码行被执行,提示内核的哪些部分还
没有被测试到,并指出需要再编写哪些新测试来测试内核的相应部分,以使可以得到更完备的测试。

4.内核回归测试

对 Linux 内核执行持续多日的回归测试,创建实时的、集中的档案库,以随时获得 Linux 内核的快


照,内核发生改变,测试人员就可进行测试。

Linux 内核架构

Linux 内核主要由五大子系统组成:进程调度子系统(Process Scheduler)、内存管理子系统


oss.linuxpk.com
源 2008 年第 11 期 112
企业应用
(Memory Manager) 、 虚 拟 文 件 子 系 统 (Virtual File System) 、 进 程 通 信 子 系 统 (Inter-
Process Communication)和网络子系统(Network Interface),其中进程调度子系统是 Linux
操作系统的核心。这五大子系统彼此紧密协作,共同对用户程序提供服务,其系统架构如下图所示。

图 1. Linux 内核结构

核心的子系统是进程调度子系统,所有子系统依赖它来挂起/唤醒进程。当进程被唤醒后,进程调度
子系统依靠内存管理子系统来对进程的内存映射(页表)进行调整;进程间通讯子系统依靠内存管理子系
统来实现共享内存通信机制,允许多个进程共享物理内存;虚拟文件子系统依靠网络接口子系统来实现
网络文件系统(NFS),并且依靠内存管理子系统来实现 Ramdisk 设备;内存管理子系统依靠虚拟文件
子系统来实现对换。

由此可见,测试 Linux 性能的关键在于测试 Linux 内核性能,而测试 Linux 内核性能又可以细化


成五大子系统的测试。

性能评测方法学

一个性能评测实际解决方案应该包括以下三个方面:

1).被评测系统处于压力负荷下;

2).测量系统执行有效特定任务的能力,执行特定任务的耗时,执行特定任务的 CPU 利用率;


oss.linuxpk.com
源 2008 年第 11 期 113
企业应用
3).基于性价比因素考虑进行改进。

性能测试领域的自顶向下方法(Top-Down Approach),是一种把性能测试从系统角度分层次考虑
的 方 法 。 从 上 到 下 分 成 系 统 层 (System Level) 、 应 用 层 (Application Level) 、 微 结 构 层
(Micro-Architecture)三层,如图所示。

图 2. 自顶向下性能测试法

1).系统层(System Level):包括处理器、内存、硬盘和网络等;

2).应用层(Application Level):包括锁、线程、堆和 API 等;

3).微结构层(Micro-Architecture):包括数据队列、循环结构和 cache 优化。

自顶向下方法是从系统硬件层(处理器、内存、硬盘、网络等)、应用层(锁、线程、堆、API)和微
结构层来考虑性能测试标准。系统层关注的是系统硬件设备资源和外围设备;应用层关注的是操作系统
和应用程序资源;微结构层关注的是 CPU 资源、逻辑单元和内存访问等细节。

内核性能评价的主要标准和参数

1.Linux 内核性能评价的主要标准

从系统性能评价方法学的角度来考虑,Linux 内核性能评价应该遵循以下标准。

1).正确性

运行的正确性是首要的,运行结果出错的程序是没有应用价值的。


oss.linuxpk.com
源 2008 年第 11 期 114
企业应用
2).可靠性

Linux 内核直接控制和管理计算机系统硬件和软件资源,以方便用户充分而有效地利用计算机资源
的程序集合,如果自身都运行不可靠,稳定性差,将直接导致硬件工作不正常和软件应用的不稳定。

3).工作性能

(1) 处理能力,单位时间内能处理的信息量(吞吐率);

(2) 响应能力,包括响应时间、周转时间和排队时间等;

(3) 利用率,时间段 T 内,资源被使用时间 t 与 T 的比值。

正确性是测试的前提,可靠性和工作性能可以通过设计相应负载对内核进行压力测试。

2.Linux 内核性能评价的参数

1).响应速度

内核完成某一任务(程序)所花费的时间,如磁盘访问、存储器访问和输入/输出等待。

2).CPU 时间

程序在 CPU 中的执行时间。

3).CPU 利用率

因此只有充分利用 CPU,才能最大程度的提高系统的效率。

Linux 内核压力测试

Linux 内核压力测试使用如下图示过程。


oss.linuxpk.com
源 2008 年第 11 期 115
企业应用

图 3. Linux 内核压力测试过程

Linux 内核压力测试组合了不同方面的多个测试,包括内存和网络传输负载生成器。在执行之前,
测试会根据系统中存在多少物理和虚拟内存来调整其总的内存使用情况。评价系统资源利用率所选择的
测试组合必须给系统的资源带来足够的压力,可以从 LTP 测试套件中获得测试脚本 ltpstress.sh。

Linux 内核主要有如下四个方面影响系统的响应和执行时间: CPU,用于在机器的 CPU(s)上处


理数据的时间;Memory,用于自真实存储器中读写数据的时间;I/O,用于自磁盘存储器读写数据的时
间;Networking,用于自网络读写数据的时间。测试能得到 CPU(s)、内存、I/O 和网络等主要内
核区域的资源利用率。

测试应该充分地覆盖内核代码,以帮助支持生成的稳定性声明。可使用下面两个开放源代码 Linux
资源监控工具来评价资源利用率水平:Top 与 sar,包含于大部分 Linux 发行版本中,可用于当前的
2.4 和 2.6 内核(目前内核为 2.6.18)。

内核代码覆盖率分析


oss.linuxpk.com
源 2008 年第 11 期 116
企业应用
获得足够的内核覆盖率是系统压力测试的另一个职责。尽管所选的测试组合充分地利用了四种主要
资源,它也有可能只是执行了内核的一小部分,因而应该对覆盖率进行分析以确保组合可以成为一个系
统压力测试。

当前,有两个开放源代码工具可以帮助进行 Linux 内核的代码覆盖率分析。Gcov,这个工具分析


内核代码的覆盖率,并报告哪些行、函数和分支被覆盖以及它们被访问了多少次。Lcov,这个工具由一
组 Perl 脚本构成,以实现基于 HTML 的输出,输出包括覆盖率百分比、图表以及概述页,可以快速浏
览覆盖率数据。

Linux 内核可靠性评测

系统的稳定性和可靠性通常以连续运转时间和系统的可靠运行时间来度量。

有两个特别的阶段:一个是“初始测试”阶段,另一个是“压力可靠性运转”阶段或“压力测试”
阶段。初始测试执行:

文件系统压力测试。

硬盘 I/O 测试。

内存管理压力测试。

IPC 压力测试。

调试器测试。

命令功能的验证测试。

系统调用功能的验证测试。

通过初始测试是开始测试的必要条件,LTP 测试套件 runalltest.sh 可用于初始测试。

压力测试在使用网络与内存管理的同时,并行地运行大范围的内核组件,并在测试系统上生成高压
力负荷,压力测试执行:

NFS 压力测试。

内存管理压力测试。

文件系统压力测试。

数学 (浮点) 测试。

多线程压力测试。

硬盘 I/O 测试。

IPC 测试。


oss.linuxpk.com
源 2008 年第 11 期 117
企业应用
系统调用功能的验证测试。

网络压力测试。

压力测试可以验证产品在系统高使用率时的健壮性, LTP 测试套件 ltpstress.sh 可用于压力测


试。

评估

可靠性(reliability)是产品在规定的条件下和规定的时间内完成规定功能的能力,它的概率度量
称为可靠度,是评估的依据。软件可靠性(software reliability)是软件系统的固有特性之一,它
表明了一个软件系统按照用户的要求和设计的目标,执行其功能的正确程度。可靠的软件系统应该是正
确、完整、一致和健壮的。

全文总结

本文在充分分析、总结国内外有关软硬件性能评测相关理论和研究成果的基础上,结合 Linux 内核
自身的特点,针对 Linux 五大子系统,研究评测内核的方法、工具和标准,以达到评测 Linux 内核性能
的目的。

作者简介:朱兴雄,毕业于北京大学,硕士,软件专业,中文 Linux 标准《信息技术 中文 Linux 应用编程界面


(API)规范》主要起草人之一。在信息产业部软件与集成电路促进中心工作期间,担任高级项目经理,负责制定
中国 Linux 参考平台规范,负责中国 Linux 参考平台实现工作。国际开放源代码开发实验室(OSDL)技术委员
会成员。在贝尔实验室(中国)期间,从事下一代智能网开发平台、 基于集群的高性能网络数据采集解析引擎
的开发工作。在北京大学期间,担任北京大学研究生《软件数学》课程、本科生《离散数学》课程助教。具有丰
富的软件开发、项目管理经验。


oss.linuxpk.com
源 2008 年第 11 期 118
企业应用

Wine Server 在兼容内核的应用


褚力行
Wine Server 是 Wine 运行在 Linux 系统上的服务器,Windows 应用程序在 Wine 上运行时,Wine
Server 提供了进程间通信、同步及进程/线程等的管理,因此 Wine Server 在 Wine 的运行过程中起到了
非常关键的作用。在本文中,笔者将针对 Wine-0.9.11 的代码分析 Wine Server 的运行过程,并介绍其
在 Linux 兼容内核开发过程中的作用。

Wine Server 是 Wine 的服务器,其工作原理和其他服务器类似,对客户端发出的请求进行处理并作


出回复。当一个 Windows 进程(确切地说,应该是 Wine 的进程)由 Wine 引导,进行初始化时,
Wine 将检查 Wine Server 是否运行,如果没有就启动并创建一个 socket,用以 Wine Server 与进程的
通信。当最后一个 Windows 进程结束时,Wine Server 也就自动终止运行。

从工作原理而言, Wine Server 的设计思路与 X Server 等并无二致,但从作用上分析, Wine


Server 对 Wine 的运行是至关重要的。Wine Server 实际上提供了进程间通信、同步和进程/线程等的管
理,或者说 Wine Server 提供的服务是将 Windows 的 API 调用转化成 Linux 的处理,这也正是 Wine 可
以兼容众多 Windows 应用程序的关键。

对于一个 Windows 应用程序,所要调用的 API 函数一般包含在几个核心 DLL 中(如 Kernel32.dll


等)。而 Wine 将这些重要的 DLL 实现为共享库,即 SO 形式(在 Wine 中称为内置 DLL),其中的函数
接口与对应 DLL 中完全一样。但是相对于 Windows DLL 需要进一步调用 Windows 系统调用的方式而
言,Wine 内置的 DLL 则是将其转化为相应的请求,发送给 Wine Server,而由 Wine Server 进一步向
Linux 进行调用作处理,如图 1 所示。而一些 Linux 系统所不具备的对象管理、Windows 的跨进程操作
等机制实际上最终都由 Wine Server 承担,作出妥善的处理。


oss.linuxpk.com
源 2008 年第 11 期 119
企业应用

图 1 Wine 对 Windows API 的处理

运行 Wine Server

对 Wine Server 的分析,笔者将分为三个部分,分别为 Wine Server 的启动、客户端请求和 Wine


Server 对请求作出的处理和回复,按时间顺序让读者理解整个过程。

Wine Server 的启动

Wine Server 相对而言是一个比较独立的进程,对于 Windows 应用程序是透明的。但是当 Wine 装


入 Windows 可执行文件,并为之创建进程及首个线程时,就要将部分信息发送给 Wine Server。

具 体 而 言 , 这 是 在 对 应 的 Wine 进 程 初 始 化 过 程 中 , 且 在 各 相 关 DLL 连 接 之 前 ( 即 调 用
LdrInitializeThunk 函数之前)。文件 dll/ntdll/loader.c 中的函数 thread_init 代码中有如下调用:

/* setup the server connection */

server_init_process();

info_size = server_init_thread( thread_info.pid, thread_info.tid, NULL );

函数 server_init_process 将通过调用 server_connect 与 Wine Server 进行连接。如果这是创建的


第 一 个 Windows 进 程 , 也 就 是 说 Wine Server 尚 未 启 动 , 那 么 server_connect 函 数 就 会 通 过
start_server,运行 Wine Server 对应的可执行文件。而 server_init_thread 则向 Wine Server 发送线程
初始化的请求。

Wine Server 本身又是一个独立的进程,下面是其主程序(server/main.c):

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


oss.linuxpk.com
源 2008 年第 11 期 120
企业应用
{

……

sock_init();

open_master_socket();

setvbuf( stderr, NULL, _IOLBF, 0 );


if (debug_level) fprintf( stderr, "wineserver: starting (pid=%ld)\n", (long)
getpid() );

init_signals();

init_directories();

init_registry();

main_loop();

return 0;
}

Wine Server 首先处理参数和设置临时的信号处理,然后通过函数 sock_init 和 open_master_init


打开 Wine Server 的主 socket,这个主 socket 主要用于 Wine Server 与客户端通信。

经过了信号、目录和注册表的初始化,Wine Server 开始进入函数 main_loop 的循环,等待用户发


送请求,并进行处理。这部分将在后面进行详细分析,不过从这段代码可以看出在 Wine 中对注册表的管
理也是由 Wine Server 负责的。

客户端请求

Wine Server 的客户端请求有比较统一的格式,笔者这里以一个简单的函数 NtClose 的代码为例进


行分析:

NTSTATUS WINAPI NtClose( HANDLE Handle )


{

NTSTATUS ret;

SERVER_START_REQ( close_handle )

req->handle = Handle;

ret = wine_server_call( req );

if (!ret && reply->fd != -1) close( reply->fd );


oss.linuxpk.com
源 2008 年第 11 期 121
企业应用
SERVER_END_REQ;

return ret;
}

NtClose 是 Windows 的一个系统调用,用以关闭一个对象的句柄,在这里就被改写成向 Wine


Server 发送请求。SERVER_START_REQ 和 SERVER_END_REQ 是一对宏:

#define SERVER_START_REQ(type) \

do { \

struct __server_request_info __req; \

struct type##_request * const req = &__req.u.req.type##_request; \

const struct type##_reply * const reply = &__req.u.reply.type##_reply; \

memset( &__req.u.req, 0, sizeof(__req.u.req) ); \

__req.u.req.request_header.req = REQ_##type; \

__req.data_count = 0; \

(void)reply; \

do
#define SERVER_END_REQ \

while(0); \

} while(0)

这里 Wine 定义了一套“规范”的请求/回复结构,在预处理时,相应的请求/回复的数据结构就会进
行替换。在 NtClose 中,设置好了请求结构 req 后,就将其作为参数由 wine_server_call 发送给 Wine
Server,并等待 Wine Server 的回复。这些过程一般都是在 ntdll.dll.so 中相应的系统调用函数中进行的,
属于客户端的请求,而这类请求就是以下面这种格式为框架的,对于不同的请求,其相应的数据结构也
不尽相同。

SERVER_START_REQ(处理函数名)
{
...
wine_server_call(req)
...
}
SERVER_END_REQ


oss.linuxpk.com
源 2008 年第 11 期 122
企业应用
Wine Server 接收到请求,经过处理后, NtClose 再关闭回复 reply 中的 fd。这就模拟了一次
Windows 的系统调用过程。

当然一个 Windows 系统调用可以通过若干个请求得到的处理来实现,而发送 Wine Server 请求的


也并不全是系统调用的界面函数。比如,在进程创建或退出时,进程并没有运行其对应的可执行文件或
动态链接库文件的代码,此时一些向 Wine server 注册或获取信息的工作就需要发送请求。

Wineserver 的响应

前面提到过,Wine Server 由 main_loop 进行循环,等待并处理客户端的请求。现在再看一下


main_loop 中使用 poll 部分的代码:

/* server main poll() loop */


void main_loop(void)
{

……

while (active_users)

……

ret = poll( pollfd, nb_users, timeout );

if (ret > 0)

for (i = 0; i < nb_users; i++)

if (pollfd[i].revents)

fd_poll_event( poll_users[i], pollfd[i].revents );

if (!--ret) break;

…………

在这里的循环中,通过 poll 监视已经建立的 socket 和 pipe,对端口接收到的请求进行相应的处理。


具 体 而 言 , 对 于 和 Wine Server 通 信 的 线 程 , 是 通 过 fd_poll_event 中 的 函 数 指 针 指 向 函 数
thread_poll_event,进行请求处理:

static void thread_poll_event( struct fd *fd, int event )


{


oss.linuxpk.com
源 2008 年第 11 期 123
企业应用
……

if (event & (POLLERR | POLLHUP)) kill_thread( thread, 0 );

else if (event & POLLIN) read_request( thread );

else if (event & POLLOUT) write_reply( thread );


}

函数 read_request 读入请求后,继续调用 call_req_handler 进行处理,而根据不同的请求,又将通


过函数指针数组 req_handlers 中对应的项,调用具体的处理函数:

typedef void (*req_handler)( const void *req, void *reply );


static const req_handler req_handlers[REQ_NB_REQUESTS] =
{
(req_handler)req_new_process,

……

};

在源代码中定义的处理函数实际上是 DECL_HANDLER(),这是一个宏:

#define DECL_HANDLER(name) \

void req_##name( const struct name##_request *req, struct name##_reply *reply )

预处理后,DECL_HANDLER()就变成上面函数指针数组中具体的一项,负责处理请求,这也就是
Wine Server 的处理过程。以 req_为前缀的处理函数在 0.9.11 版本中共有 212 个,其中很多对应于
Windows 的系统调用。而如果有必要,这些处理函数还将经过 Linux 的系统调用进行更加深入的处理。

完成以上操作之后,函数 wine_server_call 中调用的 wait_reply 就会接收到由 Wine Server 处理后


的 req 结构,从而完成了客户端与 Wine Server 的整个请求—>处理—>回复的过程。

从上述代码中可以看到,Wine Server 的请求处理是以一个 Windows 线程为单位的,这与实际的


Windows 应用是一致的。在 Wine 进程运行过程中,该进程有一套 Windows 的进程和线程的结构,而
同时,在 Wine Server 中也建立了一套对应的进程和线程结构。只不过 Wine Server 上的进程和线程结
构相当简单,只保留了其在处理过程中所需要的几项。也正是因为有了这样的对应,一个 Wine Server
进程可以对多个 Wine 进程进行很好地管理,并分别为之完成请求处理的工作。

与 Linux 兼容内核的关系

在 Linux 兼容内核项目的开发过程中,Wine 起了非常重要的作用,这其中 Wine Server 非常关键。


因为在目前 Wine 的实现下,众多的 Windows 应用软件已经可以在 Linux 系统上运行,因此从 Wine 的
角度而言,Linux 兼容内核是将其中的“系统调用”真实化,并逐步将这个请求服务的过程还原为真实的


oss.linuxpk.com
源 2008 年第 11 期 124
企业应用
系统调用。

从 Linux 兼容内核项目的发展来看,Wine Server 在测试中是不可或缺的。该项目基本实现的系统调


用函数还只是一部分,当一个 Windows 应用程序使用到一些该项目尚未实现的系统调用时,具体的处理
过程还是会像上面分析的那样走请求—>处理—>回复的这条道路,如图 2。

图 2 兼容内核中的 Wine Server

此外,对进程的管理(Linux 兼容内核第三部分代码将实现这部分内容)和注册表的使用还需要
Wine Server 进行处理,因此 Wine Server 还将在 Linux 兼容内核项目开发过程中的一段时期内扮演重
要的角色。而随着兼容内核项目对 Windows 系统调用地逐步完善,Wine Server 在系统调用处理方面的
工作也将逐渐减少。

经过对 Wine Server 整体的分析,读者可以看到对于 Wine 而言,在用户空间实现兼容,这种客户


端/服务器的结构是非常重要的,但这也很大程度上影响了 Wine 的效率。Wine Server 无论在 Wine 中
还是在 Linux 兼容内核项目的开发中都起了非常重要的作用,其实现也为 Linux 与 Windows 更好的兼容
提供了有力的帮助。


oss.linuxpk.com
源 2008 年第 11 期 125
嵌入式

Linux 武装新型滑翔机
丁大勇

Lange Flugzeugbau 公司利用嵌入式 Linux 技术研制出一种可自行起飞的滑翔机,这种滑翔机的


能源来自特制的电池。据开发人员称,与燃料推动的同类滑翔机相比,这种滑翔机具备性能可靠、噪音
小和易操作等优势。Lange Flugzeugbau 公司的 Antares 新型滑翔机在飞行控制和电源管理方面采
用了 PC/104 Linux 操作系统。

开放级高性能滑翔机

Antares 滑翔机是一种“开放级高性能滑翔机”。该滑翔机的翼展为 65.6 英尺(约 20 米),主要


由碳纤维复合材料制成,最重要的是它还有一个“生存空间”驾驶员座舱,该座舱的形状与 F 1赛车极
为相似,如图 1 所示。


oss.linuxpk.com
源 2008 年第 11 期 126
嵌入式

图 1 “生存空间”驾驶员座舱

Antares 滑翔机的设计符合最新的空气动力学和飞行动力学,是当今性能最优的滑翔机之一。电池
的动力足够将 Antares 滑翔机推动到 3000 米的高空,其上升速度最快可达每秒 4 米。负责滑翔机
Linux 系统研发的航天技术专家 Ola Rr Thorsen 称,Antares 滑翔机的性能足以与燃料引擎滑翔机
相媲美,甚至更优。

Lange Flugzeugbau 公司是一家只有 40 人的小公司,但它却拥有 30 人的制造研发队伍。此公司


计划今年生产大约 30 架 Antares 滑翔机。Thorsen 称,Antares 滑翔机的动力系统已通过 EASA 认证,
它的主体是一个他们自主设计的功率为 42 千瓦的马达。该马达拥有自己的控制器,它的动力源于一个
11 千瓦/小时的电池组。该电池组由 72 个锂电池组成。电池组拥有自己的供热系统,确保最大限度的能
量输出。

此外,Antares 滑翔机还配有一个基于微控制器的模块网络,该网络可以严密监控系统的电量等级 。
网络中的众多模块与一个 Linux 中央控制系统相连,中央控制系统配备了一组 CAN(控制器区域网络)
总线。Thorsen 称,所有的模块都由一个中心计算机控制,这台计算机使用的正是 PC/104 Linux 操
作系统。


oss.linuxpk.com
源 2008 年第 11 期 127
嵌入式
电池电源、微控制器模块和 Linux 中央计算机还可对螺旋桨和着陆齿轮进行控制,同时还管理着
Antares 滑翔机的其他功能。驾驶员座舱中配备了一个全彩色 LCD 显示屏和一组用来输出音频信息的扬
声器。整个驾驶员座舱中包含有多项专利技术,飞行员可以轻松地对飞机进行控制。

Linux 系统独特的网络功能使 Lange Flugzeugbau 公司得以为 Antares 滑翔机增加了许多真正


的高科技功能,其中包括一个 GSM/GPRS 模块。它使飞行员可以随时通过他们的自动电话获得 SMS(短
信息服务)信息,了解飞机的电池供电情况。蜂窝式模块技术使得 Lange Flugzeugbau 公司可以对
Antares 滑翔机进行远程检测和固件升级。“我相信我们的产品是第一个拥有这些技术的飞行器。”
Thorsen 骄傲地说。

Antares 滑翔机的 Linux 心

Antares 滑 翔 机 的 基 于 Linux 技 术 控 制 系 统 的 主 体 是 一 台 Lippert Cool RoadRunner


PC/104 SBC(单板计算机,如图 2),其核心是一个 300 MHz 的 Geode GX-1 处理器。主板上还嵌入
了一对专门定做的附加卡和一个双接口 CAN 总线卡。Lange Flugzeugbau 公司正计划将其更换成一个
无铅 Lippert 主板。

图 2 RoadRunner PC/104 SBC

Thorsen 称,控制 Antares 滑翔机的 Linux 系统需要的 RAM 不超过 32MB,再加上 Lippert
SBC 需要的 RAM,系统需要的总 RAM 将少于 64MB。此系统可由一个不定容量的 CF 卡启动。

Lange Flugzeugbau 公司使用了一个定制的 USB 接口对飞机进行检测。Thorsen 称他们之所以


选择用定制的 USB 接口,是为了防止发生“黑客”行为,失去对飞机的控制。

Thorsen 指出,一些传感器和模块是通过 RoadRunner 的串行及并行接口相互连接的。例如:LCD


模块便是通过一个串行接口连入系统的。另外,RoadRunner 的声音系统的主要功能是发出预警信号和
错误提示,以便飞行员在第一时间做出反应。Antares 滑翔机的 PC/104 主板堆栈如图 3 所示。


oss.linuxpk.com
源 2008 年第 11 期 128
嵌入式

图 3 Antares 滑翔机的 PC/104 主板堆栈

Antares 滑翔机的 Linux 环境是基于 Linux 2.4 内核的 PC/104 Linux 操作系统。GSM/GPRS
通信系统中还使用了 Mgetty 开源软件包。不仅如此,Lange Flugzeugbau 公司还专门为 CAN 总线编
写了自己的 Linux 驱动程序。

Antares 滑翔机的 Linux 系统是 Lange Flugzeugbau 公司定制研发的,其间飞行控制系统专家


Karl Osen 发挥了重要作用。Karl Osen 还是飞机的飞行控制系统软件开发者。

选择 Linux 的原因

Thorsen 称 , Lange Flugzeugbau 公 司 原 本 计 划 使 用 QNX 技 术 , 后 来 其 初 衷 改 变 的 原 因 是


Linux 系统的高性价比。他解释说,“Linux 系统的优势是显而易见的,我们可以对需要的功能进行修
改和添加,而且我们越来越了解这种系统。”

Thorsen 指出,Lange Flugzeugbau 公司的工程师们起初要经过仔细地研究才能对 Linux 系统


进 行 构 建 与 定 制 , 但 现 在 许 多 问 题 只 要 在 Google 中 搜 索 一 下 , 便 能 找 到 解 决 办 法 。 Lange
Flugzeugbau 公司曾在缩短 Linux 系统启动时间上花费了许多精力。如果将现有的 Linux 系统升级到
Linux 2.6 内核,相信系统的启动时间还可能变得更短。


oss.linuxpk.com
源 2008 年第 11 期 129
嵌入式

ARM 系统启动代码的——分析和开发
李浩 翟高寿 彭斌
嵌入式系统被定义为以应用为中心、以计算机技术为基础、软硬件可裁剪、适应应用系统对功能、
可靠性、成本、体积和功耗等严格要求的专用计算机系统。其核心部件是嵌入式处理器。随着嵌入式系
统不断深入到生活中的各个领域,嵌入式处理器得到前所未有的飞速发展。

典型的 32 位 RISC 芯片——ARM 处理器不论是在 PDA、STB 及 DVD 等消费类电子产品中,还是在


GPS、航空、勘探和测量等军方产品中都得到了广泛的应用。越来越多的芯片厂商看好 ARM 的前景,像
Intel、NS、Ateml、Philips、NEC、CirrusLogic 和 Motorola 等公司都推出了基于 ARM 的相应
产品。

在基于 Atmel 公司 AT91RM9200 芯片的嵌入式开发板上,笔者做了一些 μCOS 操作系统的移植工作。


在移植过程中,发现其中的一个技术难点在于系统启动程序的编写,为此专门撰写此文,详细论述该系
统启动程序的实现。

与启动相关的硬件信息

1.ARM 处理器模式和相应的异常处理

ARM 体系结构支持 7 种处理器模式,分别是用户模式、快中断模式、中断模式、管理模式、中止模


式、未定义模式和系统模式。除用户模式外,其余均为特权模式。在硬件设计上,ARM 内部寄存器(如
GPSR 和 CPSR)和一些芯片内设备只允许(或可选为只允许)在特权模式下访问。特权模式除了可以通
过程序切换进入外,也可以由特定的异常(Exception)进入。当特定的异常出现时,处理器进入相应
的模式,并从异常向量表中指定的指令处开始执行。每种模式都有附加的寄存器,以避免异常退出时用
户模式的状态不可靠。

CPU 异常通常是由中断或 CPU 错误造成的,ARM920T 的异常按照优先级别从高到低的顺序分别为


Reset 、 Data Abort 、 FIQ 、 IRQ 、 Prefetch Abort 、 Software Interrupt 及 Undefined
Instruction。当某个异常发生时,CPU 首先切换到 ARM 状态(相对于 Thumb 状态,此状态的指令为
32 位),接下来程序计数器(Program Counter)从一个指定的地址装载相应的指令,并且切换到相
应的模式(比如,快中断模式、中断模式、管理模式、中止模式或未定义模式等)。这里提到的指定地
址是由异常的类型决定的,比如,Reset 异常的地址为 0x00000000、Undefined Instruction 异
常的地址为 0x00000004。这些地址中就是所谓的向量,向量的内容一般为跳转指令(以便跳到相应的
异常处理程序)。ARM 中有八个向量,其中一个为保留向量。

在启动程序中需要设置各个处理器模式下的堆栈(至于什么原因后面会提到)。为了在不同的模式


oss.linuxpk.com
源 2008 年第 11 期 130
嵌入式
设置这些堆栈,需要用指令直接修改 CPSR 程序状态寄存器(所有模式共享一个 CPSR),切换到相应的
模式下,然后把 SP 寄存器指向相应的堆栈地址即可。在异常模式下,另外一个程序状态寄存器 GPSR 也
可以被访问,在进入异常时 GPSR 中会保存进入异常之前的 CPSR,在异常退出时,它可以用来恢复进入
异常之前的 CPSR。

M0~M4 是处理器模式位,这些位决定了处理器的操作模式;T 位反映了正在操作的状态,当 T 置位


时表示处理器在 16 位的 Thumb 指令下运行,反之在 32 位的 ARM 指令下运行;I 位和 F 位都是中断禁止
位,当 I 置位时,IRQ 中断被禁止,当 F 置位时,FIQ 中断被禁止;8~27 位为保留位;N、Z、C 和 V
位都是条件代码标志位。

2.嵌入式开发板的时钟问题

一般情况下,系统启动 CPU 会自动选择慢速访问外部存储器,以适合大多数设备,并且在启动时禁


止了部分时钟信号。因此,编写启动代码时需要对时钟部分进行适当的配置,以增加取指、存取等操作
的速度,并且使能相应的时钟信号以便访问对应的外设。

基于 AT91RM9200 芯片的开发板系统刚启动时,Clock Generator(时钟发生器)不会将 Main


Clock、PLLA Clock 和 PLLB Clock 之类的 18.432MHz 高频时钟信号使能。但是为了提高性能和使
用相应的外设,必须使能 Main Clock、PLLA Clock 和 PLLB Clock,同时还要进行一些参数的设置,
使时钟信号的频率满足相应的要求,以保证信号的顺利传递。

3.地址映射问题

在 AT91RM9200 芯片内集成了一些内存,被称为内部内存(Internal Memory)。相应的,其它


Flash、SDRAM 及 CF 和 SD 卡等是通过芯片外部的引脚连接到芯片上的,被称做外部内存(External
Memory)。

0x00000000~0x0FFFFFFF 的地址空间为 Internal Memory,其余地址为 External Memory


。Internal Memory 又分为几个区,其中 0x00000000~0x000FFFFF 之间并没有物理内存,这段空
间指向哪个真实的物理内存,由复位时 BMS 引脚的状态和内存重映射设置的值决定。在重映射之前,如
果 BMS 引脚的状态为 1,则片内 ROM 被映射在这个区域;如果 BMS 引脚的状态为 0,则外部内存区域
0(External Memory Area 0)所对应的片外 Flash 被映射到这个区域。内存重映射之后,物理内
存片内 SDRAM 被映射在内部内存区域 0(Internal Memory Area 0)。

通常将启动程序存放到 Flash 中,然后使 BMS 跳线为“1”。这样,板子上电以后,因为 Flash 被


映射到地址 0 上,于是启动程序开始运行。

与启动程序相关的软件知识

1.ADS1.2 中的编译器特性


oss.linuxpk.com
源 2008 年第 11 期 131
嵌入式
系统启动时,使用 C 语言编译出来的代码,是无法放到处理器的存储器中由 CPU 直接运行的。这是
因为使用高级语言生成的可执行镜像文件(Image File),还需要使用汇编语言编写的初始化代码才
能够运行。下面就通过例子介绍一下隐藏在 C 语言函数背后的内容。

在 ARM 的 ARMCC 编译器中,将下面的程序保存为 test1.c。

void foo(int a)
{
int b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,w,x,y,z;
b=5;
a=b;
b=6;
c=1;
d=1;
e=1;
f=1;
g=1;
h=1;
i=1;
j=1;
k=1;
l=1;
m=1;
n=1;
o=1;
p=1;
q=1;
w=1;
x=1;
y=1;
z=1;
}

使用下面的指令将其编译成汇编语言文件:

armcc -S -O0 test1.c

编译过后生成 test1.s 文件,其主要内容如下:

CODE32


oss.linuxpk.com
源 2008 年第 11 期 132
嵌入式
AREA ||.text||, CODE, READONLY
||foo|| PROC

STMFD sp!,{r4-r11,lr}

SUB sp,sp,#0x20

MOV r1,#5

MOV r0,r1

MOV r1,#6

MOV r2,#1

STR r2,[sp,#0x1c]

MOV r2,#1

STR r2,[sp,#0x18]

MOV r2,#1

STR r2,[sp,#0x14]

MOV r2,#1

STR r2,[sp,#0x10]

MOV r2,#1

STR r2,[sp,#0xc]

MOV r2,#1

STR r2,[sp,#8]

MOV r2,#1

STR r2,[sp,#4]

MOV r2,#1

STR r2,[sp,#0]

MOV r3,#1

MOV r12,#1

MOV lr,#1

MOV r4,#1

MOV r5,#1

MOV r6,#1


oss.linuxpk.com
源 2008 年第 11 期 133
嵌入式
MOV r7,#1

MOV r8,#1

MOV r9,#1

MOV r10,#1

MOV r11,#1

ADD sp,sp,#0x20

LDMFD sp!,{r4-r11,pc}

ENDP

EXPORT ||foo||

IMPORT ||Lib$$Request$$ARMlib||, WEAK

KEEP

END

这个例子说明 foo 函数运行的时候会自动递减堆栈的指针来存放变量,这就要求在运行 C 语言的函


数之前提供事先分配好的栈。栈用来存放函数的临时变量、函数调用的位置记录,以及函数使用的寄存
器记录等信息,并且栈的大小在使用过程中不能溢出,或者和其它代码地址冲突。因此,系统初始化代
码中一定要指定栈的信息。另外,C 语言的 malloc()函数中会用到堆,所以如果用到该函数,也必须初
始化堆。但是堆可以被默认为栈,因此不必做额外的工作。

仅仅准备好堆和栈是不够的,还必须准备好全局数据的初始化空间,即 RW 段和 ZI 段,用以存放 C
语言中拥有初始化值的全局(或静态)变量,以及没有指定初始值的全局值。下面的例子说明了初始化
的过程。

将以下代码保存为 test2.c:

int b=5;
void foo(int a)
{
a=b;
b=6;
}

用下面的指令将其编译成汇编语言文件:

armcc -S -O0 test2.c

编译完成后生成 test2.s 文件,主要内容如下(“;”后面是添加的注释):


oss.linuxpk.com
源 2008 年第 11 期 134
嵌入式
CODE32

AREA ||.text||, CODE, READONLY


||foo|| PROC

LDR r1,|L1.24|

LDR r0,[r1,#0] ; b

MOV r1,#6

LDR r2,|L1.24|

STR r1,[r2,#0] ; b

MOV pc,lr
|L1.24|

DCD b

ENDP

AREA ||.data||, DATA, ALIGN=2


||.data$0||
b

DCD 0x00000005

EXPORT ||foo||

EXPORT b

IMPORT ||Lib$$Request$$ARMlib||, WEAK

END

上例中访问拥有初始化值的全局变量 b 时,使用了 b 标号所在的地址,这个地址是在 RW 段中。因此,


在汇编语言中必须有一段对 RW 进行搬移的程序。还有一种全局变量被存放于 ZI 段中,它们没有初始值,
比如“常量”变量。

RW 和 ZI 都是可读、写的,应该放在 RAM 这种物理存储器中;“常量”变量由于不需要修改链接器 ,


应该把它放在 RO 区中;可执行的镜像文件应该放在 Flash 中。像 RW 和 RO 这种可读、写的段必须拷贝
到 RAM 中才能使用,同时为了提高执行速度也可以把代码段拷贝到 RAM 中执行,但是为了使搬移后的符
号不变,必须进行内存重映射。

2.ADS1.2 中链接脚本文件的使用

大部分嵌入式系统的物理内存都是在地址空间中分散分布的,并且不同的段对所在的内存有特殊要
求,比如 RW 段要求存放在可读、写的内存中。因此,需要通过链接脚本文件 Scatter,将代码和数据


oss.linuxpk.com
源 2008 年第 11 期 135
嵌入式
存放到合适的物理内存中。

为了简便起见,让程序在执行时将 RO 段(包括只读的代码和数据)存放在 Flash 中,RW 段和 ZI


段 存 放 在 RAM 中 。 这 样 就 必 须 在 Reset 时 将 BMS 的 状 态 设 为 “ 0” , 以 便 让 Flash 映 射 在 从
0x00000000 开始的地址空间中,同时,必须在使用 RW 和 ZI 中的变量之前,把它们拷到 RAM 中相应的
地方(0x20000000)去。

下面来介绍如何使用 Scatter。假设程序经过编译后生成 basicboot.o 文件,为了让它最后生成


的可执行镜像文件在前面描述的内存分布情况下执行,必须编写 scatter.scf 文件,其内容如下:

LOAD_ROM 0X00000000
{
EXEC_ROM 0X00000000
{
*(+RO)
}
RAM 0X20000000
{
*(+RW,+ZI)
}
}

然后,使用如下命令调用 scatter.scf,去布局执行时的内存分布:
armlink basicboot.o -scatter scatter.scf -o basicboot.axf

图1
依照 Scatter 的布局在存储设备中放置各个段,所形成的内存布局图称为运行视图;在运行之前装


oss.linuxpk.com
源 2008 年第 11 期 136
嵌入式
载到内存时各个段的布局称为装载视图。本例的运行视图(图 1 左边)和装载视图(图 1 右边)如图 1
所示。

系统启动程序只能在 Flash 和 ROM 中运行,这是因为 Flash 和 ROM 是静态存储器,不需要初始化


就可以使用。内存芯片 SDRAM 需要在初始化代码中使能时钟信号以后才能使用,而在上电时系统还没有
初始化,所以最开始运行的程序只能放在静态 Flash/ROM 芯片中执行。

启动代码包含的步骤

通过上面的分析,可知针对 AT91RM9200 开发板的启动代码通常包含以下步骤:

(1) 异常向量和处理程序的定义;

(2) 使能主振荡器;

(3) 初始化堆栈;

(4) 检查并配置相应的时钟信号;

(5) 初始化 SDRAM;

(6) 打开串口并输出提示信息;

(7) 按照链接脚本文件布置的运行视图搬移 RW 和 ZI 段;

(8) 跳到相应的 C 语言函数处执行。

小结

笔者提供了一个简单可行的嵌入式启动代码的设计方案,在它的基础上可以进行一般的应用程序开
发,从而为以后嵌入式操作系统的移植做准备。但这个启动程序的设计是一个最基本的系统,具体的应
用,比如支持下载文件的命令等,还需要进一步改进和完善。


oss.linuxpk.com
源 2008 年第 11 期 137
布道开源

开源"圣经":大教堂和市集
Eric Raymond
HansB 翻译

一、大教堂和市集

Linux 的影响是非常巨大的。甚至在5年以前,有谁能够想象一个世界级的操作系统能够仅仅用细
细的 Internet 连接起来的散布在全球的几千个开发人员有以业余时间来创造呢?

我当然不会这么想。在1993年早期我开始注意 Linux 时,我已经参与 Unix 和自由软件开发达


十年之久了。我是八十年代中期 GNU 最早的几个参与者之一。我已经在网上发布了大量的自由软件,开
发和协助开发了几个至今仍在广泛使用的程序(Nethack,Emacs VC 和 GND 模式,xlife 等等)。我
想我知道该怎样做。

Linux 推翻了许多我认为自己明白的事情。我已经宣扬小工具、快速原型和演进式开发的 Unix 福


音多年了。但是我也相信某些重要的复杂的事情需要更集中化的,严密的方法。我相信多数重要的软件
(操作系统和象 Emacs 一样的真正大型的工具)需要向建造大教堂一样来开发,需要一群于世隔绝的奇
才的细心工作,在成功之前没有 beta 版的发布。

Linus Torvalds 的开发风格(尽早尽多的发布,委托所有可以委托的事,对所有的改动和融合开


oss.linuxpk.com
源 2008 年第 11 期 138
布道开源
放)令人惊奇的降临了。这里没有安静的、虔诚的大教堂的建造工作——相反, Linux 团体看起来像一
个巨大的有各种不同议程和方法的乱哄哄的集市(Linux 归档站点接受任何人的建议和作品,并聪明的
加以管理),一个一致而稳定的系统就象奇迹一般从这个集市中产生了。

这种设计风格确实能工作,并且工作得很好,这个事实确实是一个冲击。在我的研究过程中,我不
仅在单个工程中努力工作,而且试图理解为什么 Linux 世界不仅没有在一片混乱中分崩离析,反而以大
教堂建造者们不可想象的速度变得越来越强大。

到了1996年中,我想我开始理解了。我有一个极好的测试我的理论的机会,以一个自由软件计
划的形式,我有意识的是用了市集风格。我这样做了,并取得了很大的成功。

在本文的余下部分,我将讲述这个计划的故事,我用它来明确一些自由软件高效开发的格言。并不
是所有这些都是从 Linux 世界中学到的,但我们将看到 Linux 世界给予了它们一个什么样的位置。如
果我是正确的,它们将使你理解是什么使 Linux 团体成为好软件的源泉,帮助你变得更加高效。

二、邮件必须得通过
1993年以前我在一个小的免费访问的名为 Chester County InterLink 的 ISP 的做技术工
作,它位于 Pennsylvania 的 West Chester。(我协助建立了 CCIL,并写了我们独特的多用户 BBS
系统——你可以 telnet 到 locke.ccil.org 来检测一下。今天它在十九条线上支持三千的用户)。
这个工作使我可以一天二十四小时通过 CCIL 的 56K 专线连在网上,实际上,它要求我怎么做!

所 以 , 我 对 Internet email 很 熟 悉 。 因 为 复 杂 的 原 因 , 很 难 在 我 家 里 的 机 器
( snark.thyrsus.com ) 和 CCIL 之 间 用 SLIP 工 作 。 最 后 我 终 于 成 功 了 , 但 我 发 现 不 得 不 时 常
telnet 到 locke 来 检 查 我 的 邮 件 , 这 真 是 太 烦 了 。 我 所 需 要 的 是 我 的 邮 件 发 送 到 snark, 这 样
biff(1)会在它到达时通知我。

简单地 sendmail 的转送功能是不够的,因为 snark 并不是总在网上而且没有一个静态地址。我需


要一个程序通过我的 SLIP 连接把我的本地发送的邮件拉过来。我知道这种东西是存在的,它们大多使用
一个简单的协议 POP(Post Office Protocol)。而且,locke 的 BSD/OS 操作系统已经自带了一
个 POP3 服务器。

我需要一个 POP3 客户。所以我到网上去找到了一个。实际上,我发现了三、四个。我用了一会


pop-perl,但它却少一个明显的特征:抽取收到的邮件的地址以便正确回复。

问题是这样的:假设 locke 上一个叫“joe”的人向我发了一封邮件。如果我把它取到 snark 上准


备回复时,我的邮件程序会很高兴地把它发送给一个不存在的 snark 上的“joe”。手工的在地址上加上
“@ccil.org”变成了一个严酷的痛苦。

这显然应是计算机替我做的事。(实际上,依据 RFC1123 的 5.2.18 节,sendmail 应该做这件


oss.linuxpk.com
源 2008 年第 11 期 139
布道开源
事)。但是没有一个现存的 POP 客户知道怎样做!于是这就给我们上了第一课:

1. 每个好的软件工作都开始于搔到了开发者本人的痒处。
也许这应该是显而易见的(“需要是发明之母”长久以来就被证明是正确的),但是软件开发人员
常常把他们的精力放在它们既不需要也不喜欢的程序,但在 Linux 世界中却不是这样——这解释了为什
么从 Linux 团体中产生的软件质量都如此之高。

那么,我是否立即投入疯狂的工作中,要编出一个新的 POP3 客户与现存的那些竞争呢?才不是哪!


我仔细考察了手头上的 POP 工具,问自己“那一个最接近我的需要?”因为:

2. 好程序员知道该写什么,伟大的程序员知道该重写(和重用)什么。
我并没有声称自己是一个伟大的程序员,可是我试着效仿他们。伟大程序员的一个重要特点是建设
性的懒惰。他们知道你是因为成绩而不是努力得到奖赏,而且从一个好的实际的解决方案开始总是要比
从头干起容易。

例如,Linux 并不是从头开始写 Linux 的。相反的它从重用 Minix(一个 386 机型上的类似 Unix


的微型操作系统)的代码和思想入手。最后所有的 Minix 代码都消失或被彻底的重写了,但是当它们在
的时候它为最终成为 Linux 的雏形做了铺垫。

秉承同样的精神,我去寻找良好编码的现成的 POP 工具,用来作为基础。

Unix 世界中的代码共享传统一直对代码重用很友好(这正是为什么 GNU 计划不管 Unix 本身有多么


保守而选取它作为基础操作系统的原因)。 Linux 世界把这个传统推向技术极限:它有几个 T 字节的源
代码可以用。所以在 Linux 世界中花时间寻找其他几乎足够好的东西,会比在别处带来更好的结果。

这也适合我。加上我先前发现的,第二次寻找找到了 9 个候选者——fetchPOP,PopTart,get-
mail,gwpop,pimp,pop-perl,popc,popmail 和 upop)。我首先选定的是“fetchpop”。
我加入了头标重写功能,并且做了一些被作者加入他的 1.9 版中的改进。

但是几个星期之后,我偶然发现了 Carl Harris 写的“popclient”的代码,然后发现有个问题,


虽然 fetchpop 有一些好的原始思想(比如它的守护进程模式),它只能处理 pop3,而且编码的水平相
当业余(Seung-Hong 是个很聪明但是经验不足的程序员),Carl 的代码更好一些,相当专业和稳固,
但他的程序缺少几个重要的相当容易实现的 fetchpop 的特征(包括我自己写的那些)。

继续呢还是换一个? 如果换一个的话,作为得到一个更好开发基础的代价,我就要扔掉我已经有的
那些代码。

换 一 个 的 一 个 实 际 的 动 机 是 支 持 多 协 议 , pop3 是 用 的 最 广 的 邮 局 协 议 , 但 并 非 唯 一 一 个 ,


oss.linuxpk.com
源 2008 年第 11 期 140
布道开源
Fetchpop 和 其 余 几 个 没 有 实 现 POP2.RPOP , 或 者 APOP , 而 且 我 还 有 一 个 为 了 兴 趣 加 入
IMAP(Internet Message Access Protocol,最近设计的最强大的邮局协议)的模糊想法。

但是我有一个更加理论化的原因认为换一下会是一个好主意,这是我在 Linux 很久以前学到的:

3. “计划好抛弃,无论如何,你会的”(Fred Brooks,《神秘的人月》第
11 章)
或者换句话说,你常常在第一次实现一个解决方案之后才能理解问题所在,第二次你也许才足够清
楚怎样做好它,因此如果你想做好,准备好推翻重来至少一次。

好吧(我告诉自己),对 fetchpop 的尝试是我第一次的尝试,因此我换了一下。

当我在 1996 年 6 月 25 日把我第一套 popclient 的补丁程序寄给 Carl Harris 之后,我发现一


段时间以前他已经对 popclient 基本上失去了兴趣,这些代码有些陈旧,有一些次要的错误,我有许多
修改要做,我们很快达成一致,我来接手这个程序。不知不觉的,这个计划扩大了,再也不是我原先打
算的在已有的 pop 客户上加几个次要的补丁而已了,我得维护整个的工程,而且我脑袋里涌动着一些念
头要引起一个大的变化。

在一个鼓励代码共享的软件文化里,这是一个工程进化的自然道路,我要指出:

4. 如果你有正确的态度,有趣的问题会找上你的,但是 Carl Harris 的态度


甚至更加重要,他理解。

5. 当你对一个程序失去兴趣时,你最后的责任就是把它传给一个能干的后
继者。
甚至没有商量,Carl 和我知道我们有一个共同目标就是找到最好的解决方案,对我们来说唯一的问
题是我能否证明我有一双坚强的手,他优雅而快速的写出了程序,我希望轮到我时我也能做到。

三、拥有用户的重要性
于是我继承了 popclient,同样重要的是,我继承了 popclient 的用户基础,用户是你所拥有的
极好的东西,不仅仅是因为他们显示了你正在满足需要,你做了正确的事情,如果加以适当的培养,他
们可以成为合作开发者。

Unix 传统另一有力之处是许多用户都是黑客,因为源优码是公开的,他们可以成为高效的黑客,这


oss.linuxpk.com
源 2008 年第 11 期 141
布道开源
一点在 Linux 世界中也被推向了令人高兴的极致,这对缩短调试时间是极端重要的,在一点鼓励之下,
你的用户会诊断问题,提出修订建议,帮你以远比你期望快得多的速度的改进代码。

6. 把用户当做协作开发者是快速改进代码和高效调试的无可争辩的方式。
这种效果的力量很容易被低估,实际上,几乎所有我们自由软件世界中的人都强烈低估了用户可以
多么有效地对付系统复杂性,直到 Linus 让我们看到了这一点。

实际上,我认为 Linus 最聪明最了不起的工作不是创建了 Linux 内核本身,而是发明了 Linux 开


发模式,当我有一次当着他的面表达这种观点时,他微笑了一下,重复了一句他经常说的话:“我基本
上是一个懒惰的人,依靠他人的工作来获取成绩。”象狐狸一样懒惰,或者如 Robert Heinlein 所说,
太懒了而不会失败。

回顾起来,在 GNU Emacs Lisp 库和 Lisp 代码集中可以看到 Linux 方法的成功,与 Emacs 的 C


内核和许多其他 FSF 的工具相比,Lisp 代码库的演化是流动性的和用户驱动的,思想和原型在达到最终
的稳定形式之前往往要重写三或四次,而且经常利用 Internet 的松散合作。

实际上,我自己在 fetchmail 之前最成功的作品要算 Emacs VC 模式,它是三个其他的人通过电


子邮件进行的类似 Linux 的合作,至今我只见过其中一个人(Richard Stallman),它是 SCCS、RCS
和后来的 CVS 的前端,为 Emacs 提供“one-touch”版本控制操作,它是从一个微型的、粗糙的别人写
好的 sccs.el 模式开始演化的,VC 开发的成功不像 Emacs 本身,而是因为 Emacs Lisp 代码可以很快
的通过发布/测试/改进的过程。

(FSF 的试图把代码放入 GPL 之下的策略有一个未曾预料到的副作用,它让 FSF 难以采取市集模式,


因为他们认为每个想贡献二十行以上代码的人都必须得到一个授权,以使受到 GPL 的代码免受版权法的
侵扰,具有 BSD 和 MITX 协会的授权的用户不会有这个问题,因为他们并不试图保留那些会使人可能受
到质询的权力)。

四、早发布、常发布
尽量早尽量频繁的发布是 Linux 开发模式的一个重要部分,多数开发人员(包括我)过去都相信这对
大型工程来说是个不好的策略,因为早期版本都是些充满错误的版本,而你不想耗光用户的耐心。

这种信仰强化了建造大教堂开发方式的必要性,如果目标是让用户尽可能少的见到错误,那你怎能
不会仅仅每六个月发布一次(或更不经常),而且在发布之间象一只狗一样辛勤“捉虫”呢? Emacs C 内
核就是以这种方式开发的,Lisp 库,实际上却相反,因为有一些有 FSF 控制之外的 Lisp 库,在那里你
可以独立于 Emacs 发布周期地找寻新的和开发代码版本。

这其中最重要的是 Ohio 州的 elisp 库,预示了今天的巨大的 Linux 库的许多特征的精神,但是我


oss.linuxpk.com
源 2008 年第 11 期 142
布道开源
们很少真正仔细考虑我们在做什么,或者这个库的存在指出了 FSF 建造教堂式开发模式的什么问题,
1992 年我曾经做了一次严肃的尝试,想把 Ohio 的大量代码正式合并到 Emacs 的官方 Lisp 库中,结果
我陷入了政治斗争中,彻底失败了。

但是一年之后,在 Linux 广泛应用之后,很清楚,一些不同的更加健康的东西诞生了, Linus 的开


发模式正好与建造教堂方式相反,Sunsite 和 tsx-11 的库开始成长,推动了许多发布。所有这些都是
闻所未闻的频繁的内核系统的发布所推动的。

Linus 以所有实际可能的方式把它的用户作为协作开发人员。

7. 早发布、常发布、听取客户的建议
Linus 的创新并不是这个(这在 Unix 世界中是一个长期传统),而是把它扩展到和他所开发的东西
的复杂程度相匹配的地步,在早期一天一次发布对他来说都不是罕见的!而且因为他培育了他的协作开发
者基础,比其他任何人更努力地充分利用了 Internet 进行合作,所以这确实能行。

但是它是怎样进行的呢?它是我能模仿的吗?还是这依赖于 Linus 的独特天才?

我不这样想,我承认 Linus 是一个极好的黑客(我们有多少人能够做出一个完整的高质量的操作系


统内核?),但是 Linux 并不是一个令人敬畏的概念上的飞跃,Linus 不是(至少还不曾是)象 Richard
stallman 或 James Gosling 一样的创新天才,在我看来,Linus 更象一个工程天才,具有避免错误
和开发失败的第六感觉,掌握了发现从 A 点到 B 点代价最小的路径的决窍,确实,Linux 的整个设计受
益于这个特质,并反映出 Linus 的本质上保守和简化设计的方法。

如果快速的发布和充分利用 Internet 不是偶然而是 Linus 的对代价最小的路径的洞察力的工程天


才的内在部分,那么他极大增强了什么?他创建了什么样的方法?

问题回答了它自己,Linus 保持他的黑客用户经常受到激励和奖赏:被行动的自我满足的希望所激
励,而奖赏则是经常(甚至每天)都看到工作在进步。

Linus 直接瞄准了争取最多的投入调试和开发的人时,甚至冒代码不稳定和一旦有非常棘手的错误
而失去用户基础的险,Linus 似乎相信下面这个:

8. 如果有一个足够大的 beta 测试人员和协作开发人员的基础,几乎所有的


问题都可以被快速的找出并被一些人纠正。
或者更不正式的讲:“如果有足够多的眼睛,所有的错误都是浅显的” (群众的眼睛是雪亮的),我
把这称为“Linus 定律”。

我最初的表述是每个问题“对某些人是透明的”, Linus 反对说,理解和修订问题的那个人不一定


oss.linuxpk.com
源 2008 年第 11 期 143
布道开源
非是甚至往往不是首先发现它的人,“某个人发现了问题”,他说,“另一个理解它,我认为发现它是
个更大的挑战”,但是要点是所有事都趋向于迅速发生。

我认为这是建造教堂和集市模式的核心区别,在建造教堂模式的编程模式看来,错误和编程问题是
狡猾的、阴险的、隐藏很深的现象,花费几个月的仔细检查,也不能给你多大确保把它们都挑出来的信
心,因此很长的发布周期,和在长期等待之后并没有得到完美的版本发布所引起的失望都是不可避免的。

以市集模式观点来看,在另一方面,我们认为错误是浅显的现象,或者至少当暴露给上千个热切的
协作开发人员,让他们来对每个新发布进行测试的时候,它们很快变得浅显了,所以我们经常发布来获
得更多的更正,作为一个有益的副作用,如果你偶尔做了一个笨拙的修改,也不会损失太多。也许我们
本不应该这样的惊奇,社会学家在几年前已经发现一群相同专业的(或相同无知的)观察者的平均观点比
在其中随机挑选一个来得更加可靠,他们称此为“Delhpi 效应 ”,Linus 所显示的证明在调试一个操
作系统时它也适用——Delphi 效应甚至可以战胜操作系统内核一级的复杂度。

我受 Jeff Dutky (dutky @ wam.umd.edu)的启发指出 Linus 定律可以重新表述为“调试可以


并行”,Jeff 观察到虽然调试工作需要调试人员和对应的开发人员相交流,但它不需要在调试人员之间
进行大量的协调,于是它就没有陷入开发时遇到的平方复杂度和管理开销。

在实际中,由于重复劳动而导致的理论上的丧失效率的现象在 Linux 世界中并不是一个大问题,“


早发布、常发布策略”的一个效果就是利用快速的传播反馈修订来使重复劳动达到最小。

Brooks 甚至做了一个与 Jeff 相关的更精确的观察:“维护一个广泛使用的程序的成本一般是其开


发成本的 40%,奇怪的是这个成本受到用户个数的强烈影响,更多的用户发现更多的错误”(我的强调)。

更多的用户发现更多的错误是因为更多的用户提供了更多测试程序的方法,当用户是协作开发人员
时这个效果被放大了,每个找寻错误的人都有自己稍微不同的感觉和分析工具,从不同角度来看待问题。
“Delphi 效应”似乎因为这个变体工作变得更加精确,在调试的情况下,这个变体同时减小了重复劳动。

所以加入更多的 beta 测试人员虽不能从开发人员的 P.O.V 中减小“最深”的错误的复杂度,但是


它增加了这样一种可能性,即某个人的工具和问题正好匹配,而这个错误对这个人来说是浅显的。

Linus 也做了一些改进,如果有一些严重的错误,Linux 内核的版本在编号上做了些处理,让用户


可以自己选择是运行上一个“稳定”的版本,还是冒遇到错误的险而得到新特征,这个战略还没被大多
数 Linux 黑客所仿效,但它应该被仿效,存在两个选择的事实让二者都很吸引 人。

五、什么时候玫瑰不是玫瑰?


oss.linuxpk.com
源 2008 年第 11 期 144
布道开源
在研究了 Linus 的行为和形成了为什么它成功的理论之后,我决定在我的工程(显然没有那么复杂
和雄心勃勃)里有意识的测试这个理论。

但我首先做的事是熟悉和简化 Popclient。 Carl Harris 的实现非常好,但是有一种对许多 C 程


序来说没有必要的复杂性。他把代码当作核心而把数据结构当作对代码的支持,结果是代码非常漂亮但
是数据结构设计得很特别,相当丑陋(至少对以这个老 LISP 黑客的标准来看),然而除了提高代码和数
据结构设计之外,重写它还有一个目的,就是要把它演化为我彻底理解的东西,对修改你不理解的程序
中的错误负责可不是一件有趣的事。

第一个月我只是在领会 Carl's 的基本设计的含义,我所做的第一个重大修改是加入了 IMAP 支持,


我把协议机重新组织为一个通用驱动程序和三个方法表 (对应 POP2、POP3 和 IMAP),这个前面的修改
指出一个需要程序员(特别是象 C 这种没有自然的动态类型支持的语言)记在脑中的一般原理:

9. 聪明的数据结构和笨拙的代码要比相反的搭配工作的更好
Fred Brooks 也在他第 11 章中讲道:“让我看你的[代码],把你的[数据结构]隐藏起来,我还
是会迷惑;让我看看你的[数据结构],那我就不需要你的[代码]了,它是显而易见的”。

实际上,他说的是“流程图”和“表”,但是在三十年的术语/文化演进之后,事情还是一样的。

此时(1996 年 9 月初,在从零开始六个月后),我开始想接下来修改名字——毕竟,它已不仅仅是
一个 POP 客户,但我犹豫了,因为还没有什么新的漂亮设计呢,我的 popclient 版本需要有自己的特
色。

当 fetehmail 学会怎样把取到的邮件转送到 SMTP 端口时,事情就完全改变了,但是首先:上面我


说过我决定使用这个工程来测试我关于 Linus Torualds 所做的行为的理论,(你可能会问)我怎样做
到这点呢? 以下面的方式:

    1. 我尽早尽量频繁的发布(几乎从未少于每十天发布一次;在密集开发的时候是每天一
次)。

    2. 我把每一个和我讨论 fetchmail 的人加入一个 beta 表中。

    3. 每当我发布我都向 beta 表中的人发出通告,鼓励人们参与。

    4. 我听取 beta 测试员的意见,向他们询问设计决策,对他们寄来的补丁和反馈表示感谢 。

这些简单的手段立即收到的回报,在工程的开始,我收到了一些错误报告,其质量足以使开发者因
此被杀掉,而且经常还附有补丁、我得到了理智的批评,有趣的邮件,和聪明的特征建议,这导致了:


oss.linuxpk.com
源 2008 年第 11 期 145
布道开源
10. 如果你象对待最宝贵的资源一样对待你的 beta 测试员,他们就会成为你

最宝贵的资源。

六、popclient 变成了 Fetchmail


这个工程的真正转折点是 Harry Hochleiser 寄给我他写的代码草稿,他把邮件转发到客户端机
器的 SMTP 端口,我立即意识到这个特征的可靠实现将淘汰所有其他的递送模式。

几个星期以来我一直在修改而不是改进 fetchmail,因为我觉得界面设计虽然有用但是太笨拙琐碎
了,到处充满了太多的粗陋的细小选项。

当我思考 SMTP 转发时我发现 popclient 试图做的事太多了,它被设计成既是一个邮件传输代理


(MTA)也是一个本地递送代理(MDA)。使用 SMTP 转发,它就可以从 MDA 的事务中解脱出来而成为一个
纯 MTA,而象 sendmail 一样把邮件交给本地递送程序来处理。

既然端口 25 在所有支撑 TCP/IP 的平台上早已被预留,为什么还要为一个邮件传输代理的配置或


为一个邮箱设置加锁的附加功能而操心呢?尤其是当这意味着抽取的邮件就象一个正常的发送者发出的
SMTP 邮件一样,而这就是我们需要的。

这里有几个教益:第一,SMTP 转发的想法是我有意识地模拟 Linus 的方法以来的最大的单个回报,


一个用户告诉我这个非同寻常的想法——我所需做的只是理解它的含义。

11. 想出好主意是好事,从你的用户那里发现好主意也是好事,有时候后者

更好。
很有趣的是,你很快将发现,如果你完全承认你从其他人那里得到多少教益的话,整个世界将会认
为所有的发明都是你做出的,而你会对你的天才变得谦虚。我们可以看到这在 Linus 身上体现得多明显!
(当我在 1997 年 8 月的 Perl 会议上发表这个论文时,Larry Wall 坐在前排,当我讲到上面的观点时,
他激动的叫了出来:“对了!说对了!哥们!”所有的听众都哄堂大笑起来,因为他们知道同样的事情也发
生在 Perl 的发明者身上)。

于是在同样精神指导下工程进行了几个星期,我开始不光从我的用户那儿也从听说我的系统的人那
儿得到类似的赞扬,我把一些这种邮件收藏起来,我将在我开始怀疑自己的生命是否有价值时重新读读
这些信。:)

但是有两个更基本的,非政治性的对所有设计都有普遍意义的教益。


oss.linuxpk.com
源 2008 年第 11 期 146
布道开源
12. 最重要和最有创新的解决方案常常来自于你认识到你对问题的概念是错

误的。
一个衡量 fetchmail 成功的有趣方式是工程的 beta 测试人员表(fegtchmail 的朋友们)的长度,
在创立它的时候已经有 249 个成员了,而且每个星期增加两到三个。

实际上,当我在 1997 年 5 月校订它时,这张表开始因为一个有趣的原因而缩短了,有几个人请求我


把他们从表中去掉,因为 fetchmail 已经工作的如此之好,他们不需要看到这些邮件了!也许这是一个
成熟的市集风格工程的生命周期的一部分。

我以前一直在解决错误的问题,把 popclient 当作 MTA 和具有许多本地递送模式的 MDA 的结合物,


Fetchmail 的设计需要从头考虑为一个纯的 MTA,做为一个普通 Internet 邮件路径的一部分。

当你在开发中碰了壁时(当你发现自己很难想通下一步时),那通常不是要问自己是否找到正确答案,
而是要问是否问了正确问题,也许需要重新构造问题。

于是,我重新构造了我的问题,很清楚,要做的正确的事是 (1)把 SMTP 转发支持放在通用驱动程序


中,(2)把它做为缺省模式,(3)最终分离所有其他的递送模式,尤其是递送到文件和标准输出的选项。

我在第三步上犹豫了一下,担心会让 popdiant 的长期用户对新的递送方法感到烦心,在理论上,


他们可以立即转而转发文件或者他们的非 sendmail 等价物来得到同样的效果,在实际中这种转换可能
会很麻烦。

但是当我这么做之后,证明好处是巨大的,驱动程序代码的冗余的部分消失了,配置完全变得简单
了——不用屈从于系统 MDA 和用户的邮箱,也不用为下层 OS 是否支持文件锁定而担心了。

而且,丢失邮件的唯一漏洞也被堵死了,如果你选择了递送到一个文件而磁盘已满,你的邮件就会
丢失,这在 SMTP 转发中不会发生,因为 SMTP 侦听器不会返回 OK 的,除非邮件可以递送成功或至少被
缓冲留待以后递送。

还有,性能也改善了(虽然在单次执行中你不会注意到),这个修改的另一个不可忽视的好处是手册
变得大大简单了。

后来,为了允许处理一些罕见的情况,包括动态 SLIP,我必须回到让用户定义本地 MDA 递送上来,


但是我发现了一个更加简单的方法。

所有这些给了我们什么启发呢?如果可以不损失效率,就要毫不犹豫抛弃陈旧的特性,Antonine
de Saint-Exupery(在他成为经典儿童书籍作家之前是一个飞行员和飞机设计师)曾说过:


oss.linuxpk.com
源 2008 年第 11 期 147
布道开源
13. “最好的设计不是再也没有什么东西可以添加了,而是再也没有什么东

西可以去掉。”
当你的代码变得更好和更简单时,这就是你知道它是正确的时候了,而且在这个过程中 ,
fetehmail 的设计具有了自己的特点,而区别于其前身 popclient。

现在是改名的时候了,这个新的设计看起来比老 popclient 更象一个 sendmail 的复制品,它们


都是 MTA,但是 Senmail 是推然后递送,而新的 popclient 是拉然后递送。于是,在两个月之后,我
把它重新命名为 fetehmail。

七、Fetchmail 成长起来
现在我有了一个简洁和富有创意的设计,工作得很好的代码,因为我每天都用它,和一直在增长的
beta 表,它让我渐渐明白我已经不是在从事只能对少数其他人有用的工作中,我写了一个所有有一个
Unix 邮箱和 SLIP/PPP 邮件连接的人都真正需要的程序。

通过 SMTP 转发功能,它成为一个潜在的“目录杀手”,远远领先于它的竞争者,这个程序如此能干
以至于其他的程序不但被放弃简直被忘记了。

我知道你不可以真得瞄准或计划出这样的结果,你只能努力去设计这些强大的思想,以后这些结果
就好象是不可避免的、自然的、注定了的,得到这种思想的唯一办法是获取许多思想,或者用工程化的
思考其他人的好主意而超过原来想到它的人的设想。

Andrew Tanenbanm 原来设想建造一个适合 386 的简单的 Unix 用做教学,Linus Torvalels


把 Andrew 的可能想到的 Minix 可以做什么的概念推进了一步,成长为一个极好的东西,同样的 (虽然
规模较小),我接受了 Card Harris 和 Harry Hochheiser 的想法,把它们变得更强大,我们都不是
人们所浪漫幻想的天才的创始人,但是大多数科学和工程和软件开发不是被天才的创始人完成的,这和
流传的神话恰恰相反。

结果总是执着的原因——实际上,它是每个黑客为之生存的成功 !而且它们意味着我必须把自己的标
准定高一点,为了把 fetchmail 变得和我所能设想的那样好,我必须不仅为我自己的需要写代码,而且
也要包括对在我生活围主页外的人们的需求的支持,而且同时也要保证程序的简单和健壮。

在实现它之后我首先写的最重要的特征是支持多投——从集中一组用户的邮件的邮箱中取出邮件,
然后把它路由到每个人手中。

我之所以加上多投功能部分是因为有些用户一直在闹着要它,更是因为我想它可以从单投的代码中
揭露出错误来,让我完全一般地处理寻址,而且这被证明了。正确解释 RFC822 花了我相当长的时间,
不仅因为它的每个单独部分都很难,而且因为它有一大堆相互依赖的苛刻的细节。


oss.linuxpk.com
源 2008 年第 11 期 148
布道开源
但是多投寻址也成为一个极好的设计决策,由此我知道:

14. 任何工具都应该能以预想的方式使用,但是一个伟大的工具提供你没料

到的功能。
Fetchmant 多投功能的一个没有料到的用途是在 SLIP/PPP 的客户端提供邮件列表、别名扩展。
这意味着一个使用个人机器的人不必持续访问 ISP 的别名文件就能通过一个 ISP 帐户管理一个邮件列表。
我的 beta 测试员提出的另一个重要的改变是支持 8 位 MIME 操作,这很容易做,因为我已经仔细的保证
了 8 位代码的清晰,不仅因为我预见到了这个特性的需求,而且因为我忠实于另一准则:

15. 当写任何种类的网关型程序时,多费点力,尽量少干扰数据流,永远不

要抛弃信息,除非接收方强迫这么作!
如果我不遵从这个准则,那么 8 位 MIME 支持将会变得困难和笨拙,现在我所需要做的,是只读一下
RFC 1652,在产生信头的逻辑加上一点而已。

一些欧洲用户要求我加上一个选项来限制每次会话取得消息数(这样他们就可以从昂贵的电话网中控
制花费了),我很长一段时间拒绝这样做,而且我仍然对它不很高兴,但是如果你是为了世界而写代码,
你必须听取顾客的意见——这并不随他们不付给你钱而改变。

八、从 Fetchmail 得来的另一些教益


在他们回到一般的软件工程问题以前,还有几个从 fetchmail 得到的教益需要思考。

rc 文件语法包括可选的“noise”关键字,它被扫描器完全忽略了,当你把它们全抽取出的时候,
关键字/值对更具可读性。

当我注意到 rc 文件的声明在多大程度上开始象一个微型命令语言时,这是一个 Late-night 的体


验(这也是我为什么把 popclient 原来的“server”关键字改成了“poll”)。

对我来说似乎把这个微型命令语言变得更象英语可能会使它更容易使用。现在,虽然我对经过
Emacs 和 HTML 及许多数据库引擎所证实的“把它做成一个语言”的设计方式确信不疑,但是我并不是
一个通常的“类英语”语法的狂热拥护者。

传统程序员容易控制语法使它尽量精确和紧凑,完全没有冗余,这是计算机资源还很昂贵时遗留下
的一种文化传统,所以扫描策略需要尽可能的廉价和简单,而具有 50%冗余度的英语,看来好象是一个
非常不合适的模型。


oss.linuxpk.com
源 2008 年第 11 期 149
布道开源
这并不是我不用类英语语法的原因,我提到这一点是为了推翻它,在更廉价的时钟周期与核心的时
代,简洁并没有走到尽头,今天对一个语言来说,对人更方便比对机器更廉价来的更加重要。

然而,有几个原因提醒我们小心一点,一个是扫描策略的复杂度开销——你并不想把它变成一个巨
大的错误来源和让用户困惑,另一个是试图使语言表面上的类似可以和传统语言一样令人困惑(你可以在
许多 4GL 和商业数据库查询语言上看到这一点)。

Fetchmail 的控制语法避免了这些问题,因为语言的领域是极其有限的。它一点也不象一个一般性
的语言,它很简单地描述的东西并不复杂,所以很少可能在英语的一个小子集与实际的控制语言之间发
生混淆,我想这有一个更广泛的教益:

16. 如果你的语言一点也不象是图灵完备的,严格的语法会有好处。
另一个教益是关于安全的,一些 fetchmail 用户要求我修改软件把口令加密存贮在 rc 文件里,这
样觑探者就不能看到它们了。

我没有这样做,因为这实际上起不到任何保护作用,任何有权读取你的 rc 文件的人都可以以你的名
义运行 fetchmail——如果他们要破你的口令,它们可以从 fetchmail 的代码中找到制作解码器的方法。

所以 fetchmail 口令的加密都会给那些不慎重思考的人一种安全的错觉,这里一般性的准则是:

17. 一个安全系统只能和它的秘密一样安全,当心伪安全。

九、集市风格的必要的先决条件
本文的早期评审人员和测试人员坚持提出成功的市集模式开发的先决条件,包括工程领导人的资格
问题和在把项目公开和开始建造一个协作开发人员的社团的时候代码的状态。

相当清楚,不能以一个市集模式从头开发一个软件,我们可以以市集模式、测试、调试和改进,但
是以市集模式从头开始一个项目将是非常困难的,Linus 没有这样做,我也没有,初期的开发人员的社
团应该有一此可以运行和测试的东西来玩。

当你开始创建社团时,你需要演示的是一个诺言,你的程序不需要工作的很好,它可以很粗糙、很
笨拙、不完整和缺少文档、它不能忽略的东西是要吸引哪些人卷入一个整洁的项目。

Linux 和 fetchmail 都是以一个吸引人的基本设计进入公共领域的,许多和我一样在思考市集模


式的人已经正确的认为这是非常关键的,然后得出了一个结论,工程领导者的高度的设计直觉和聪颖是
必不可少的。


oss.linuxpk.com
源 2008 年第 11 期 150
布道开源
但是 Linus 是从 Unix 得到他的设计的,我最初是从先前的 popmail 得到启发的(虽然相对 Linux
而言,它最后改变巨大),所以市集风格的领导人/协调人需要有出众的设计才能,或者他可以利用别人
的设计才能?

我认为能够提出卓越的原始设计思想对协调人来说不是最关键的,但是对他/她来说绝对关键的是
要能把从他人那里得到的好的设计重新组织起来。

Linux 和 fetchmail 项目都显示了这些证据,Linus(如同前面所说)并不是惊人的原始设计者,


但他显示了发现好的设计并把它集成到 Linux 内核中的强大决窍。还有我也描述了怎样从别人那里得到
了 fetchmail 中最强大的设计思想(SMTP 转发)。

本文的早期读者称赞我,说因为我做了许多关于原始设计的事,所以倾向于低估原始设计在市集项
目中的价值,也许有些是对的吧,但是设计(而不是编码或调试)本来就是我最强的能力。

变得聪明和软件设计的原始创作的问题是它会变成一个习惯,当需要保持事物健壮和简洁的时候,
你却开始把事情变得漂亮但却复杂。我曾经犯过错误,使得一些项目因我而崩溃了,但我努力不让它发
生在 fetchmail 身上。

所以我相信 fetchmail 项目的成功部分是因为我抑制自己不要变得太聪明,这说明(至少)对市集


模式而言原始设计并不是本质的,请考察一下 Linux 假设 Linus Torvalds 在开发时试图彻底革新操
作系统设计,它还会象今天我们所拥有的内核那样稳定和成功吗?

当然基本的设计和编码技巧还是必需的,但我希望每个严肃考虑发起一个市集计划的人都已至少具
备这些能力,自由软件社团的内部市场对人们有某些微妙的压力,让他们不要发起自由不能搞定的开发,
目前为止,这工作得仍然相当好。

对市集项目来说,我认为还有另一种通常与软件开发无关的技能和设计能力同样重要——或者更加
重要,市集项目的协调人或领导人必须有良好的人际和交流能力。

这是很显然的,为了建造一个开发社团,你需要吸引人,你所做的东西要让他们感到有趣,而且要
保持他们对他们正在做的工作感到有趣,而且要保持他们对他们正在做的工作感到高兴,技术方面对达
成这些目标有一定帮助,但这远远不是全部,你的个人素质也有关系。

并不是说 Linus 是一个好小伙子,让人们喜爱并乐于帮助他,也并不是说我是个积极外向的,喜欢


扎堆儿工作,有出众的幽默感的人,对市集模式的工作而言,至少有一点吸引人的技巧是非常有帮助的。

十、自由软件的社会学语境
下述如实:最好的开发是从作者解决每天工作中的个人问题开始的,因为它对一大类用户来说是一


oss.linuxpk.com
源 2008 年第 11 期 151
布道开源
个典型问题,所以它就推广开来了,这把我们带回到准则 1,也许是用一个更有用的方式来描述:

18. 要解决一个有趣的问题,请从发现让你感兴趣的问题开始。
这是 Carl Harris 和原先的 popclient 的情形,也是我和 fetchmail 的情形,但这已在很长一
段时间被大家知晓了,Linux 和 fetchmail 的历史要求我们注意的有趣之处是下一个阶段——软件在
一个庞大的活跃的用户和协作开发人员的社团中的进化。

在《神秘的人月》一书中,Fred Brooks 观察到程序员的工作时间是不可替代的:在一个误了工期


的软件项目中增加开发人员只会让它拖得更久,他声称项目的复杂度和通讯开销以开发人员的平方增长,
而工作成绩只是以线性增长,这个说法被称为“Brooks 定律”,被普遍当作真理,但如果 Brooks 定律
就是全部,那 Linux 就不可能成功。

几年之后,Gerald Weinbeng 的经典之作“The Psychology Of Computer Progromming”


为我们更正了 Brooks 的看法,在他的“忘我(egoless)的编程”中,Weinberg 观察到在开发人员不
顽固保守自己的代码,鼓励其他人寻找错误和发展潜力的地方,软件的改进的速度会比其他地方有戏剧
性的提高。

Weinberg 的用词可阻止了他的分析得到应有的接受,人们对把 Internet 黑客称为“忘我”的想


法微笑,但是我想今天他的想法比以往任何时候都要引人注目。


oss.linuxpk.com
源 2008 年第 11 期 152
布道开源
Unix 的历史已经为我们准备好了我们正在从 Linux 学到的(和我在更小规模上模仿 Linus 的方法
所验证的)东西,这就是,虽然编码仍是一个人干的活,真正伟大的工作来自于利用整个社团的注意和脑
力,在一个封闭的项目中只利用他自己的脑力的人会落在知道怎样创建一个开放的、进化的,成百上千
的人在其中查找错误和进行修改的环境的开发人员之后。

但是 Unix 的传统中有几个因素阻止把这种方法推到极致。一个是各种授权的法律约束、商业机密和
商业利益,另一个(事后来看)是 Internet 还不够好。

在 Internet 变得便宜之前,有一些在地理上紧密的社团,它们的文化鼓励 Weingberg 的“忘我


”编程,一个开发人员很容易吸引许多熟练的人和协作开发人员,贝尔实验室, MIT A1 实验室,UC
Berkeley,都成为传统的、今天仍然是革新的源泉。

Linux 是第一个有意识的成功的利用整个世界做为它的头脑库的项目,我不认为 Linux 的孕育和万


维网的诞生相一致是一个巧合,而且 Linux 在 1993-1994 的一段 ISP 工业大发展和对 Internet 的兴
趣爆炸式增长的时期中成长起来,Linus 是第一个学会怎样利用 Internet 的新规的人。

廉价的 Internet 对 Linux 模式的演化来说是一个必要条件,但它并不充分,另一个关键因素是领


导风格的开发和一套协作的氛围使开发人员可以吸引协作开发人员和最大限度地利用媒体。

但是这种领导风格与氛围到底是什么呢?它不能建立在权力关系之上——甚至如果它们可以,高压的
领导权力不能产生我们所看到的结果,Weinberg 引用了 19 世纪俄国的无政府主义者 Kropotkin 的
“Memoris of a Revolutionist”来证明这个观点:

“我从小生活在一个农奴主的家庭中,我有一个活跃的生活,象我们时代的所有年轻人一样,我深
信命令、强制、责骂、惩罚等等的必要性。但是当我(在早期)必须管理一个企业,和(自由)人打交道时,
当每一个错误都会产生严重后果时,我开始接受以命令和纪律为准则来行动和以普通理解为准则来行动
的区别。前者在军事阅兵中工作的很好,但是它在现实生活中一文不值,目标达成只是靠许多愿望的聚
合的简单后果。”“许多聚合在一起的愿望的直接后果”精确地指出了象 Linux 的项目所需要的东西。
“命令的准则”在 Internet 这种无政府主义的天堂中一群自愿者之中是没有市场的,为了更有效的操
作和竞争,想领导协作项目的黑客们必须学会怎样以 Kropotkins 含糊指出的“理解的准则”模式来恢
复和激活社团的力量,他们必须学会使用 Linus 定律。

前面我引用“Delhpi 效应”来作为 Linus 定律的一个可能的解释,但是来自生物学和经常学的自


适应系统的更强大的分析也提出了自己的解释,Linus 世界的行为更象一个自由市场或生态系统,由一
大群自私的个体组成,它们试图取得(自己)最大的实效,在这个过程中产生了比任何一种中央计划都细
致和高效的自发的改进的结果,所以,这里就是寻找“理解的准则”的地方。

Linux 黑客取得的最大化的“实际利益”不是经典的经济利益,而是无形的他们的自我满足和在其
他黑客中的声望,(有人会说他们的动机是“利他的”,但这忽略了这样的事实:利他主义本身是利他主


oss.linuxpk.com
源 2008 年第 11 期 153
布道开源
义者的一种自我满足的形式),自愿的文化以这种方式工作的实际上并非不寻常,我已参与一个科幻迷团
体很长时间了,它不象黑客团体一样,显式地识别出“egoboo”(一个人在其他爱好者之中的声望的增长)
作为自愿者活动背后的基础驱动力)。

Linus 成功地把自己置于项目的守门人的位置,在项目中开发大部分是别人做的,他只是在项目中
培养兴趣直到它可以自己发展下去,这为我们展示了对 Kropokin 的“共同理解原则”的敏锐把握,对
Linux 这种类似经济学的观点让我们看到这种理解是怎样应用的。

我们可以把 Linus 的方法视为创建一个高效的关于“egoboo”(而不是钱)的市场,来把自私的黑客


个体尽可能紧密的联系起来,达成只能通过高度协作才能得到的困难的结果,在 fetchmail 项目中我展
示了(在较小规模上)这种模式可以复制,得到良好的结果,也许我比他更有意识一点、更加系统一点。

许多人(尤其是哪些由于政治原因不信任自由市场的人)会盼望自我导向的自我主义者的文化破碎、
报废、秘密和敌对,但这种盼望很明显地被 Linux 的文档的多样性、质量和深度打破了,程序员讨厌写
文档似乎已是圣训,但 Linux 的黑客们怎么产生了这么多?显然 Linux 的 egoboo 自由市场比有大量资
金的商业软件产品的文档部在产生有品德的、他人导向的行为方面工作的更好。

Fetchmail 和 Linux 内核项目都表明,通过恰当的表彰许多其他黑客,一个强大的开发者/协调


者可以用 Internet 得到许多协同开发人员而不是让项目分崩离析为一片混乱,所以关于 Brooks 定律
我得到了下面的想法:

19. 如果开发协调人员有至少和 Internet 一样好的媒介,而且知道怎样不通


过强迫来领导,许多头脑将不可避免地比一个好。
我认为自由软件的将来将属于那些知道怎样玩 Linus 的游戏的人,把大教堂抛之脑后拥抱市集的人,
这并不是说个人的观点与才气不再重要,而是,我认为自由软件的前沿将属于从个人观点和才气出发的
人,然后通过共同兴趣自愿社团的高效建造来扩展。

可能不只是自由软件的将来,在解决问题方面,没有任何商业性开发者可以与 Linux 社团的头脑库


相匹敌,很少有人能负担起雇佣 200 多个为 fetchmail 出过力的人!

也许最终自由软件文化将胜利,不是因为协作在道德上是正确的或软件“囤积居奇”在道德上是错
的(假设你相信后者,Linus 和我都不),而仅仅是因为商业世界在进化的军备竞赛中不能战胜自由软件
社团,因为后者可以把更大更好的开发资源放在解决问题上。


oss.linuxpk.com
源 2008 年第 11 期 154
编读往来

Linuxpk.com 十月十大热门帖

大型网站架构演变
http://bbs.linuxpk.com/thread-36093-1-1.html

应对微软黑屏的解决方案
http://bbs.linuxpk.com/thread-35922-1-1.html

haproxy 部署介绍
http://bbs.linuxpk.com/thread-35812-1-1.html

让你的 Firefox 飞起来(Firefox 超速绝密方法)


http://bbs.linuxpk.com/thread-35973-1-1.html

Linux 性能监测工具
http://bbs.linuxpk.com/thread-35899-1-1.html

(原创)ORACLE 的聚合函数怎么了?
http://bbs.linuxpk.com/thread-36081-1-1.html

PHP 负载均衡指南
http://bbs.linuxpk.com/thread-35984-1-1.html

轻松实现 Apache,Tomcat 集群和负载均衡


http://bbs.linuxpk.com/thread-36000-1-1.html

一份关于软件集成测试的考题(一)
http://bbs.linuxpk.com/thread-35998-1-1.html

本站 sns 开通“中国开源校园”
http://bbs.linuxpk.com/thread-35740-1-1.html


oss.linuxpk.com 源 2008 年第 11 期 155
封底

You might also like