Professional Documents
Culture Documents
开源 2008 年第 7 期 1
卷首语
苹果是敌 微软是友
开源 2008 年第 7 期 2
卷首语
开源 2008 年第 7 期 3
目录
开源 2008 年第 7 期 4
目录
目 录
卷首语
苹果是敌 微软是友.................................................................................................................... 2
产业聚焦
陆首群教授出任《开源》主席.................................................................................................... 7
Mozilla 终获吉尼斯证书............................................................................................................... 8
腾讯研发官方版 Linux QQ 即将问世.......................................................................................... 9
移动文档格式 PDF 已获批国际标准......................................................................................... 10
Linux 厂商 Xandros 收购 Linspire............................................................................................... 10
16000 玩家向暴雪请愿“Diablo 3 Linux”.................................................................................. 11
Sun 与英特尔共推 Solaris 最优化............................................................................................... 11
红帽加强对华投入 欲打破三足鼎立........................................................................................ 12
《第二人生》面临开源竞争对手.............................................................................................. 13
Google 发布基于开源的 C++测试框架...................................................................................... 13
Novell 为超级计算机提供 Linux 服务器.................................................................................... 14
Linux 之父 10 大名言:微软操作系统性能太次...................................................................... 14
Linux 开源手机 FreeRunner 实机预览........................................................................................ 15
调查显示:开源程序及项目多达 22 万种.................................................................................... 16
专题
走近开源...................................................................................................................................... 18
开源软件为中国软件提供了发展机遇...................................................................................... 23
开源软件开发创新机制...............................................................................................................27
坚持开源软件的创新之路.......................................................................................................... 29
关于 Linux 和 Windows 的互操作问题...................................................................................... 33
对陆首群“坚持开源软件的创新之路”一文的讨论.............................................................. 35
开源社区
文泉驿中文字体之“祈祷”发布.............................................................................................. 37
GNOME 3 公布消息披露............................................................................................................ 37
CentOS 5.2 i386 LiveCD 发布..................................................................................................... 38
Gentoo Linux 2008.0 正式发布................................................................................................... 39
Linux 输入法 Fitx 0.2.0 发布....................................................................................................... 39
Windows 兼容系统 ReactOS 0.3.5 发布...................................................................................... 40
盘点开源世界的 2007.................................................................................................................. 41
走近 Erlang 世界.......................................................................................................................... 44
开源 2008 年第 7 期 5
目录
知识学堂
Linux 下设备完全驱动(二).................................................................................................... 49
PC 的足迹(上)......................................................................................................................... 65
经验技巧
Linux 一句话精彩问答——系统配置篇(5).......................................................................... 72
netstat 把脉 Linux 系统状态........................................................................................................ 76
用 TC 实现动态带宽分配............................................................................................................ 78
多方法实现 HTTP 访问的负载均衡........................................................................................... 81
挂载(mount)命令使用技巧....................................................................................................... 85
“僵尸”进程必杀技.................................................................................................................. 86
轻松玩转 Firefox(2) .....................................................................................................................88
50 个让你疯狂的软件.................................................................................................................. 94
企业应用
构造 chroot 服务监禁................................................................................................................... 99
邮件客户端整合 LDAP............................................................................................................. 111
使用开源 CRM 进行客户关系管理.......................................................................................... 115
嵌入式
uC/OS-II 在 SkyEye 上的移植分析........................................................................................... 117
嵌入式 Linux 培训之路............................................................................................................. 126
如何看懂 man page?................................................................................................................ 128
开源小知识..................................................................................................................................... 139
开源 2008 年第 7 期 6
产业聚焦
产业聚焦
陆首群教授出任《开源》主席
应《开源》电子杂志邀请,中国开源软件(OSS)推进联盟(COPU)主席陆首群教授出任《开源》
电子杂志主席。
《开源》电子杂志成功发行六期,已经成为中国开源领域下
载量最大、传播范围最广、影响最深的电子期刊杂志。在不断发
展的同时,也得到了中国开源软件推进联盟的指导和支持,尤其
陆主席在百忙之中阅读杂志,并给予建议与鼓励。作为中国开源
世界的领袖,COPU 一直致力于中国开源产业的发展与应用,
在中国开源领域享有极高的声望与地位,尤其陆首群主席作为中国开源业界的泰斗,其先进的理念一直
为我国的开源事业发展提供指导。陆首群教授出任《开源》电子杂志主席,将更多地对杂志方向进行把
握,必将为《开源》电子杂志的发展带来无限生机。
陆首群简介:
陆首群教授现任中国开放源码软件推进联盟(China Open
Source Software Promotion Union)主席,中国高校 Linux 推
进联盟(China Linux University Promotion Alliance)名誉主
席 , OSDL ( 开 放 源 码 开 发 实 验 室 ) 全 球 特 别 顾 问 ( Expert
Advisor of Open Source Development Labs),广东省开放源
码软件推进联盟名誉主席。
现任中国工业经济联合会副会长。
现任首都信息发展股份有限公司名誉董事长,北京网络多媒
体实验室主任。
曾应聘担任中国人民银行、国家广播电影电视部、北京市人
民政府、中国社会科学院、国家信息中心、航天工业部、中国华
能集团公司的信息化高级顾问。
开源 2008 年第 7 期 7
产业聚焦
曾任国务院信息办常务副主任。
曾任北京电子振兴办公室主任兼北京市政府电子工业办公室主任。
曾任中国长城计算机集团公司董事长,吉通通信公司董事长,中国联通公司筹建组负责人之一。
曾负责主持作为中国信息化标志的金桥工程、金关工程、金卡工程、金税工程总体规划和框架设计
工作。
曾担任创建中国第一批互联网、互联网信息管理中心和制定中国第一部互联网法规的国务院筹备组
负责人。
曾组织建设“首都之窗”(中国第一个电子政务网站)和“首都电子商城”(中国第一个进行电子商务
的交易场); 任商务部《中国电子商务》首席专家。
Mozilla 终获吉尼斯证书
近日,Mozilla 收到了吉尼斯世界纪录证书,这一记录被描述为“24 小时内下载量最大的软件”,
时间是 18:16 UTC on June 17, 2008 to 18:16 UTC on June 18,2008,数量是 8002530 名。
开源 2008 年第 7 期 8
产业聚焦
开源 2008 年第 7 期 9
产业聚焦
开源 2008 年第 7 期 10
产业聚焦
到目前为止,暴雪的开发者还没有给出回复。
开源 2008 年第 7 期 11
产业聚焦
红帽加强对华投入 欲打破三足鼎立
日前,消息人士表示红帽将加强对中国市场 前国内 IT 工程师招聘中有 20%以上要求应聘者具
的投入,以期突破目前国内 Linux 市场上红帽、 有 HCE 资格。
红旗、Novel 三足鼎立的局面。 第三、大力拓展咨询业务,这主要由于中国
据 悉 , 红 帽 在 2007 年 首 次 超 过 红 旗 与
Novel 成为中国市场占有第一。在其前不久公布
的 2009 财政年度第一季度业绩报告中,第一季
度的总收入为 1.566 亿美元,较上年同期增长
32%,较上个季度增长 11%。为继续保持市场第
一的位置,进一步拉开与其他两家厂商的差距,
红帽将开展四方面措施。
首先、红帽之前在渠道领域具有深厚的积累,
为扩大客户范围,红帽自去年下半年起开始在国
内专门设置针对直销、大客户的销售、客服团队。
第二、继续在教育领域扩大 HCE(Red Hat 大客户对于定制服务需求非常迫切。咨询业务是
认证工程师)在国内的认知度。据记者了解到目 目前红帽除订阅服务外力推的一大业务,在 09 财
开源 2008 年第 7 期 12
产业聚焦
《第二人生》面临开源竞争对手
现在,《第二人生》正面临一个真正的开源
竞争对手,OpenSimulator 项目的发展势头非常
强劲。IBM 宣布它在 OpenSimulator 和 Linden
服务器之间实现了协同工作。这意味着你能使用
《第二人生》的客户端去登录 OpenSim 服务器。
更远一步的是,任何人都可以运行自己的服务器。
“通过来自官方客户端的协议,开发者了解
到了《第二人生》工作的原理,实现了他们自己
的兼容服务器代码。”看起来《第二人生》中的
用户将个人资料、虚拟物品和他们在虚拟世界中
拥有的其它东西移植到一个“开放世界”服务器
Linden Labs 谈论了很长时间的《第二人生》
上,这只是一个时间上的问题。它将对 Linden
平台开源,但不确定是否真会这样,目前其客户
Labs 的“虚拟世界体验”构成了挑战。
端源代码已经公开,但服务器端没有。
开源 2008 年第 7 期 13
产业聚焦
—编译——测试周期中能发现并修复更多问题。 轻松地对不常见的情况定义新的断言。
对常见的测试需求提供很多断言,同时你也可以
Linux 之父 10 大名言:微软操作系统性能太次
北京时间 7 月 13 日消息,据国外媒体报道, 却又充满调侃意味而著称,并经常在不同场合与
Linux 操 作 系 统 创 始 人 林 纳 斯 托 · 瓦 尔 兹 (Linus 微软“对着干”。
Torvalds)一直提倡软件产品的共享理念,Linux
的出现,也在很大程度上改变了全球计算机产业 以下就是被外界引用最多的托瓦尔兹 10 条名
的格局。在日常生活中,托瓦尔兹以语言犀利、 言:
开源 2008 年第 7 期 14
产业聚焦
1、软件就像午餐一样,不要钱的总比收钱的
好吃。
2、微软并不是恶魔,只是他们做出来的操作
系统性能实在太次。
3、我叫林纳斯,也就是你们的上帝。
4、你不仅必须成为一位能够编出诸如 Linux
操作系统的优秀程序员,而且还得变成一名恬不
知耻的人。
5、如果你认为 Linux 的核心理念是“面临风
险而开怀大笑”,那你就错了;如果你认为
Linux 的出色之处是“自己动手”,这就对了。
6、很多用户曾对我表示,Linux 图标中使用
了胖乎乎的企鹅,让人感觉 Linux 有点笨重的意
味。说这些话的人,肯定没有看到企鹅生气后以
每小时 100 英里速度追赶人群的样子。 9、虚拟化在很多领域具有实用价值,对此我
7、要判断一个人是否真正聪明,那就要看他 并不怀疑。我最为怀疑的是,那些搞虚拟化软件
能否根本不用动手,而工作却又能完成。 的人,是否愿意让虚拟化软件发挥出其这种重大
8、如果你对别人说:“我写了一个程序,并 影响。
导致 Windows 崩溃。”其他人只会对你冷眼相 10、很多程序员都表示,每年圣诞节期间都
看:“我在安装该操作系统时,上面就免费带着 觉得无所事事,因为商店都已关门。这时候你们
了(让 Windows 崩溃的程序)。” 不妨试试 Linux 2.6.15-rc7 内核。反正除了吃饭
外,你们也没有别的事情可干。
开源 2008 年第 7 期 15
产业聚焦
调查显示:开源程序及项目多达 22 万种
随着互联网的发展,开源软件得到了长足的 载的开源软件探测工具,它可以扫描任何计算机
发展,同时也开始逐渐被一些企业使用。不过对 并将扫描结果以匿名的方式提交到开源调查项目
于企业用户来说,对于在企业环境尤其是生产环 的数据库中。一旦参与者提交了扫描结果后,他
境中使用开源还是保持着谨慎的态度。如何让开 们将有可以访问对他们自己使用开源软件情况进
源软件大规模的进入企业软件领域成为开源界的 行汇总的报告,并且可以与类似的公司进行对比。
一个重大使命。 OpenLogic 还免费提供通过开源调查所收集
的匿名汇总数据,这个汇总数据列出了在所有参
与企业和个人的计算机上每一个项目被安装的次
数和时间。该数据可以让开源社区和开发者能够
跟踪他们软件的使用记录。
这个调查正在引起全球开源界的关注。在前
让企业认识并接受开源软件
两个月中被扫描的计算机硬盘中有 66%来自于美
国之外的用户。在调查中比较活跃的参与者来自
去年 12 月份,企业开放源码软件解决方案供
诸如欧洲、加拿大和澳大利亚等地区。
货商 OpenLogic 发起了一个叫做开放源码调查
(Open Source Census,OSC)的协作项目,
首战告捷 将进行深入分析
来收集和分享开源软件使用的真实情况。
最初的赞助商包括 IDC、 CollabNet、
据该项目组织者声称,目前这个开源调查的
Olliance 组织、开放解决方案联盟、开源企业联
第三阶段将马上开始,前两个阶段主要是争取外
盟等。另外,OSC 项目还从开源开发社区中招募
界的支持,并形成一个可以指导进行全球调查的
了一些知名人士作为顾问,包括 Apache 基金会
框架,而第三阶段将进行深入的分析。
主席 Jim Jagielski 和 Tony Wasserman。
第一轮开源调查的数据主要是来自每一个参
OSC 的主要目标就是推动开源软件在企业中
与者计算机使用开源软件的情况。参与这次软件
的使用,OpenLogic 认为如果能够让企业看到它
扫描的公司代表将对其自己的桌面计算机进行扫
们或它们的伙伴公司已经在企业中采纳开源软件,
描,或者对公司内的某一小部分计算机进行扫描,
它们可能就会感到比较放心,才有信心让开源软
以得出调查数据。
件发挥更大的作用。同时通过 OSC 项目,开源社
根据到目前为止的数据显示,在企业办公室
区和开源厂商也可以审视它们的开源产品的推广
内安装的开源程序按照数量多少依次是 Firefox
和发展情况。
(火狐浏览器)、Xerces(开源 XML 解析器)、
OpenLogic 的市场高级副总裁 Kim Weins
Zlib(开源压缩工具)、Xalan 和 Prototype。
表示,“这个项目现在最大的动力是与企业实现
根据最近发布的调查结果显示,Linux 操作系统
合作,从它们单位中的计算机中选取更多的样本
Ubuntu 是其中被安装次数最多的 Linux 版本。
来提交数据。”
在参与调查的安装 Linux 操作系统的计算机
OpenLogic 为调查参与者提供了一个免费下
开源 2008 年第 7 期 16
产业聚焦
开源 2008 年第 7 期 17
专题
专题
走近开源
作者:刘梅 出处:CIO INSIGHT
有人认为,开源软件就等于质量低、不安全。中国开源软件推进联盟主席陆首群说,这
完全是误解。事实上,开源软件相对于传统商业软件的优势非常明显——安全、低成本、
灵活性和不依赖软件提供商。
在中国开源软件推进联盟主
席陆首群的办公室里,摆放着很
多记录重要时刻的照片,在其中
能找到近年来国家的主要领导人
以及世界各大 IT 企业的巨头、开
源领袖,当然也能找到陆首群。
这些照片向来访者述说着主人公
的辉煌:曾经身为全国知名的国
有大型企业的改革家,中国早期
经济和社会信息化的推动者、组
织者和领导者,后来又是一位成
功的 IT 企业创业者,同时又是一
位资深的网络和信息化专家。陆
首群的业绩数不胜数,可是他却
极少向外界讲述自己的个人历程。
虽然年过 70,陆首群仍然活
跃在他所热衷的开源事业里,为
此他卸任了很多职务,目前他主
要担任的职务有:中国开放源码
软件推进联盟(China
OpenSource Software
Promotion Union)主席、中国
高校 Linux 推进联盟(China
开源 2008 年第 7 期 18
专题
开源 2008 年第 7 期 19
专题
在企业的后续开发阶段,这个阶段是以“企
业”、“不公开”为特征的创新阶段,企业是有
可能在其中拥有自主知识产权的,但在这时从社
区获得的源代码或技术仍然要公开,而企业自己
开发的工程化实现技术则可以不公开。
CIOI:对 CIO 而言,他们最关注的是如何使开
源运动与企业开发做到无缝衔接,对此你怎么看?
陆首群:社区开发与企业开发有所分工,前
者为设计开发,后者为工程开发,两者构成了全
部的产品化技术。同时两者间也是分工互补的,
从而可以做到无缝衔接,以消除间隙。
我以前多次指出,Linux 发行商负责工程化
处 理 技 术 , 其 内 容 包 括 Linux 内 核 社 区
(kernel.org)的主干(Official)内核与发行商
的次干内核,它们之间允许存在 3~5%的偏差,
各种软件模块可以进行不同的优化配置,开源产
品必须进行兼容性测试和质量认证(Q.C.),这
也是软硬件整合的产品化技术。进行回归移植或
降级处理(BugFix,Patch),开展涉及改进使
用性的用户界面(UI)设计,进行外观工业设计
(ID),以及开发本地服务的技术。 再到组织产品生产、配套(形成产业链),是从
市场策划到产品销售、用户服务的全过程,而开
CIOI:如你所说,将企业的工业开发流程和开 源项目的开发(开源社区的开发)只是其中的一
源项目进行有机结合是企业用户最关心的,如何 段,应把开源项目的开发纳入到整个企业的工业
做到这一点? 开发流程中去,企业可以对社区的开发成果进行
陆首群:开源社区在开发时不关注用户调研, 选择,企业也要组织其成员无偿参与到社区开发
也就是不直接收集分析用户的需求,他们也没有 中,在为社区做出贡献的同时,也可以从中了解
产品开发目标,换句话说就是只搞项目开发,不 到社区先期开发的总体思路,把握体系结构全局,
管产品开发,也没有产品开发路线图。他们不关 积累工程经验,并向社区提供其缺失的信息,做
心开源技术的产品化,没有商业模式,不对用户 到互为补充、互相支持。
进行技术支持和各种服务,也不对挑错、纠错、 一个成功的软件,包括开源和私有商业软件
打补丁(BugFix,Patch)、解决问题负责。而 都是如此,要对项目开发与产品开发进行结合或
企业的工业开发流程是从用户调研、了解分析用 统一,要把开发过程与企业其他经营环节,如量
户需求出发的,到编制技术任务书和产品开发路 产、分发、市场推广、销售、服务、技术支持等
线图,组织项目开发和产品开发,实行产品化, 完美结合。
开源 2008 年第 7 期 20
专题
开源 2008 年第 7 期 21
专题
陆首群:众所周知,关于文档的格式, 定期收取租赁费或服务费用,一般以年为单位。
ODF 已被 ISO、IEC 批准为国际标准,UOF 被批 据我了解,开源软件的运维费用或支持服务费用
准为国家标准,微软的 OOXML 最近也被 ISO 批 也不高,但这种商业模式如要在中国推广开来,
准为国际标准,虽然这点还尚有争议。现在 ISO 我想开始时中国用户可能不太习惯,对此要有思
表示,要解决 ODF 与 OOXML 两个标准的融合 想准备。
与转换问题。这两个标准的起草单位 Sun、IBM
与微软均表示,支持 ODF、OOXML 与 UOF 的 CIOI:大多数经理人都天性保守,他们的做事
融合,并将改善三者文档格式的转换器(翻译 风格就是稳妥。显然,没有人会因为选用微软的
器),以提高互操作性效率。 产品而被解雇,那么如何让更多的 CIO 转向开源
最近在与微软的某些专家会面时,我对他们 软件同时不遭到质疑?一旦遭到质疑,他们该怎
说,要一起研究三种文档格式标准的融合问题, 么办?
并进行符合性测试。另外,格式兼容是文档的底 陆首群:微软创建了“软件王国”,而且 20
层兼容,它用以解决文档存储读、写的兼容问题。 年不衰,特别是在桌面端,它在全球的市场占有
但文档还要解决其上层的兼容(如内容兼容、版 率达到 90%。大多数经理人持有“求稳”高于“
面兼容),只有这样,才能促使有关应用程序能 求新”的心理。求新势必将带来风险,这自然使
在不同操作系统平台上平滑转移,全面实现互操 他们趋于保守。近年来,随着开源技术不断创新,
作。为此,应将不同办公套件提供商找在一起进 开源产品趋于成熟,开源生态系统日益完善,开
行协商,以便在交流不同算法的基础上,解决精 源解决方案逐渐变得富有竞争力,开源在某些领
密兼容或全面互操作的问题。 域已成主流,更多用户对待“多一种选择”表现
出欢迎的态度。
CIOI:曾有 CIO 做过这样的比喻,购买商业软 早年我在访问微软时说过:在西雅图的波音、
件就像一次性付款买房,而开源就像分期付款买 星巴克、亚马逊这三大企业中,我看到他们都在
房,虽然首付很低,但运维和升级费用不菲,你 应用开源软件。这些企业的与微软近在咫尺,对
如何看待这个问题? 此你做何感想?
陆首群:这个问题我在上面谈开源软件的商 随着互联网的大发展,原来在互联网中占有
业模式即定购模式时已谈到了,这种模式就是租 很大优势的开源技术,现在可以说是进入了发展
赁模式,其他诸如应用服务提供商(ASP)、托 的 春 天 , 像 智 能 化 手 机 、 便 携 式 PC , 包 括
管、软件即服务(SaaS)、外包等,均体现了租 MID(移动互联网终端设备),都同时配置了
赁服务的性质,它们不同于传统的“一次性买断 Linux 与 Windows 两种嵌入式操作系统,这已经
”的方式。因为对开源软件,其知识产权所有者 成为了一种时尚。当然在应对使用开源软件的挑
的概念处于“灰色地带”,所以它不能向用户采 战中,特别是在国内,还要解决国人对开源认识
用类似于专业许可证(Licence)那样的收费方式, 上的很多观念问题,这涉及到对开源的教育、推
来一个“一次性买断”,它通常向用户提供服务, 广普及等多个方面。
开源 2008 年第 7 期 22
专题
开源软件为中国软件提供了发展机遇
中国开源软件推进联盟主席 陆首群
开源 2008 年第 7 期 23
专题
开源软件为中国软件提供了发展机遇 建设开源软件的生态系统
国内外有人对开源软件持有两种极端的看法。 开源软件的生态系统分狭义理解和广义理解
一种看法是:开源软件模式最终将取代商业软件 两类。
模式,甚至把它看作为现代民主的一个重要组成 从狭义理解来说,对于 Linux 或 OSS,孤立
部分;另一种看法是:开源软件对知识产权持怀 地开发或推出一个产品(发行版)是不行的,必须
疑和对抗态度,使知识产权归属处于混乱、复杂 形成围绕该产品平台的生态系统,即把大量丰富
状态,甚至是对西方社会的破坏力量。我们不同 的应用软件移植到这个产品平台上来,该产品必
意这两种极端的看法。 须能预装到一些必要的硬件体系结构中去,必须
事实上近年来开源软件正在向市场推出更低 能与众多外围设备匹配衔接。而移植、预装、匹
成本、更优质量、更大灵活性,以及更富竞争力 配是需做大量测试、修改工作的,涉及成百上千
的软件,推出与传统商业软件在销售时所实行的 个企业协同工作,需耗费大量人力、物力、财力
许可证制度不同的商业模式。我们说,整个软件 和时间。为做到这一点,首先必须开发出在全球
产业,特别是商业软件,不能无视开源软件带来 能进入主流的产品,否则要吸引或取得全球广大
的竞争和挑战,我们也说,发展开源软件只是作 企业、社区的支持,共同来营造一个生态系统是
为商业软件的一种补充,为用户提供多一种选择。 不可能的。当然在营建生态系统过程中,还要取
最近连微软也认为,要接受开源软件与商业软件 得广大企业、特别是拥有丰富资源和影响力的跨
“共存”的事实和前景。微软的一位主管还说, 国公司,以及有关社区的大力支持。我认为,以
他们应向开源软件学习:(1)如何控制并降低软 Linux 为例,能成为全球的主流产品的数量估计
件模块化或集成成本的激增,(2)如何学习社区 不会多于 3~4 个,也不能用纯技术观点来看待这
开发机制的有益经验,(3)如何增加软件的透明 个问题;关于开发推出全球主流产品,我们中国
度以赢得用户信任度的增加。 要争取成就一个。
事实证明,自由/开源软件的发展,搞活了全 从广义理解来说,要将企业、学校、用户、
球的软件产业,为重组软件产业提出挑战;也为 政府、资本、市场、社会等各个环节的生态系统
中国软件的发展提供了机遇。 组织起来,做好沟通、互动,理顺互相依赖和支
持的关系。
社区和企业两种互相补充的开发机制
走联合、合作之路,做大做强
为了加快中国 Linux 和开源软件的发展,我
们认为,在开发机制方面,要形成社区开发和企 中国现有 Linux 企业主要有红旗、共创、中
业开发互为补充的两种机制,前者主要是搞创新, 标软、北京拓林思等 5~6 家,他们多具有在艰苦
后者主要是做稳定,即做好工程化、产品化工作。 创业环境中拼搏的精神,与国内主要用户也有密
国内至今尚未形成社区开发的机制,多是关起门 切联系、互动的良好条件,这几年在政府支持下
来做,缺乏开放性,无法充分利用全球成千上万 相继开发、完善推出一批 Linux 产品,市场占有
名有能力、有智慧进行开发创新的人才资源及其 率也逐年扩大,甚至在一些大客户订货招标中一
丰硕的成果。 度还击败了外国同行。但总的来说,国内 Linux
开源 2008 年第 7 期 24
专题
企业规模还不大,力量也较弱,资金不雄厚,只 源的,即这个或这些层次的软件可能是拥有专利
有实行国内联合、国际合作才能把 Linux/OSS 做 的,成为专有或私有软件,从而构成了一种以开
大做强。 源为主的混合型软件。
Linux 操作系统源程序代码行仅占开源软件 开源软件虽然全部软件模块的源代码是公开
(OSS)源程序代码行的 3-5%。中国开尖软件 的,但不等于其全部技术也都是公开的。主要为
发展现状主要集中在 3-5%的 Linux 上,向 100% 了提高产品的稳定性、计算效率和灵活扩充性的
的 OSS 充分展开不够。 工程化技术难以做到完全公开,一般是不公开的。
所谓工程化技术是一种实现技术、隐性技术,主
建立持续发展、不断升级的能力 要表现为技术诀窍(Know-How)或熟练技巧
(Skill)、工程经验、系统底层技术的把握等隐
产品开发决不能寄希望于“一次成功”,要 性知识方面。
建立产品持续发展、不断升级的能力。无论在开 开源软件产品的工程化技术主要由两部分构
源软件或商业软件中出现缺陷(Bug)是很自然的、 成:(1)在开发过程中,有些与设计思想、原理、
经常的,关键在于要很快找到解决对策,为用户 实现机制(包括算法)有关的隐性设计技术;与
及时提供补丁(Patch),这个周期不能太长,这方 各软件模块之间的协同、耦合、调用等相互依赖
面的服务必须跟上。 关系有关的实现技术(特别是实现细节);企业
为了提供由开源软件产品链集成的解决方案, 内核分支发行版的源代码与官方内核主线版本
需要进行协同测试,找出最佳组合,并进行持续 (Official Linux Kernel)的源代码之间偏差的度
追踪、不断升级。 的把握能力。(2)在产品化或应用过程中,为增
强开源软件的增值效应,对各软件模块进行包装/
开源软件(技术)与工程化技术 配置/集成,以及剖析并改进(Profile)相应的软
件系统所涉及的隐性技术。
开源软件包括操作系统、数据库、中间件、 如上所述,在 Linux/OSS 全部开发技术中,
应用程序以及编程工具等各类软件。 有公开的和不公开的两部分,在两部分中均可能
执行 GPL 许可协议的软件称自由软件(BSD 具有核心技术,对公开的部分我们可实行“拿来
是过份自由的软件)。自由软件和开源软件其所 主义”(但要注意在作修改时需按开源协议规则
有软件的源代码都是公开的、开放的;自由开源 反馈),但在不公开的部分中(指工程化技术)
软件为实现其基本功能之外的附加、增强、扩充 需要自主创新,而在其中有可能拥有自主知识产
或 增 值 功 能 时 , 需 叠 加 增 强 型 组 件 权。发展开源软件也为我们实施跨越性开发战略
( Component , 如 High Availability 提供有利条件。
Component 、 Enhance Security Component
等)及相应的界面,这里叠加的组件层可能是开 开源软件推出的各种商业模式
源的,也可能是闭源的;还有一些开源软件,由
于执行的许可协议是双授权模式,在其软件的整 需 要 推 出 因 地 制 宜 、 随 需 而 变 ( on
个层次组合(Stack)中,其中大多数层次的软件 Demand Business)、可执行的开源软件商业模
是开源的,但其中的某个或某些层次也可能是闭 式。
开源 2008 年第 7 期 25
专题
开源 2008 年第 7 期 26
专题
开源软件开发创新机制
中国开源软件推进联盟主席 陆首群
开源软件具有独特的开发创新机制,即具有社区开发和企业开发两种相互支持、相互补充、相互衔
接的开发创新机制;社区主要是进行产品创新,开发产品新的性能,但社区不必对修补产品缺陷
(BugFix)、打补丁(Patch)、解决用户使用中的问题负责。企业主要是完善产品质量,促使其稳定、优
化和成熟,企业有保证产品品质的责任,有为用户提供支持服务的责任。社区开发创新的力量来自全球
志愿者,他们的开发创新活动具有“集体开发”、“合作创新”的特点,在遵循自由开源许可协议(如
GPL、LGPL、BSD、MPL、……等)前提下,开发全部开放的源代码;企业开发创新依靠自己的专业技
术人员,他们的开发创新工作具有“自主开发”、“自主创新”的特点,开发与源代码是否开放无关的、
不公开的工程化技术。在这两个相
互衔接的不同开发创新机制下开发
出来的全部技术,是分别具有公开
与不公开性质的共生技术,这也是
具有商业模式的成熟的开源软件的
技术特点。
下面列出社区与企业两种开发
机制的一些统计数字:
1.社区与企业,谁是开源软件
中缺陷的主要发现者与改正者
微软的一位朋友跟我谈:在某
些知名的开放源代码的应用程序中
所存在的缺陷(Bug),有 75%
是由企业发现并改正的,25%才
是由开源社区发现并改正的。
据 Gartner 统计,在
Mozilla、Apache 等开源软件中
存在的缺陷(Bug),75%是由企
业程序员发现的,25%才是由开
源社区发现的。
据国际开源社区统计,开源软
件的性能 70%是由社区开发的,
开源 2008 年第 7 期 27
专题
30%是由企业开发并完善的。
2.全球志愿者对开源软件开发创新的贡献
据 Gartner 统计,北美地区志愿者对开源社区开发创新的贡献率(志愿者向开源社区递交、且被社
区吸纳的源程序代码行)占 46%,欧洲志愿者的贡献率占 42%,其他地区占 12%(其中,国人的贡献目
前只是凤毛麟角)。
根据 OSDL 提供的 Linux2.6 内核开发的资料——“谁在做事”显示:
◆独立内核开发者 554 人;
◆主要内核开发者 108 人(占开发者 20%,完成开发任务 90 %,社区核心层);
◆内核最高会议(Kernel Summit,社区研发小组)52 人(这是 2001 年的资料);
◆前 12 名开发者(社区领袖或大师,其中有 10 名是企业/销售商开发者,2 名是非商业开发者);
◆商业开发者:RedHat 4 人,IBM 1 人,Novell 1 人,SGI 1 要,ARM 1 人,OSDL 2
人;
◆非商业开发者:IOWA 大学 1 人,Samba 1 人;
根据 Ubuntu 创始人 Mark Shuttleworth 答复的资料:Ubuntu 社区开发人核心层 110 人(其中 70
人为志愿者;40 人为固定专业人员,负责编制文档)。
综合有关方面提供的数据,各企业、组织、社区、全球志愿者对 Linux 内核 2.6.4 开发创新的贡献率
为:
表(2),各企业、社区、组织、志愿者的贡献率
表(3),归类不规范统计(约)
开源 2008 年第 7 期 28
专题
坚持开源软件的创新之路
中国开源软件推进联盟主席 陆首群
我国 IT 产业的创新工作 宝贵的工程经验。集成电路的创新有了良好的起
步。
我国是全球 IT 产业发展的后起者,我们肩负 国内软件创新又如何呢?
为我国 IT 产业生存、发展和提升而搏弈的历史重 系统软件是最基础、最核心、创新难度也最
任。走自主创新之路,将是这场搏弈胜出的关键。 大的软件,我想可将它作为软件创新的代表。系
集成电路和软件是 IT 产业的两个支柱。近年 统软件一般为操作系统、数据库、编译器和工具、
来国内围绕这两个支柱产业的创新历程为: 编程环境、中间件等,其中操作系统又在系统软
在集成电路方面,国内自主开发了中低端通 件中处于龙头地位。
用微处理器(CPU)、芯片集成系统(SOC)和数字讯 中国要自主开发操作系统或系统软件,难度
号处理器(DSP)等芯片,虽然这些芯片的集成度 很大,必须走开源软件创新之路,从开源软件创
还较低,大约比国际高水平还差一个数量级(如龙 新中找机遇突破;而要进行开源软件的创新必须
芯 II 号相当于奔腾 IV 中档,其集成度约为 107 个 实行体制创新。
晶体管,而国际水平为 108 个晶体管),但毕竟我 目前国内虽然推出了几款 Linux 操作系统发
们从无到有,完成了上述一系列芯片开发创新的 行版,但自主创新的技术含量不高,总体上还处
全过程,即完成了科研创新、设计创新,以及工 于学习模仿阶段,缺乏深层次的研发能力。在先
具创新、工艺创新和工程创新全过程(必须指出, 导的社区开发创新(即“集体开发”、“合作创新
工程创新的难度比科研创新的难度要大得多,有 ”)阶段,国内个别人虽然曾向国际开源社区递交
人预测工艺创新难度约为设计创新难度的 10 倍), 了诸如“Linux 虚拟服务器(LVS)”、“入侵检测
但我们毕竟在创新全过程道路上走了一回,突破 系统(IDS)”等修改的软件包,但作为社会或企业
了国外对工艺技术的严格控制,积累了自己非常 的志愿者向国际开源社区的贡献还属凤毛麟角;
开源 2008 年第 7 期 29
专题
而在后续的企业开发创新(即“自主开发”、“自 关注于:改善操作稳定性,优化计算效率,增强
主创新”)阶段,国内企业一般尚未能把握好工程 灵活扩展性,提高产品质量,催化产品成熟度。
化实现技术,工程经验很少。有人说,“中国系 工程化技术是一种实现技术、优化技术、隐性技
统软件的开发创新面临着一个进退维谷的境界”, 术,主要表现为技术诀窍(Know-How)或熟练
这样的估计似乎过于悲观。我认为,中国开源系 技巧(Skill)、工程经验、系统底层技术的把握
统软件应该从模仿走向创新,在“合作创新”基 等隐性知识方面。
础上扩大“自主创新”。 开源软件的工程化技术主要由两部分构成:
为了实现开源软件的开发创新,必须了解开 (1)在开发过程中,有些与设计思想、原理、实
源软件独特的创新方式。 现机制(包括算法)有关的隐性设计技术;与各
软件模块之间的协同、耦合、调用等相互依赖关
两种共生技术 系有关的实现技术(包括实现细节);开源企业
(服务商)的“内核分支”发行版的源代码与由
人们常常陷于一个思维误区:“开源软件是 Linus Torvalds 负 责 开 发 和 监 护 的 官 方
由全球志愿者集体开发的,遵循开源许可协议, (Official)“内核主线”版本的源代码之间偏差
其全部源代码是开放的,任何人均可自由获得”, 程度的把握能力。IT 评论家 Matt Asay 指出,人
而“全部源代码的开放也表示其全部技术是公开 们可以得到 Red Hat 公司企业级 Linux 发行版的
的。”他们不明白,开源软件不能再停留在其早 全部源代码,但它直接交付用户使用的二进制版
期“自由的理想王国”里,仅供“黑客”、“玩 本(即所谓“ready to go”版本)并不是这些源
家”们当“玩艺”;开源软件要取得持续发展, 代码编译的结果,其中存在着一些差异(关键要
必须探索并形成自己的商业模式,惟有具备商业 把握差异的程度),这就是商业秘密。(2)在产
模式的开源软件才是成熟的,才能处理好如下矛 品化或应用过程中,为增强开源软件的增值效应,
盾,即:既不违反开源许可协议,公开全部源代 对各软件模块进行包装/配置/集成,以及剖析并
码;又能不公开自己的专有技术,保守自己的商 改进相应的软件系统(Profile)所涉及的隐性技
业秘密。事实上,具有商业模式的开源软件,其 术。
技术创新并不完全表现于具有自由开放特点的科 举国外开源软件“Ubuntu”的例子来分析:
研创新和设计创新之中,即并不完全表现于开放 Ubuntu 作为 Linux 的 386 个发行版之一(有桌
的源代码之中,它还表现在具有技术不公开特点 面版,也有服务器版)是非常优秀的。发展迅猛,
的工艺创新和工程创新之中,即表现在与源代码 受人欢迎,其开发创新机制确有过人之处。
无关的工程化实现技术(即专有技术和商业秘密) Ubuntu 为何发展如此之快,干得如此出色呢?
之中。这就是说,开源软件的全部技术是由:以 我认为其中一个重要原因是 Ubuntu 利用了国际
开放源代码所表征的公开化技术,与不公开的工 上最大的开源社区 Debian 的人才和资源。所以
程化技术两部分组成;或者说由这两部分技术组 有人说“Ubuntu 是基于 Debian 开发的版本”,
成开源软件的共生技术。所谓工程化技术,是在 “Ubuntu 是 Debian 的副产品”,确是如此。
开源软件已完成了其公开技术(即全部源代码或 但 Ubuntu 认为“Debian 的过于宽广庞杂”,
全部技术性能)的开发过程的基础上,服务于产 它在 Debian 资源上进行剪裁、移植和再创新,
品化或商业应用,尚需解决的后续技术,它主要 达到“少而精”的目的。现在随着 Ubuntu 的发
开源 2008 年第 7 期 30
专题
展 , 它 并 不 想 与 Debian 兼 容 , 也 不 愿 参 加 旧的封闭的开发模式和机制,他们在“社区版”
Debian 的联合体。 上进行剪裁、移植或者进行简单修改,属于自主
最近 Ubuntu 自己认承:Ubuntu 的发布版 开发创新的成果还不多,他们基本上还处于学习、
在产品稳定性等性能方面尚有待于改进,它还未 模仿阶段,他们基本上还是一个开源软件的集成、
通过用户认证。这使我联想到 Ubuntu 的开发创 发布商,不是开发商,他们基本上还缺乏深层次
新机制可能还存在一些问题,他们“集体开发” 开发能力。国际开源社区曾多次反映,国人在开
开放技术的能力可能有余,而“自主开发”工程 源软件“集体开发”、“合作创新”活动中,向
化技术的能力可能不足。今年 2 月我曾向 社区提交自己修改、创新的源程序代码行(到被
Ubuntu 创始人 Mark Shuttleworth 当面指出这 吸纳)尚属凤毛麟角,对开源社区抢占算法
些问题,获得了 Mark 的首肯。 (Preemption)方面的贡献还微小,以致有人认为:
很多执行双授权许可协议模式的开源软件, 国人尚未能进入这个开发创新模式的核心圈之内,
在其层次结构(Stack)中可能嵌入某个层次的闭 而且从这个衡量开发创新人员资质水准的统计数
源软件,或可能附加某些闭源的组件模块,这些 据来看,国人尚有不小差距。
闭源软件实际上就是私权软件,而私权软件的全
部技术都是不公开的,并将完全依赖于自主开发 两种开发机制
创新。
为了加快中国开源软件的发展,需要建立开
双重创新模式 源社区,形成社区开发和企业开发两种互相支持、
互为补充的开发机制,社区开发主要是科研创新,
与一般企业的私权软件创新模式不同,开源 企业开发主要是工程实现。
软件首先采用由志愿者进行“集体开发”、“合 在开源社区,具有“集体开发”、“合作创
作创新”的新模式,这种创新模式实行“源代码 新”、“技术公开”特征的创新体系,是建立在
开放”、“技术公开”;但是仅靠这种模式还不 自由开放的互联网平台上的,很多创意通常自下
足以开发出开源软件的全部共生技术(即不能开 而上来自底层志愿者。在这个创新体系中,能够
发不公开的工程化技术),也不足以向市场推出 广泛吸收全球广大志愿者的智慧,经常产生大量
优质高效、操作稳定、技术更趋成熟、竞争力更 思维碰撞,并往往撞出不少耀眼的思想火花,经
强的开源软件产品。实际上,开源软件针对开发 常迸发出创新点子,在技术上有所突破,但也常
工程化技术,还需要另一种:“自主开发”、“ 常伴随着不够系统、不够稳定、不够成熟的现象。
自主创新”、“具有自主知识产权”的创新模式 开源社区的创新活动偏重于科研,偏重于科研创
来跟进和补充。开源软件的双重创新模式,即“ 新和设计创新,开源社区的创新活动需要有开源
集体开发”、“合作创新”与“自主开发”、“ 领袖(或大师)以及一批核心骨干的支撑,他们
自主创新”两种模式是互补的、互相衔接的、不 在社区负责对志愿者提交的软件包,进一步作“
可分割的;也可看作开源软件开发创新过程的两 选包、打包、集成、测试”循环的创新活动并实
个阶段。 施资源管理。在开源社区创新体系之外,还需一
近年来国内企业开发并向市场推出一批开源 个后续的企业创新体系与之互为补充,企业创新
软件产品,取得了长足进步;但某些企业还沿袭 体系具有“自主开发”、“自主创新”、“自主
开源 2008 年第 7 期 31
专题
知识产权”(技术不公开)的特征,它是建立在 移植到这个产品平台上来;该产品要能预装到一
企业内部开发部门或企业局域网平台上的,其创 些必要的硬件体系结构中去;要能与众多外围设
新的任务是向市场推出满足用户需求的产品,计 备匹配衔接。而移植、预装、匹配是需要做大量
划通常自上而下,开发者是企业专业技术队伍, 测试、修改以及“再开发”工作的,涉及成百上
企业的创新活动需要有经验丰富的资深人士(包 千个企业协同工作,需耗费大量人力、物力、财
括系统架构师)及一批核心骨干的支撑(最好具 力和时间。为做到这一点,首先必须开发出在全
有参与社区开发创新的经历并与之保持良好的互 球能进入“主流”的产品,否则要吸引全球广大
动接口)。他们在利用开源社区创新成果的基础 企业、社区的支持,共同来营造一个生态系统是
上,重点做工程化、产品化、系统化、完善化、 不可能的。当然在营造生态系统过程中,不能用
稳定性和性能优化的创新工作,在攻克工程化技 纯技术观点来看待这个问题,在争取广大企业、
术方面进行自主创新。企业的创新活动偏重于工 社区支持时,特别要争取拥有丰富资源和影响力
程,偏重于工艺创新和工程创新。在开源系统软 的跨国公司的支持,为此我们要做好协调工作。
件领域内,工程的难度比科研的难度大很多。工 还必须指出,“分散的低水平重复”很难使开发
程化主要依靠积累的经验、专有技术(技术诀窍)、 出来的开源软件在全球能够占居“主流产品”的
资深技术骨干的智慧(隐性技术),以及在测试版 地位,为此加强国内联合、国际合作是十分重要
上持续不断地进行配置、集成、调试的测试工作, 的。
从中不断发现错误和纠正错误,完全是靠一点一
点调出来、改出来的,绝不可能是想出来、写出 开源架构和开源、闭源产品链
来的。
开源软件的 LAMP 架构(即 L-Linux 操作系
统 , A-Apache 开 源 服 务 器 或 其 他 开 源 中 间 件 ,
M-MySQL 或 Postgre 开 源 数 据 库 , P-PHP 或
Perl、Python 脚本语言)具有简易性、低成本和
执行灵活性等特点,当“在线交易进程
(OLTP)”在 LAMP 架构的解决方案中取得成
功,有力地推动了这个架构的发展。LAMP 架构
的崛起,与 J2EE 架构(Java 编程语言)和.Net
架构(C#编程语言)形成了三角鼎立的竞争态
势。
针对各种信息化应用解决方案,在开源软件
LAMP 架构上形成的开源产品链,需进行集成、
产品平台和生态系统
测试、优化的开发创新活动;从实际需求出发,
有时我们也要推出开源和闭源产品混生的产品链,
对于开源软件,孤立地开发或推出一个产品
而在推出这样的产品链之前也需要进行相应的开
(发行版)是不够的,必须形成围绕该产品平台
发创新活动。
的生态系统,即要把大量软件(特别是应用软件)
开源 2008 年第 7 期 32
专题
中国开源软件推进联盟主席 陆首群
Linux 是 一 种 开 放 源 代 码 操 作 系 统 , 所谓“互操作性”,指一个软件系统(如
Windows 是一种属于私权的商业性操作系统(自 Linux 系统)与另一个软件系统(如 Windows 系统)
然是不开放源代码的),从本质上说,两者是异构 互相间具有的接收、处理并共享所发送的信息的
的信息系统或环境。 能力。所以“互操作性”具有独立性、主动性、
几年前,有人感到在发展 公平性(或对称性) 、战
Linux 操作系统(特别是桌面 略性等特点。
Linux 系统)时,势将面对已经 本文要谈的是:近年来
移植到 Windows 平台上的大量 Linux 和 Windows 在
应用软件的压力和人们使用习 互操作性问题上有很大
惯的挑战,他们希望 Linux 要 进展;国人、国内企业
解决好对 Windows 的兼容 或科研机构对此作出了
(Compatibility)问题或互操作 重大贡献。
(Interoperability)问题;随着 为了更好地探讨
近几年 Linux 的迅速发展, Linux 系统和 Windows
Linux 对 Windows 的冲击,微 系统的互操作问题,我
软的某些主管也开始呼吁要解 们将在上述信息系统环
决好两个异构操作系统的互操 境中的应用程序(特别是
作问题。 文档软件)分为三个层次
在这里,我想先明确“兼 来讨论,即(1)文档系统
容性”与“互操作性”这两个概念。所谓兼容性 (体现在硬盘中的信息存储,用户希望对文档具有
指在某系统(如 Linux 操作系统)上运行的应用程序 长期存取能力),(2)文档(体现为信息,这里指文
(或功能单元)符合另一系统(如 Windows 操作系 档或信息的规范、格式和标准),(3)应用程序 (具
统)的接口要求,从而使该应用程序也可在另一系 有生成文档进行信息处理的功能)。
统上运行,这时对该应用程序符合某个接口的能
力称为兼容性。 关于在文档系统层次的互操作问题
提倡“兼容性”,你去兼容别人,在利益的 关于在两个(或多个)异构信息系统的环境中
驱动下,必将导致别人的“反兼容”。例如:近 生成的文档系统,可置于对方环境中被读、写,
来微软开发的 Windows Vista,重新改写了 60% 而实现两个(或多个)文档系统层次上的互操作性。
源程序,就是一个反兼容措施,你要去兼容他, 我们从全球最大的开源社区(Source Forge)上查
他就设法甩掉你。所以说,兼容往往是短期行为, 到一个研究开发项目:“能在 Windows 环境中
具有很大风险。 读、写 Linux ext2、ext3 文档系统的软件模块
开源 2008 年第 7 期 33
专题
开源 2008 年第 7 期 34
专题
对陆首群“坚持开源软件的创新之路”一文的讨论
陈怀临
注 : 中 国 开 源 软 件 (OSS) 推 进 联 盟 有适应性发展与更新。只有这样,我们才可能有
( www.oss.org.cn )的陆首群主席撰写了 持续的人才储备。只有这样,我们才可能达到陆
“坚持开源软件的创新之路”一文。笔者
老师提出的开源社区开发创新
有幸在一个小范围内参加讨论,与国内一
2、我在新水木清华(www.newsmth.net) 体
些著名的学者和信息产业部的高阶官员,
并写下了如下评论。原以为是小范围的讨 系 结 构 版 和 中 国 Linux 论 坛
论,所以许多措辞方面并未特意斟酌。一 (www.linuxforum.net) 的 CPU 版和我的系统计
日偶然发现 OSS 网站上已发表我与李国杰 算研究所专栏上做 BBS 斑竹多年,对民间的系统
老师的评论。于是决定也作一些整理修改 软件开发人员有一定的接触,主要体会是国内已
发布在系统计算研究所的网站上。 经具备大量的熟悉操作系统(如 Linux)内部数据结
构,算法等的研发人员。人员主要分别在北京,
我非常仔细的研读了陆老师的文章——“坚
上海等的公司里,也有许多高校和科学院的研究
持开源软件的创新之路"。非常同意陆老师的观点,
生在积极参与操作系统细节的学习。热情非常高。
在开源(Open Source)基础上的自主创新;我也想
缺点是:国内基本上没有一个好的 Open Source
借此机会谈点在陆老师的思路上扩展的一些个人
的项目使得这些研发人员共同参与。比较零散。
想法。
这方面我个人觉得有可能可以这样考虑:以中国
社区开发创新
开源软件推进联盟为牵头,联合几个相应的单位
1、希望政府与学校加大 Linux,Freebsd 等
(公司,研究所),在相应的调研的基础上,定位
的普及工作。在高校操作系统教材,实习方面要
一到两个 Open Source 项目。从而使得国内能
开源 2008 年第 7 期 35
专题
开源 2008 年第 7 期 36
开源社区
开源社区
文泉驿中文字体之“祈祷”发布
文泉驿是著名的自由中文字体,包括点
阵宋体和正黑两种。
其中在一些发行版上(如 Ubuntu
8.04),已经将文泉驿字体作为默认的中文
字体。
现在文泉驿正黑之“祈祷”(版本号
0.6.23)正式发布了。
相对于上个版本“夸父”,“祈祷”有
很大的改进。其中:
下载地址:http://wenq.org/gallery/thumbnails.php?album=16
访问文泉驿主页获取更多的信息:http://wenq.org/
GNOME 3 公布消息披露
从 KDE 4.0 到即将发布的 KDE 4.1,KDE 桌 于有消息了!
面正在不断地发展着。喜欢 GNOME 的朋友们一 近日,在土耳其的伊斯坦布尔正举行着
定在想下一代 GNOME 桌面(即 GNOME 3)什 GUADEC 2008 ( 即 GNOME User and
么时候才会有消息呢? Developer European Conference:GNOME 用
现在,所有 GNOME 粉期待的 GNOME 3 终 户和开发者欧洲大会)。
开源 2008 年第 7 期 37
开源社区
前已经过大半,大家感兴趣的东西也多被讨论到
了。其中就是本文所要述说的 GNOME 3。
大家都知道,GNOME 的发布周期是半年一
个版本。比如今年 3 月份的 GNOME 2.22 和今年
9 月份要发布的 GNOME 2.24。另外,2009 年
的 GNOME 2.26 也在计划中,似乎 GNOME 3
还看不到。
不过,在这次大会上,开发者终于透露了:
GNOME 2.30 = GNOME 3。也就是说,继
这是 GUADEC 第 9 届大会,吸引来自全球各
2009 年的 GNOME 2.26 和 GNOME 2.28 以后,
地的 GNOME 黑客、用户和其他人员相聚在一块
2010 年,我们就可以见到 GNOME 2.30,也就
讨论最新科技和有关 GNOME 的各种事项。本届
是传说中的 GNOME 3 了。
GUADEC 在 7 月 7 日至 7 月 12 日之间召开,目
开源 2008 年第 7 期 38
开源社区
主要改进:
开源 2008 年第 7 期 39
开源社区
◆升级的 bootloader(FreeLdr)部分重写增强稳定性;
◆修正了整个系统范围内的内存泄露问题;
◆修正内核,重写了部分内存管理器;
◆Win32 子系统:全面加强,包括用户和内核空间部分;
◆Base CRT 库的主要部分重写提高兼容性;
◆Command shell (cmd.exe)改进,尤
其提高了批处理脚本能力;
◆字体改进;
◆国际化支持改进;
◆几乎所有内核中的驱动以及用户程序
都有不同程度的改进。
感兴趣的朋友可以在这里
www.reactos.org/en/download.html
下载安装光盘。
开源 2008 年第 7 期 40
开源社区
盘点开源世界的 2007
开源 2008 年第 7 期 41
开源社区
虚拟化
开源 2008 年第 7 期 42
开源社区
移动及因特网 Linux
开源 2008 年第 7 期 43
开源社区
走近 Erlang 世界
顾宏军
开源 2008 年第 7 期 44
开源社区
开源 2008 年第 7 期 45
开源社区
◆热代码升级,一些系统不能够由于软件维护而 整个软件行业也在发生重大变革,由卖工具
停止运行。Erlang 允许程序代码在运行系统中被 软件转向卖服务(软件免费,这也是开源软件兴
修改。旧代码能被逐步淘汰而后被新代码替换。 起的过程),由单纯客户端向 B/S 或 C/S 转化,
在此过渡期间,新旧代码是共存的。这也使得安 相应的存储和计算向服务器端转移,由原来的 PC
装 bug 补丁、在运行系统上升级而不干扰系统操 客户端向客户端多元化(如手机、PDA、电视机
作成为了可能。 顶盒等)转化。这些变革趋势,使得用户可以更
◆递增式代码装载,用户能够控制代码如何被装 方便地访问到服务的同时,服务器也要承受越来
载的细节。在嵌入式系统中,所有代码通常是在 越高的负荷,并行/分布的需求增加。
启动时就被完全装载。而在开发系统中,代码是 Erlang 语言不是用来解决所有问题的语言,
按需装载的,甚至在系统运行时被装载的。如果 至少现在还不是。Erlang 最初专门为通信应用设
测试到了未覆盖的 bug,那么只有具有 bug 的代 计的,比如控制交换机或者变换协议等,非常适
码需要被替换。 合于构建分布式,实时软并行计算系统。它是一
门专注的语言,可以适应现代服务器要求高负荷、
Erlang 应用场合 高可靠、持续服务的需求。它要解决的问题域包
括:高并发、分布式、持续服务、热升级和高可
未来的计算是并发计算。现今甚至桌面 CPU 靠等问题
也是多核的,当客户给他们的服务器购买了越来
越多的 CPU 时,他们更期望能伸缩自如以利用他 Erlang 应用实例
们的新投资,但是今天的许多软件系统并不能很
好地做到这一点。 典型的 Erlang 应用是由很多被分配不同任务
的“节点(Node)”组成的“集群(Cluster)”。一
个 Erlang 节点就是一个 Erlang 虚拟机的实例,
你可以在一台机器(服务器,台式机或者笔记本)
上运行多个节点。Erlang 节点自动跟踪所有连接
着的其他节点。要添加一个节点你仅仅需要把它
指向任何一个已建节点就可以了。只要这两个节
点建立了连接,所有其他的节点马上就会感应到
新加入的节点。Erlang 进程使用进程 ID 向其他
进程传递报文,进程 ID 包含着运行此进程的节点
的信息。因此进程不需要理会正在与其交流的其
他进程实际在何处运行。一组相互连接的 Erlang
节点可以看作是一个网格计算体或者一台超级计
算机。
Yaws 是一个 Erlang 写的 Web 服务器。
ErLang 本身带有一个 HTTP Server , 叫做 inet;
yaws 对于 inet,就相当于 servlet 对于 http
Erlang 的 odbc 应用程序结构图
开源 2008 年第 7 期 46
开源社区
务器市场。 本电脑都将是多核的,而要让程序在多核上更快
公司支持。它是个开源项目,非常适合多核处理、 在线应用所需要的。
开源 2008 年第 7 期 47
开源社区
开源 2008 年第 7 期 48
知识学堂
知识学堂
Linux 下设备完全驱动(二)
郄晓烨
IDE 硬盘及光驱
1.IDE 设备的驱动过程
操作系统首先是安装在块设备上,没有对块设备的支持系统就无法启动,所以首先介绍常见块设备
的安装。硬盘就是最常见的块设备,普通 PC 上的硬盘通常是 IDE 接口的,而服务器上的硬盘通常是
SCSI 接口的。一般内核中内置对通用 IDE 控制芯片的支持。下面看一下 IDE 硬盘在内核中的驱动过程,
dmesg 命令可以看到内核在启功和加载内核模块时的信息:
# dmesg | less
开源 2008 年第 7 期 49
知识学堂
开源 2008 年第 7 期 50
知识学堂
开始编译内核:
# make dep
# make clean
# make bzImage
# make modules
# make modules_install
重新启动系统,使用刚刚编译的内核就会发现启动信息中多出一行“linux-test”。留意启动时的
信息,就会发现有下面一行信息:
"VP_IDE: VIA vt8237 (rev 00) IDE UDMA133 Controller on pci00:0f.1"
如果正常启动,各种服务也都没有问题,那么以后就可以用这个新的内核了。可以用# hdparm -i 命
开源 2008 年第 7 期 51
知识学堂
令来调整硬盘的传输方式,检查硬盘目前的传输模式。
/dev/hda:
查看一下当前硬盘的工作模式,如果不是 ATA133,则可以灵活使用控制硬盘传输模式的命令:
# hdparm -d1 /dev/hda //enable DMA 模式
# hdparm -d0 /dev/hda //disable DMA 模式
# hdparm -X70 /dev/hda //将传输模式切换到 UDMA 6 -ATA133 模式
开源 2008 年第 7 期 52
知识学堂
光驱的驱动及刻录机的使用
1.光驱的驱动过程
2.CD/DVD 刻录机的驱动及使用
开源 2008 年第 7 期 53
知识学堂
(1)更改/boot/grub/grub.conf 文件
在 kernel /boot/vmlinuz-2.XXX ro root=/dev/hda1 之后,添 hdc=ide-scsi。
(2)更改 /etc/modules.conf 文件
添加下面两行:
ide-cd ignore=\"hdc\"
ide-scsi
(3)直接编译内核
不编译 ATA/IDE/MFM/RLL 选单中的 IDE/ATAPI CDROM support 部分,但是要编译对 SCSI 光驱
的支持。
上面三种方法都是不希望系统用自带的普通 CD/DVD-ROM 驱动程序去驱动刻录机,希望将刻录机
模拟成一个 SCSI 设备,其中第一种方法最简单,成功后就可以通过以下命令来刻录 CD 或 DVD 光盘。
# mkisofs -Jv -V examplecd -o example.iso /root/
调整/mnt/iso 文件的内容:
# umount /mnt/iso
开源 2008 年第 7 期 54
知识学堂
0,2,0 2) *
0,3,0 3) *
0,4,0 4) *
0,5,0 5) *
0,6,0 6) *
0,7,0 7) *
SCSI 设备驱动过程
下面以 Adaptec SCSI RAID 3200S 卡为例,介绍 SCSI RAID 卡的驱动过程。这是常见的带 RAID 功
能的 SCSI 卡。在大部分编译好的内核中,都会编译对 SCSI 设备的支持。但是需要知道,内核中只是支
持通用的 SCSI 总线,而具体的 SCSI 卡还需要加载相应的驱动程序。SCSI 芯片驱动的安装比较特殊,下
面分成两种情况叙述。
(2)将该镜像文件写入软盘中。Linux 下可以用下面命令:
# dd if=dpt_i20-drv_2.5.0-rh9-i686.img of=/dev/fd0
或者
# cat dpt_i20-drv_2.5.0-rh9-i686.img > /dev/fd0
开源 2008 年第 7 期 55
知识学堂
(4)按照向导提示,将刚才制作的驱动软盘插入。
以后的安装过程就没有什么不同了。安装向导实际上将软盘上的驱动程序放到了 initrd 的
RAMDISK(内存磁盘镜像)文件中,每次内核启动后,都最先加载这个内存虚拟硬盘的镜像,利用里面
的 SCSI 驱动程序来驱动 SCSI RAID 卡和卡上连接的硬盘。
加载以太网卡驱动模块及参数调整
1.以太网卡的驱动过程
开源 2008 年第 7 期 56
知识学堂
开源 2008 年第 7 期 57
知识学堂
ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.1.1
NETMASK=255.255.255.0
TYPE=Ethernet
我们可以看到,系统内置的网卡驱动程序在/lib/modules/2.4.XXX/kernel/drivers/net 目录下,如
果网卡不在默认支持的硬件中,可以用以下方法来安装网卡驱动。
比 如 , 我 们 有 一 块 3COM 3CR990 网 卡 , 可 以 到 3COM 网 站 上 下 载 针 对 2.4 内 核 的 驱 动
http://support.3com.com/infodeli/tools/nic/linux/3c990-1.0.0a.tar.gz。然后解压缩下载的文档到解
开的目录中:
#t tar xvfz 3c990-1.0.0a.tar.gz
# make
看 一 下 该 模 块 是 否 可 以 被 正 常 加 载 , 如 果 没 有 问 题 , 就 更 改 /etc/modules.conf 文 件
和/lib/modules/2.XXX/modules.dep 文件,让模块每次启动时加载:
# echo “alias eth0 3c990” >> /etc/modules.conf
# cp ./3c990.o /lib/modules/2.XXX/kernel/drivers/net
# echo "/lib/modules/2.XXX/kernel/drivers/net/3c990.o:" >>
/lib/modules/2.XXX/modules.deps
3.调整以太网卡的参数
有时在加载完网卡的驱动后,如果网卡的状态不正确,比如驱动起一块网卡,但是它在 100Mb 的速
度上工作很不稳定,就可以使用 mii-tool 命令调整以太网卡的属性。目前多数以太网卡为 10BaseT 与
100BaseTx 的 10Mb/100Mb 自适应网卡,也有较新的支持 1000BaseT 的千兆以太网卡。
下面介绍 mii-tool 命令的一些用法:
(1)显示当前网卡所使用的以太网类型,目前这块网卡使用的是 100baseTx 的全双工工作方式。
开源 2008 年第 7 期 58
知识学堂
# mii-tool
eth0: negotiated 100baseTx-FD flow-control, link ok
(2)显示当前的网卡支持的所有以太网类型。
# mii-tool -v
eth0: negotiated 100baseTx-FD flow-control, link ok
product info: vendor 00:08:18, model 22 rev 2
basic mode: autonegotiation enabled
basic status: autonegotiation complete, link ok
capabilities: 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD
advertising: 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD flow-control
link partner: 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD flow-control
开源 2008 年第 7 期 59
知识学堂
给这个文件加上执行权限:
# chmod 700 ppp-on
# ./ppp-on
开源 2008 年第 7 期 60
知识学堂
驱动程序。到下面网址下载驱动 http://www.linuxant.com/drivers/hsf/full/downloads.php,选定适
合本系统内核版本的驱动程序,下载后是一个 RPM 包。
#rpm-ivhhsfmodem-6.03.00lnxt04061800full _k2.4.21_4.EL-1rh.i686.rpm
... ...
Config for modem unit 0: /dev/ttySHSF0
Device instance: 0-PCI-8086:24c6-14f1:5422
HW revision : CXT22
HW profile name: hsfmc97ich
Registration ID: 115C-247C-BFC0
License owner : unknown
License key : FREE
License status : FREE (max 14.4kbps data only)
Current region : CHINA (T.35 code: 0026)
由 上 可 以 看 到 , 安 装 程 序 自 动 建 立 了 一 个 设 备 文 件 /dev/ttySHSF0 , 并 且 为 它 创 建 了 名
叫/dev/modem 的软链接文件,这个文件与其它的 ttyS 文件的类型是不同的:
# ls /dev/ttyS0 -l
crw-rw---- 1 root uucp 4, 64 Sep 15 2003 /dev/ttyS
# ls /dev/ttySHSF0 -l
crw-rw-rw- 1 root root 240, 64 Jun 29 02:36 /dev/ttySHSF0
3.ADSL 及宽带连接驱动
开源 2008 年第 7 期 61
知识学堂
http://www.linuxsir.org/postnuke/modules.php?
op=modload&name=Downloads&file=index&req=getit&lid=242 下 载, 或 者直 接下 载 RPM 包
http://www.neweasier.com/software.html?class=4 。
配置非常简单,下载包解压缩后直接运行下面代码:
# ./go
或者
# ifup ppp0
#neat
或者
#redhat-config-network
开源 2008 年第 7 期 62
知识学堂
开源 2008 年第 7 期 63
知识学堂
开源 2008 年第 7 期 64
知识学堂
4.常见故障处理
如果在配置网络时出现问题,可遵循以下步骤检查:
(1)用 ifconfig 看一下网络接口是否启动,IP 地址是否绑定,如果网络接口没有启动。例如,
PPP0 没有启动,可使用 ifup ppp0 命令。如果 IP 地址没有绑定,使用命令 ifconfig eth0 192.168.1.1
设置地址;也可以使用命令 netconfig 设置 IP 地址、网关及 DNS 服务器的地址。然后用 service
network restart 重启网络。
(2)如果网络接口及 IP 没有问题,但是不能上网,可使用 ping 211.XXX 的一个外网地址,如果能
通,则应该是 DNS 服务器的问题,更改/etc/resolv.conf 文件中的 nameserver 的地址,换一个能用的
DNS 服务器的地址。
(3)如果都没有问题就是 ping 不通外网的 IP,可使用命令 route -n 看一下默认网关是否正确,如
果不正确使用 route del/add 来设置默认网关,使用 netconfig 可以永久更改默认网关。
从上面的讲解中可以看到,我们遇到的情况可能是千差万别的,安装的方式也是多种多样的。但是,
不论哪一种设备应该首先理解这种设备的驱动方式,然后再来了解具体的驱动程序。
PC 的足迹(上)
Intel 开源软件技术中心 王齐
如果说十五、六世纪是以探索为主题的大航 的风景线。
海时代;十六、七世纪是以发现为主题文艺复兴 1991 年,Apple、IBM 和 Motorola 结成
时代;十七、八世纪是以蒸汽机为主题的工业革 AIM 联盟以对抗 Wintel, 并研制了 PowerPC 体
命时代;十八、九世纪是以枪炮为主题的殖民地 系。当时 AIM 联盟认为 Intel 的 CISC 结构将很快
时代;十九、二十世纪是以和平为主题的大战争 走到尽头,RISC 将在 PC 领域取代 CISC。后来这
时代;那么二十、二十一这个世纪之交就是以半 个联盟随着 Apple 加入 x86 阵营,正式宣布解体,
导体为主题的大通信时代。这个时代中“硅”的 但是 PowerPC 体系并没有因此结束,2004 年
横空出世及屹立在“硅”这个半导体之上的处理 IBM 和 15 个合作伙伴成立了 Power.org,2006
器的出现,改变了人类的发展进程。各种流派处 年 Freescale 加入 Power.org,之后 Apple 通过
理器的百舸争先构建了这个世纪之交一道最亮丽 收购 PA Semi(一家制作低功耗 PowerPC 处理
开源 2008 年第 7 期 65
知识学堂
开源 2008 年第 7 期 66
知识学堂
系统的首选。但是依然有许多商业用户更加倾向 理器可以作为微控制器,用于各种工业及控制领
IBM 的 PC,1982 年,康柏推出了 IBM PC 兼容 域,用今天的话,就是应用在嵌入式领域。
机,之后生产 PC 兼容机厂商的数目如雨后春笋
般增长,在很短的时间里,已有近百家 PC 兼容
机的生产厂商。Intel 的 8086/8088 处理器获得
了巨大的商业成功。
IA-32 系列处理器从 16 位的 8086/8088 处
理器开始。8086 处理器具有 16 位的寄存器和 16
位的外部总线,可以访问 1MB 地址空间;8088
处理器和 8086 处理器有些类似,但是 8088 处理
器的外部总线只有 8 位。8086/8088 处理器使用
16 位的段寄存器 CS/DS/ES/SS 联合内部 16 位的
地址总线,可以访问的最大物理地址空间为
1MB。 图 2.1977 年 Apple 发布的 Apple II(68000)
开源 2008 年第 7 期 67
知识学堂
开源 2008 年第 7 期 68
知识学堂
开源 2008 年第 7 期 69
知识学堂
也许 Fairchild 会成为一家巨型的处理器公司,而
今天的 Fairchild 的主流产品却是一些电源芯片,
离散逻辑器件,二极管和三极管。
与 Intel 的创始人不同,Sanders 命中多桀。
Sanders 和 AMD 奋 战 向 前 的 故 事 永 载 史 册 。
AMD 成立之前,Sanders 首先遇到了资金的问
题,多年之后 Sanders 回忆起这段往事,诙谐地
说“Intel 只花了 5 分钟就筹集了 500 万美元,而
我花了 500 万分钟只筹集了 5 美元。”实际上
AMD 在公司成立 20 分钟前才募集到了注册公司
所需资金的底限。人才匮乏也是 AMD 创业之初
的致命伤,Intel 的三位创始人自身就是世界上第
一流的工程师和科学家,很多优秀的工程师都是
图 4.1989 年,英特尔发布了 486 处理器
毛 遂 自 荐 到 Intel , 心 甘 情 愿 追 随 Noyce 和
上看,486 处理器只是在 386 处理器的基础上完 Moore。而 Sanders 在许多工程师眼中不过是一
善了一些功能,并没有质的提高。而 486 处理器 个能说会道的销售罢了。这种先天的技术缺陷决
却取得了巨大的商业成功。在中国,许多人从 定了 AMD 当年的路只能是“一流的销售加上二
486 处理器开始拥有自己的 PC,之前多数人都是 流的技术”。
使用单位的 PC。也是在这个时间段,Microsoft 在很长的一段时间里,AMD 只能紧随 Intel
逐渐羽翼丰满,Wintel 组合渐入佳境。在 486 平 的脚步。在 Intel 设计出 8080 处理器后,AMD
台上,Microsoft 的 Window 3.1 和 Borland C+ 很快使用逆向工程方法,设计出和 8080 处理器
+ 3.0 几乎是每一个程序员必装的软件,这些优 兼容的 8080A 处理器。在之后的很长一段时间里,
秀的工具软件极大促进了各类应用软件的发展, AMD 一直作为 Intel 正式授权的处理器第二供应
整个 PC 业蓬勃发展。1993 年,AMD 也做出了 商 , 其 产 品 必 须 为 Intel 的 Logo 留 出 空 间 。
AM486 处理器,这对 Intel 的 486 处理器是一个 8086 处理器的出现改变了这一格局,Intel 从这
极大的冲击,也是一个严峻的挑战。 个时间开始不再向 AMD 提供授权,直到 IBM 要
AMD 公司目前还存在这个事实就足以令人 求 Intel 与 AMD 签订城下之盟。这段时间到 386
尊敬。1969 年 5 月 1 日,Jerry Sanders 与其他 处理器面世之前 AMD 可以产生 Intel 所有的处理
7 位 同 来 自 Fairchild 的 员 工 创 建 器 和 协 处 理 器 芯 片 , 包 括 8086/8088 处 理 器 ,
AMD。Fairchild 是一个伟大的公司,这个公司 8087 协 处 理 器 、 80186 和 80286 处 理 器 芯 片 。
被 称 为 美 国 硅 谷 的 缔 造 者 。 Intel 的 创 始 人 1984 年,AMD 的销售收入达到了 5.8 亿美元,
Robert Noyce、Gordon Moore、Andy Grove 而 Intel 是 16 亿美元。
也是来自 Fairchild。不过和 Intel 创始人的不同, “Good old day”永远不会太长。在 1985
Jerry Sanders 居然是被 Fairchild 公司解雇的。 年,386 处理器正式面世时,Intel 拒绝向 AMD
遍 览 IT 史 册 , 自 毁 长 城 的 事 每 一 个 公 司 都 有 , 再次提供授权。期间不知道经历了多少轮政治斡
Fairchild 公司最多。如果这些优秀人物没有离去, 旋,1987 年 4 月,AMD 正式向 Intel 提出法律
开源 2008 年第 7 期 70
知识学堂
开源 2008 年第 7 期 71
经验技巧
经验技巧
《Linux 一句话精彩问答》是 Linux 初学者很好的入门文档,想必很多朋友当时都是边看该文档,边
敲打键盘,玩着 Linux 过来的。该文档由本刊副总编陈绪主编,迄今已经收录近千个精彩问答。从本期
开始将在桌面应用栏目进行连载,希望能帮助到更多刚接触到 Linux 的朋友们。
Linux 一句话精彩问答——系统配置篇(5)
1101 linux 中刻录 iso 的方法
2 找刻录机的命令:
cdrecord --scanbus
输出结果为:
0,0,0 0) 'ATAPI ' 'CD-R/RW 8X4X32 ' '5.EZ' Removable CD-ROM
刻录的命令:
cdrecord -v speed=8 dev=0,0,0 hutuworm.iso
1102 屏幕变花时怎么办
开源 2008 年第 7 期 72
经验技巧
1103 卸载软件包时得知具体包名
在/etc/fstab 中加入一行:
none /tmp tmpfs default 0 0
或者在/etc/rc.local 中加入
mount tmpfs /tmp -t tmpfs -o size=128m
1105 用 ls 只列出目录
1108 bg 和 fg 的使用
开源 2008 年第 7 期 73
经验技巧
1110 目录统计脚本
1112 删除目录中含输入关键字的文件
开源 2008 年第 7 期 74
经验技巧
进入到 manual 目录
代码:
find ./ -regex .*\.en|awk -F. '{ printf "mv %s.%s.%s.%s %s.%s.%s\n",$1,$2,$3,$4,$1,$2,$3}'|sh
1117 如何起多个 X
启动完毕后用命令 dmesg 查看
1120 我需要编译内核,内核源码在哪里
1、一般在发行版的盘里都有,比如 RedHat,一般在第二、第三张上
开源 2008 年第 7 期 75
经验技巧
陈小晖
用 netstat 查看所有服务
以下命令可以显示所有的服务:
$ netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 *:telnet *:* LISTEN
tcp 0 0 *:smtp *:* LISTEN
tcp 0 0 192.168.1.5:32851 nest.anthill.echid:ircd ESTABLISHED
udp 0 0 *:ipp *:*
Active Unix domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
Unix 2 [ ACC ] STREAM LISTENING 1065 /tmp/ksocket-carla/klaunchertDCh2b.slave-socket
如果接收队列持续处于阻塞状态,那么很有可能受到了拒绝式服务的攻击。如果发送队列不能被快
速清除,则可能是因为有一个应用程序不能将所要发送的东西传送完。
“Local Address” 指本机的 IP 和端口号。“Foreign Address”指所要连接的主机名称和服务。
“State”指现在连接的状态。三种常见的 TCP 状态如下所示:
◆ LISTEN 等待接收连接;
开源 2008 年第 7 期 76
经验技巧
◆ ESTABLISHED 一个处于活跃状态的连接;
◆ TIME_WAIT 一个刚被终止的连接。它只持续 1 至 2 分钟,然后就会变成 LISTEN 状态。
由于 UDP 是无状态的,所以其 State 栏总是空白。
持续获取有用信息
使用“netstat -a”命令,显示结果可能会有数百行。其实,在这些结果中可以忽略所有“Active
Unix domain sockets”以后的内容。因为这些内容是本地内部进程之间的通信,而不是网络连接。使
用以下命令可以避免显示无用信息:
$ netstat --inet -a
检查网卡
开源 2008 年第 7 期 77
经验技巧
用 TC 实现动态带宽分配
郑重
在实际应用中,经常会遇到需要对网络节点的转发流量进行动态控制的情况,比如,某个节点有一
个网络应用,当该应用从网络接收数据时,要求该节点能够保证它的数据带宽;当该应用不接收数据时,
需要这个网络节点释放分配给它的网络带宽,以提高带宽资源利用率。下面介绍一种利用 TC 在 Linux 下
实现动态带宽分配的方法。
TC 简介
使用 TC 进行分类队列调度的基本步骤如下:
1.针对网络物理设备(比如以太网卡 eth0)绑定一个队列;
2.在该队列上建立分类;
3.为每一分类建立一个基于路由的过滤器;
4.为每个分类设置相应的 Qdisc。
动态带宽分配实例
开源 2008 年第 7 期 78
经验技巧
1.建立队列
根据假设条件建立队列,首先对 eth0 设置如下:
# tc qdisc del dev eth0 root handle 10: cbq bandwidth 10Mbit avpkt 1000
# tc qdisc add dev eth0 root handle 10: cbq bandwidth 10Mbit avpkt 1000
# tc class add dev eth0 parent 10:0 classid 10:1 cbq bandwidth 10Mbit rate 10Mbit
allot 1514 weight 1Mbit prio 8 maxburst 20 avpkt 1000
# tc class add dev eth0 parent 10:1 classid 10:200 cbq bandwidth 10Mbit rate 1Mbit
allot 1514 weight 100Kbit prio 5 maxburst 20 avpkt 1000 bounded
# tc qdisc add dev eth0 parent 10:200 sfq quantum 1514b perturb 15
这是为了保证数据转发的公平性。
对 eth1 的设置与 eth0 的设置基本相同:
# tc qdisc del dev eth1 root handle 20: cbq bandwidth 10Mbit avpkt 1000
# tc qdisc add dev eth1 root handle 20: cbq bandwidth 10Mbit avpkt 1000
# tc class add dev eth1 parent 20:0 classid 20:1 cbq bandwidth 10Mbit rate 10Mbit
allot 1514 weight 1Mbit prio 8 maxburst 20 avpkt 1000
# tc class add dev eth1 parent 20:1 classid 20:200 cbq bandwidth 10Mbit rate 1Mbit
allot 1514 weight 100Kbit prio 5 maxburst 20 avpkt 1000 bounded
# tc qdisc add dev eth1 parent 20:200 sfq quantum 1514b perturb 15
完成上面的设置后,该网络节点就已经建立了两个不同带宽转发队列。这两个队列不会同时被使用,
而是根据视频流量的实际输入情况,动态地选择其中一个队列作为当前的有效队列,这样就可以实现动
态的带宽分配了。
开源 2008 年第 7 期 79
经验技巧
2.队列的动态选择
队列的动态选择要应用到 TC 里面 Filter 的概念,Filter 是 TC 用来实现数据包分类的工具。当一个数
据包要进入队列时,系统首先依照优先级依次查询各种 Filter 定义的条件,然后把数据包划入其满足条件
的队列。Filter 对数据包分类的方法很灵活,根据不同的应用可以基于源/目的地址、源/目的的端口号、
协议类型、防火墙标记和 TOS 等建立合适的分类规则。
在 linux 下可以使用 ipchains 的数据统计功能来为视频数据建立一个统计项,然后根据该统计项来
判断当前是否有视频数据流入。如果有视频数据,则应用以下命令:
# tc filter add dev eth0 parent 10:0 protocol ip prio 100 route from 2 flowid 10:200
# tc filter add dev eth1 parent 20:0 protocol ip prio 100 route to 2 flowid 20:200
# tc filter del dev eth0 parent 10:0 protocol ip prio 100 route from 2 flowid 10:200
# tc filter del dev eth1 parent 20:0 protocol ip prio 100 route to 2 flowid 20:200
3.脚本实现流程
可以通过以下流程,利用脚本来实现系统的动态带宽分配:
{
为两个网口建立队列
选择相应队列后,“等待一段时间”是为了使这种
while [ 1 ]; do
动态调整不至于太频繁,以至于影响整个系统的效率。
获取当前视频输入的状态信息
if 无视频输入 then
小结
选择 10Mbps 带宽转发队列
等待一段时间
这里介绍了一种简单的动态带宽调整方法。其实,
else
通过更多的队列和更复杂的控制方法可以实现更为精细
选择 1Mbps 带宽转发队列
的带宽调整。希望以上介绍能够对读者有所启发和帮助。
等待一段时间
fi
done
}
开源 2008 年第 7 期 80
经验技巧
李汉强
当网站被越来越多的人访问时,Web 服务器就容易出现带宽和资源危机。面对访问数量的快速增长,
必须采用多服务器技术,并在这些服务器之间进行负载均衡(Round Robin)才能满足大量并发的访问
需求。
对 Linux 服务器来说,由于其在网络方面具有的强大功能,有很多方法可以实现 HTTP 访问的负载均
衡。下面就介绍几种简单、实用的方法。
利用 R-Proxy
如果没有,则需要进行安装。
然后,把“<IfModule mod_proxy.c>”和“</IfModule>”之间的代码替换为如下内容:
开源 2008 年第 7 期 81
经验技巧
利用 mod_rewrite 和 mod_proxy
# vi httpd.conf
RewriteEngine on
RewriteLogLevel 9
RewriteLog /var/log/apache2/rewrite_log
ProxyPassReverse / http://server1/
ProxyPassReverse / http://server2/
ProxyPassReverse / http://server3/
ProxyPassReverse / http://server4/
ProxyPassReverse / http://server5/
ProxyPassReverse / http://server6/
开源 2008 年第 7 期 82
经验技巧
local5.info /var/log/apache_access_log
local6.* /var/log/apache_error_log
LogLevel warn
ErrorLog syslog:local6
CustomLog "|/usr/bin/logger -t APACHE -p local5.info" common
随后在/etc/syslog.conf 文件中加入如下内容:
local5.info @logserver
local6.* @logserver
利用 Pound
#######################
## global options:
开源 2008 年第 7 期 83
经验技巧
User nobody
Group nobody
RootJail /chroot/pound
## allow PUT and DELETE also (by default only GET, POST and HEAD)?:
ExtendedHTTP 0
WebDAV 0
#######################
## listen, redirect and ... to:
ListenHTTP 0.0.0.0,80
其中笔者给出中文注释的代码需要根据实际情况进行设置。“BackEnd 192.168.0.1,80,1”一行最
后的数字“1”表示访问的优先级别,数字越小被访问的机率就越大。
开源 2008 年第 7 期 84
经验技巧
挂载(mount)命令使用技巧
Linux 系统在使用光盘、软盘或 U 盘时,必须先执行挂载(mount)命令。挂载命令会将这些存储
介质指定成系统中的某个目录,以后直接访问相应目录即可读写存储介质上的数据。
1.挂载光盘
挂载光盘的命令如下:
# umount /mnt/cdrom
2.挂载软盘
将软盘挂载到/mnt/floppy 目录的命令如下:
卸载软盘的命令如下:
#umount /mnt/floppy
3.挂载 U 盘
挂载 U 盘相对复杂一些。首先使用“fdisk -l”命令查看外挂闪存的设备号,一般为/dev/sda1。然
后用“mkdir /mnt/usb”命令建立一个挂载 U 盘用的目录。之后使用如下命令挂载 FAT 格式的 U 盘:
开源 2008 年第 7 期 85
经验技巧
4.挂载外挂硬盘分区
挂载外挂硬盘分区(FAT32 格式)同样需要先用“fdisk -1”查看外挂的硬盘分区设备号,假设
为/dev/hda1。建立/mnt/vfat 挂载目录后,使用如下命令进行挂载:
“僵尸”进程必杀技
田海洋
# killall mozilla-bin
开源 2008 年第 7 期 86
经验技巧
# ps -ux|grep mozilla
然后再用“kill -9 Mozilla-PID”命令。
kill 命令似乎麻烦一些,但是 killall 命令可能会导致非预期的效果。killall 的 Man Page 上就有提示:
特权用户在使用这个命令时需要特别小心。这是因为“在两次扫描的间隙,如果前一进程消失,被代之
以一个同名的新进程,‘killall -w’侦测不到”,所以可能会杀死其它用户的同名进程。
应用拓展
其实,系统重新启动 syslogd 的命令给出了一个很好的 kill 扩展使用方法示例。它先确定了 syslogd
进程的 PID,然后再将该 PID 作为参数输入给 kill 命令。基于这种想法,笔者编写了一个 Shell 脚本用来
查找指定进程的 PID,其内容如下:
cat status
#!/bin/bash
#Name:status
#Author:PopZslam
#Popur:To check the veryfiy process
#
printf "UID"\\t"PID"\\t"NAME"\\n
ps -aux|grep -v $0|grep -v grep|grep $1|awk -F" " '{print $1"\t" $2"\t" $11}'
#End
# status mozilla
UID PID NAME
500 2033 /bin/sh
500 2043 /bin/sh
500 2048
/home/dianhaiyong/bin/local/mozilla/mozilla-bin
开源 2008 年第 7 期 87
经验技巧
小结
轻松玩转 Firefox(2)
linuxpk.com kennycx
在上一期杂志中,我们与各位读者分
享了 Firefox 下常用的一些扩展及插件,
其实 Firefox 下还有很多有趣的扩展应用,
接下来将对大家进行介绍。
Firefox 的天气预报
图1
开源 2008 年第 7 期 88
经验技巧
图 2 我们国家都用摄氏度,所以要设置温度单位,“公制”
为摄氏度,“英制”为华氏温度。你还可在设置界面设置天气预报的天数。(如图 1)
设置完毕之后,Firefox 的右下角会出现未来几天的天气预报图标(如图 2)。看着状态栏上不断换
变的天气图标,也似乎能提醒自己,该接触一下大自然,不要成天泡在网上了 。
图3
开源 2008 年第 7 期 89
经验技巧
超级拖曳
Maxthon 浏览网页时的超级拖拽功能,相信你用过以后就再也舍不得丢弃了。只要你装上
SuperDragAndGo 即可实现,这个插件无须设置。现在你只要把网页上的链接或文本拖至任意空白处,
即可在新标签页中打开或者直接到 Google 搜索。
我们可以在 http://downloads.mozdev.org/superdragandgo/SuperDragAndGo-0.2.4.xpi 下载
到最新版本并安装它。
安装后,我们用鼠标拖动网页链接,文本链接或者文本链接自动在新 Tab 中打开,选中一段文字后
用鼠标拖动,会在新 Tab 中调用选中的整合搜索引擎自动进行搜索,可以设置拖动一张图片,自动对图
片进行下载和保存,保存的路径在 SuperDragAndGo 的设置选单中设定。
Gmail 邮件通知
开源 2008 年第 7 期 90
经验技巧
图 4
为 Firefox 装上金山词霸
在 http://linuxfans.org/nuke/modules.php?name=Site_Downloads&op=geninfo&did=3430
下载到内嵌在 Firefox 的金山词霸,将其解压后方在 Firefox 的 searchplugins 目录下,在搜索引擎那一
栏中将多出个 Ciba 搜索,它使用
cb.kingsoft.com 网站提供的字典,
为我们提供在线字典的功能(如图
5)。
Firefox 自带有几个搜索引擎,如果
你觉得还不够用,你可以在 http://
www.firefox.net.cn/newforum/d
ownload.php?id=377 下载到别人
打包好的近 30 个搜索引擎的插件,
将其解压到 Firefox 的
searchplugins 目录下即可正常使
用了(如图 6)。
图 5
开源 2008 年第 7 期 91
经验技巧
Firefox 主题更换
优化 Firefox 提高上网速度
开源 2008 年第 7 期 92
经验技巧
面有一个大图片或者执行时间较长的脚本,后面已经发送的请求就会被阻塞;而在这种情况下,如果没
有使用 pipelining,浏览器发现一个请求处理时间很长,自然会使用另一条持久连接用作后续请求,甚
至进一步开启非持久连接。另外,如果服务器支持 pipelining 不好而过早的关闭连接,浏览器势必要重
新发送请求。基于这种种原因,有人认为这个数字设置得比 2 大反而会降低浏览速度。我个人的推荐是,
这个数值一般情况可以保持默认值 4,如果浏览的网站有大量的静态小图片,或者网络速度较慢,可以尝
试将其调大。)
network.http.max-persistent-connections-per-proxy 4 (每个代理服务器允许的最大持久连接
数。4 是目前比较公认的最合适的数值,尽管 HTTP/1.1 的推荐值是 2。)
network.http.proxy.keep-alive true (连接代理服务器是否允许持久连接。true 挺好的。)
network.http.proxy.pipelining false(连接代理服务器是否允许 pipelining。目前普遍认为大多数
代理服务器支持 pipelining 并不好,所以一般不建议打开。)
图7
开源 2008 年第 7 期 93
经验技巧
50 个让你疯狂的软件
以及其开源软件替代方案(二)
作者:immy Atkinson
编译:Linuxpk.com Cheiron 王乐
通 信
30、从 AIM 到 Pidgin:别再用它了。AIM,AOL 的即时通讯工具,已经不再一统天下了。开源的
Pidgin,一个支持多种协议的即时通讯终端允许你同时使用你所有的即时通讯账户。让我们别再用 AIM
开源 2008 年第 7 期 94
经验技巧
媒体
35、从 iTunes 到 Songbird: 如果你正习惯于这个等式:Apple+iPod+iTunes=许多许多钱,那
么你也许应该尝试一下使用 Songbird 了。Songbird 是一个开源的播放器,一个平台,它承诺“播放你
想听的音乐+从你喜欢的站点+在你想要的设备上”。Songbird 挑战被发现的习惯,购买,消费和组织
开源 2008 年第 7 期 95
经验技巧
网上的音乐。
36、从 Nero Burning Rom 到 K3b:Nero Burning Rom 是一个流行的烧录 CD、DVD 和蓝光光盘
的工具。这个软件包含了备份,CD 拷贝和声音特性等等,而且非常易用。但是它不像
K3b(Windows)一样是开源。后者可以烧录 Cd 和 DVD,包括非凡的 DivX/XviD 编码,DVD 拷贝,
VCD 创建,通过任何音频文件来创建音频 CD,CD-TEXT 支持音频 CD,支持 DVD-RW 和 DVD+RW
等等。哦,还用我们说它非常易用吗?
功 能
40、从 CuteFTP 到 Filezilla:确实,CuteFTP 是可爱的,但是它并不免费。确实,它是可信赖的,
但是许多其他的 FTP 应用程序同样可信赖。试试 Filezilla,一个快速的 Windows 上的 FTP 和 SFTP 终端,
有着许许多多的特点——易于安装,易于使用,值得信赖,可靠安全,而且开源。
开源 2008 年第 7 期 96
经验技巧
安 全
45、从卡巴斯基杀软个人版到 Winpooch:卡巴斯基杀毒软件由于其突出的查毒效率,也许是
Windows 上杀软市场的顶级产品了。它具有多种进程,所以能对付普通病毒,脚本病毒,扫描压缩文件
(比如 zip 文件),还能邮件中移除病毒。它也提供间谍软件保护和广告软件保护。作为一个开源的代替,
Winpooch 也能扫描你电脑上的文件,发现感染的文件,对付所有的病毒,木马和其他卡巴斯基能够发
现和解决的问题。顺便说一下,Winpooch,还有实时扫描功能,这是 ClamWin(下面将提到)所没有
的。
开源 2008 年第 7 期 97
经验技巧
金 融
48、从 Authorize.net 到 OpenSSL:Authorize.net 是首选的支付和交流途径,AIM 为商人们交易
提供了高级的和可定制的安全的平台。但是,当你可以免费获得一个开源产品的时候,为什么还要为可
靠的 SSL 付钱呢?OpenSSL 项目致力于发展一个健全的,商务级别的,功能完善的,和开源的工具,支
持保密插口层(SSL v2/v3)和传输层安全性(TLS v1)协议以及有力的密码机制。全世界的志愿者们通
过互联网来交流、计划和发展 OpenSSL 工具箱,它用文档的形式来管理这个项目。
你喜欢这篇文章,是吗?那么…
开源 2008 年第 7 期 98
企业应用
企业应用
构造 chroot 服务监禁
钟国春
在安全至上的今天,针对系统部署安全方案是必不可少的。服务监禁便是其中的一种。服务监禁就
是把运行在 Linux 主机上的各种服务,比如 DNS、PHP、MySQL、Web 等放置在一个特定的环境
chroot 中运行,从而把这些服务同整个系统隔离开来。这样,即使黑客利用服务的漏洞攻破了应用,也
很难突破该 chroot 环境而危害到系统本身。那么,服务监禁到底有多安全?如何在 chroot 环境中配置、
应用服务呢?
配置 chroot 基本环境
首先,需要创建一些必要的目录:
这些目录分别用来存放 chroot 环境下安装应用所需要的
#mkdir -p /chroot/soft
包、构建 chroot 环境所需的 RPM 包和编译 chroot 环境所需
#mkdir -p /tmp/rpm/basic
要的 RPM 包。
#mkdir -p /tmp/rpm/compile
开源 2008 年第 7 期 99
企业应用
图1
图2
开源 2008 年第 7 期 100
企业应用
#cp /etc/hosts /chroot/etc
#cp /etc/resolv.conf /chroot/etc
#cp /etc/fstab /chroot/etc
httpd-2.0.46.tar.gz php-4.3.2.tar.gz
mysql-4.0.15a.tar.gz proftpd-1.2.8.tar.gz
proftpd-mod-quotatab-1.2.7.tar.gz
下面尝试启动 chroot:
#chroot /chroot
bash-2.05b#
注意提示符前面的信息变化,这表示已经成功安装并启动。由于下面编译安装 MySQL、Apache 等
服务时需要查看/proc 文件系统内容,所以,先将/proc 文件系统 mount 上去:
bash-2.05b#mount /proc
在 chroot 中配置各种应用
开源 2008 年第 7 期 101
企业应用
1.MySQL 数据库的安装、配置和安全调整
(1)安装和配置 MySQL(限于篇幅,屏幕输出基本略去)
(2)修改配置文件
为了增加安全性,需要禁止远程访问。添加“skip-networking”到/chroot/etc/my.cnf 的
[mysqld]一节,并注释掉“port=3306”。这样,在重启 mysqld 进程时就会生成 mysql.sock,用于同
PHP 程序通信。添加“set-variable=local-infile=0”到/chroot/etc/my.cnf 的[mysqld]节可以提高本
开源 2008 年第 7 期 102
企业应用
地安全性。
修改管理员密码,以防止黑客的空密码连接:
bash-2.05b#/usr/local/mysql/bin/mysql -u root
mysql> SET PASSWORD FOR root@mylinux=PASSWORD(' DB23#RT5!');
删除默认用户数据库:
把历史记录扔到黑洞里面:
关闭服务:
开源 2008 年第 7 期 103
企业应用
2.Apache 的安装、配置和安全调整
(1)编译安装
#chroot /chroot
bash-2.05b#groupadd apache
bash-2.05b#useradd apache -c "Apache server" -d /dev/null -g apache -s /sbin/nologin
bash-2.05b#mkdir -p /www/vhosts/he
bash-2.05b#mkdir -p /www/vhosts/she
bash-2.05b#cd /soft/httpd..
bash-2.05b# ./configure --prefix=/usr/local/apache --enable-so --disable-info --disable-
autoindex --disable-status --disable-cgi --disable-dav --disable-include --disable-env --
disable-setenvif --disable-negotiation --disable-imap --disable-actions --disable-userdir
--disable-alias --disable-asis
bash-2.05b#make;make install
(2)修改配置文件/chroot/usr/local/apache/conf/httpd.conf
部分配置文件如下:
开源 2008 年第 7 期 104
企业应用
ServerAdmin admin@hotmail.com
DocumentRoot /www/vhosts/he
DirectoryIndex index.php
ServerName he.example.com
ErrorLog logs/he.example.com-error_log
CustomLog logs/he.example.com-access_log common
</VirtualHost>
<VirtualHost *>
ServerAdmin admin@hotmail.com
DocumentRoot /www/vhosts/digico
DirectoryIndex index.php
ServerName she.example.com
ErrorLog logs/she.example.com-error_log
CustomLog logs/she.example.com-access_log common
</VirtualHost>
#Dynamic Shared Object (DSO) Support
#LoadModule foo modules/foo.so
(3)Apache 服务的开启和关闭
3.PHP 安装配置
(1)编译安装
#chroot /chroot
#cd /soft/php...
#./configure --with-apxs2=/usr/local/apache/bin/apxs \ --with-
mysql=/usr/local/mysql \ --with-config-file-path=/usr/local/apache/conf \ --enable-
safe-mode
#make;make install
开源 2008 年第 7 期 105
企业应用
(2)修改配置文件 php.ini
4.安装和配置 ProFTP
配置 FTP 的目的是允许用户更新他们的 Web 主目录。由于磁盘空间有限,所以这里配置 ProFTP 有
磁盘配额功能,需要额外下载 proftpd-mod-quotatab-1.2.7.tar.gz。
bash-2.05b#groupadd proftp
bash-2.05b#useradd proftp -c "Proftp server" -d /dev/null -g proftp -s /sbin/nologin
bash-2.05b#cd /chroot/soft
bash-2.05b#cd mod-quotatab
bash-2.05b#cp mod_quotatab.c ../proftpd-1.2.8/contrib/
bash-2.05b#cp mod_quotatab.h ../proftpd-1.2.8/contrib/
bash-2.05b#cp mod_quotatab_file.c ../proftpd-1.2.8/contrib/
bash-2.05b#chroot /chroot
bash-2.05b#cd /soft/proftpd-1.2.8
bash-2.05b#install_user=proftp install_group=proftp ./configure
--prefix=/usr/local/proftp \ --with-modules=mod_quotatab:mod_quotatab_file
bash-2.05b#make
bash-2.05b#make install
bash-2.05b#cd /soft
bash-2.05b#cp ftpquota /usr/local/proftp/etc
bash-2.05b#cd /usr/local/proftp/etc
bash-2.05b#./ftpquota --create-table --type=limit
bash-2.05b#./ftpquota --create-table –type=tally
bash-2.05b# ./ftpquota --add-record --type=limit --name=he --quota-type=test \
--bytes-upload=4 \ --units=Gb \ --table-path=/usr/local/proftp/etc/ftpquota.limittab
bash-2.05b#exit
开源 2008 年第 7 期 106
企业应用
exit
#
(1)修改配置文件/chroot/usr/local/proftp/etc/proftpd.conf
去掉 DefaultRoot ~前面的注释,将限制用户登录后其宿主目录成为“/”。并且加入下列和配额相
关的项目:
QuotaEngine on
QuotaDisplayUnits Gb
QuotaDirectoryTally on
QuotaShowQuotas on
QuotaLog /usr/local/profane/etc/quota.log
QuotaLimitTable file:/usr/local/proftp/etc/ftpquota.limittab
QuotaTallyTable file:/usr/local/proftp/etc/ftpquota.tallytab
(2)启动 ProFTP
#chroot /chroot
bash-2.05b#/usr/local/proftp/sbin/proftpd start
(3)测试
bash-2.05b#useradd vhrdd
bash-2.05b#passwd vhrdd
bash-2.05b#exit
exit
# ftp localhost
Connected to localhost (127.0.0.1).
220 Secure FTP server ready
Name (localhost:safe): vhrdd
331 Password required for vhrdd.
Password:
230 User vhrdd logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> quote SITE QUOTA
200-The current quota for this session are [current/limit]:
开源 2008 年第 7 期 107
企业应用
Name: vhrdd
Quota Type: User
Per Session: False
Limit Type: Hard
Uploaded Gb: 0.00/4.00
Downloaded Gb: unlimited
Transferred Gb: unlimited
Uploaded files: unlimited
Downloaded files: unlimited
Transferred files: unlimited
200 Please contact guochunzhong@msn.com if these
entries are inaccurate
ftp> bye
221 Goodbye.
#
5.综合测试
配置完成后,可以联合测试 chroot 环境下 Apache、MySQL 和 PHP 的工作情况。
#cd /chroot/www/vhosts/he
#vi index.php
<html><body>
<?php
$link = mysql_connect("localhost", "vdata", "DB23#RT5!")
or die;
print "HE IS OK !";
mysql_close($link);
?>
</body></html>
#vi /etc/hosts
192.168.0.99 he.example.com
#lynx http://he.example.com
HE IS OK !
开源 2008 年第 7 期 108
企业应用
防止黑客突破 chroot 环境
开源 2008 年第 7 期 109
企业应用
bash-2.05b#su - apache
bash-2.05b$/usr/local/apache/bin/httpd -k start
(13)Permission denied: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
#vi /chroot/usr/local/apache/conf/httpd.conf
......
Listen 8080
......
bash-2.05b#su - apache
bash-2.05b$/usr/local/apache/bin/httpd -k start
bash-2.05b#exit
exit
#ps -aux|grep httpd
#504 20824 0.0 2.6 7396 3340 ? S 15:18 0:00 /usr/local/apache/bin/httpd -k start
#504 20825 0.0 2.6 7412 3340 ? S 15:18 0:00 /usr/local/apache/bin/httpd -k start
......
开源 2008 年第 7 期 110
企业应用
小结
没有绝对的安全,只有相对的安全。安全不是一个产品,而是一个过程。在这个过程中,人所扮演
的角色始终是最主要的。建立完善的安全制度,在技术上对安全进行加固,并严密监控系统的运行,安
全就有了一定程度的保障。黑客攻击与安全防范这场没有硝烟的战争注定了是一场持久战,在这样反复
的较量中,技术得以不断革新和进步。
邮件客户端整合 LDAP
潘宇
在公司中,员工使用多种客户端收发邮件, 员的邮件地址以及其他部门有关人员的邮件地址
保存公司内其他员工的邮件地址信息。但当电脑 都会十分不了解,这可能会降低新员工入职后在一
重装系统,感染病毒,或遇到软件问题的时候, 段时间内的工作效率。在企业内部员工收发邮件
很可能造成联系人信息的丢失。这给员工带来很 会 用 到 多 种 客 户 端 , 例 如 Outlook, Outlook
多不便,同时也降低了工作效率。建立企业内部 Express, Evolution, Thunderbird 等,这些邮件
的员工信息数据库并整合目前流行的邮件客户端, 客户端都支持 LDAP。在使用这些邮件客户端的
已经成为越来越多企业的选择。 时候就可以方便查询各个部门的所有员工信息,
无论对于新员工还是老员工,这样的改进都会极
目前一些企业的现状 大的提高工作效率。另外,在 LDAP 中还可以存
储员工照片,在邮件的客户端中还可以显示员工
目前,很多企业在存储员工的联系方式和工 入职时提供的照片,这样就更方便了员工之间的
作电话,以及人力资源存储的个人信息都形成了 沟通和交流。
信息孤岛,有的甚至统一存放在一张 excel 表中,
当员工的手机电话或工位发生了调整,这些信息 使用 LDAP 的优势
孤岛中的数据很少被更新。
员工的个人信息都可以存放在 LDAP 数据库 事实上,员工的信息可以存放在各种数据库
中,新员工在进入一个部门的时候对部门内部人 中,例如关系型数据库 MySQL,使用 LDAP 来存
开源 2008 年第 7 期 111
企业应用
储这些信息也有其优势: 存 在 LDAP 服 务 器 端 , 邮 件 客 户 端 , 例 如
1.LDAP 是一个标准的协议,不会因为厂商 Outlook,实际上是作为 LDAP 的客户端去访问
的不同造成实现的差异化。这样就便于开发人员 LDAP 服务器上的数据。点开 Outlook “联系人
开发软件。开发人员不用担心做出的软件会由于 ”的属性可以看到很多信息,如图 1。
LDAP 数据库的不同而不能正常使用。这也是为
什么目前很多大厂商开发的邮件客户端(例如 这些信息和 LDAP 数据库中的人员的属性是
Outlook, Thunderbird, Evolution)都支持使用 一一对应的。这种对应关系在各个邮件客户端中
LDAP 目录来存储邮件地址信息的原因。 是有区别的,举例来说,Outlook 在联系人属性
2.提高数据的安全性。把联系方式存放在 中“姓名”这一栏对应的是 LDAP 中的“cn”
LDAP 中的另一个优势是在员工的工作机出现硬 (即 common name)属性,但在 Thunderbird
件或软件问题的时候,不用担心丢失重要的联系 中,“姓名”这一栏可能对应的就是属性“
人,所有人的联系方式都可以在服务器中找到。 displayName”。为了兼容这两个邮件客户端,
3.避免信息孤岛的产生。LDAP 数据库的用 在 LDAP 数据库中就会存在冗余数据,把用户的
途很广不但可以存放用户的邮件,还可以做身份 中 文 姓 名 分 别 放 在 属 性 “ cn” 和
认证或存储各种证书。出于企业内部数据整合的 “displayName”中。依次类推,为了使主流的
目的更应该选择 LDAP 这样的通用的协议。 邮件客户端都能够正常工作,在 LDAP 服务器中
会有多处出现上述情况。以下我将以目前主流的
邮件客户端整合 LDAP 的工作原理 邮件客户端为例说明具体的对应情况,我选择了
以 下 4 个 邮 件 客 户 端 版 本 , Outlook
用户的邮件地址信息以及个人的联系资料储 Express6 , Outlook 2003 , Outlook 2007
beta2 , Thunderbird
。 其 中 Outlook
2003,Outlook 2007
beta2 是 完 相 同 的 。
Evolution 和
Thunderbird 是 极 其
相似的,这里只以
Thunderbird 为 例 ,
如图 2 所示。
图1
开源 2008 年第 7 期 112
企业应用
的存放员工信息的接点。
搜索的时候同样选择“工具”->“通
讯簿”,点“查找用户”,输入相应
的用户名就可以查找了。
Outlook2003/2007 的配置方法:
图 2 会生效。
搜索的时候选“工具”->“通讯簿”,点“
配置方法以及需要注意的问题 查找”即可。
“通讯簿” 求,例如,只有认证通过的用户才可以查看企业
>“帐户”,点“添加” 有这样的安全选项,例如员工甲在服务器中对应
开源 2008 年第 7 期 113
企业应用
部分如下: AUXILIARY
access to attrs=userPassword MAY ( company )
by self write )
by anonymous auth
access to * attributeType 部分为新添加的 company 属
by self write 性,其中的第一串以点分开的数字是 company
by users read 这个属性的唯一标识,这串数字是任意的,只要
不和已有标识冲突即可。下面的 DESC 部分是对
通过修改 ACL 权限还可以实现对员工的部分 company 属性的描述,EQUALITY 的值表示匹配
隐私属性进行隐藏,只允许具有一定权限的人看 模式,caseIgnoreMatch 代表 company 字段的
到。 值 与 大 小 写 无 关 。 下 面 的 SUBSTR 代 表
如果只是整合 Thunderbird 或 Evolution 等 company 字段的类型,目前是忽略大小写的字符
开源软件,到这里整个配置过程就结束了。如果 串 型 , 最 后 的 SYNTAX 是 字 符 串 型
要 更 好 的 整 合 微 软 的 Outlook Express 以 及 caseIgnoreSubstringsMatch 的唯一标识。
Outlook 还要为这两个客户端建立新的 schema 接下来的 objectClass 部分是定义一个新的
文件以增加它们所需要的特殊的元素属性 组,用来包含 company 这个属性,如果还需要
(attributeType)。由于微软在开发 Outlook 的过 有更多的属性被定义,都可以写在 objectClass
程中应用了很一些未成为标准的技术和一些非标 部分的 MAY 中,各个属性用“$”分开。
准的属性,例如 Outlook 需要 company 属性作 最后还要在 OpenLDAP 的配置文件中把这
为用户的“单位”显示在联系人信息中,这个属 个新创建的 schema 文件“include”进来,例如:
性在标准的 schema 文件中是不存在的,所以需 include
要手工添加这些属性,下面以其中的一个属性为 /usr/local/etc/openldap/schema/outlook.sch
例简要说明创建新属性的过程。所有新创建的属 ema
性都要写到 schema 文件中,并在 LDAP 服务器
启动的时候加载到服务器中。 这是从一个标准的位置引入一个名为
outlook.schema 的 schema 文件。
attributeType ( 1.3.6.1.4.1.4203.666.100.130
NAME 'company'
DESC 'the name of corporating' 写在最后
EQUALITY caseIgnoreMatch
SUBSTR caseIgnoreSubstringsMatch 虽然微软提供商用的解决方案,如 Active
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 ) Directory、Exchange,但开源的 OpenLDAP 也
objectClass ( 1.3.6.1.4.1.4203.666.100.1 同样可以做的很好,目前在易用性方面和商业解
NAME 'officePerson' 决方案还有一些差距,但 OpenLDAP 的开发团
DESC 'Office employee or computer user' 队一直十分活跃,相信在不久的将来一定可以超
SUP top 过商业产品。
开源 2008 年第 7 期 114
企业应用
顾宏军
化,标准化。
VtigerCRM 客户关系系统不能做什么?
VtigerCRM 不是万能的,不可能时候任何场
合,它只适用普通的中小企业,几个人到几十个
人的公司,特别是贸易企业,销售团队,服务企
业等,如果有分公司,子公司等可能不太适合,
如果希望进行生产管理也不适合,因为它没有生
产管理功能,默认的财务管理功能也比较弱。
和所有客户关系管理系统一样,VtigerCRM
不适场合,实施的困惑,系统工作流程等。下期 素。
采购、库存、客服等全程跟踪客户,最大可能获 或者各个部门抽个把人成立信息录入组,将公司
得订单,提高客户满意度;比较适合销售团队, 的各种客户的历史数据,进行分类录入,然后相
贸易公司,服务型企业使用;部分作用如下: 关负责人或相关部门对录入内容进行审核,在系
A. 统一记录与管理客户资料,不再担心资料丢失; 统中有一定数据量后,各个业务人员,客服人员
C. 自动化的统计分析您的客户信息、销售情况等; 化它的工作,减少不少的工作量,因为见到好处,
D. 全面掌握公司业务信息,避免人员离职等导致 没有人不会喜欢。
开源 2008 年第 7 期 115
企业应用
开源 2008 年第 7 期 116
嵌入式
嵌入式
北京亚嵌专家讲师(www.akaedu.org ) 李明
ARM 的体系结构
开源 2008 年第 7 期 117
嵌入式
图1
图2
每一种处理器异常模式,都有一个对应的 SPSR ( Saved Program Status Register )寄存器,用来保
存进入异常模式前的 CPSR。SPSR 的作用就是当从异常模式退出时,可以通过一条简单的汇编指令就能
够恢复进入异常模式前的 CPSR,而这个值都是保存在当前异常模式的 SPSR 中的。例如:当从 usr 态进
入中断 irq 态时,原先的 CPSR_all 将被保存在当前的 SPSR_irq 中,类似的异常模式下的 SPSR 还有
SPSR_fiq、SPSR_svc、SPSR_abt、SPSR_und。非异常模式的 usr 和 sys 模式下没有 SPSR,只有
CPSR。不能显式的指定把 CPSR 保存到某个异常模式下的 SPSR,比如 SPSR_irq,而必须是变更到 irq
开源 2008 年第 7 期 118
嵌入式
图3
a)通用寄存器:
i.R0-R7:与所有处理器模式无关的寄存器,可以用作任何用途。
ii.R8-R14:与处理器模式有关的寄存器,在不同的模式下,对应到不同的物理寄存器。其中 R13
又叫做 sp,一般用于堆栈指针。R14 又叫做 lr,一般用于保存返回地址。这两个寄存器在每种异常模式
下都对应到不同的物理寄存器上,例如 lr_irq、lr_svc、lr_fiq 等。
iii.R15:又叫做程序计数器,即 pc,所有的模式下都使用同一个 pc。
b)状态寄存器:
i.CPSR:当前程序状态寄存器,所有的模式下都使用同一个 CPSR。
ii.SPSR:保存的程序状态寄存器,每种异常模式下都有自己的 SPSR,一共有 5 种 SPSR,即
SPSR_irq、SPSR_fiq、SPSR_svc、SPSR_abt、SPSR_und。usr 和 sys 态下没有 SPSR 。
所有的 ARM 寄存器的命名和含义,可以用下面的这张表来说明,其中相同命名的都是同一个物理寄
存器,不同命名的寄存器都对应不同的物理寄存器,如图 4 所示。
开源 2008 年第 7 期 119
嵌入式
图4
uC/OS-II 移植工作介绍
uC/OS-II 实际上可以简单地看作是一个多任务的调度器,在这个任务调度器之上完善并添加了和多
任务操作系统相关的一些系统服务,如信号量、邮箱等。它的 90%的代码都是用 C 语言写的,因此只要
有相应的 C 语言编译器,基本上就可以直接移植到特定处理器上,这也是 uC/OS-II 具有良好的可移植性
的原因。移植工作的绝大部分都集中在多任务切换的实现上,因为这部分代码主要是用来保存和恢复处
理器现场(即相关寄存器),因此不能用 C 语言,只能使用特定的处理器汇编语言完成。
uC/OS-II 的全部源代码量大约是 6000-7000 行,一共有 15 个文件。将 uC/OS-II 移植到 ARM 处
理器上,需要完成的工作也非常简单,只需要修改三个和 ARM 体系结构相关的文件,代码量大约是 500
行。以下分别介绍这三个文件的移植工作:
开源 2008 年第 7 期 120
嵌入式
1.OS_CPU.H 文件
数据类型定义
这部分的修改是和所用的编译器相关的,不同的编译器会使用不同的字节长度来表示同一数据类型,
比如 int,同样在 x86 平台上,如果用 GNU 的 gcc 编译器,则编译为 4 bytes,而使用 MS VC++则编
译为 2 bytes。我们这里使用的是 GNU 的 arm-elf-gcc,这是一个免费并且开放源码的编译器。相关的
数据类型的定义如下,如图 5 所示。
图5
堆栈单位
因为处理器现场的寄存器在任务切换时都将会保存在当前运行任务的堆栈中,所以 OS_STK 数据类
型应该是和处理器的寄存器长度一致的。
图6
堆栈增长方向
堆栈由高地址向低地址增长,这个也是和编译器有关的,当进行函数调用时,入口参数和返回地址
一般都会保存在当前任务的堆栈中,编译器的编译选项和由此生成的堆栈指令就会决定堆栈的增长方向。
图 7
开源 2008 年第 7 期 121
嵌入式
宏定义
包括开关中断的宏定义,以及进行任务切换的宏定义。
图8
2.OS_CPU_C.C 文件
任务堆栈初始化
这里涉及到任务初始化时的一个堆栈设计,也就是在堆栈增长方向上如何定义每个需要保存的寄存
器位置,在 ARM 体系结构下,任务堆栈空间由高至低依次将保存着 pc、lr、r12、r11 、r10、…
r1、r0、CPSR、SPSR。
图 9
开源 2008 年第 7 期 122
嵌入式
图 10
系统 hook 函数
此外,在这个文件里面还需要实现几个操作系统规定的 hook 函数,如下:
OSSTaskCreateHook( )
OSTaskDelHook( )
OSTaskSwHook( )
OSTaskStatHook( )
OSTimeTickHook( )
如果没有特殊需求,则只需要简单地将它们都实现为空函数就可以了。
3.OS_CPU_A.S 文件
OSStartHighRdy()
此函数是在 OSStart()多任务启动之后,负责从最高优先级任务的 TCB 控制块中获得该任务的堆
栈指针 sp,通过 sp 依次将 cpu 现场恢复,这时系统就将控制权交给用户创建的该任务进程,直到该任
务被阻塞或者被其他更高优先级的任务抢占 cpu。该函数仅仅在多任务启动时被执行一次,用来启动第
一个,也就是最高优先级的任务执行,之后多任务的调度和切换就是由下面的函数来实现。
OSCtxSw()
任务级的上下文切换,它是当任务因为被阻塞而主动请求 cpu 调度时被执行,由于此时的任务切换
开源 2008 年第 7 期 123
嵌入式
OSIntCtxSw()
中断级的任务切换,它是在时钟中断 ISR(中断服务例程)中发现有高优先级任务等待的时钟信号到
来,则需要在中断退出后并不返回被中断任务,而是直接调度就绪的高优先级任务执行。这样做的目的
主要是能够尽快地让高优先级的任务得到响应,保证系统的实时性能。它的原理基本上与任务级的切换
相同,但是由于进入中断时已经保存过了被中断任务的 cpu 现场,因此这里就不用再进行类似的操作,
只需要对堆栈指针做相应的调整,原因是函数的嵌套。
OSTickISR()
时钟中断处理函数,它的主要任务是负责处理时钟中断,调用系统实现的 OSTimeTick 函数,如果
有等待时钟信号的高优先级任务,则需要在中断级别上调度其执行。其他相关的两个函数是
OSIntEnter()和 OSIntExit(),都需要在 ISR 中执行。
ARMEnableInt()& ARMDisableInt()
分别是退出临界区和进入临界区的宏指令实现。主要用于在进入临界区之前关闭中断,在退出临界
区的时候恢复原来的中断状态。它的实现比较简单,可以采用方法 1 直接开关中断来实现,也可以采用
方法 2 通过保存关闭/恢复中断屏蔽位来实现。
我的移植体会
开源 2008 年第 7 期 124
嵌入式
总结
移植 uC/OS-II 到 SkyEye 上,既是对 uC/OS-II 的学习和实验,同时也是对 SkyEye 仿真器的验证
和实践。uC/OS-II 作为一个优秀的实时操作系统已经被移植到各种体系结构的微处理器上,也是目前较
为常用的公开源码的实时内核。从这里入手学习嵌入式系统开发的基本概念,以及在 SkyEye 里构造一个
可以运行的 RTOS,能够使我们更深入地了解嵌入式开发的流程,在没有硬件的条件下也能对 ARM 的体
系结构有个初步的认识。
在移植 uC/OS-II 到 SkyEye 之后,我得到了一块 Samsung 的 ARM 评估板,在调通了板子上一些
相关硬件(例如串口输出和定时器)的驱动后,仅仅花了不到一天时间就将 SkyEye 下的 uC/OS-II 移植
到了真实的开发板上,这也说明在 SkyEye 上所做的移植工作是非常有意义和帮助的,完全可以作为嵌入
式开发的入门捷径。
如果大家移植过程中遇到什么问题,欢迎发 email 和我讨论。
作者简介:李明,清华大学计算机系硕士,北京亚嵌(www.akaedu.org)专职讲师,10 年软件开发经验 ,
5 年嵌入式行业教学经验。是 www.lumit.org 开源项目 lumit(嵌入式个人学习网)的创办者,《源码开
放的嵌入式系统软件分析与实践——基于 SKYEYE 和 ARM 开发平台》一书作者, SkyEye 嵌入式开源
项目核心开发成员。国内最早将 uC/OS-II 实时操作系统移植到 SkyEye 模拟器上,独立设计并实现
CEBus 协议的解释器,并将其移植到 ColdFire 平台;曾负责国家高技术研究发展计划项目-微小型直
升机控制系统设计与姿态控制研究项目,并且基于 RTLinux 实时操作系统完成了"国家 863 计划-虚拟
漫游智能机器人平台项目"的控制软件总体设计和实施。 Email: limingth@akaedu.org
开源 2008 年第 7 期 125
嵌入式
李阳
所以当时看到了 AKAE,心中一亮,更坚定了自
己不去加入那些盲目去招聘会的大军里了。终于
在七月份,我毕业了,也如愿的来到了由中国一
些开源项目领头羊们带领的 AKAE。
学习全景实录
说已经完全的改变。 是爱不释手了。
困惑了很多年,有可能现在才真的知道为什么吧。 的 code,一个程序,不,应该说是一个小项目吧,
法(当然,当时肯定不知道黑客这个词了)。原 (#ifndef,#define,#endif)的头文件,和规范的编
帮同学免费的在网吧上网,在院里可以和老师一 了。
块做项目。但是真正发觉自己只是在电脑业余爱 第三周,是对自己编程的升华了,都知道
那些科班出身的人的一个项目。做完项目后,大 是对 C 语言的深入理解。在这周里,我学到了一
家都在找工作了,我心里非常明确的告诉自己不 直非常想得到的但书本上不会讲的东西。例如,
开源 2008 年第 7 期 126
嵌入式
的感觉可能只有自己能够体会的到吧。 机世界的命脉-处理器的体系架构。原来在学校
真正对思想的改变还是对 UNIX 编程的学习, 只是学过微机原理,现在看到了精简指令集架构
IO 编程,进程,信号量,线程,还有网络的编程 的美,知道了 2/8 原则的成功思想,无奈那些老
中,我学到了很多操作系统级的知识,和网络协 牌的 CISC 的处理器要兼顾它以前的东西。当了
议的知识。当然更重要的是,在 AKAE 众多武林 解了一些“大脑”-处理器是怎么干活的时候,
高手的指点下,自己也有勇气并可以看懂一些传 例如:异常,中断,内存管理,流水线,等知识
说中的葵花宝典级的书了。 后,感觉自己离计算机这个世界又进了一步。
增加内功后,自己知道了 UNIX 编程的名言 这周的试验更是有趣,看着自己编的跑马灯,
“尽量提供机制,而不提供策略”。自己编程是 听着蜂鸣器发出的音乐(虽然音质上。。。),
站在用户态呢,还是内核态。当在用户态编程时, 不过这都是自己的成果呀,一个字--“享受”。
我的程序的进程上下文是什么样的,自己调用的 第五周进入了实用的嵌入式 LINUX 的应用
一些标准库函数和系统调用时,他们是如何陷入 的学习了,通过这周的学习和具体的试验,让我
内核态执行的。现在编程时脑子里就会有这么一 真正的理论联系了实践。自己建立交叉编译环境,
个立体的画面,爽。(谁都喜欢知道自己到底在 了解 BOOTLOADER,自己编译内核自己做文件
做什么,自己做得事情后面真正在发生什么。) 系统,完全的 DIY 的计算机出来了。
UNIX 编程的另一大特点莫过于同步了,想 第六周对 C 进行了一些强化的编程训练,也
一想在同一时刻,你的程序在同时做着很多不同 算是前一段的总结和让我看到变化的一周。而且
的事情,即使只有一个处理器,也可以让你感觉 在这周里,最重要的是我知道我自己是一名程序
到一种并发的效果,这样有很多问题会得到简化, 员了,我编出来的程序不是为了兴趣自己用了,
很多程序更加高效合理。(例如像交互这种“慢 我的用户可能是一些街上的大妈,所以我不得不
”系统调用) 当自己真的可以真正的理解和考虑 站在它们的角度去提供一些功能,和做出一些出
到同步的精髓时,自己可能又会小骄傲一下吧。 错处理。对出错处理这方面感觉收益非浅。自己
现在只是知道在多进程,线程(LINUX 里好像线 在编程时也对内存这个“雷区”更加小心了。
程也是用进程实现的吧)编程时,如何通过信号 李明老师提出的状态机的编程思路使我内功
量来同步每个进程,如何用锁的机制来保护共享 又一次的提高,因为李老师刻意的反复提出,我
资源。加锁的顺序和技巧,避免死锁。当然信号 知道了它的重要性,上网一查更知道这个属于编
更是个很广很有用的概念,以后要通过实践继续 译原理的概念是一个应用非常广泛的思想。谢谢
总结。 老师们还教给了我们他们的宝贵经验和方法。
还有 AKAE 的大作业制度真的很好,让我体 第七周,不敢相信自己要开始编写设备驱动
验到了网络编程的乐趣,几个人用自己编的程序 了,不过这是真的,现在可以编写一个简单的字
聊天的感觉,又是一种从未有过的喜悦。 符设备驱动了,还有一些关于硬件中断的驱动例
第四周我们进入了 ARM 嵌入式体系结构的 程。脑子里有了字符设备,块设备,网络设备的
学习中,有人说,其实计算机就二条命脉:处理 编程逻辑,现在头脑中就可以呈现出内核态的一
器+操作系统。在前三周在自己不知不觉的编程 些样子。站在内核态编程是一种挑战,也是一种
中,学到了自己一直希望得到的操作系统的知识 升华吧。以后一定会在工作的实践中去进一步的
后,这周 AKAE 又一次及时的给出了另一条计算 尝试。
开源 2008 年第 7 期 127
嵌入式
亚嵌教育(www.akaedu.org) 宋劲杉
开源 2008 年第 7 期 128
嵌入式
算是学习提高了;第四,这本书毕竟只介绍了数量有限的 C 函数,实际工作中当然会用到很多书上没有
的函数,本来看看 man page 就会用了,但是新手们已经离不开这本书了,必然会想一些凑合应付的办
法,用书上有的函数代替书上没有的函数去应付工作。就这样,这本 masterpiece 培养出了一大批合格
的垃圾代码制造者。
还有一本《Linux C 函数库详解词典》也是这一类书的典型代表,和上面说的那本大同小异。扯点离
题的话,我有一个更极端的观点:任何给程序员看的文档都不应该翻译成中文,因为不具备流畅地阅读
英文的能力就不是一个合格的程序员,应该先去学好英文再学编程,更何况翻译总会引入新的错误和不
准确,使文档的质量下降。只有给用户看的文档才应该翻译成中文,因为不能要求用户达到多高的水平
才可以使用这个软件。
把难理解的、难掌握的都回避了,把本来很复杂的 man page 阉割了之后再去教给新手,让他们以
为掌握技术就是这么简单,一书在手,万事不愁,这根本不算是教育。真正的教育不应该回避任何复杂
性,而应该是举一反三,把一个复杂的问题给学生分析透了,然后启发学生自己去解决其它的复杂问题。
下面我来仔细剖析一个 man page,通过这一个例子说明 man page 的行文中存在的普遍规律,说明应
该如何理解一个 man page,以达到举一反三的目的,我相信我这一篇文章比以上两本烂书对新手更为
有用。
这是 POSIX 规范中正则表达式的 C 函数的 man page,读者要用这些函数首先要对正则表达式的概
念非常清晰,知道正则表达式能用来干什么,不能用来干什么,要干的话怎么干,并且能够很熟练地写
出正则表达式来,每个 man page 都是高度 cohesive 的,不会教你这些偏离主题的东西。也就是说,首
先你期望要用这些函数完成什么工作必须非常清楚,如果自己都不知道自己要干什么,man page 是帮
不了你的。
NAME
regcomp, regexec, regerror, regfree - POSIX regex functions
SYNOPSIS
#include <sys/types.h>
#include <regex.h>
开源 2008 年第 7 期 129
嵌入式
size_t errbuf_size);
怎么会有四个函数呢?哪个跟我想要的函数最相关?其它函数又是做什么的?这是一个好的阅读习
惯:你要主动去猜测,而不是被动地接受信息。理解的过程应该是拿你的猜测去和文字描述相比较,如
果相符就说明理解对了,如果不符就要提出一个新的猜测去比较,完全被动地接受信息那不叫理解。
传入参数和传出参数是一个重要的提示,Linux 的库函数原型都是非常规范的,const 指针一定是传
入参数,非 const 指针一定有传出值(可能是传出参数,也可能是传入-传出参数),所以,函数原型就
已经非常清楚地告诉你应该怎么调用这个函数了,根本没必要给出代码例子。看第一个函数:
regex_t regobj;
regcomp(®obj, "正则表达式", 标志位 1|标志位 2|...);
再强调一遍,要想理解一段文字,就要充分调动经验和推理,主动去猜测,然后看下文验证你的猜
测,而不是被动接受信息。怎么推理呢?以上函数传入一个正则表达式,指定几个标志,传出一个值,
应该是把正则表达式转换格式了吧?这就叫推理。相反,如果我根本不管 preg 是一个传出参数,而且也
不是字符串型的,非要往 my_expect_func 的形式上套,既然 regex 参数是正则表达式,那么 preg 参数
就应该是目标字符串,这就不叫推理和猜测,叫瞎蒙。
如果对正则表达式的机理有一定了解,就可以借助这个经验猜到这个函数大概是把正则表达式字符
串转换成状态机以便高效地匹配目标字符串。如果以前用过其它编程语言的正则表达式库函数,也可以
借助这些经验知道正则表达式在使用之前大多有一个预处理的步骤。另外,对英文缩写要有一定敏感性,
函数名是 regcomp,reg 就是正则表达式,comp 是 compare 还是 compile?如果是 compare,那应
该有两个相同类型的参数来做比较,就像 strcmp,这里显然是 compile,编译,把字符串形式转为二进
开源 2008 年第 7 期 130
嵌入式
制形式,从另一个侧面也验证了前面的猜测。这些都是靠经验而不是推理得到的,经验有助于更快更准
确地理解,但不是必须的,因为事实上我们通过上面基于传入传出参数的推理已经猜出正确结论了,只
不过有经验的人会对自己的猜测更自信。
对英文缩写敏感是看 man page 和看代码需要具备的最基本的能力,但这需要长期的练习才能找到
感觉。也许你要学会一个函数怎么用并不必知道函数名和各个参数名是什么的缩写,你通过以上列举的
两本烂书就可以学会怎么用,但如果总是回避 man page,总是不去做猜缩写的练习,就不可能看懂别
人的代码,不看别人的代码就自己乱写代码,连变量名该怎么起都不知道,写出来的永远是垃圾代码。
对 于 regcomp 这 个 函 数 名 以 及 各 参 数 名 , regex 是 regular expression , regcomp 是 regular
expression compile。那么 preg 是什么?reg 是 regular expression,p 表示什么呢?表示指针?那是
微 软 的 infamous 的 hungarian notation , Linux 上 肯 定 不 是 这 么 用 的 , 这 里 的 p 我 猜 是
precompiled。cflags 的 c 是什么?不知道,但是跟下面一个函数对比来看:
开源 2008 年第 7 期 131
嵌入式
regmatch_t 对象如何表示一个匹配呢?如果一个正则表达式模式在一个目标字符串中有五次出现,
如何表示这五次出现呢?可以猜测这个 regmatch_t 结构体一定包含了在目标字符串中的匹配位置信息。
另外,我传进去 10 个 regmatch_t 对象,如果只有五次匹配,函数返回后我怎么知道前面五个对象是有
效的匹配信息而后面是无效的呢?是不是通过一个参数或返回值表示匹配次数的?该函数并没有额外的
参数,而且快速翻看一下 man page 的 RETURN VALUE 节,这个函数返回值是错误码,也不表示匹配
次数。那这个函数一定会在后面无效的 regmatch_t 对象里填充一个特殊值,这就是推理,这个猜测将会
在阅读后面的文字时证实或证伪,不管猜得对不对,一定会在后面得到答案。
后面还有两个函数:
DESCRIPTION
POSIX Regex Compiling
regcomp() is used to compile a regular expression into a form that is
suitable for subsequent regexec() searches.
开源 2008 年第 7 期 132
嵌入式
的文档中,表示概念之间关系的文字尤其容易被忽视,因为不像下定义那么明显,往往一个词就带过。
作为练习,请读者注意后面的文字中有哪些表示概念之间关系的词。
REG_EXTENDED
Use POSIX Extended Regular Expression syntax when interpreting
regex. If not set, POSIX Basic Regular Expression syntax is
used.
REG_ICASE
Do not differentiate case. Subsequent regexec() searches using
this pattern buffer will be case insensitive.
REG_NOSUB
Support for substring addressing of matches is not required.
The nmatch and pmatch parameters to regexec() are ignored if the
pattern buffer supplied was compiled with this flag set.
REG_NEWLINE
Match-any-character operators don’t match a newline.
开源 2008 年第 7 期 133
嵌入式
match a newline.
REG_NOTBOL
The match-beginning-of-line operator always fails to match (but
see the compilation flag REG_NEWLINE above) This flag may be
used when different portions of a string are passed to regexec()
and the beginning of the string should not be interpreted as the
beginning of the line.
REG_NOTEOL
The match-end-of-line operator always fails to match (but see
the compilation flag REG_NEWLINE above)
开源 2008 年第 7 期 134
嵌入式
BYTE OFFSETS
Unless REG_NOSUB was set for the compilation of the pattern buffer, it
is possible to obtain substring match addressing information. pmatch
must be dimensioned to have at least nmatch elements. These are filled
in by regexec() with substring match addresses. Any unused structure
elements will contain the value -1.
typedef struct {
regoff_t rm_so;
regoff_t rm_eo;
} regmatch_t;
Each rm_so element that is not -1 indicates the start offset of the
next largest substring match within the string. The relative rm_eo
element indicates the end offset of the match.
regerror() is passed the error code, errcode, the pattern buffer, preg,
a pointer to a character string buffer, errbuf, and the size of the
string buffer, errbuf_size. It returns the size of the errbuf required
to contain the null-terminated error message string. If both errbuf
and errbuf_size are nonzero, errbuf is filled in with the first
errbuf_size - 1 characters of the error message and a terminating null.
开源 2008 年第 7 期 135
嵌入式
RETURN VALUE
regcomp() returns zero for a successful compilation or an error code
for failure.
ERRORS
The following errors can be returned by regcomp():
REG_BADBR
Invalid use of back reference operator.
REG_BADPAT
Invalid use of pattern operators such as group or list.
REG_BADRPT
Invalid use of repetition operators such as using ’*’ as the
first character.
开源 2008 年第 7 期 136
嵌入式
REG_EBRACE
Un-matched brace interval operators.
REG_EBRACK
Un-matched bracket list operators.
REG_ECOLLATE
Invalid collating element.
REG_ECTYPE
Unknown character class name.
REG_EEND
Non specific error. This is not defined by POSIX.2.
REG_EESCAPE
Trailing backslash.
REG_EPAREN
Un-matched parenthesis group operators.
REG_ERANGE
Invalid use of the range operator, e.g., the ending point of the
range occurs prior to the starting point.
REG_ESIZE
Compiled regular expression requires a pattern buffer larger
than 64Kb. This is not defined by POSIX.2.
REG_ESPACE
The regex routines ran out of memory.
REG_ESUBREG
Invalid back reference to a subexpression.
CONFORMING TO
开源 2008 年第 7 期 137
嵌入式
POSIX.1-2001.
有 个 学 生 看 完 了 这 一 段 之 后 问 我 , 上 面 说 regexec 成 功 返 回 0 失 败 返 回
REG_NOMATCH,REG_NOMATCH 这个错误码表示什么?怎么在 ERRORS 节中没有解释?这是一个典
型的没有理解到位的例子。上面说 regcomp 成功返回 0 失败返回错误码,却没有说返回哪些错误码,而
是详细列在 ERRORS 节中,regcomp 失败的原因有很多,这些错误码大多是描述正则表达式的各种语法
错误的。而 regexec 是判断匹配不匹配的,匹配就返回 0 不匹配就返回 REG_NOMATCH,NOMATCH
就是 no match,这句话本身就说明了这个错误码是什么意思,所以就没有在 ERRORS 节中再解释了,
这也体现了 man page 的简洁性,一句废话都没有。
这个学生为什么会没有理解到位呢?还是因为对英文不敏感,REG_NOMATCH 在他看来就是一串大
写字母,一个符号,而没看出来是 no match,因此觉得这个符号必须在后面详细解释,而没有想到这个
符号用在这里是双关的,它自己就解释了自己。
SEE ALSO
grep(1), regex(7), GNU regex manual
COLOPHON
This page is part of release 2.77 of the Linux man-pages project. A
description of the project, and information about reporting bugs, can
be found at http://www.kernel.org/doc/man-pages/.
作者简介:宋劲杉,清华大学自动化系硕士,北京亚嵌教育研究中心(www.akaedu.org)高级讲师,5
年嵌入式系统开发经验,2 年嵌入式行业教学经验。参与多个嵌入式系统项目开发工作,精通 Linux 内核 、
POSIX、TCP/IP、 bootloader 编写、文件系统、ARM 处理器,擅长 ARM 平台上 Linux 系统的移植和
应用开发,熟悉的 ARM 处理器有:S3C2410、PXA255、PXA270 和 EP7312 等。
个人博客地址:http://djkings.javaeye.com/
开源 2008 年第 7 期 138
开源小知识
开源小知识
什么是开源软件(OSS)? software”这个字眼,他们的意思可能是你可以
免费获得一份二进制代码的拷贝,也可能是在你
开源软件即开放源代码软件,其定义首先起 所购买的机器中已经包含了一份拷贝。但是,这
源于自由软件(Free Software)。自由软件出现 种说法与在 GNU 计划中“free software”的意
之前的规则是软件开发商拥有软件源代码的专用 义是不同的。
权,他们牢牢控制了源代码,只有他们才有特权 由于在操作中极易混淆,因此一旦软件公司
访问源代码,用户和其他程序员无法查看、改动 说他们的软件是自由软件,您一定要检查您是否
和完善,使用户无法真正融入计算机环境之中。 得到了自由软件所应包括的一切。有时,您得到
Richard Stallman 倡导自由软件运动,就是 的是自由软件,有时不是。
要开发出一系列完整的软件,由原作者对自己的
一些知识产权的权利进行放弃,具体说应该是向 “开源软件 OSS ”与“自由软件 FS”的关系
公众的许可,同意不但开放源代码,而且鼓励用
户之间互相拷贝,通过网络在线服务,电子公告 这两个名词实质是从两个角度看待同样一类
板(BBS)的发布,或者从一个用户的手里传给 事物,对同一类软件的不同叫法,突出不同的价
另一个用户等途径自由地传播,并借此获得学术 值取向和精神。二者的差别在于给出定义的角度
上和技术上的交流,让别人修正和改进源代码并 不同。“开放源代码软件”(Open Source
接受自由软件运作规则,再重新发布。用这种模 Software,也有译为“公开源代码软件”)的定
式去激发世界各地的软件开发人员投入到自由软 义是从技术层面上讲,而“自由软件”则是从被
件的开发中,软件开发人员的集体智慧得到充分 许可的权利层面上讲。至于自由软件和开放源代
发挥,人们可以及时发现并解决程序中存在的问 码软件的区别,实际体现的就在于许可证对权利
题,减少大量不必要的重复劳动。 义务的规定的严与紧的程度上,有学者认为,开
放源代码软件许可证中那部分对被许可人权利限
什么是自由软件(FS)? 制比较严的许可证是自由软件许可证,也就是说,
开放源代码软件的范围要稍宽一些,自由软件的
自由软件是指允许任何人使用、拷贝、修改、 许可证中不允许被许可人将本许可证许可的源代
分发(免费/少许收费)的软件。尤其是这种软件 码的修改版本、演绎版本以其他的许可证方式再
的源代码必须是可得到的。从某种意义上说,“ 许可或者保留起来不许可,只能按此许可证实施
没有源代码,就称不上是(自由)软件。”自由 再许可,像自由软件联盟 GNU 下适用 GPL 开放
软件很少标价出售,可以理解为一定程度的免费。 源代码软件许可证的软件。而开放源代码软件的
但有时软件公司在提及价格时使用“free 许可证则允许以其他许可证的方式实施再许可。
开源 2008 年第 7 期 139
开源小知识
开源 2008 年第 7 期 140
开源小知识
开源 2008 年第 7 期 141
开源小知识
开源 2008 年第 7 期 142
开源小知识
开源 2008 年第 7 期 143