You are on page 1of 143

卷首语

开源 2008 年第 7 期 1
卷首语

苹果是敌 微软是友

  在最近波特兰举行的《世界开源大会》(OSCON 2008)上,Ubuntu Linux 创始人


Mark Shuttleworth 发表了主题演讲。Mark 认为,Linux 的真正对手不是微软,而是苹果。
并大胆预测,在两年时间内,Linux 必能超越苹果。与 Linux 水火不相容的微软居然成了朋
友?而一向与 Liunx 井水不犯河水的苹果竟然成了假想敌?这是一个很大胆的命题,但在目
前阶段,这样的观点是具有现实意义的。
  “苹果是开源的敌人”,这是很多开源人士都认同的一种现实,如今终于被 Mark 说出
来了。为什么说苹果是开源的敌人?仅仅因为苹果的软件不开源吗?我看未必。如果仅是不
开源,那微软和苹果都将是开源的敌人,而不会有敌友之分。而根本原因在于,苹果是开源
的受益者,但并不是开源的贡献者。
  苹果的软件有着很好的客户体验,这是不争的事实,也是很多人都知道的事实。但是苹
果软件的根源及发展,这个可能知道的人就会少上许多。很多人可能认为苹果的软件都是“
私有软件”,都是苹果的“私有设计”,这种看法可以说对了一半。苹果的软件确实都是“
私有软件”,但大多数的苹果软件都是基于开源软件开发的,并非其私有设计。
  比如众所周知的 Mac OS,我们看看维基百科上的描述,“Mac OS X 使用基于 BSD
Unix 的内核,并带有 Unix 风格的内存管理和抢占式多任务处理。”不难看出,Mac OS 是
基于 BSD 开发的,遵循 BSD 协议,可以说是 BSD Unix 的衍生版本。熟悉开源的人都知道,
BSD 是开源协议家族中最宽松的一种协议,它允许你使用开源的代码,并且可以不反馈回
社区。苹果正是采用了 BSD 协议,基于 BSD 内核,不断地完善了 Mac OS。
  苹果的软件究竟有多少基于开源软件的,这个可能无法考证,但有开源社区人士表示:
“苹果 90%的软件基于开源软件开发,可能不到 10%是属于私有设计,自主开发。现在流
行的 iPhone 手机,其上运行的软件大多数都是开源软件。”说的更明白一点就是,苹果
90%的软件是拿了开源社区的代码开发的软件,但迄今未听说苹果开源了某款软件。
  苹果是家卖硬件的公司,软件是否就是免费的呢?答案是否定的。苹果正是有一套完整
的软件战略,并且必须依附于其硬件平台上,所以能让苹果的机器价格比普通 PC 高出许多。
苹果的根本,应该是软件+硬件的公司,硬件其实只是个表现形式,而其软件是根本、是灵
魂。如果没有这些软件,那苹果的硬件也就不值钱了。
  并且,苹果为了长期地控制用户,采用了芯片加密及软件加密的手法,使得苹果的机器
无法运行其他的 OS,这是一种绑定,一种让用户失去选择的绑定。去年,在 Mac 世界中很
有影响力的程序开发员 Mark Pilgrim 宣布转投 Linux 的怀抱,放弃了以前使用的 Mac 操作

开源 2008 年第 7 期 2
卷首语

系统,正是因为 Mark Pilgrim 认为 Mac 平台上越来越多的专有文件格式和采用 DRM 技术


限制了他的使用。由此可见,Mark Shuttleworth 将苹果树立为开源的敌人,这是有依据
的。
  相比较而言,微软近期的态度要开放许多,无论是频繁地与开源世界接触,还是关于
OOXML 文档协议,我们至少看到了微软一个比较开放的心态。微软与 Linux 是敌人,但与
数量更多的开源软件是朋友,比如 Apache、MySQL,不可否认的是目前已经有很多开源
软件能很好地运行在 Windows 的平台之上了。
  “苹果是敌,微软是友”,从这个命题下我们也许能读到 Mark 想表达的真实意思,那
就是 Linux 需要超越 Mac OS,同时,与 Windows 在各个层面兼容。如果说“苹果是敌、
微软是友”更多的还是 Mark 战略性的提法,那么“两年超越苹果”,则表现了他坚定的信
心。根据 www.w3counter.com 的权威统计数字,苹果的 Mac OS 操作系统在 2008 年 1 月
份所占全球用户比例是 4.82%,到今年 6 月份却下降到 4.62%;而 Linux 的全球用户比例从
今年 1 月份的 1.84%上升到今年 6 月份的 1.95%,照此趋势下去,Mark 预言是完全可能实
现的。

开源 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 名。

Mozilla Europe 总裁 Tristan Nitot 接受了这一证书,并向所有支持 FireFox 的下载用户表示感谢。

开源 2008 年第 7 期 8
产业聚焦

腾讯研发官方版 Linux QQ 即将问世


  腾讯正在着手研发基于 Linux 操作系统的 操作系统。作为免费的开源操作系统,Linux 一
QQ,这款产品已进入测试阶段,并将于 7 月正 直以系统开放、功能强大而得到众多开发者的青
式发布。与此同时,官方开发的 QQ for Mac 1.0 睐,并成为众多企业级应用的主流操作系统之一。
版日前公开邀请用户参与体验计划,QQ 对跨平 QQ 以往只依靠国内 Windows 平台就稳坐 IM 市
台开发的态度越来越开放。 场龙头老大位置,此次如果成功推出 Linux 平台
  有消息称,腾讯公司的 Linux 版 QQ 研发酝 版本,意味着 QQ 将覆盖所有 PC 客户机 IM 应用
酿已久。在 4 月英特尔信息技术峰会(IDF)上,爱 市场,因为 Windows 和 Linux 两种操作系统已
国者总裁冯军就曾在超移动互联网设备(MID) 上 覆盖了几乎全部的 PC 客户机应用。
演示了 QQ,而该演示的 MID 样机就是基于   据悉,中国每年都有超过 200 万台新电脑预
Linux 操作 装和捆绑
系统的,当 Linux,H
时网上也出 P、华硕
现了“腾讯 等笔记本
秘密研发 电脑巨头
Linux 也开始在
QQ”的传 低端廉价
闻,只是没 的笔记本
有发布的具 电脑中预
体时间,同 装
时该传闻也 Linux。
没有得到官 近年来,
方确认。 凭借差异
  据了解, 化、定制
这款 QQ 产 化以及移
品另一大看点是完全支持国产龙芯 CPU,未来将 动化上的优势,Linux 在整个操作系统市场中保
在教育领域与龙芯进行捆绑推广。这也就意味着 持了较快的增长势头。
今后每台龙芯电脑都可预装腾讯官方的 Linux   根据赛迪顾问发布的《2008 年第一季度中国
QQ。龙芯是目前国家重点扶植的自主核心技术, Linux 软件市场分析报告》数据显示,2008 年一
未来在政府部门、教育行业预计会得到着重培养, 季度,中国 Linux 软件市场销售额达 3800 万元,
QQ 支持了龙芯,等于是支持民族产业。据了解, 较去年同期增长 22.6%。此次,腾讯开发 Linux
很多采用 Linux 系统的专业用户都对 Linux QQ QQ 版本,也是满足不同用户的需求,填补该领
满怀期待;支持龙芯的各界人士也对这次腾讯和龙 域的空白。据内部人士透露,该版本正由腾讯研
芯的并肩作战寄予厚望。 究院秘密研发中,目前已进入测试阶段,各项基
  Linux 是 Windows 平台以外最重要的个人 本功能已较为完善。

开源 2008 年第 7 期 9
产业聚焦

移动文档格式 PDF 已获批国际标准


  国际标准组织(ISO)已经批准 Adobe 系统公 年 4 月 1 日 ISO 批准该格式为国际标准。
司的 PDF(移动文档格式)为国际标准,这意味着   微软本打算在 Office 2007 中支持 PDF,但
ISO 可控制对该格式的任何改动。 因与 Adobe 产生分歧在最后一分钟改变了计划。
   ISO 周 三表 示, 获得 国际 标准 的是 1.7 版 不过微软将在明年出发布的一个服务包,会在
PDF,标准号为 ISO 32000-1,该格式对任何人 Office 2007
开 放 并 被 使 用 。 PDF 属 于 Adobe 系 统 的 中支持 PDF。
Acrobat 软件,长期以来一直被用作交换和浏览 该升级也将增
商业文件的格式。不过 Adobe 一直保留了该格 加对 ODF(开
式的版权,直到 2007 年 2 月因行业压力被迫向 放文档格式)的
ISO 提交了标准化申请。 支持,ODF 已
  Adobe 此举也反映出一种全行业范围的趋势, 经在 2006 年
即要求对广泛采用的文件格式进行标准化,提高 5 月获得 ISO
不同应用软件之间的互操作性。微软也向 ISO 提 批准成为了国
交了 Office 2007 使用的 OOXML 格式申请,今 际标准。

Linux 厂商 Xandros 收购 Linspire


收购。
  在 Linspire 的首席执行官 Larry Kettler 给股
东的公告中说,已经决定卖出 Linspire 的所有资
产。该次交易包括 Linspire、Freespire 和该公司
发行版独有的 CNR(Click-N-Run)桌面安装平
台。
    此 举 未 获 所 有 的 Linspire 股 东 一 致 欢 迎 。
Xandros 桌 面 版 本 1 基 于 曾 获 得 大 奖 的 Corel
Linux OS,可以称为最悠久的 Linux 发行版之一。
通 过 在 华 硕 的 流 行 Eee 电 脑 上 预 装 Xandros
Linux,Xandros 成为非常流行的 Linux 发行版。
Xandros 从华硕得到了大量收入。
  到目前为止,Xandros 和 Linspire 都没有对

  7 月 1 日,位于美国加州圣迭戈的 Linux 分 交易发表任何官方评论。但是,Xandros 的代表

销商 Linspire 被加拿大 Linux 桌面厂商 Xandros 确认了交易的存在。

开源 2008 年第 7 期 10
产业聚焦

16000 玩家向暴雪请愿“Diablo 3 Linux”


  近日,暴雪宣布了 Diablo 3,至于什么时候
推出还是未知之数。

  游戏的发布平台将是 Windows 和 Mac,没


有 Linux。为此 Linux 玩家发起了请愿书,请求
暴雪推出其产品的 Linux 版。

  一些人还在 Battle.net 的论坛上发帖宣称,


如果游戏能通过 WINE 模拟,他们会购买两份拷
贝;如果能有 Linux 原生版,他们会购买更多拷
贝。

  到目前为止,暴雪的开发者还没有给出回复。

Sun 与英特尔共推 Solaris 最优化


  日前,继 Sun 和英特尔达成合作 8 个月后, 特性在正式添加到 Solaris 产品之前还需要经过试
两家公司共同宣布了在基于英特尔处理器的服务 验和调试,然后再安装到 Sun 的服务器上。这项
器平台上推进 Solaris 开源操作系统最优化的计划。 计划在帮助 Sun Solaris 操作系统的优化上已经
取得了突破性进展。
  “2007 年 1 月我们与英特尔达成战略同盟让
我们有权使用英特尔的基础架构来为 Solaris 操作
系统做点事情,这在以前是不可能实现的。
”Sun Solaris 部门销售总监 Herb Hinstorff 表
示:“合作的第一年我们的主要工作是相互了解。
而今年,我们工作的重点是在英特尔处理器平台
上推进 Solaris 开源操作系统的最优化,英特尔也
为 OpenSolaris 做出了卓越的贡献。”
  英特尔软件工程经理戴夫.斯图尔特补充说:
近日,这两家公司发布通告汇报了这项计划的最
“我们可以看到 Solaris 操作系统和至强处理器的
新进程和进一步的发展方向。
合作产生了多么明显的效果。目前我们正和 SUN
  计划的多数工作都是围绕 OpenSolaris 的最
公司的 xVM 团队合作共同推进虚拟化最优化的进
优化进行的,Solaris 操作系统的测试版中一些新

开源 2008 年第 7 期 11
产业聚焦

程。” 提升系统性能。Nehalem 处理器还将使用不同容


  但两家公司的合作不仅是建立在中央处理器 量的内存和 DDR3。
级别上的。Solaris X64 工程部门资深总监安迪.   两家公司还在合作推进 Java 的性能调校。在
若兹表示:“我们的合作不仅与处理器相关,还 Sun 与英特尔结盟的头半年里,Java 的性能提升
涉 及 到 更 多 的 内 容 。 我 们 与 Sun 共 同 努 力 为 了 20%。在今年初举行的 JavaOne 大会上,他
Solaris 操作系统的用户交付全面的以英特尔处理 们共同宣布基准测试提升了 68%。SUN 公司的
器为基础的解决方案。”安迪还表示如今在 Sun Java 团队和英特尔合作致力于多重操作系统平台
的办公区随处可见英特尔的研发人员,而在英特 的最优化,目标是在英特尔的处理器平台上最大
尔情况亦是如此。 可能的实现 JAVA 性能的最优化。
    Hinstorff 表 示 两 家 公 司 正 致 力 于 基 于     IDC 咨 询 公 司 副 总 裁 Jean Bozman 表 示
OpenSolaris 的 Penryn 处理器最优化,他们希 Sun 与 英 特 尔 的 结 盟 让 Sun 公 司 受 益 匪 浅 :
望能在 Nehalem 处理器上应有所有最新的技术。 “Sun 在其 X86 市场上的销售高歌猛进。但这取
英特尔的最新处理器架构将与年底正式推出。这 决于很多因素。原因之一就是他们开始积极参与
将是最优化的解决方案,因为 Nehalem 处理器 之前从未涉足过的市场领域。通过在英特尔处理
超越了目前至强处理器的设计,代表了英特尔体 器平台上对 Solaris 的优化,无疑为他们在 X86
系架构的主要转变。若兹强调说,全新的中央处 市场的服务器销售起到了推波助澜的作用。”
理器采用了内存控制器,将大幅降低内存延迟和

红帽加强对华投入 欲打破三足鼎立
  日前,消息人士表示红帽将加强对中国市场 前国内 IT 工程师招聘中有 20%以上要求应聘者具
的投入,以期突破目前国内 Linux 市场上红帽、 有 HCE 资格。
红旗、Novel 三足鼎立的局面。   第三、大力拓展咨询业务,这主要由于中国
    据 悉 , 红 帽 在 2007 年 首 次 超 过 红 旗 与
Novel 成为中国市场占有第一。在其前不久公布
的 2009 财政年度第一季度业绩报告中,第一季
度的总收入为 1.566 亿美元,较上年同期增长
32%,较上个季度增长 11%。为继续保持市场第
一的位置,进一步拉开与其他两家厂商的差距,
红帽将开展四方面措施。
  首先、红帽之前在渠道领域具有深厚的积累,
为扩大客户范围,红帽自去年下半年起开始在国
内专门设置针对直销、大客户的销售、客服团队。
  第二、继续在教育领域扩大 HCE(Red Hat 大客户对于定制服务需求非常迫切。咨询业务是
认证工程师)在国内的认知度。据记者了解到目 目前红帽除订阅服务外力推的一大业务,在 09 财

开源 2008 年第 7 期 12
产业聚焦

政年第一季度获得了 2590 万美元的收入。 完成了一级城市的渠道建设,今年将由一级城市


  此外、红帽还将延续在渠道方面的强大优势, 向二级城市继续铺设。
建设更深入广泛的渠道网络。截止去年,红帽已

《第二人生》面临开源竞争对手
  现在,《第二人生》正面临一个真正的开源
竞争对手,OpenSimulator 项目的发展势头非常
强劲。IBM 宣布它在 OpenSimulator 和 Linden
服务器之间实现了协同工作。这意味着你能使用
《第二人生》的客户端去登录 OpenSim 服务器。
更远一步的是,任何人都可以运行自己的服务器。
  “通过来自官方客户端的协议,开发者了解
到了《第二人生》工作的原理,实现了他们自己
的兼容服务器代码。”看起来《第二人生》中的
用户将个人资料、虚拟物品和他们在虚拟世界中
拥有的其它东西移植到一个“开放世界”服务器
  Linden Labs 谈论了很长时间的《第二人生》
上,这只是一个时间上的问题。它将对 Linden
平台开源,但不确定是否真会这样,目前其客户
Labs 的“虚拟世界体验”构成了挑战。
端源代码已经公开,但服务器端没有。

Google 发布基于开源的 C++测试框架


  Google 最近开源了其基于 xUnit 的 C++单 嵌入式系统中。
元测试框架。项目开发者 Zhanyong Wan 说在 很多平台的构建
Google 内部已经有数以千计的 C++开发者在使 工具和测试运行
用该框架,并且已经持续好几年了。 器都处在开发当
  根据 Google 所述,此次发布的主要亮点体 中,并且现在已
现在: 经有 Linux 的
  Google Test 是便携式的,它可以通过不同 Autotools 支持
版本的 GCC 和 MSVC 编译器应用在多种平台上 了。
(Linux、Windows、Mac OS X 等)。你甚至   支持 fatal 和 nonfatal 断言。在 nonfatal 失
可以将它用于 Windows CE 和 Symbian 这样的 败后测试还会继续。这使得在一次单独的编辑—

开源 2008 年第 7 期 13
产业聚焦

—编译——测试周期中能发现并修复更多问题。 轻松地对不常见的情况定义新的断言。
对常见的测试需求提供很多断言,同时你也可以

Novell 为超级计算机提供 Linux 服务器


    据 外 电 报 道 , Novell 的 SUSE Linux 研 发 的 IBM eServer Blue Gene ; Juelich
Enterprise Server 已获得全球多个超级计算机小 Research Center 的 IBM eServer BlueGene/P
组采用,根据专门追踪与侦测高效能运算潮流的 (JUGENE);以及美国新墨西哥州计算应用中心
TOP500 项目数据显示,SUSE Linux Enterprise (New Mexico Computing Applications
已受到当前大型高性能运算(HPC)超级计算机采 Center,NMCAC)负责的 SGI Altix 8200。
用。   NASA 先进超级运算部门的三组超级计算机
目前皆采用 Novell SUSE Linux Enterprise。这
些计算机的主要功能是用来评估新技术是否符合
NASA 的工程与科学需求、控制系统运作与发射
计划;并支持 NASA 在航天、科学与太空运作等
领域的各项计划。NASA 最新预计在今年夏天完
工 的 超 级 计 算 机 , 也 将 采 用 SUSE Linux
Enterprise Server;其在部署完毕后将成为最大
的 SGI Altix ICE 系统之一,与现今全球效能排名
第三的超级计算机平分秋色。
    此 外 , 包 括 Appro International 、 Atipa
  Novell 指出,全球最佳的 50 台超级计算机 Technologies、ClusterResources、HP、Peng
中,有 40%采用 SUSE Linux Enterprise;其中 uin Computing、SGI 与 Teradata 等公司,均将
包 括 美 国 Lawrence Livermore 国 家 实 验 室 SUSE Linux Enterprise Server 整合至他们提供
(Lawrence Livermore National Laboratory) 所 给客户的高效能运算解决方案之中。

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 内核。反正除了吃饭
外,你们也没有别的事情可干。

Linux 开源手机 FreeRunner 实机预览


机不太相同。其中除了常见的手机主机、充电器、
电池、SD 卡、手机套之外,还包括了备用工具包、
Debug 板等等调试用工具。
  由于主机刚刚到手,购买者仅测试了 AT&T
和 T-Mobile 的 SIM 卡,其中 T-Mobile 的 SIM
卡完全工作正常,但是 AT&T 的 3G SIM 卡似乎
有些问题,三张 SIM 卡中有一张不能正常工作。
  尽管完成度不高,但还是有人购买了   看起来对于普通的用户来说,这款手机还很
OpenMoko 的开源手机 FreeRunner。由于尚未 遥远。不过对于 Linux 开发人员和爱好者来说,
完成,所以这款手机的随机附件与通常的零售手 FreeRunner 则有可能变成一台不可多得的宝贝。

开源 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
产业聚焦

中,不同版本的 Ubuntu 操作系统几乎占了一半, 使用开源技术的情况,其中包括像 Perl、Tcl 和


而 Debian 占据了 14%;Novell 的 Suse Linux Python 等开源语言的使用情况。”
占了了 12%;红帽的 Fedora 则仅有 7%。   据俄勒冈州大学开源实验室的运营经理 Jeff
  不过,该项目目前得出的调查结果与我们设 Sheltren 表示,该实验室的目标不仅仅是帮助开
想还有一定差距。据 Weins 表示,随着对安装软 源社区,还包括推动开源软件的开发和普及。
件进行更广泛的调查,红帽企业版 Linux 的使用   他表示,“对于这次开源调查,我们所看到
率很明显会得到进一步的提高。 的第一个好处是它让个人和企业以匿名的方式把
  Weins 表示,现在一些调查数据的出来的结 自己使用开源软件的情况提交到一个集中的地方。
果与人们的预期有一定差别,出现这个结果的原 这些调查数据可以被开源软件开发者所使用,以
因可能是因为调查只停留在初级阶段。 了解他们的应用程序被使用的情况,同时还可以
  据该调查显示,目前在商业计算机上安装的 让企业评价它们的开源软件使用程序,并与其它
开源程序和项目已经多达 22 万种。现在该项目又 参与调查的用户进行对比。”
把重点放到了对企业用的开源产品进行深入分析   微软负责平台战略的高级主管解释说,之所
上。 以选择赞助开源调查 OSC 项目,主要原因是微软
  OpenLogic 现在希望将这个开源调查更深入 的合作伙伴、客户,及开发人员处于日渐严重的
一步,通过对一个单位的数百台、数千台计算机 复杂环境,微软加入像是 Open Source Census
进行扫描,以便得到更详细的数据,从而推动开 之类的项目也与微软所参与的生态系统是息息相
源软件更多的被企业客户所接受。 关的 。
  他表示,通过微软工程师和产品团队,微软
微软也赞助开源? 正在非常积极的参与到开
源之中,其方式包括通过
  随着该项目影响力的逐步增加,新的成员正 微软的工程师、产品团队、
在从不同的层次加入到这个调查组织中来,其中 行业伙伴和开源软件项目
包括一个叫做“开源调查之友”的层次。 等。
  新加入到“开源调查之友”的公司包括   在 OSAlt.com 的编辑
ActiveState、EnterpriseDB 和 OSAlt.com。 Anders Ingeman
  另外,该项目最近得到了更多赞助商的支持, Rasmussen 看来,现在已
其中包括开源界可能最不喜欢的公司——微软, 经出现了数百个开源软件
另外该项目最近也得到了俄勒冈州州立大学开源 可以成功取代一些非常知
实验室的赞助。 名的专有软件产品。
  ActiveStae 首席执行官 Bart Copeland 表示, Rasmussen 表示,“我们
“ActiveState 是一个基于开源模式建立的公司, 相信这次开源调查将验证
我们非常高兴能够支持这次开源调查,开源软件 在我们网站上每天都能看
让企业更加灵活,从社区开发中获得更多,并且 到的东西:企业不再对使
提高了企业创新能力。这次调查将明确企业实际 用开源软件感到恐惧。“

开源 2008 年第 7 期 17
专题

专题
走近开源
作者:刘梅 出处:CIO INSIGHT

  有人认为,开源软件就等于质量低、不安全。中国开源软件推进联盟主席陆首群说,这
完全是误解。事实上,开源软件相对于传统商业软件的优势非常明显——安全、低成本、
灵活性和不依赖软件提供商。

  在中国开源软件推进联盟主
席陆首群的办公室里,摆放着很
多记录重要时刻的照片,在其中
能找到近年来国家的主要领导人
以及世界各大 IT 企业的巨头、开
源领袖,当然也能找到陆首群。
这些照片向来访者述说着主人公
的辉煌:曾经身为全国知名的国
有大型企业的改革家,中国早期
经济和社会信息化的推动者、组
织者和领导者,后来又是一位成
功的 IT 企业创业者,同时又是一
位资深的网络和信息化专家。陆
首群的业绩数不胜数,可是他却
极少向外界讲述自己的个人历程。
  虽然年过 70,陆首群仍然活
跃在他所热衷的开源事业里,为
此他卸任了很多职务,目前他主
要担任的职务有:中国开放源码
软件推进联盟(China
OpenSource Software
Promotion Union)主席、中国
高校 Linux 推进联盟(China

开源 2008 年第 7 期 18
专题

Linux University Promotion Alliance)名誉主 议就意味着全部源代码开放、全部技术公开、开


席、中国工业经济联合会副会长、北京网络多媒 发成果上网,用户可以从网上自由、免费下载,
体实验室主任。在陆首群的博客上,记录着他在 在这个阶段,你不可能期望从中拥有你自己的自
中国开源事业的开拓、见证和实践方面的点点滴 主知识产权。如果你要修改来自社区的软件,并
滴。日前,CIOINSIGHT 记者在陆首群宽敞的办 出售修改后的发行版,前提是要将你修改软件的
公室里与他进行了深入的交流。 源代码公开发布,即默认返回社区,以保证自由
/开源软件符合 GPL 许可协议——可以自由传播。
  CIOI:目前国内的企业用户在开源软件的认识   必须指出,这个阶段开发的社区版或原创性
和应用方面与国外相比,有哪些差距? 设计,在技术上虽然体现了很多创新亮点,但尚
  陆首群:从中国国内的情况来看,与全球相 不够稳定、优化、高效和成熟,与产品化尚有一
比,在开源环境建设中的确还存在着一些差距, 段距离,我们也只能把它看成是“半成品”。对
但是处在发展中也有很多有利条件,而且目前我 于社区开发成果社区发行版,社会上的人们都可
们的这种差距正在加快缩小中。 以自由下载,但社区不向他们提供技术支持和各
  因为开源运动发源于西方,目前主流也在西 种服务。企业也可以自由下载,以便在社区开发
方,中国与西方在文化、语言上有很大的差异, 成果的基础上进行后续开发。通常来说,企业的
不少国人对自由/开源软件的一些基本概念的认 后续开发有两类:一类是企业自己使用社区的资
知尚有误区,国内在开发机制和工程经验上也尚 源,后续开发后再向市场提供服务,比如
显不足。目前来看,中国的开源软件企业还比较 Google ; 另 一 类 是 企 业 作 为 开 源 发 行 商
小而散,所以在整体环境上,目前国内的开源软 (Distributor),将社区资源进行产品化的“再
件无论在产品本身上,还是在应用水平上,与国 加工”,最终向市场出售产品,比如
外企业相比都还存在比较明显的差距。但中国软 RedHat、Novell、中科红旗等公司都是这样。
件市场(包括开源软件)潜力很大,是全球最大、   在企业开发阶段,开源产品在继承开源社区
发展最快的潜在市场。近年来在开源领域我们与 开发成果(原创新设计)的基础上,会再进行工
国际间的合作开展得较好。在总体上政府也比较 程化处理(即开发工程化实现技术)。这个阶段
重视。加上开源软件开放、透明的特点,这些都 的开发完成了工程创新,以最终实现产品化。工
是我们加快开源发展、缩小与国际水平的差距、 程化实现技术主要由专用技术(KnowHow)、
改善整体开源环境的有利因素。 工 业 设 计 ( IndustrialDesign ) 和 工 程 经 验
   (EngineeringExperience)所组成,是不公开
  CIOI:开源软件的开发过程相比于传统软件有 的。开源技术的开发,在社区的先导开发阶段是
什么不同? 以合作、公开开发为特征的创新阶段,自由 / 开
  陆首群:开源技术的开发可以分为两个阶段: 源软件的法律主体,也就是软件作品的所有者是
社区开发阶段以及企业开发阶段。在社区开发阶 不明确的,即 GPL-2 在法律上有缺失,这使得任
段,针对开源项目开发原创性技术,推出社区发 何人都不能声称他拥有自主知识产权,就是所谓
行版或 Beta 测试版。这个阶段的开发,完成了设 的开发者集体拥有的左版版权,这也只是一个虚
计创新。社区开发的机制是“集体开发、合作创 弱的灰色地带,同时任何人也不得将公开的源代
新”。以 Linux 操作系统为例,执行 GPL 许可协 码或技术转变为不公开的,或作为私有的。

开源 2008 年第 7 期 19
专题

  在企业的后续开发阶段,这个阶段是以“企
业”、“不公开”为特征的创新阶段,企业是有
可能在其中拥有自主知识产权的,但在这时从社
区获得的源代码或技术仍然要公开,而企业自己
开发的工程化实现技术则可以不公开。
  
  CIOI:对 CIO 而言,他们最关注的是如何使开
源运动与企业开发做到无缝衔接,对此你怎么看?
  陆首群:社区开发与企业开发有所分工,前
者为设计开发,后者为工程开发,两者构成了全
部的产品化技术。同时两者间也是分工互补的,
从而可以做到无缝衔接,以消除间隙。
  我以前多次指出,Linux 发行商负责工程化
处 理 技 术 , 其 内 容 包 括 Linux 内 核 社 区
(kernel.org)的主干(Official)内核与发行商
的次干内核,它们之间允许存在 3~5%的偏差,
各种软件模块可以进行不同的优化配置,开源产
品必须进行兼容性测试和质量认证(Q.C.),这
也是软硬件整合的产品化技术。进行回归移植或
降级处理(BugFix,Patch),开展涉及改进使
用性的用户界面(UI)设计,进行外观工业设计
(ID),以及开发本地服务的技术。 再到组织产品生产、配套(形成产业链),是从
市场策划到产品销售、用户服务的全过程,而开
  CIOI:如你所说,将企业的工业开发流程和开 源项目的开发(开源社区的开发)只是其中的一
源项目进行有机结合是企业用户最关心的,如何 段,应把开源项目的开发纳入到整个企业的工业
做到这一点? 开发流程中去,企业可以对社区的开发成果进行
  陆首群:开源社区在开发时不关注用户调研, 选择,企业也要组织其成员无偿参与到社区开发
也就是不直接收集分析用户的需求,他们也没有 中,在为社区做出贡献的同时,也可以从中了解
产品开发目标,换句话说就是只搞项目开发,不 到社区先期开发的总体思路,把握体系结构全局,
管产品开发,也没有产品开发路线图。他们不关 积累工程经验,并向社区提供其缺失的信息,做
心开源技术的产品化,没有商业模式,不对用户 到互为补充、互相支持。
进行技术支持和各种服务,也不对挑错、纠错、   一个成功的软件,包括开源和私有商业软件
打补丁(BugFix,Patch)、解决问题负责。而 都是如此,要对项目开发与产品开发进行结合或
企业的工业开发流程是从用户调研、了解分析用 统一,要把开发过程与企业其他经营环节,如量
户需求出发的,到编制技术任务书和产品开发路 产、分发、市场推广、销售、服务、技术支持等
线图,组织项目开发和产品开发,实行产品化, 完美结合。

开源 2008 年第 7 期 20
专题

  CIOI:为什么现在中国的开源软件产品还集中   CIOI:从成本上考虑,开源开发模式的 TCO


在 Linux 层面,而国外开源软件更为宽泛?你能 (总体拥有成本)模型是否真的省钱?虽然这种
不能给我们描述一个具体的例子,可以将开源运 软件的购买成本很低,但是后期维护和二次开发
动与企业开发做到无缝衔接? 的成本及使用成本会不会很高?
  陆首群:你的问题很好,之所以会出现这个   陆首群:今年 4 月 8 日,在我国台湾举行的
问题原因有两点:一是 Linux 操作系统是开源产 “开放手机平台论坛”上,也曾经讨论过这个问
品的龙头,因此我们在谈开源时自然重点谈 题。他们说,使用 Linux 并不是为了降低成本,
Linux。第二点我曾经在一篇叫做《开源的春天》 事实上无形的工程成本是相当庞大的,要付出的
的文章中谈到其他开源软件的发展,如开源中间 工程费用单位是亿元(新台币)。
件,以 Apache 为例,在互联网上 Apache 比微   问题是在开源社区的开发中,广大社会志愿
软的 IIS 更有优势,全球 71.0%的网站使用 者和一些企业的集体志愿者都是无偿工作的,他
Apache,20.2%的网站使用 IIS。Apache 在中 们的成本没有摊进来,所以开源软件具有研发成
国市场 2005 年的市场份额是 17.65%,2007 年 本低的优势,也可以说无形的 TCO 可能较高,但
提升到了 24.22%,在全球的位置也从倒数第二 有形的 TCO 是很低的。至于后期维护和二次开发
(2005 年的数据)有了很大提升。 成本,开源软件也是较低的,也有其优势。
  国外的开源中间件如 JBOSS、JonAs 发展也   
很快,甚至微软曾经谋求与 JBOSS 的合作,在国   CIOI:与传统商业软件相比,CIO 更关注如何
内金碟也在开发开源中间件 Apusic。关于开源数 保证开源软件的质量,什么样的开源项目或者开
据库,MySQL 发展得很快,社区版的全球下载 源产品是可以信赖的?
量已经达到 1000 多万套,中国约占 1/5,其商业   陆首群:开源软件相对于传统商业软件的优
版 销 路 也 很 好 , 2007 年 在 中 国 的 销 售 量 达 到 势非常明显:安全、低成本、灵活性和不依赖软
1500 套,销售额达到 2000 万元。开源浏览器 件提供商。有人认为开源软件就等于质量低、不
Firefox(火狐)在全球的市场占有率约为 30%, 安全,这完全是误解。在开源软件产品化过程中,
其 中 Firefox2.0 达 到 20 % , 超 过 了 IE7 的 要进行兼容性测试和质量认证,就是为了保证其
19%。其他如开源开发环境 Eclips,编程语言 产品的质量。
PHP、Perl、Python、Ruby 在国内外的应用也   至于开源软件企业是否也与传统商业软件企
日益广泛。2005 年中国的 PHP 应用居全球第四, 业一样,实行 CMM、CMMI 认证制度问题,我
到 2007 年在所统计的 175 个国家和地区中已跃 的意见是现在没有,但需要研究。
居中游的位置。   由于开源的性质,开源项目/开源产品的
  针对各行业的应用解决方案,开源架构 BugFix、Patch 系统可以比传统商业软件的同类
LAMP(基于 Linux、Apache、 MySQL 和 PHP 系统运作得更有效、更迅速、更彻底,从而提高
的开放资源网络开发平台)也已与 J2EE、.Net 架 了其可信程度。
构形成了三角鼎立、互相竞争、互相参插的态势。
LAMP 架构灵活性好,可根据用户需求,提供混   CIOI:关于私有商业软件与开源软件之间的互
源架构。 操作性或兼容性问题,近来是国内外的一个热门
   话题,这个问题应该如何解决?

开源 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
专题

开源软件为中国软件提供了发展机遇

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

开放源代码操作系统(Linux)和开放源代码软   近年来,国内 Linux 发展很快,高于国际平


件(OSS)的发展 均水平。据“赛迪”统计,2004 年中国 Linux 销
售 增 长 率 为 45% , 高 于 同 期 全 球 销 售 增 长 率
  为了适应当今世界经济、社会和政治的动态、 34%,高出约 1/3。
快速响应、高效发展的需要,今天作为实施开放   中国政府自 1997 年 7 月 15 日正式表态支持
计算、开放标准的开放源代码软件这种应用技术 Linux 以来,对 Linux/OSS 在中国的发展一直是
正在迅速发展,提供巨大价值,并逐步取得成功。 高度重视和有力支持的。
  《Massive Change》一书的作者 Bruce
Mau 说,过去 20 年全球软件产业没有取得明显 建立信息化应用解决方案的产业链
进步(其主要原因是软件损坏构成的成本大于其
收益,纯收益是负数)。据有关统计,国内软件   为了提供各种信息化应用的解决方案,可从
产业的效益连续五年逐年下降(其主要原因之一 操作系统、数据库、专用的功能组件、中间件、
是缺少核心技术,拥有自主知识产权不多)。发 软件开发工具和应用软件,以及相应硬件的产品
展开源软件,有利于打破软件垄断,激活全球软 链中选择相应的系统集成。而与开源的 Linux 操
件(Gartner 认为是将整个软件产业带出困境的 作系统配套的产品链,可以全部采用开源软件,
重要因素);也有利于中国软件,特别是系统软 也可以全部采用商业软件,或更多地采用开源与
件和基础软件,为实现跨越性发展创造条件,为 商业的混合软件。对于全部采用开源软件的方案
中国软件产业发展提供机遇。我们如果进行理性 来说,其中有些产品尚未完全成熟;在中国,相
的分析和预测,可以认为,发展开源软件,不是 对于 Linux 来说,OSS 产品链发展存在滞后现象。
为了打倒(也不可能打倒)传统商业软件,而只
是作为传统商业软件的重要补充,Bill Gates 后 开源软件 LAMP 架构
来认为开源软件将与传统商业软件处于共存的局
面。开源软件为广大用户提供多一种选择。   由于开源软件 LAMP 架构(即 Linux 操作系统,
  据 IDC 预测,全球 Linux 市场每年以 25%速 Apache-开源页面服务器,MySQL-开源数据库,
度增长,到 2008 年将达 350 亿美元(其中桌面 PHP 或 PHP、Perl、Python 脚本语言)的崛起,
Linux 将达 10 亿美元,占 3%)。 与 IBM、Sun 主导的 J2EE 架构(Java 语言)和微软
    据 Gartner 统 计 , 在 美 国 , 接 触 和 应 用 主导的.Net 架构(C#语言)形成了三角鼎立的竞争
Linux/OSS 的企业已达 80-90%,普及率很高。 态势,打破了某些软件巨头的垄断局面,迫使他
欧盟一些主要国家,如法、英、德、西、芬等政 们降低产品价格,改善服务,拿出应对方案。
府在软件采购时,出于安全的原因,其政策明显
向开源软件倾斜。

开源 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
专题

  Linux/OSS 要取得成功,首先要有一个好产 协议就是一种授权方式,人们可以通过互联网络


品,其次要建立一个好社区,还要找到一个好的 从 Linux 社区自由获得开放源代码软件资源,并
商业模式。 允许自由修改,自由发布相应的版本(产品)。
  迄今为止,开源软件还没有单一的商业模式 但在向市场发布前,必须将自己修改的部分源代
国外推出的一批商业模式可供借鉴。国外开源软 码及时返回社区。Linux 是有版权的,虽然它是
件商业模式概括起来有:(1)立足于开源软件免 一种得到许可的软件,但不是可以无限制自由的
费、工程化技术或某些附加的闭源层的专利技术 公共软件;如果人们违反 GPL 许可协议(这种“
收费的模式;(2)软件免费、服务支持收费的定 左”版软件所遵循的游戏规则),就相当于盗版
购服务(Subscription)模式(收费的商业模式 那样的非法占有(所谓盗版,是针对不准分享的
后移,如 SaaS);(3)组建俱乐部(各会员每 右版即传统版权法的非法复制)。在国内,个别
年交纳年费),向不同类别的会员(如青铜会员 人或企业目前还存在如上的一些负面效应,亟待
白银会员、黄金会员、钻石会员等不同等级或类 改正。GPL 协议只解决版权问题,解决不了专利
别 ) 提 供 不 同 服 务 支 持 的 模 式 ( 如 问题,特别是隐性专利问题。对包括 Linux 在内
Mandriva 、 ubuntu 的 销 售 公 司 Canonical ) 的 OSS 最大威胁就是软件专利问题。OSS 不是由
……等等(在这里顺便指出,Google 正在掀起一 任何企业或个人开发的,它们对其不拥有所有权;
波订价模式革命,Google 提供的程序是免费的, 它是有众多社区成员通过互联网集体、协同开发
服务也免费,靠广告或“辛迪加”支持收费,从 的(全球软件界不认为这是一种可执行的版权),
而也向微软提出了挑战。最近微软推出 而推出发行版的企业只具有使用权、发行权。在
Live.com“网络服务”,表示再也不能固守依赖 社区汇集起来的众多分散的开发者所修改或创新
软件专利授权合同的模式)。 的源码中,有可能含有隐性专利。专利将通过法
  在国际上,开源软件正在涌现出一批商业模 律限制而不是市场竞争来阻碍开源软件的商品化
式,在未来的岁月中,其中一些模式可能会成功, 发展。最近我在参加中法 OSS 合作论坛时,一位
但很多模式可能会失败,这说明全球开源软件的 法国政府官员告诉我:法国政府和欧盟不主张对
商业模式还在探索中,还不完全成熟。在中国也 开源软件设置专利保护。
要进行积极探索。   专利不但要追索侵权的经营者的法律责任,
还要追索使用者(用户)的法律责任。自由软件
消除或降低开源软件可能遇到的侵犯知识产权的 基 金 会 ( FSF ) 著 名 的 OSS 首 席 律 师 Eben
风险 Moglen 领导一个小组,正在修改 GPL 规则(计
划 2006 年中推出 GPL3.0),可最大限度地消除
  有人说,包括 Linux 在内的开源软件处于高 或减轻 OSS 用户可能面临的风险。同时作为企业
度侵权的风险之中,这是不符合事实的。Linux 经营者也有可能采取若干有效的措施以减少隐性
是自由软件,是遵循 GPL 许可协议的软件。许可 专利给其自身带来的风险。

开源 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
专题

表(4),对 Linux 内核贡献率

  从上面表(2)、表(3)、表(4)中看,目前中国志愿者参与 OSS/Linux(或 Kernel)的创新开


发活动尚属凤毛麟角

坚持开源软件的创新之路

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

我国 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 系统)与另一个软件系统(如 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
专题

(工具)”。其中,吴先生(Matt Wu)主持了这个项 ”的成果,其 Linux 可全部“兼容”,Windows


目的开发。 则“兼容”常用的大多数。我建议刘教授将“兼
  关于反向读、写问题,在国际开源社区也有 容”改为“互操作”,他表示完全同意。刘教授
不 少 人 在 开 发 。 对 “ 在 Linux 环 境 中 读 、 写 他们已有一个出色的起步,据说在国内外均已找
Windows 的 FAT、FAT32 文档系统”,一直是很 到一些用户,在继续测试的基础上并开始了应用。
好的,唯有在支持“NTFS 文档系统”时,以前 关于上述各项成果的比较分析,有待进一步研究。
读是没有问题的,写则有可能破坏文档系统。但
我们从 CSDN 网上查到最近(2006 年 7 月 17 日) 关于应用程序或办公软件的兼容性或互操作性问
来自 Linuxeden 的信息:“经历相当长时间极限 题
测试,Linux 已经完全支持微软 ntfs 读、写”。   我们知道,办公套件(Office),浏览器软件
该项“信息”还指出:Linux 终于有了可完全读 (如 Firefox)都属于应用程序范畴,处于“信息处
写的开放源代码的 ntfs 支持。 理”层次。
  对于实现互操作性来看,要讲究读、写的速   关于开源办公套件(open office), Sun 公司
率,以及在测试中文档是否丢失或丢失的数量。 在全球研究开发中起领头的作用,近年来国内在
一个成熟的“互操作”与大量成功的测试数据有 开源办公套件或跨平台办公套件的开发方面,出
关。还是根据网上所举的实例:“初步试验显示出, 现了“三大派、七大家”,在与 Windows 兼容
未经优化的驱动已经有 ext3 的 2 倍速率,比商业 方面(与微软.doc 格式的文档实行内容兼容、格式
实 现 paragon NTFS 快 20-50 倍 ; 而 建 立 在 兼容和版面兼容)走在前列。
Windows 自 身 的 ntfs 驱 动 上 的 Interestingly    众所 周知 ,开 源办 公套 件 (open office) 采
Captive NTFS 在测试中丢失文档的方式全部输给 用.SXW 电子文档存储格式。
Linux ntfs 驱动”。
  上面关于在 Linux 、Windows 不同环境中 关于符合一定格式标准的文档(信息)层次的互操
能够互相读写对方生成的文档系统的事实表明, 作问题
在文档系统层次可实现 Linux 与 Windows 的互   我们首先来谈开放文本格式(ODF),它已被
操作。 国际标准组织(ISO、IEC、OASIS)批准为国际标
  首都师范大学刘金刚教授领导一个 50 人组成 准,并已为国际上很多国家的政府,以及美国的
的研究小组,历时 8 年,推出了与上述类似的“ 一些州政府确定为该政府公文交换、信息存储的
兼容”Linux 和 Windows 应用软件三维桌面环境 标准格式。ODF 处于“文档(信息)”层次。
  在目前市场上有许多应用均已支持 ODF,如
在开源项目中的 Open office、K-office,商业软
件中的 Star office(sun) 、workspace(IBM)等,
最近微软也认可 ODF(虽然微软即将推出的 2007
MS Office 并 不 支 持 ODF) , 微 软 支 持 Aztec
Soft(法)公司开发转换器(Convertor),通过转换
器间接支持 ODF(微软支持 ODF 电子文档是经第
三方“转换”工具来实现的,因此可能会丢失一

开源 2008 年第 7 期 34
专题

些信息)。 结 合 起 来 (open offce 的格式已 改 变:


  ODF 将文档(信息)与生成文档的应用程序(信 .SXW/ODF),则可将“兼容”转化为“互操作”,
息处理)分离开来;多个应用程序由于同时支持相同 从而减少“反兼容”风险。
的格式标准的 ODF 则可认为具有互操作能力。换   Ubuntu 支持 open office,原来采用.SXW
言之,如果 ODF 文档受到各种有关的应用程序的 存储码,自 5.10 版后改为 ODF 码,但同时也采
支持,并能进行完全地、无损地处理,则各种生 用仿真.doc 码(可做到 95%与 MS Office 兼容)。
成文档的应用程序将具有互操作性。 国 际 上 采 用 Wine 作 Linux“ 适 配 层 ” 与
过去国内在 Open office 以及永中 Office(采用 Windows 兼容,是另一层次的问题,其兼容性
Java 功能)所做的与微软(Ms office.doc 格式)的 不甚理想。
兼容工作是有很大成绩的。如果能进一步与 ODF

对陆首群“坚持开源软件的创新之路”一文的讨论

陈怀临

    注 : 中 国 开 源 软 件 (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
专题

凝 聚 力 量 作 出 一 点 东 西 为 Open Source 可以举办一些龙芯技术竞赛,Linux/MIPS 技术


Community。一则为我们在 Open Source 社区 讲座等。
赢得更多的尊严,更大的意义是:凝聚力量;坚 企业开发创新
持并专注一两个项目,培养人才。我也曾经观察   我的一些不成熟的个人想法如下:
过 cosoft.org.cn 上的项目,总体感觉还是太零   (1) 虚拟化技术( virturalization)与微内核技
散,没有突破,没有凝聚力量。如果陆老师能够 术
与相关领导立项一两个开源项目,在一两个企业   目前,这方面比较得到许多公司的重视,比
和研究所/高校的领头下,许多民间的力量有可能 如 INTEL L4 微内核与 XEN 等等越来越被人注意。
就参与进来了。比如,IBM 投入大量的人力物力 这方面的应用比较广,而且我们与欧美几乎没有
促 进 Linux 系 统 的 开 发 , 比 如 , 太大的距离。比如 Linux/XEN,FreeBSD/XEN.
http://www-1.ibm.com/linux/ 。 SGI 也 是 如 此 , Linux/L4. 其 应 用 是 广 泛 的 , 比 如 下 一 代
比如 http://oss.sgi.com/。 SERVER,REAL-TIME SYSTEM 等。
  我想,陆老师提出的在开源基础上的自主创   (2) Multi-Core CPU 与操作系统的研究。
新;一个非常好的概念,我们应该在这个概念的基   这一方面欧美也是刚开始不久。传统的
础上,立项,申请政府的支持。 Linux, BSD 等等不可能非常好的在几十个 CPU
  另外一个感觉是目前国内系统软件开发队伍 ON ONE DIE 上展开。龙芯将来一个巨大的方向
在计算机体系结构方面,略微薄弱。从操作系统 有可能是 Multi-Core 的方向。那么在系统软件
的角度,操作系统本身的算法,数据结构,概念 上,我们一定要能跟得上去。否则,即使 Multi-
很多,但都属于形而上的知识。一个好的系统软 Core 的龙芯能 tape out,没有相应的操作系统,
件队伍必须对各种硬件,CPU 体系结构有足够的 也是不能发挥作用。
了解,这样才能把握一个复杂的大系统。从我在   在 Multi-Core 的系统软件上,投资会比较
各个 BBS 体系结构班当斑竹的经验,国内的研发 大,有可能一定要与大企业合作,比如华为,中
队伍在这方面略微薄弱,需要加强。我想这也是 兴等等。从目前的态势看来,华为,中兴等通讯
可以理解的,因为我们以前没有自己的 CPU 技术。 公司在高端系统上不得不走 multi-core 的技术路
从龙芯 tape out 以后,感觉有所变化,但还在起 线,否则如果仍然走 ASIC/FPGA 的技术路线基
步阶段。这也是我为什么在龙芯一出来后,就组 本是比较局限的。我个人建议李老师与陆老师等
织 了 ” See MIPS Run" 一 书 的 翻 译 工 作 把握这个巨大的机遇,与大的通讯公司合作,我
(www.xtrj.org/smr.htm ) 并与计算所的张福新博 们的高端系统软件和芯片技术就会有一个可持续
士合写了拟 IPS 体系结构剖析,编程与实践"电子 性的发展。从华为等目前与我的接触看来,基本
书(www.xtrj.org/mips ) 的主要动机。这方面我 上不具备上述 R&D 的力量。如果他们持续的依
个人建议,计算所李老师,唐老师,胡老师可以 靠买国外的技术,自己做点集成工作,这是对企
考虑如何通过一些方法传播 Linux/MIPS 体系结 业发展是短视的,对国家信息产业战略发展是无
构相关的知识,经验,从而使得我们会有更多的 功而又过的。如果信息产业部能牵头,联合各方
人了解,熟悉 MIPS 体系结构等等。这种潜在的 力量,定义并开发我们自己的高端操作系统,将
益处是长远的。比如,通过计算机世界报等等, 会是一个好消息。

开源 2008 年第 7 期 36
开源社区

开源社区
文泉驿中文字体之“祈祷”发布
  文泉驿是著名的自由中文字体,包括点
阵宋体和正黑两种。
  其中在一些发行版上(如 Ubuntu
8.04),已经将文泉驿字体作为默认的中文
字体。
  现在文泉驿正黑之“祈祷”(版本号
0.6.23)正式发布了。
  相对于上个版本“夸父”,“祈祷”有
很大的改进。其中:

* 加入了最新版本 Unicode(5.1)的 CJK 字符


* 优化了 6749 个中文汉字
* 加入了 44-wqy-zenhei.conf 字体匹配文件
* 加入了 66-wqy-zenhei-sharp.conf 字体匹配文件,适合喜欢点阵的朋友

下载地址: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 日之间召开,目

CentOS 5.2 i386 LiveCD 发布


  CentOS 开发团队发布了 5.2 i386 LiveCD (Maintainence) 更新时间。
,它基于之前发布的 CentOS 5.2 i386 发行版。   和 RedHat Enterprise Linux (RHEL) 不同的
是,CentOS 依 GPL 的规范,移除了 RedHat 品
  CentOS 5.2 i386 LiveCD 主要包含了 牌及图片。
OpenOffice.org 2.3.0, Firefox 3.0,
Pidgin 2.3.1, Scribus 1.3.3.2, K3b
0.12.17, Gimp 2.2.13 等应用软件。不
过据了解之前已知的一些 Bug 在这次发
布的 LiveCD 中并没有得到及时的修正。
比如,SATA 光驱时常不能引导的问题。

  CentOS Linux 是一个依 GPL 规范,


及利用 RedHat Enterprise Linux
(RHEL) 的源代码 (source code) 来重新
编译 (compile) 的 Linux 版本.CentOS
提供和 RHEL 的 Binary 档案几乎百分之
百兼容性,相同的版本 (Release) 和维护

开源 2008 年第 7 期 38
开源社区

Gentoo Linux 2008.0 正式发布


 
  Gentoo Linux 2008.0 正式版本已经放出。
新版本增加了许多新特性,包括:对 installer
(安装程序) 进行了更新、改善了对硬件的支持、
完全重做了 profiles、LiveCD 中的 GNOME 替
换成了 Xfce 等。此外,该版本也更新了许多包,
如 Portage 2.1.4.4、2.6.24 kernel、Xfce
4.4.2、gcc 4.1.2、glibc 2.6.1。
  Gentoo Linux 2008.0 的安装 ISO 映像可从
Gentoo 官方网站下载。值得注意的是,适用于
x86 和 amd64 架构的 LiveDVD 目前暂未提供。

Linux 输入法 Fitx 0.2.0 发布


  Fitx 全名是 Fun Input Toy for Linux,Fitx  * 修正;在双拼中的问题;
的姐妹版 Fun Input Toy,是 Mac OS X 下最流  * 修正双拼模式中微软与紫光方案问题;
行的输入法之一,同时 Fitx 还为 iPhone 版本  * 修正其他小的问题。
WeFIT 提供强劲的输入引擎。Fitx 的目标和 FIT
一样,旨在为 Linux 的用户提供流畅的输入体验。 下载地址:     
Fitx 是建立在 scim 和 scim-python 上的输入法, http://code.google.com/p/fitx/downloads/list
同时由于原生在 Mac OS X 平台,因此需要
GNUstep-base 库支持。

主要改进:

 * 支持 i 模式输入,和 scim 的智能拼音使用同


样的 i 模式方案;
 * 支持 v 模式(临时英文模式),在这个模式
下提供单词的拼写纠错功能;
 * 支持输入全角字符;
 * 支持使用左 SHIFT 键切换中英文状态;
 * 当使用双拼时候禁止使用 v 和 i 模式;

开源 2008 年第 7 期 39
开源社区

Windows 兼容系统 ReactOS 0.3.5 发布


  根据官方定义“ReactOS 项目致力
于开发一个免费软件,向大家提供完全
兼容 Microsoft Windows XP 的操作系
统。ReactOS 旨在实现和 NT 与 XP 操作
系统二进制下的完全应用程序和驱动设
备的兼容性,通过使用类似构架和提供完
全公共接口。 ReactOS 已经并将继续吸
收最新版本的 Win32 API,跟踪甚至发
展最新的操作系统技术。”

  该操作系统最新版 ReactOS 0.3.5


昨天刚刚发布,其主要更新包括:

◆升级的 bootloader(FreeLdr)部分重写增强稳定性;
◆修正了整个系统范围内的内存泄露问题;
◆修正内核,重写了部分内存管理器;
◆Win32 子系统:全面加强,包括用户和内核空间部分;
◆Base CRT 库的主要部分重写提高兼容性;
◆Command shell (cmd.exe)改进,尤
其提高了批处理脚本能力;
◆字体改进;
◆国际化支持改进;
◆几乎所有内核中的驱动以及用户程序
都有不同程度的改进。

  感兴趣的朋友可以在这里
www.reactos.org/en/download.html
下载安装光盘。

开源 2008 年第 7 期 40
开源社区

盘点开源世界的 2007

Intel 开源软件技术中心 蒋运宏 张晓波 朱轶 董耀祖

  2007 年的开源世界,一如以往的热闹与繁华, 候会关掉定时时钟中断,它的正式名称为无定时


在传统 Linux 内核领域出现了一些新的技术,包 空闲(tickless idle),使处理器在空闲时进入深
括可圈可点的电源管理、内核性能优等。在人们 睡眠状态,而不用处于随时被唤醒的浅睡眠状态,
热议的虚拟化技术领域,开源虚拟化一如前两年, 从而节约处理器电源,使 Linux 在电源管理方面
继续成为众多社区成员和学院派人士的青睐,正 又大大前进了一步。这一改动对于移动设备如笔
一路高歌猛进。 记本电脑,手机非常重要,当然传统 Linux 电源
  在开源世界还有一件在 2007 年不得不提的 管理和电源管理策略也同时得到了进一步完善。
大事,那就是移动及因特网 Linux 项目(Mobile   Linux 内核的性能始终是社区关注的另一个
& Internet Linux project ) , 英 文 称 之 为 热点。Linux 2.6 内核采用了多种优化方式努力提
moblin。它是 2007 年的新生事物,面向越来越 高系统性能.比如 O(1)进程调度器, 完全公平队
普及的可移动设备用操作系统如可移动互联网接 列输入输出调度器以及基于用户 ID 的进程组之间
入设备,可移动 PC 和手机等的嵌入式 Linux。 的公平调度. 在进程调度方面,内核还引入了模块
化的调度架构。这个可扩展的层次
结构把内核中的进程调度算法组织
起来并且为将来向内核中添加新的
进程调度算法提供了方便。在
2.6.23 之前, 内核性能主要集中在
服务器平台。自从 2.6.23,内核采
用了全新的完全公平进程调度器,
以便更好地支持桌面应用. 有了完全
公平进程调度器,诸如 firefox 等应
用程序的响应时间大大缩短。
  展望未来,Linux 内核将会在扩
展性(scalability),文件系统,虚
拟化,进程调度等领域会继续得到
Linux 内核 加强。在向上扩展性方面,今天的 Linux 已经能
够比较好的工作在具有 512 个处理器的平台上,
  在 2007 年,一件萦绕在 Linux 内核社区至 但是对有更大的系统比如 4096 个处理器的机器
少 3 年的无定时中断(tickless)补丁程序终于部分 就会有比较大的性能问题,这个问题预计随着
被采纳了。最终采纳的方案虽然没有彻底去掉定 NUMA 架构的越来越普及会在未来一年里得到重
时时钟中断,但是操作系统在空闲(idle)的时 视和更好的解决。在向下扩展性方面,在一些小

开源 2008 年第 7 期 41
开源社区

系统以及嵌入系统中,Linux 也还有不少的地方 summit 上,Rusty Russell 提


需要改进,比如改进内核数据结构使其占用更少 出"paravirt_ops",使得同一个 Linux 内核不经
的内存,去除不必要的子系统以及电源管理等等 修改运行在不同的 Hypervisor 上成为可能,同
在文件系统方面,随着今天的硬盘变得越来越大 时也解决了长期以来 VMWare 和 Xen 在泛虚拟
闪存盘(Flash storage)的不断普及,文件系统 化实现方法方面的争论;2)2006 年 10 月,Avi
方面的改进也势在必行。Ext4 文件系统可能会在 Kivity 发布了 KVM。KVM 利用硬件支持的虚拟
不 远 的 将 来 出 现 以 支 持 更 大 的 分 区 ( 如 1024 化技术实现了基于 Linux 主机的虚拟化实现,并
PB,注:1 PB = 106 GB)。同时改进文件系统 迅速被 Linux 内核社区接受。
检查和修正的 fsck 操作的算法和实现使其能胜任   对于 KVM 而言,2007 显然是长足发展的一
如今越来越大的文件系统将是一个可预见的工作 年。2007 元旦刚过,Ingo Molner 发布了针对
一些新的文件系统例如:logfs、chunkfs/tilefs、 KVM 的 泛 虚 拟 化 支 持 ; 2007 年 2 月 , 内 核
btrfs 会得到进一步的发展和应用。 2.6.20 正式发布,Linux 通过 KVM 实现了对虚拟
  同时一些新的设备和设备驱动程序将继续不 化的支持。回想 Xen 为了能进入 Linux 内核所做
断出现,特别是无线设备方面如新的 802.11 网络 的努力,我们不得不惊讶于这一个火箭似的速度。
协议栈 mac80211 以及 Intel 的 iwlwifi 无线驱动 在过去一年,KVM 取得了巨大的变化:更稳定的
等。在显卡驱动方面,我们希望看到有更多的显 系统,更好的性能,更多的客户机操作系统类型
卡厂商能够推出开源的显卡驱动程序,今天,所 的支持,SMP 客户机的支持,以及跨体系结构支
有 Intel 的显卡已经做到驱动程序完全开源,但是 持如对 Intel 安腾架构和 IBM PPC 及 S390。
有些厂商的驱动程序还在使用二进制的模块,有   Xen 在 2007 年依然保持了高速发展,目前
些则部分开源。 最新的发布版本是 3.1.2,并且 xen 社区准备在年
  除了以上这些在技术方面的动作以外,今年 底发布 3.2 版本。在不断修正错误以提高稳定性
在开源界最大的事情莫过于 GPL 版本 3 的发布。 的同时,越来越多的功能被加入了 Xen 的发布版
由于 Linux 内核显示的标明采用 GPL 版本 2 的软 本(xen unstable tree),包括:1)XenAPI 的集
件授权方式, 加之 Linus Torvalds 本
人对 GPL 版本 3 并不十分的欣赏,若
想使得采用 GPL 版本 2 的今天的
Linux 内核代码转向采用 GPL 版本 3
将会遇到非常大的困难。

虚拟化

  当我们回顾 2007 年开源世界的


虚拟化技术之前,我们不得不回顾到
更遥远的 2006 年。那一年的两个重
要事件极大影响了虚拟化技术在开源
社区的发展:1)2006 年的 kernel

开源 2008 年第 7 期 42
开源社区

成以提供更好的 VM 管理;2)HVM 客户机的实   在内核社区关于虚拟化的另一个讨论就是对


时迁移(Live Migration);3)32 位 PV 客户机 IO 虚拟化的统一。目前各种 Hypervisor 都实现
在 64 位 HV 上的支持;4)Intel VT-d 技术的支 了各自的 I/O 虚拟化方法,针对这种现状,Rusty
持使得 HVM 客户机可以直接使用物理设备;5) Russell 提出了 VirtIO 概念并提供了块设备和网
硬件内存虚拟化技术的支持以提高内存虚拟化的 络设备的范例驱动程序,Virtio 通过针对不同 HV
性能等。同时,更多基于 Xen 的开发仍在继续中。 的虚拟 IO 层以及其上的统一的 Linux 驱动,以实
关于虚拟化环境下的电源管理开始进行讨论,部 现对虚拟 IO 的单一机制。当然,这种努力仍然处
分 实 现 已 经 被 集 成 到 了 Xen 源 代 码 ; 于早期的阶段,估计在 2008 年会得到解决。
NetChannel2 利用新的网络硬件技术,为 Xen   Linux 世界里的虚拟化实现远非 KVM/Xen
提供了更好的网络支持。同时更多的架构和更多 两 家 争 雄 的 简 单 局 面 。 VMWare 基于
的虚拟化方案提供商开始加入到 Xen 解决方案中 paravirt_ops 的 VMI 接口已经被集成进了内核
来,如三星提出了在手机上实现基于 ARM 平台 2.6.21 版本,而 VMWare 也已经在其 VMWare
多个虚拟机的解决方案;Solaris 推出了基于 Xen workstation 6.0 上 提 供 了 对 VMI 接 口 的 支 持 。
的 Solaris 开源虚拟化技术 xVM 等等。这些都表 Lguest 也已经被集成进了 Linux 内核。
明 Xen 正在得到越来越广泛的应用。   在 Linux 社区之外,Innotek 在 2007 年 1 月
  Xen 的基于 paravirt_ops 的实现也被集成进 提供了 VirtualBOX 的开源版本 (VirtualBOX
了 2.6.23 的 Linux 内核里,尽管还只是非常基本 OSE),除了一些针对企业客户的特性之外,开
的支持,但毕竟是一个好的开端。这离 Xen 于 源版本的 VirtualBOX 与完整的 VirtualBOX 包完
2003 年向 Linux 社区发送的第一个发布以及 xen 全相同,而 VirtualBox 最让人感兴趣的,并不止
2.0 的第一个对 Linux 修改的补丁程序已经过去了 是它的二进制翻译技术(binary translation),
4 年,真是岁月如梭。在 2008 年,可以预见更多 而且它可以运行在 Mac 系统上。另外 Google 也
基于 xen 实现的的内核程序会逐渐被接受,特别 开始进入了虚拟化的世界,提供了基于 Xen 的虚
是对 Dom0 的实现。 拟服务器管理工具 Ganeti。

移动及因特网 Linux

  2007 年 Intel 向社区宣布的


新的开源项目—Moblin(http://
www.moblin.org),和开源社区
竭诚合作为促进移动 Linux 革新做
出不懈努力.Moblin 项目主要为移
动设备,数字医疗与数字家庭设
备等消费类电子产品(Consumer
Electronics)提供互操作与可伸缩
的创新解决方案。Moblin 旨在为
移动设备开发合适的 Linux 系统与

开源 2008 年第 7 期 43
开源社区

应用,这包括开源的解决方案,工具和一个框架 子产品通常会有跟标准 PC 不同的特殊的硬件部


结构。在这个框架内,开源社区可以分享技术, 件,因此 moblin 项目建立了内核子项目以适应
创意以及使用模型。 这些硬件平台的不同。在电源管理方面,由于移
  在 2007 年 4 月的北京,英特尔开发者论坛 动设备和消费类电子设备均采用电池供电,对电
(IDF)上英特尔发布了移动因特网设备 MID。 源的效率极其敏感。Moblin 对 Linux 的现有电源
第一款移动互联网产品预计在 2008 推出,Linux 管理能力进行了扩充和加强,以提供广泛的、强
是 MID 的首选操作系统。选择 Linux 的原因主要 健的和可扩展的电源管理框架。用户界面架构子
是客户更加看重 Linux 的小巧、省电、灵活、高 项目则非常容易理解,MID 设备和消费类电子产
性能与低价格,Moblin 就是首先为 MID 量身定 品通常不具有如 PC 那样的大屏幕,因此必然需
做,当然 Moblin 也可应用到其它消费类电子产 要在用户界面上量身定做。在多媒体方面,MID
品。 设备和消费类电子产品具有很强的需求,同时兼
  Moblin 还应用于汽车导航定位,数字医疗 有移动的特点,因此 moblin 在多媒体的内容管
与数字家庭等领域。车载领域中汽车供应商可以 理和框架支持上都有独特地方。作为移动互联网
通过建立 Intel 架构在车载的信息娱乐平台,应用 设备,互联网浏览器的角色至关重要,直接关系
嵌入式 linux 把资讯的机会变成现实,丰富导航、 到 moblin 的普及。对基于 Mozilla 的浏览器软
定位、内容和应用等车载服务. Moblin 应用于数 件进行改进以适应 MID 设备和消费类电子产品自
字医疗与数字家庭等领域可实现随时随地的数字 然是一个重中之重。
医疗信息和数字媒体信息获取及共享。   回顾 2007 年,moblin 有了一个很好的开始,
  Moblin 采用 Linux 内核,但在下列几个方面 我们估计 2008 年 moblin 将会有一个极大的提高,
进行了提高:1)Linux 内核,2)电源管理策略, 各种基于 Moblin 的设备也将大量出现,我们可
3)用户界面架构,4)多媒体,5)浏览器等等。 以拭目以待。
在内核方面,不同于 PC,MID 设备和消费类电

走近 Erlang 世界

顾宏军

  提起 Erlang 语言,相信许多人都会挠头,因 %)、Perl(6.177%)、C#(3.483%)、Pyth


为它实在是太陌生了。在 2007 年 6 月由 TIOBE on(3.161%)、JavaScript(2.616%)、Ruby
Programming Community 提供的程序语言排 (2.132%)。相对于传统老牌“大佬”语言相比,
名中,Erlang 占有率仅为 0.080%,排名第 49 位。 Erlang 语言绝对算得上是一种“小众”语言,但
与之形成鲜明对比的是,Java 以 20.025%的占有 其未来的发展前景却是无法估量的,因为它可以
率高居榜首,紧随其后的是 C(15.967%)、C+ 解决传统语言很难解决的并行计算中的难题,有
+(11.118%)、VB(9.332%)、PHP(8.871 可能成为下一个 Java,在正在迅猛发展的并行计

开源 2008 年第 7 期 44
开源社区

算时代,Erlang 将会是一颗璀璨的明星。 组成,并通过消息传递相互通讯。使用 Erlang 来


编写分布式应用比其它语言要简单的多,因为它
认识 Erlang 的分布式机制是透明的:对于程序来说并不知道
自己是在分布式运行。Erlang 运行时环境是一个
  Erlang 并非一门新语言,它最早在 1987 年 虚拟机,有点像 Java 虚拟机,代码一经编译,同
就出现了,只是当时对并发、分布式需求还没有 样可以随处运行。它的运行时系统甚至允许代码
今天这么普遍,可谓英雄无用武之地。Erlang 语 在不被中断的情况下更新。另外如果你需要更高
言创始人 Joe Armstrong 当年在爱立信做电话网 效的话,字节代码也可以编译成本地代码运行。
络方面的开发,他使用 Smalltalk,可惜那个时候 相当其它语言,Erlang 有很多天生的适应现代网
Smalltalk 太慢,不能满足电话网络的高性能要求。 络服务需求的特性:
但 Joe 实在喜欢 Smalltalk,于是定购了一台
Tektronix Smalltak 机器。但机器要两个月才到。
Joe 等待中百无聊赖,就开始使用 Prolog,结果
等 Tektronix 到的时候,他已经对 Prolog 更感兴
趣,Joe 当然不满足于精通 Prolog,经过一段时
间的试验,Joe 给 Prolog 加上了并发处理和错误
恢复,于是 Erlang 就诞生了。这也是为什么
erlang 的结构图
Erlang 的语法和 Prolog 有不少相似之处,比如
它们的 List 表达都是[Head | Tail]。
◆并发性, Erlang 具有超强的轻量级进程,这种
  1987 年 Erlang 试验版推出,并在用户实际
进程对内存的需求是动态变化的,并且它没有共
应用中不断完善,于 1991 年向用户推出第一个
享内存和通过异步消息传送的通讯。Erlang 支持
版本,带有了编译器,图形接口等更多功能。
超大量级的并发线程,并且不需要操作系统具有
1992 年,Erlang 迎来更多用户:如 RACE 项目
并发机制。
等。Erlang 被移植到 VxWorks, PC, Macintosh
◆分布式,Erlang 被设计用于运行在分布式环境
等多种平台,两个使用 Erlang 的产品项目也开始
下。一个 Erlang 虚拟机被成为 Erlang 节点。一
启动。1993 爱立信公司内部独立的组织开始维护
个分布式 Erlang 系统是多个 Erlang 节点组成的
和支持 Erlang 实现和 Erlang 工具。
网络(通常每个处理器被作为一个节点)。一个
  目前,随着网络应用的兴起,对高并发、分
Erlang 节点能够创建运行在其它节点上的并行线
布部署、持续服务的需求增多,Erlang 的特性刚
程,而其它节点可以使用其它操作系统。线程依
好满足这些需求,于是 Erlang 开始得到更多人的
赖不同节点之间的通讯,这完全和它依赖于单一
关注。
节点一样。
◆软实时性,Erlang 支持可编程的“软”实时系
Erlang 特性
统,这种系统需要反应时间在毫秒级。而在这种
系统中,长时间的垃圾收集(garbage
  Erlang 是一种函数式语言,使用 Erlang 编
collection)延迟是无法接受的,因此 Erlang 使
写出的应用运行时通常由成千上万个轻量级进程
用了递增式垃圾收集技术。

开源 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
开源社区

server。yaws 也可说是一个 web 开发框架, 器上运行的高可靠性系统的唯一成熟语言。


yaws 的 ehtml 类似于 jsp, php, ruby     Erlang 始 于 20 年 前 , 是 一 个 并 发 性
template。Yaws 并发能力是 apache 的 15 倍, Prolog。Joe Armstrong 创造了它,并且他也是
有人利用 16 台集群服务器所做的實驗显示, 主要作者。第一个大型 Erlang 项目是一个由几百
Yaws 可以承受超過八万個并发活动,Apache 則 人创建的电信交换系统,系统有数百万行代码。
在四千個就当机了。 系统主要关注的就是可靠性,并且系统有难以置
信 的 可 靠 性 历 史 。 据 Joe 介 绍 , " 它 有
99.9999999%的可靠性"。
  "它有 99.9999999%的可靠性"这意味着什么?
这意味着每 10 亿秒才有 1 秒宕机时间,或者说
10 亿分钟有 1 分钟宕机时间。十亿秒大概是 30
年,10 亿分钟大概有 2000 年。99.999%的可靠
性大概是每年宕机 5 分钟,这已经是很好的了。
了解可靠性的人多知道,可靠性系统有
99.9999%的,甚至 99.99999%的,但是估计没
听过有 99.9999999%可靠性的,可基于 Erlang

Erlang 和 ruby 的简单测试的图 的系统实现了。


  但这还不是可以会令 erlang 壮大的理由,因

  Ejabberd -目前是可扩展性最好的一种 为不是什么人都关注可靠性。也不是因为 erlang

Jabber/XMPP 服务器,支持分布多个服务器, 是一个函数式语言它可能壮大,更不是并行

并且具有容错处理,单台服务器失效不影响整个 Erlang 是个面向对象语言。它会壮大的原因是它

集群运作。Ejabberd 基于 ErLang + Mnesia, 是唯一一个有可靠实现和完善类库的成熟的并行

项目已成功发展 5 年,占据 30%左右 Jabber 服 开发语言,在不久的将来所有的桌面系统、笔记

务器市场。 本电脑都将是多核的,而要让程序在多核上更快

  Tsung-多协议分布式压力测试工具, 可用于 的运行就要使程序能充分利用多核处理的能力。

测试 http、soap、Postgresql、Jabber/XMPP   Erlang 带有一组类库。多数类库是用于构建

服务器。而 wings 则是一个 3D 建模程序,软件 各类 Internet 服务的。Erlang 有 web 服务器和

支持 Windows、Mac OSX 、Linux、及主要 数据库。Erlang 社区认为它是构建可靠 web 服务

Unix。 器和 web 服务的首选语言。如果你看看 Erlang


包的名字,将会发现它没有处理电信事物的内容。

下一个 Java? 它是一个构建可靠系统的框架/平台;它构建的平


台可以持续运行而无需关闭,可以每天更新软件,

  Erlang 将会成为一个非常重要的语言。它有 甚至可以定期的更换硬件。这些特性是电信应用

可能会成为下一个 java;它最大的问题是缺乏大 所需要的,它还是在线银行、在线商城、等各类

公司支持。它是个开源项目,非常适合多核处理、 在线应用所需要的。

web 服务等领域。事实上,它也是编写在多核机     Joe Armstrong 最 近 写 了 本 书

开源 2008 年第 7 期 47
开源社区

《Programming.Erlang》,所有关注 Erlang 的人 Erlang-China.org 能继续为对 Erlang 感兴趣的


都值得一读。Erlang 符合所有面向对象语言特性, 中文用户提供便利,促进用户彼此之间的交流,
虽然它是个函数式语言,而不是面向对象语言 推动对这一语言的深入研究,促成一些 Erlang 开
erlang 区分与面向对象语言的一个方面就是它的 源项目,帮助中文用户为整个 Erlang 社区做出贡
错误处理。在某消息出错时,进程不是抛出出错 献。
的例外,而是直接进程出错。而系统结构被设计   Erlang 没有类似 Java、C++的语法,它不是
为底部是工作进程(它们可能会失败),上层是 面向对象语言,它没有多态,它是函数编程语言
管理进程,它们可以重新启动失败的进程。 (Functional programming Language)。大量程
  我不相信其它语言能迅速赶上 Erlang。对其 序员并不熟悉函数式编程,我们的计算机教育里
它语言而言,加入像 Erlang 这样的语言特征是很 也都是基于面向对象和面向过程语言的,这会是
容易的。但这将花费他们大量的时间来构建这样 所有想尝试 Erlang 的用户遇到的首要问题,这会
一个高质量的 VM 和成熟的并发性与可靠性类库。 使得培训成本加大,决策人员也需要足够勇气来
因此 Erlang 很自然会成功。如果你想在未来几年 选择一个新语言来构建应用。另外,Erlang 虽然
构建一个多核应用,你应该看看 Erlang。 内建了并行、分布的支持,但是程序员还需要学
习和掌握并行的思维模式,并行的思维模式也许
Erlang 在中国 是更加难以跨越的门槛。
  要解决计算时代,可伸缩性、容错性以及运
  Erlang 在全球看都还是个小众语言,其在中 行时可更新系统需求,就目前而言,只有 Erlang
国影响力就更小了,好在有国内的 Erlang 爱好者 语言可以很好的解决。Erlang 语言也正面临这一
已经组织起来,在进行相关的工作,成立了 场大的变革,从默默无闻走向更多人视野,会向
Erlang-china.org;发布了部分 Erlang 相关中文 更广的网络应用领域渗透,已经 20 岁的 Erlang
文档,并且组织了两次 Erlang 爱好者聚会,希望 迎来它更加辉煌的明天。

开源 2008 年第 7 期 48
知识学堂

知识学堂
Linux 下设备完全驱动(二)

郄晓烨

  这一节首先讲述 IDE 硬盘及光驱的设置、IDE 刻录机的使用,以及如何安装 SCSI 硬盘驱动。然后介


绍以太网卡驱动模块的加载及网络接口的启功过程,如何调整网卡的参数,Modem、ADSL 和宽带的驱
动安装,以及 PPP 连接的设置等。

IDE 硬盘及光驱

1.IDE 设备的驱动过程

  操作系统首先是安装在块设备上,没有对块设备的支持系统就无法启动,所以首先介绍常见块设备
的安装。硬盘就是最常见的块设备,普通 PC 上的硬盘通常是 IDE 接口的,而服务器上的硬盘通常是
SCSI 接口的。一般内核中内置对通用 IDE 控制芯片的支持。下面看一下 IDE 硬盘在内核中的驱动过程,
dmesg 命令可以看到内核在启功和加载内核模块时的信息:
  # dmesg | less

  在 Linux 内核启动过程中,可以发现内核首先驱动初始化 CPU、内存、系统时钟部分,接着加载


PCI 总线的驱动,然后就加载了通用的 IDE 驱动程序:
  Uniform Multi-Platform E-IDE driver Revision: 7.00beta4-2.4

  接着初始化 IDE 的控制器,IDE 控制器集成在 Intel 的 ICH4 南桥芯片组中,IDE 控制芯片驱动加载后,


进行初始化传输模式:

  ICH4: chipset revision 1


  ICH4: not 100% native mode: will probe irqs later
   ide0: BM-DMA at 0xbfa0-0xbfa7, BIOS settings: hda:DMA, hdb:pio
   ide1: BM-DMA at 0xbfa8-0xbfaf, BIOS settings: hdc:DMA, hdd:pio

开源 2008 年第 7 期 49
知识学堂

  该驱动程序会向核心中注册主设备号为 3 的 block 型设备。可以看到,在 IDE 控制器初始化时,占


用的 I/O 资源及分配给它的中断号:
  ide0 at 0x1f0-0x1f7,0x3f6 on irq 14
  ide1 at 0x170-0x177,0x376 on irq 15

  接着使用 IDE 控制器查找连接在 IDE 接口上的设备,如果检查到硬盘则加载 IDE 硬盘的驱动程序,


设置了该硬盘的基本参数,设置传输方式为 UDMA(100),也就是 ATA100(100Mb/s 的传输速度),
并且根据这个驱动程序检测硬盘上的分区:
  hda: attached ide-disk driver.
  hda: host protected area => 1
  hda: 78140160 sectors (40008 MB) w/7898KiB Cache, CHS=4864/255/63, UDMA(100)
  ide-floppy driver 0.99.newide
  Partition check:
  hda: hda1 hda2 hda3 hda4 < hda5 hda6 hda7 hda8 hda9 >

  /dev/hda 代表第一个 IDE 接口的主设备,它的设备号为 block(3/0),而/dev/hda1 是这块硬盘


的第一个分区,设备编号是 block (3/1);/dev/hdb 代表第一个 IDE 接口的从设备,设备编号为
block(3/64)。由此我们可以看到,内核默认可以支持 1~63 个分区,其中第一个逻辑分区的编号肯
定为/dev/hda5。但是,在/dev 目录下查找有 hda1~hda32,共 32 个分区文件,如果需要更多的分区,
就需要使用 mknod 命令来创建更多的设备文件。
  /dev/hdc 是第二个 IDE 接口的主设备;/dev/hdd 是第二个 IDE 接口的从设备。

2.安装、升级常见的 IDE 驱动程序

  通用的 IDE 控制器可以通过内核这样加载起来,如果遇到一些较新的芯片组,当前的内核无法完全


发挥出新硬件的性能,这时就要向内核中打补丁,例如,2.4.20-8 的内核就无法支持 VIA VT8237 芯片
组中的 IDE ATA133 方式,需要向内核中打补丁。先到 VIA 的网站上下载相关补丁,网址为
http://www.viaarena.com/?PageID=297#ATA,注意要选择适合当前自己内核的驱动,接下来是升级
内核,给内核打补丁。
  # rpm -ivh kernel-source-<Kernel Version>.i386.rpm

  安装需要版本的源代码包。把刚才链接中的补丁下载,将这个 patch 文件解开:


  # tar xzvf VIA IDE ATA133 Patch 8237 ver0.8.gz

  进入解包出来的目录,将需要的 patch 文件 cp 到 /usr/src 目录:


  # cp <Linux OS>-patch-<Kernel Version> /usr/src

开源 2008 年第 7 期 50
知识学堂

  Kernel Version 代表内核的版本号,Linux OS 代表不同的 Linux 系统。


  # cd /usr/src

  # patch -p0 < <Linux OS>-patch-<Kernel Version>

  将 patch 打入内核中,重新编译内核:


  # cd /usr/src/linux-<Kernel Version>

  编辑 Makefile 文件,把 "EXTRAVERSION=" 改成 "EXTRAVERSION=-test",这是给新的内核命名。


  # cp /boot/config-XXX .config
  # make menuconfig ( config 或 xconfig 也可以 )

  确定 "ATA/IDE/MFM/RLL support/IDE,ATA and ATAPI Block devices"中的"VIA82CXXX chipset


support"被选中。

  开始编译内核:
  # make dep
  # make clean
  # make bzImage
  # make modules
  # make modules_install

  # cp arch/i386/boot/bzImage (或 vmlinuz-test) /boot/vmlinuz-test


  # cp /boot/initrd-< Kernel Version >.img /boot/initrd-test.img

  编辑 /boot/grub/grub.conf 文件,在最后添加下面三行:


  title linux-test
  kernel /boot/vmlinuz-test ro root=/dev/hda1
  initrd /boot/initrd-test.img

  重新启动系统,使用刚刚编译的内核就会发现启动信息中多出一行“linux-test”。留意启动时的
信息,就会发现有下面一行信息:
  "VP_IDE: VIA vt8237 (rev 00) IDE UDMA133 Controller on pci00:0f.1"

  如果正常启动,各种服务也都没有问题,那么以后就可以用这个新的内核了。可以用# hdparm -i 命

开源 2008 年第 7 期 51
知识学堂

令来调整硬盘的传输方式,检查硬盘目前的传输模式。
  /dev/hda:

  Model=IC25N040ATCS05-0, FwRev=CS4OA63A, SerialNo=CLP429F4HALVPA


  Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }
  RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4
  BuffType=DualPortCache, BuffSize=7898kB, MaxMultSect=16, MultSect=16
  CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=78140160
  IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}
  PIO modes: pio0 pio1 pio2 pio3 pio4
  DMA modes: mdma0 mdma1 mdma2
  UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5 //显示所支持的硬盘传输模式
  AdvancedPM=yes: mode=0x80 (128) WriteCache=enabled
  Drive conforms to: ATA/ATAPI-5 T13 1321D revision 3:

  * signifies the current active mo

  查看一下当前硬盘的工作模式,如果不是 ATA133,则可以灵活使用控制硬盘传输模式的命令:
  # hdparm -d1 /dev/hda //enable DMA 模式
  # hdparm -d0 /dev/hda //disable DMA 模式
  # hdparm -X70 /dev/hda //将传输模式切换到 UDMA 6 -ATA133 模式

  -X 后数字 16~18 代表 SDMA 0~2,32~34 代表 MDMA 0~2,64~70 代表 UDMA 0~6。


将最后一行加入到/etc/rc.d/rc.sysinit 或/etc/rc.d/rc.local 文件中,可以让硬盘每次启动都工作在
ATA133 下。

3.安装 nforce 芯片组的驱动程序

  AMD64 平台的 nforce 系列芯片组性能强劲,虽然可以用常规的方法加以驱动,但有可能无法发挥


新设备的特性,或者该芯片组的网卡、声卡无法使用。nVIDIA 提供了更方便的 RPM 文件供使用,其中
一些是源代码 tar 文件,需要进行编译;有些是 RPM 包,直接进行安装就可以了。nforce 芯片组在
Linux 下驱动的下载地址为 http://www.nvidia.com/object/linux_nforce_1.0-0275.html,其中包含了
内核的补丁、芯片组中对网卡及声卡的驱动程序。下载经过编译的 RPM 包可以直接安装:
  # rpm -ivh NVIDIA_nforce.athlon.rpm

如果使用的不是 SuSE 或 Red Hat Linux 系统,也可以下载带有源代码的.src.rpm 包经过编译后再安装:

开源 2008 年第 7 期 52
知识学堂

  # rpm -ivh NVIDIA_nforce.src.rpm //将驱动程序的源程序文件安装到系统中


  # cd /usr/src/redhat/SPECS
  # rpmbuild -bb NVIDIA_nforce.specs //编译源驱动程序,编译成可直接使用的 rpm 文件

  # cd /usr/src/redhat/RPM/i386/ //根据具体包的不同,也可能是 i686、noarch 等

  # rpm -ivh NVIDIA_nforce.i386.rpm //程序自动安装包内的驱动程序,并利用 RPM 包中的脚本


自动配置

光驱的驱动及刻录机的使用

1.光驱的驱动过程

  编译内核时,在 ATA/IDE/MFM/RLL 选单中都会有 IDE/ATAPI CDROM support 的选项,通常所见


到的内核都将这个部分编译在了内核中,所以不需设置光驱就可以使用。下面看一下系统启动时光驱是
如何驱动的:
  # dmesg |grep CD

  hdc: HL-DT-STCD-RW/DVD-ROM GCC-4240N, ATAPI CD/DVD-ROM drive


  Uniform CD-ROM driver Revision: 3.12

  一般的通用 CD/DVD-ROM 驱动程序就可以将光驱驱动起来,不需要特别的配置。如果遇到的是


SCSI 光驱,则一般的内核也可以驱动,因为在编译内核时,一般会将 SCSI 的内容编译出来。如果没有
SCSI 的光驱驱动,则可以自己手动编译。make menuconfig(或 xconfig)时,在 SCSI support 选单
中只要将 SCSI support 设置为“Y”或“M”(Y 代表该部分编译在内核中,M 表示该部分编译为内核
模块);SCSI CD-ROM support 设置为“Y”或“M”;SCSI generic support 设置为“Y”或
“M”,这样就可以驱动 SCSI 接口的光驱了。

2.CD/DVD 刻录机的驱动及使用

  现在 CD 或 DVD 刻录机越来越普及,那么在 Linux 下如何使用内置的 CD 或 DVD 刻录机呢?默认的


情况下,系统会将刻录机视作只读的驱动器,只加载普通的 CD/DVD-ROM 驱动,光驱无法写入。因此,
需要用 ide-scsi 伪设备驱动程序来驱动刻录机,将普通的 IDE 接口的设备模拟成一个 SCSI 接口的设备,
这时才能向其中刻录。我们可以使用三种方式来实现将 IDE 光驱模拟为 SCSI 光驱。假设使用 GRUB 作为
bootloader,刻录机安装在第二个 IDE 接口,是主设备,则它默认应该为/dev/hdc 。

开源 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/

  将/root/目录下的文件做成一个名叫 example.iso 的光盘镜像文件,该文件的卷标为 xamplecd。


还可通过命令将该文件加载到/mnt/iso 文件夹中,可以自由添加删除镜像中的文件,但要注意不要超过
光盘的容量。
  # mkdir /mnt/iso
  # mount -t iso9660 -o loop example.iso /mnt/iso

  调整/mnt/iso 文件的内容:
  # umount /mnt/iso

  最后使用 cdrecord 命令来刻录:


  # cdrecord -scanbus

  查看 SCSI 总线中刻录机的配置信息:


  Cdrecord 2.0 (i686-pc-linux-gnu) Copyright (C) 1995-2002 J?rg Schilling
  Linux sg driver version: 3.1.25
  Using libscg version 'schily-0.7'
  cdrecord: Warning: using inofficial libscg transport code version (schily - Red Hat-scsi-linux-
sg.c-1.75-RH '@(#)scsi-linux-sg.c 1.75 02/10/21 Copyright 1997 J. Schilling').
  scsibus0:
   0,0,0 0) 'HL-DT-ST' 'RW/DVD GCC-4240N' 'E112' Removable CD-ROM
   0,1,0 1) *

开源 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 总线的参数,然后根据参数来输入下面的命令刻录光盘:


  # cdrecord -v -eject speed=24 dev=0,0,0 example.iso

  speed=24 是以 24 倍速来刻录光盘,dev=后加上刚才显示的刻录机的 SCSI 参数。

SCSI 设备驱动过程

  下面以 Adaptec SCSI RAID 3200S 卡为例,介绍 SCSI RAID 卡的驱动过程。这是常见的带 RAID 功
能的 SCSI 卡。在大部分编译好的内核中,都会编译对 SCSI 设备的支持。但是需要知道,内核中只是支
持通用的 SCSI 总线,而具体的 SCSI 卡还需要加载相应的驱动程序。SCSI 芯片驱动的安装比较特殊,下
面分成两种情况叙述。

1. Linux 系统的启动文件就是在 SCSI 硬盘上


  这种情况下,SCSI 设备的驱动程序不能像普通的驱动程序来安装。因为如果系统启动时没有加载
SCSI 卡的驱动程序,那么根本无法访问其它的 Linux 系统文件,所以必须在内核启动后立刻就加载该设
备的驱动程序。以下是在 Red Hat 系统中具体的安装过程。

(1)从 Adaptec 网站 http://www.adaptec.com/worldwide/support/driverdetail.jsp?


sess=no&language=English+US&cat=/Product/ASR-3200S&filekey=dpt_i20-drv_2.5.0-rh9-
i686.img 下载 Adaptec SCSI RAID 3200S 卡针对 Red Hat 9.0 的驱动程序,大家可以看到这是一
个.img 的镜像文件。

(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

  在 Windows 下利用 Red Hat 第一张安装光盘中的/CDROM/dosutils/rawrite.exe 程序。

开源 2008 年第 7 期 55
知识学堂

(3)在启动 Red Hat 安装过程时,boot 提示符出现时进入安装模式:


  boot: linux dd

(4)按照向导提示,将刚才制作的驱动软盘插入。
  以后的安装过程就没有什么不同了。安装向导实际上将软盘上的驱动程序放到了 initrd 的
RAMDISK(内存磁盘镜像)文件中,每次内核启动后,都最先加载这个内存虚拟硬盘的镜像,利用里面
的 SCSI 驱动程序来驱动 SCSI RAID 卡和卡上连接的硬盘。

2. Linux 系统已经安装到一个 IDE 的硬盘上

  这种情况跟其它的驱动程序没有太大的区别,用 modprobe 或 insmod 将 SCSI 卡的驱动模块加载


到内存中。
(1)查看系统是否能访问 PCI 设备:
  # lspci -v | grep -i i2o

(2)从 Adaptec 网站 http://www.adaptec.com/worldwide/support/driverdetail.jsp?


sess=no&language=English+US&cat=/Product/ASR-3200S&filekey=dpt_i20-drv_2.5.0-rh9.rpm
下载驱动程序,检验是否可以加载模块。
  # rpm -ivh dpt_i20-drv_2.5.0-rh9.rpm
  # modprobe dpt_i2o

(3)察看是否可以访问/dev/sda 设备,或者已经创建好/dev/md0 设备。

加载以太网卡驱动模块及参数调整

1.以太网卡的驱动过程

  处理网络方面任务是 Linux 的长项,仅仅一两兆的 Linux 内核就可以对 TCP/IP 有很好的支持。下面


首先了解一下最常见的网络设备—以太网卡的驱动过程。
  在内核加载后,虽然已经有了对 TCP/IP 协议的支持,但是具体的网络接口设备的驱动并没有加载。
在内核启动后,将硬盘上的根分区 mount 到系统中,系统就会查找模块配置文件/etc/modules.conf,
并按照该文件记录的内容来加载模块:
  # cat /etc/modules.conf
  alias eth0 8139too
  alias sound-slot-0 i810_audio
  post-install sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -L >/dev/null 2>&1 || :

开源 2008 年第 7 期 56
知识学堂

  pre-remove sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -S >/dev/null 2>&1 || :


  alias usb-controller usb-uhci
  alias usb-controller1 ehci-hcd

  上面代码表示加载 8139too 模块,我的网卡是 8139 的 100Mb 以太网芯片,并将该模块取别名叫


做 eth0。这表示第一个以太网的网络接口,以后只要访问 eth0,就是访问这块网卡。然后系统会在/lib/
modules/2.4XXX/的 modules.deps 中查找该模块的具体位置:
  # grep 8139too /lib/modules/2.4.21-4.EL/modules.dep
  /lib/modules/2.XXX/kernel/drivers/net/8139too.o:
  /lib/modules/2.4.21-4.EL/kernel/drivers/net/mii.o
  /lib/modules/2.4.21-4.EL/kernel/lib/crc32.o

  以上内容在同一行中,表示 8139too 模块依存于 mii 模块和 crc32 模块,8139too 模块的具体位置


在/lib/modules/2.XXX/kernel/drivers/net/8139too.o,所有系统内置的网络驱动程序都
在/lib/modules/2.XXX/kernel/drivers/net 目录下。
  驱动模块加载完成之后,可以直接通过命令 ifconfig 来设置网卡的 IP 地址,:
  # ifconfig eth0 192.168.1.1

  这样设置的 IP 地址重启后就会失效,使用 netconfig 命令可以永久更改 IP 地址:


  # netconfig
  # service network restart 或者 # /etc/rc.d/init.d/network restart`
  那么系统每次启动时是怎样配置网络的呢?在 Linux 系统中,网络作为一项服务被加载,配置文件
是/etc/rc.d/init.d/network,在该文件中可以看到系统启动网络接口、绑定 IP 地址、设定静态路由的过
程,这个文件通过调用/etc/sysconfig/network-scripts/ifcfg-*的几个文件来配置各个网卡的 IP 地址。
比如有 eth0,则会生成一个文件 ifcfg-eth0,系统每次启动时自动绑定 eth0 的 IP 地址:
  # cat /etc/sysconfig/network-scripts/ifcfg-eth0
  DEVICE=eth0
  ONBOOT=yes
  BOOTPROTO=none
  IPADDR=192.168.0.1
  NETMASK=255.255.255.0
  TYPE=Ethernet

  以上就为 eth0 设备绑定了 192.168.0.1 的 IP 地址。


  # cat /etc/sysconfig/network-scripts/ifcfg-eth0:1
  DEVICE=eth0:1

开源 2008 年第 7 期 57
知识学堂

  ONBOOT=yes
  BOOTPROTO=none
  IPADDR=192.168.1.1
  NETMASK=255.255.255.0
  TYPE=Ethernet

  以上的 ifcfg-eth0:1 文件为 eth0 设定了第二个 IP 地址 192.168.1.1,这个文件是我添加的,注意


DEVICE=eth0:1 跟上一个文件是不一样的。

2.安装 3COM 3CR990 网卡驱动程序

  我们可以看到,系统内置的网卡驱动程序在/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

  此时当前文件下将会生成 3c990.o 的驱动模块。


  # modprobe ./3c990.o

    看 一 下 该 模 块 是 否 可 以 被 正 常 加 载 , 如 果 没 有 问 题 , 就 更 改 /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

  (3)强制 eth0 使用 10baseT-FD 的方式(10Mb 全双工的方式)工作。


  # mii-tool -F 10baseT-FD eth0

  (4)解除 eth0 的强制状态,让 eth0 自动侦测使用什么方式通信。


  # mii-tool -R
  resetting the transceiver...

Modem 和 ADSL 驱动安装及 PPP 连接设置

1.外置 Modem 的驱动程序安装

  Modem 分为外置和内置两种。比较而言,外置的 Modem 配置较容易,使用方便。Modem 一般


接在串口上,在 Linux 中串口对应的设备文件为/dev/ttyS*,如果是 COM1 口,则对应/dev/ttyS0。如
果不知道连接的是哪一个 COM 口,可以先给 Modem 加电,用以下命令测试:
  # echo AT > /dev/ttyS0

  如果 Modem 的 TR 灯亮,则表明该 Modem 接到 COM1 口上;如果不亮,再试一下/dev/ttyS1 文


件。知道了 Modem 连接的是哪一个串口后,就可以拨号了。拨号的过程实际上是通过 Modem 建立
PPP(点对点通信协议)的连接。

  在命令行下,可以使用 pppd 进行拨号,常见的 Linux 系统中会安装这个拨号程序,大家可以看一下


/etc/ppp 目 录 下 是 否 有 相 关 的 脚 本 文 件 , 如 果 没 有 可 以 下 载 并 安 装 ppp 包
ftp://cs.anu.edu.au/pub/software/ppp。将包安装后,可以查找 ppp-on 和 ppp-on-dialer 文件,把

开源 2008 年第 7 期 59
知识学堂

文件复制到/etc/ppp 文件夹下,修改 ppp-on 文件如下几个地方:


  TELEPHONE=270 //ISP 提供的上网电话号码
  ACCOUNT=user //ISP 提供的账号名称
  PASSWORD=123 //登录密码
  LOCAL_IP=0.0.0.0 //PPP 连接的 IP 地址,0.0.0.0 表示由 ISP 动态分配
  REMOTE_IP=0.0.0.0 //远端 IP 地址,一般为 0.0.0.0
  NETMASK=255.255.255.0
  export TELEPHONE ACCOUNT PASSWORD \
  DIALER_SCRIPT=/etc/ppp/ppp-on-dialer \ //查找另一个必须的配置脚本
  exec /usr/sbin/pppd lock modem crtscts /dev/ttyS0 115200 \ //设置 COM 口及速度
  asyncmap 0 kdebug 4 \
  $LOCAL_IP:$REMOTE_IP noipdefault netmask $NETMASK defaultroute \
  connect $DIALER_SCRIPT&

  给这个文件加上执行权限:
  # chmod 700 ppp-on
  # ./ppp-on

  这样就可以拨号上网了。这种方法可以适用于多数的 Linux 系统,如果是 Red Hat Linux,可以使用


redhat-config-network 命令轻松地在文本界面上配置拨号连接,如图 1。

  如果启动了 X-Window,GNOME 与 KDE 都自带图形界面的拨号程序。

2.内置 Modem 驱动程序的安装


  内置 Modem 比起外置的 Modem 配置要麻烦一些,下面在 Dell D600 笔记本安装内置 Modem 的

开源 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)

  The /dev/modem alias (symlink) points to /dev/ttySHSF0


  ……

    由 上 可 以 看 到 , 安 装 程 序 自 动 建 立 了 一 个 设 备 文 件 /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

  由上可以看到,/dev/ttySHSF0 文件不是标准的 COM 口,而是该驱动程序自己注册的 240 类型的


驱动程序。
  实际上,驱动内置 Modem 的过程是先加载驱动程序,模拟一个 ttyS 的串口设备文件,然后像给普
通外置 Modem 建立 PPP 链接那样,为内置的 Modem 建立拨号连接,不过这时要选定/dev/modem
作为设备文件。

3.ADSL 及宽带连接驱动

  ADSL 设备通常是通过以太网卡来拨号,建立 PPP 链接,这时的 PPP 协议叫做 PPPoE,就是 PPP


over Ethernet(在以太网上的点对点通信协议),一般不需要任何 ADSL Modem 的驱动,只需直接建
立 PPPoE 连 接 。 在 命 令 行 下 , 下 载 ADSL 拨 号 程 序 rp-pppoe , 可 以 通 过

开源 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

  则出现 PPPoE 配置向导,会提示输入用户名和密码,然后使用以下命令建立连接:


  # adsl-start

  或者
  # ifup ppp0

系统中会在配置完后出现一个 SysV 的服务:


  # chkconfig --list adsl
  adsl 0:off 1:off 2:off 3:off 4:off 5:off 6:off
  # chkconfig adsl on

  这样以后每次启动就会启用 ADSL 拨号。


  如果不用 rp-pppoe 的向导,也可以在 X-Window 中直接使用下面命令(如图 2):

  #neat
或者
  #redhat-config-network

  上面两个命令是 Red Hat Linux 中的命令,可以在图形界面下建立 PPPoE 的连接,其它版本的


Linux 也应该有自己的 ADSL 拨号程序。

开源 2008 年第 7 期 62
知识学堂

  如图 3 所示中,单击上面的“New”建立新连接,如 VPN、eth、ISDN、Modem 等,则出现图 4


所示页面。

  图 4 里的 xDSL 并不是只有 ADSL 等 DSL 的连接,一般的 PPPoE 连接都可以使用,比如即使是建立

开源 2008 年第 7 期 63
知识学堂

类似网通的宽带 LAN 接入形式也应该选择这一项。单击“Forward”进行下一步。

  输入 ADSL 或 LAN 宽带接入的连接信息,如图 5 所示。然后单击“Forward”。


  建立好了链接后,在/etc/sysconfig/network-scripts/ 目录中会出现 ifcfg-ppp0 的文件,可以通过

以下命令让系统通过 ADSL 拨号上网,建立宽带连接;也可以用刚才的向导拨号上网,如图 6。


  # ifup ppp0

开源 2008 年第 7 期 64
知识学堂

  有些地方提供 LAN 宽带接入方式也需要进行拨号,如北京网通 LAN 接入宽带,它实际上使用跟


ADSL 一样的 PPPoE 协议,建立连接时与 ADSL 的拨号方式一样,也可以用 rp-pppoe 或 redhat-
config-network 来建立拨号连接,运行向导时没有区别。

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
知识学堂

器的公司)也重新回到了 Power 阵营,这也使 Technology 共同出资组建,总部在剑桥。ARM


Power 体系进入手机市场成为可能。Power 体系 公司不直接从事芯片生产,而是靠转让 License
具备和 IA(Intel Architecture)体系全面竞争的 由合作公司生产各自的处理器。ARM 处理器是目
能力。目前 Power 体系在服务器领域与 IA 体系 前性能/功耗比最好的处理器。ARM 凭借其低功
平分秋色,在嵌入式领域遥遥领先 IA 体系,而在 耗的优点,在手持领域一统天下,ARM 11
PC 领域被 IA 体系彻底清除。Power 和 IA 体系的 Mpcore 内核的发布也使 ARM 进军高端处理器
竞争极大促进了处理器的发展。 市场提供了可能。
    MIPS 是 Microprocessor without   Intel 64、IA-32 主要面对 PC 和服务器领域,
Interlocked Pipeline Stages 的 缩 写 。 在 MIPS 其体系结构向前兼容,虽然显得相对臃肿,但也
处理器出现之前,Pipeline 的概念已经非常流行 难掩其优势。Intel 最早的处理器是 1971 年 11
在当时这个技术并不容易实现。因为有些复杂的 月 15 日诞生的 4004 处理器,这是一个 4 位单片
指令需要使用许多机器周期才能执行完毕,此时 机。1972 年,Intel 设计了 8 位的 8080 处理器。
处 理 器 需 要 使 用 Interlock 锁 定 整 个 执 行 过 程 。     IA 体 系 结 构 从 8086 处 理 器 开 始 , 历 经
MIPS 处 理 器 通 过 削 减 指 令 集 , 成 功 地 将 286、386、486、Pentium、P6,直到现在的
Interlock 移除,这也是 RISC 处理器最早的雏形。 Nehalem 和 Atom 处理器,共三十年的时间。在
1984 年 John L. Hennessy 和 其 在 Stanford 的 这三十年时间里,Intel 一直提倡并坚守向前兼容
开 发 团 队 推 出 第 一 个 MIPS 处 理 器 — — 的模式。即使到了今天,最先进的 Nehalem 处
R2000。MIPS 凭借其廉价 License 策略取得了商 理 器 依 然 与 最 原 始 的 8086 处 理 器 兼 容 。 这 是
业 上 的 成 功 。 Sony 的 PS2 和 PlayStation Intel 非常大的负担,也是了不起的成就。
Portable 采用了 MIPS 处理器,SGI 的一些图像
工作站也开始使用 MIPS 处理器。而大学背景的 PC 的诞生
公司在财务上永远拮据,1991 年 MIPS 发布第一
颗 64 位处理器 R4000 时,居然没有募集到足够   1978 年 6 月 8 日,Intel 推出 8086 处理器,
的钱将其市场化。而 R4000 处理器的成败在某种 当时没有太多人认为这将是一个全新时代的开始,
意义上说,也关系到了 SGI 的成败。SGI 在权衡 当时的 Intel 在大多数人眼中还是一个危机重重的
利弊后于 1992 年全面收购 MIPS 处理器,并成 存储器制造商。而 Motorola 才是绝大多数人眼
立了一个全资子公司 MIPS Technologies。后来 中的巨人,这个巨人在 1979 年发布的 68000 处
SGI 决定支持 Intel 的 Itanium,在 2000 年,将 理器才真正吸进客户的眼球。
MIPS Technologies 独立。此后 MIPS 处理器反   1981 年 8 月 12 日是微处理器世界永远铭记
而获得了新生,在多核处理器领域创出了一片新 的日子,在这一天 IBM 宣布“IBM PC XT”诞生,
的天地。Cavium、RMI 基于 MIPS 的多核产品在 XT 机使用 Intel 的 8088 处理器,主要针对个人
通信领域直面 PowerPC 处理器,其占有的市场 用户,即 PC 领域。XT 机并不是世界上第一台
份额越来越大。 PC,在 1977 年,Apple 就已经推出了基于
  ARM 是 Advanced RISC Machines 的缩写, 68000 处理器的 Apple II,在当时 Apple 和
ARM 公司在 1990 年成立,当时由 Acorn Motorola 的合作更被业界看好,实际上在上世
Computers,Apple Computer 和 VLSI 纪八十年代到九十年代,苹果机一直是美国教育

开源 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)

  1982 年,Intel 推出了 80186 处理器。这颗


处理器没有得到大规模的普及,多数兼容机生产   80186 处理器没有真正成功的主要原因可能

厂商对这颗处理器并不感冒。稍大一点的兼容机 是几周后 Intel 就推出的新一代针对 PC 领域的处

厂商,只有西门子使用了这颗处理器发布了自己 理器 80286。许多人认为 Intel 将这颗本不针对

的第一台个人电脑 Siemens PC-D。与 8086 处 PC 市场的处理器命名为 80186,是基于商务上

理器相比,80186 处理器内部集成了更多的逻辑 的考虑,主要为了对抗 Motorola 即将推出的

部件,如存储器控制器、计数器等,因此这个处 68010 处理器。采用这样的市场策略可以使普通


用户认为 80186 可以与 68010 处理器相提并论,
而 80286 是 80186 的下一代处理器。
  80286 微处理器的最大主频为 20MHz,内、
外部数据传输均为 16 位,使用 24 位物理地址,
内存寻址能力为 16MB。Intel 宣布 80286 处理
器可以全面支持 8086/8088 处理器上的应用程序,
这是 Intel 处理器发展史的一个重大事件。从这一
刻起,Intel 背上了向前兼容这个沉重的十字架,
这个十字架也给 Intel 带来了巨大的商业成功。
  80286 处理器可以运行在两种模式下,实模
式和保护模式。80286 处理器运行在实模式时可
以访问 1MB 之下的内存空间;运行在保护方式模
式时,80286 处理器可直接访问 16MB 之下的内
存空间。这种保护模式使得 80286 处理器可以同
时运行多个任务,彼此不相干扰。
图 1.1981 年 8 月 12 日,IBM PC XT(8088)诞生

开源 2008 年第 7 期 67
知识学堂

  IBM 使用 80286 处理器的 PC,也叫做 AT 机。 ”的 IBM 也不能逆天行事,事实证明任何公司采


与 XT 机相比,AT 机从性能和功能上都得到了相 取的任何阻碍新技术革新的举动和行为不过是螳
当大的提升。不过此时的 IBM 公司在做出了一个 螂挡车,以卵击石。
影响深远决定的同时,还历经了一场影响深远的
争论。 新的篇章
  IBM 向 Intel 要求有其他一家公司可以提供
x86 系列的处理器,从现代 ERP 管理的角度上看,   1985 年 10 月 17 日,英特尔在伦敦、慕尼
IBM 这样做无可厚非,当时的半导体在生产过程 黑、巴黎、旧金山和东京同时发布了 80386 处理
中经常出现各种问题,不能及时交付,AMD 被 器。这是 x86 构架的一个划时代的产品。386 处
幸运地选中。1982 年,Intel 和 AMD 签订了关 理器是 Intel 第一个 32 位处理器,提供了三种模
于 iAPX86(iAPX86 是 8086 处理器的正式名称) 式,实模式、保护模式和 VM86 模式。
系列微机处理器和技术交换协议,AMD 被 Intel
授权可以使用 iAPX86 技术。在此之前,AMD 主
攻存储器产品,在七八十年代,AMD 还是存储
器行业的领先者。从今天掌握的资料看,Intel 当
时进行的这种转让并不完全因为“当时的 IBM 对
于当时的 Intel 比天还大”。1982 年,Intel 的创
始人 Robert Noyce,Gordon Moore 还是志在
千里,Andy Grove 也正年富力强,Intel 能发展
到今天所依赖的绝不是狭隘。后来 Intel 又将 x86
处理器技术授权给了 Cyrix,也许是为了限制
AMD,也许是出于更深层次的考虑。至今让人反
思的是,x86 体系并不因为这次全面的公开而没
落,Intel 更没有因为竞争而消亡。 图 3.1985 年,intel 发布 80386 处理器
  也在这个时候,曾经拥抱开放,提倡革新的
IBM 却和 Intel 开了一个大玩笑。286 处理器面世   VM86 模式用于多用户操作系统执行 VM86
后,在 IBM 有相当多的人反对从 8086 处理器切 任务,绝大多数 VM86 任务都是 DOS 任务,因
换到 80286 处理器,因为这将影响 XT 机的销售, 此 VM86 任务有时也被称为 DOS 任务,即基于
但也有相当多的人支持处理器的升级。基于 DOS 操作系统的应用程序。实际上这个模式对于
80286 处理器的 IBM PC AT 机问世后的相当长的 多数 386 处理器的用户并没有太大的意义,因为
一段时间里,IBM 还在主推 XT 机。 他们使用的操作系统就是 DOS 操作系统。这个模
  Intel 无法等待,实际上是整个世界不能等待。 式给我带来的最大好处是我现在还可以继续在
在 IBM 的这场争论正在进行时,康柏快速推出基 Windows 操作系统中运行仙剑奇侠,三国英杰
于 80286 处理器的 PC 兼容机,率先生产基于 和大航海 2 这些经典的 DOS 游戏。
80386 处 理 器 的 PC 兼 容 机 , 并 借 此 打 败 了   实模式在现代处理器体系结构中的标准说法
IBM,成为 PC 机市场新的霸主。“自视比天还高 是关闭 MMU(Memory Management Unit)

开源 2008 年第 7 期 68
知识学堂

的模式,在这种模式下,处理器可以直接访问物 8259A 管理外部中断。从现在的眼光看,8259A


理地址;保护模式是指打开 MMU 的模式,在这 是一个功能单一的中断控制器,但是目前还有许
种模式下,处理器必须通过 MMU 将程序直接访 多微机原理教科书以 8259A 为例,讲述中断控制
问的虚拟地址转换为物理地址后,才能访问存储 器的在处理器系统中的作用。
器地址。当然 MMU 的功能不仅是虚实地址的转   386 处理器引进了许多新的概念,如处理器
换,还有许多关于内存属性和访问权限的设置。 的特权级别,并规定操作系统使用级别 0~2,应
在 x86 体系中,保护模式的概念在 286 处理器中 用程序使用级别 3,各种用于转换特权级的门
首先提出,在 386 处理器中真正地将其系统化, (Gate),如调用门(Call Gate)、任务门
完整化。 (Task Gate)、中断门(Interrupt Gate)和自
  386 处理器提出一些在之前 x86 体系中没有 陷门(Trap Gate)。
涉及过的概念,进一步完善了指令集、寄存器、   这些机制使得 386 处理器鲜明区别于之前的
指令流水线、内存管理和中断/异常处理,并为任 8086/8088 和 80286 处理器。这是 x86 体系中
务切换提供了 TSS(Task State Segment)。这 的一个重大的里程碑。这颗处理器的出现是 Intel
一切工作使得 386 处理器更加适合运行多任务操 向高级处理器迈向的坚实一步。而这颗处理器在
作系统。但是直到 386 处理器完全淡出,也没有 面世的时候并没有得到太多主流学术界人士的认
等到合适她的多任务操作系统。当时的应用水平 可,这颗处理器确实也有自身的问题,许多设计
决定了这颗处理器将与 DOS 为伴。当时有许多程 并非完全合理,Intel 在后来也确实为这些不合理
序员热衷在 DOS 操作系统中编写一些常驻内存的 付出了代价。但是没有人会依此否定 386 处理器
程序,这也是在 DOS 系统下多任务的雏形。有些 的成就,否定 Intel 的抉择。
常驻内存程序非常有用,我喜欢一个叫 FPE 的游
戏修改程序,这个程序使用小键盘的*键(也可以 天下有敌
修改成`键激活,这是我最喜欢的方式)激活。使
用这个常驻内存程序,我习惯性地将沙丘魔堡游     1989 年 4 月 , Intel 发 布 了 486 处 理 器 。
戏中的金钱值锁定,然后率领的军队所向披靡。 486 处理器是在 386 处理器基础之上的一次并不
  这种常驻内存程序经常会引发系统崩溃,主 太大的升级,增加了片内 FPU(Floating Point
要的原因还是在 DOS 实模式下,存储器可以被直 Unit)、边界检查、页方式管理等功能,并添加
接访问,虽然 386 处理器提供了一系列内存使用 了一些新的异常处理,引进了 SMM(System
机制,但是 DOS 并没有使用。386 处理器的这些 Management Mode)模式。SMM 模式实际上
内存访问机制一直被 x86 体系的后续处理器继承。 是一种特殊的实模式,由 386SL 处理器初次引入,
  386 处理器使用段页式管理物理内存,通过 并在 486 处理器中完善,处理器可以通过 SMI 异
CS/DS/ES/FS/GS/SS 这 些 段 寄 存 器 从 常进入 SMM 模式。在 SMM 模式中,处理器可
GDT ( Global Descriptor Table ) 或 者 以访问所有 4G 内存空间,执行所有特权指令,
LDT(Local Descriptor Table)中获得段描述符, 从技术的角度看,这种模式可以方便地使处理器
之后再将这个段中的物理内存按照 4K 字节大小 进入维护模式。
页面进行管理,并可以设置访问权限,物理页面   与 386 处理器相比,486 处理器在主频和工
属性等一系列参数。386 处理器使用中断控制器 艺上都有非常大的提高。但是从体系结构的角度

开源 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
知识学堂

诉讼。这是一场 AMD 必须坚持的诉讼,也是


Intel 无论输赢都是胜利的诉讼。对于 Intel,只
要这场诉讼没有结束,AMD 都不能生产 386 处
理器。1994 年,AMD 与 Intel 的长达七年的法
律诉讼结束。
  这场七年的法律诉讼由两个时间段组成,
1985 年~1991 年,AMD 起诉 Intel,AMD 获胜
并获得生产 x86 处理器的权利。在第一阶段漫长
的诉讼过程中,Sanders 决定自行设计 386 处理
器,还是借助逆向工程的方法,AMD 于 1991 年
推出 AM386 处理器。这个举动激怒了
Intel,Intel 决定起诉 AMD。 图 5.AMD 推出的 AM486 处理器
  这次诉讼从 1991 年到 1994 年,Intel 希望
剥夺 AMD 使用 Intel 处理器指令集的权力。在     这 场 诉 讼 最 终 于 1994 年 3 月 10 日 结 案 ,
1992 年 2 月,法庭认为英特尔违反了 1982 年协 AMD 大获全胜。对于 AMD 来说,最大的胜利莫
议,判决 Intel 必须向 AMD 授权使用 Intel 的指 过于在旷日持久的诉讼中,每天都在死亡线边缘
令集,但同年的 6 月法庭再次仲裁却认为 AMD 徘徊的绝境中,终于明白求人不如求己。 AMD
没有英特尔处理器指令集的使用权,并判定 发起这场诉讼的初衷是希望继续从 Intel 获得 x86
AM287 处 理 器 侵 犯 了 英 特 尔 的 知 识 产 权 , 产品的授权,而在这场诉讼结束后,AMD 已经
AM287 处理器是一个与 80386 指令集完全兼容 不需要继续跟随 Intel 的脚步,不必每次都在自己
克隆产品。这个针对 AM287 处理器的仲裁对尚 的产品上印着 Intel 的 Logo。从这一刻起 PC 处
未出售的 AM486 同样有效。AMD 此时决定研发 理器的历史伴随着 Intel 和 AMD 的竞争奋然而向
不侵犯 Intel 知识产权的指令集。1993 年 4 月 15 前。
日,法庭归还了 AMD 对 80287 处理器指令集的
使用权。AMD 用最短的时间作出回应,4 月 19   敬请期待下期 PC 的足迹(中):奔腾的心、
日宣布推出 AM486 处理器。 生死时速和铩羽而归等章节。

开源 2008 年第 7 期 71
经验技巧

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

Linux 一句话精彩问答——系统配置篇(5)
1101 linux 中刻录 iso 的方法

  1 使用 xcdroast,选择制作光碟,选择 ISO 文件,刻录!


   参见 http://www.xcdroast.org/xcdr098/faq-a15.html#17

  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

  3 使用 k3b 可以刻录 CD/DVD


   k3b 主页:http://www.k3b.org/
      ( 实 际 上 k3b 是 个 图 形 界 面 , 刻 录 CD 利 用 了 cdrecord , 刻 录 DVD 利 用 了 dvd+rw-tools
http://fy.chalmers.se/~appro/linux/DVD+RW/ )

1102 屏幕变花时怎么办

  当您一不小心 cat 了一个并不是文本的文件时,屏幕会变花,那么您可以按两下"Enter"键,再


敲"reset",那么屏幕就恢复正常了....

开源 2008 年第 7 期 72
经验技巧

1103 卸载软件包时得知具体包名

  删除软件包的命令是 rpm -e XXX,如果不知道这个 XXX 的确切拼写时,可以用 rpm -qa 查询所有


安装的软件包或者用 rpm -qa |grep xxxx 查询出名字

1104 使用内存作 linux 下的/tmp 文件夹

  在/etc/fstab 中加入一行:
  none /tmp tmpfs default 0 0

  或者在/etc/rc.local 中加入
  mount tmpfs /tmp -t tmpfs -o size=128m

  注:size=128m 表示/tmp 最大能用 128m


  不管哪种方式,只要 linux 重启,/tmp 下的文件全部消失

1105 用 ls 只列出目录

  ls -lF | grep ^d


  ls -lF | grep /$
  ls -F | grep /$

1106 在命令行下列出本机 IP 地址,而不是得到网卡信息

  ifconfig |grep "inet" |cut -c 0-36|sed -e 's/[a-zA-Z: ]//g'


  hostname –i

1107 修改/etc/profile 或者$HOME/.profile 文件后如何立即生效

  #source /etc/profile  (或者 source .profile )

1108 bg 和 fg 的使用

  输入 ctrl+z,当前一个任务会被挂起并暂停,同时屏幕上返回进程号,此时用 "bg %进程号",会把


这个进程放到后台执行,而用" fg %进程号 "就能让这个进程放到前台来执行。另外,job 命令用来查看
当前的被 bg 的进程

开源 2008 年第 7 期 73
经验技巧

1109 ctrl+s 与 ctrl+q

  ctrl-s 用来暂停向终端发送数据的,屏幕就象死了一样,只能用 ctrl-q 来恢复

1110 目录统计脚本

  保存成 total.sh,然后用 total.sh 绝对路径,就能统计路径下目录的大小了


  代码:
  #!/bin/sh
  du $1 --max-depth=1 | sort -n|awk '{printf "%7.2fM ----> %s\n",$1/1024,$2}'|sed 's:/.*/\
([^/]\{1,\}\)$:\1:g'

1111 grep 不显示本身进程

  #ps -aux|grep httpd|grep -v grep


  grep -v grep 可以取消显示你所执行的 grep 本身这个进程,-v 参数是不显示所列出的进程名

1112 删除目录中含输入关键字的文件

  find /mnt/ebook/ -type f -exec grep "在此输入关键字" {} \; -print -exec rm {} \;

1113 让 cron 中的任务不回馈信息, 本例 5 分钟检查一次邮件

  0-59/5 * * * * /usr/local/bin/fetchmail > /dev/null 2>&1

1114 在当前目录下解压 rpm 文件

  cat kernel-ntfs-2.4.20-8.i686.rpm | rpm2cpio | pax –r

1115 合并两个 Postscript 或 PDF 文件

  $ gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite \


  -sOutputFile=bar.ps -f foo1.ps foo2.ps

  $ gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \


  -sOutputFile=bar.pdf -f foo1.pdf foo2.pdf

开源 2008 年第 7 期 74
经验技巧

1116 去掉 apache 的 manual 目录中的所有.en 的后缀名

  进入到 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

  startx 默认以 display :0.0 起第一个 X,通过传递参数给 Xserver 可以起多个 X:


  # startx -- :1.0
  # startx -- :2.0
  ...
  然后用 Ctrl-Alt-F7/F8...切换

1118 split 分割合并文件

  split -b1440k a_whopping_big_file chunk


  cat chunk* > a_whopping_big_file

1119 看 Linux 启动时屏幕的显示信息

  启动完毕后用命令 dmesg 查看

1120 我需要编译内核,内核源码在哪里

  1、一般在发行版的盘里都有,比如 RedHat,一般在第二、第三张上

    2.4 内核的叫 kernel-source-2.4.xx-xx.rpm


    2.6 内核的叫 kernel-devel-2.6.xx-xx.rpm

  2、去 www.kernel.org 下载一份你喜欢的

开源 2008 年第 7 期 75
经验技巧

netstat 把脉 Linux 系统状态

陈小晖

  关注 Linux 的系统状态,主要从两个角度出发,一个角度是系统正在运行什么服务;另外一个就是


有什么连接或服务可用。使用 ps 命令可以查看处于活跃状态的服务;使用 netstat 命令则可以显示所有
可用连接和服务,以及它们的状态。netstat 还可以显示 ps 无法显示的、从 inetd 或 xinetd 中运行的服
务,比如 telnet 等。

用 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

  上述显示中,“Proto”是 Protocol 的简称,它可以是 TCP 或 UDP。“Recv-Q”和“Send-Q”指


的是接收队列和发送队列,这些数字一般都应该是 0,如果不是,则表示软件包正在队列中堆积。这种情
况只能在非常短的时间内存在,比如在 KMail 中单击检查邮件按钮时,有如下显示是正常现象:

tcp 0 593 192.168.1.5:34321 venus.euao.com:smtp ESTABLISHED

  如果接收队列持续处于阻塞状态,那么很有可能受到了拒绝式服务的攻击。如果发送队列不能被快
速清除,则可能是因为有一个应用程序不能将所要发送的东西传送完。
  “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

    “ netstat --inet -a” 命 令 的 显 示 结 果 将 只 有 网 络 连 接 , 包 括 所 有 正 处 在 “ LISTEN” 状 态 和


“ESTABLISHED”状态的。
  需要特别注意的是,对于普通用户而言,一般不需要使用 telnet 或 SMTP 服务。因此需要将其关闭,
以提高系统安全性;并且要重新配置启动文件,以保证它们不会在下次系统启动时自动重新启动。
  要想持续不断地查看随时都在更改的网络信息,可以使用 netstat 命令的“-c”参数,并且将结果存
入文件中:

$ netstat --inet -a -c > netstat.txt

  这时,查看 netstat.txt 文件即可检查邮件服务、Web 服务和 telnet 服务等的状态变化。

检查网卡

  使用 netstat 命令的“-i”参数还可以帮助检查网卡。该命令的显示结果如下所示:

Kernel Interface table


Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 0 28698 0 0 0 33742 0 0 0 BMRU
lo 16436 0 14 0 0 0 14 0 0 0 LRU

  在“RX-OK (Received OK)”和“TX-OK (Transmitted OK)”栏应该看到很多数字,而其它地方的


数字应该非常小。如果在“RX-ERR”或“TX-ERR”栏看到很多数据,则很有可能是网卡或网线出现了
问题。

开源 2008 年第 7 期 77
经验技巧

用 TC 实现动态带宽分配

郑重

  在实际应用中,经常会遇到需要对网络节点的转发流量进行动态控制的情况,比如,某个节点有一
个网络应用,当该应用从网络接收数据时,要求该节点能够保证它的数据带宽;当该应用不接收数据时,
需要这个网络节点释放分配给它的网络带宽,以提高带宽资源利用率。下面介绍一种利用 TC 在 Linux 下
实现动态带宽分配的方法。

TC 简介

   TC 是 Linux 中的 流量 控制 器, 通过 它可 以对 网络 节点 的数 据流 进行 整形 ( Shaping) 和分 类


(Classify)等处理,从而实现网络服务质量保证(QoS)。
  当一个网络数据包进入 Linux 内核后,先进入 Ingress Qdisc(Queueing Discipline,类所采取的
具体调度算法)。在 Ingress Qdisc 中应用用户的设置来过滤数据包,把一些无用的数据包丢弃,这个过
程称做 Policing。Policing 后的有用数据包,或者进入 IP 堆栈等待本机的上层应用程序处理;或者直接
进入发送队列,等待被转发出去。数据在被发送出去之前先进入 Egress Classifier,由它对数据分类后把
数据送入所属类的相应队列,每个队列再根据各自的策略(Qdisc)把数据发送出去。TC 就是通过对
Egress Classifier 及各个队列的 Qdisc 进行设置来实现网络数据的流量整形和分类等功能的。

  使用 TC 进行分类队列调度的基本步骤如下:
  1.针对网络物理设备(比如以太网卡 eth0)绑定一个队列;
  2.在该队列上建立分类;
  3.为每一分类建立一个基于路由的过滤器;
  4.为每个分类设置相应的 Qdisc。

动态带宽分配实例

  假设一个网络节点(带宽 10Mbps)有 eth0 和 eth1 两个网络接口。该节点要从网络上接收视频数


据,同时还为另一台主机提供数据转发的功能。由于视频数据要求比较稳定的带宽,所以在有视频数据
发送过来的时候要限制该节点的转发数据带宽(限制为最大 1Mbps)。当没有视频数据时,可以适当提
高或取消对转发带宽的限制,以提高转发数据的效率。
  实现这种动态带宽分配需要为转发数据建立两条队列,分别对应限制和不限制时的转发带宽。然后
再根据当前系统的情况动态地决定采用哪一个队列作为实际转发的队列。下面针对以上假设来介绍一下
具体的实现过程。

开源 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

  上面两个命令会清空以前的 eth0 设置,然后重新设置 eth0 为 cbq 类型的分类调度方式。“cbq”


是 TC 中较常用的一种分类队列调度方法,它主要是利用时间片的分配来实现不同队列之间的优先级调度。
然后,给 eth0 的 cbq 队列建立两个子类队列:

# 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

  以上命令建立的两个子类队列分别对应 10Mbps 的最大带宽和 1Mbps 的最大带宽。其中,10Mbps


带宽的队列为缺省队列,如果没有特殊设置,所有的转发数据都会通过这个队列转发出去。
  最后给 1Mbps 带宽的队列规定一个 sfq 策略:

# 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

  使所有的转发数据都归为最大带宽为 1Mbps 的子类队列。


  如果没有视频数据,则应用如下规则删除有流控时候的 Filter:

# 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

  由于带宽为 10Mbps 的队列是缺省队列,在没有任何 Fliter 规则的情况下,转发数据流进入该缺省


队列。这样就可以实现动态地选择转发队列了。

  3.脚本实现流程

  可以通过以下流程,利用脚本来实现系统的动态带宽分配:


为两个网口建立队列
  选择相应队列后,“等待一段时间”是为了使这种
while [ 1 ]; do
动态调整不至于太频繁,以至于影响整个系统的效率。
获取当前视频输入的状态信息
if 无视频输入 then
小结
选择 10Mbps 带宽转发队列
等待一段时间
  这里介绍了一种简单的动态带宽调整方法。其实,
else
通过更多的队列和更复杂的控制方法可以实现更为精细
选择 1Mbps 带宽转发队列
的带宽调整。希望以上介绍能够对读者有所启发和帮助。
等待一段时间
fi
done

开源 2008 年第 7 期 80
经验技巧

多方法实现 HTTP 访问的负载均衡

李汉强

  当网站被越来越多的人访问时,Web 服务器就容易出现带宽和资源危机。面对访问数量的快速增长,
必须采用多服务器技术,并在这些服务器之间进行负载均衡(Round Robin)才能满足大量并发的访问
需求。
  对 Linux 服务器来说,由于其在网络方面具有的强大功能,有很多方法可以实现 HTTP 访问的负载均
衡。下面就介绍几种简单、实用的方法。

利用 R-Proxy

  Proxy 是常用的上网代理服务器。为了节约带宽、提高存取效率,Proxy 可以提供 Cache 的功能,


所以 Proxy 服务器也被称为“Proxy Cache Server(代理缓存服务器)”。R-Proxy 也是一种 Proxy 代
理服务器。“R”就是“Reverse(反向)”的意思,即反过来用于实现代理 Internet 使用者存取内部受
限网站的功能。它同样可以提供文件 Cache。
  基本的 R-Proxy 服务器只能单纯地按照网页目录分配 HTTP 访问,并且一个网页目录只能连接一台
主机。当某台主机宕机后,该主机连接的网页目录就失效了。因此需要通过修改 R-Proxy 的配置,把网
页目录分散到不同的主机进行负载均衡。
  首先确认 Apache 有 R-Proxy。通常在 httpd.conf 文件中能看到如下代码,就表示已经安装了 R-
Proxy:

LoadModule proxy_module /usr/libexec/apache/libproxy.so


AddModule mod_proxy.c

  如果没有,则需要进行安装。
  然后,把“<IfModule mod_proxy.c>”和“</IfModule>”之间的代码替换为如下内容:

ProxyRequests On<Directory proxy:*>


Order deny,allow
Deny from all
Allow from .your_domain.com
</Directory>

  通过以上设置,就可以实现 HTTP 访问的负载均衡。

开源 2008 年第 7 期 81
经验技巧

利用 mod_rewrite 和 mod_proxy

  这个方法主要是通过 Apache 附带的 mod_rewrite 和 mod_proxy 模块来实现。mod_rewrite 模块


提供了一个基于规则的实时转向 URL 请求引擎,能兼容在 Apache 1.3 及更高的版本中。mod_proxy 模
块 是 一 个 HTTP 1.1 代 理 / 网 关 服 务 器 , 实 现 了 Apache 对 FTP 、 CONNECT ( 用 于 SSL ) 、 HTTP
0.9、HTTP 1.0 和 HTTP 1.1 的代理功能。该模块在 Apache v1.2.x 和 Apache v1.3.x 中进行了改良,并
去除了一些 Bug,然后在 Apache v2.0 中进行了大的修整。
  假定实际环境有六台 Apache Web Server。通过对安装 Proxy 的主机进行如下配置,利用 Apache
的 mod_rewrite 和 mod_proxy 模块来实现负载均衡。当然要求这两个模块的装载没有问题。

# vi httpd.conf
RewriteEngine on
RewriteLogLevel 9
RewriteLog /var/log/apache2/rewrite_log

#让 mod_rewrite 从/etc/httpd/rproxy.conf 中随机选取一个值


#/etc/httpd/rproxy.conf 内容如下:
# serverfarm server1|server2|server3|server4| server5|server6

RewriteMap servers rnd:/etc/httpd/rproxy.conf

RewriteRule ^/(.*)$ http://${servers:serverfarm}/$1 [P,L]

#mod_proxy 将访问分配到 6 台 Server 上


ProxyRequests Off

ProxyPassReverse / http://server1/
ProxyPassReverse / http://server2/
ProxyPassReverse / http://server3/
ProxyPassReverse / http://server4/
ProxyPassReverse / http://server5/
ProxyPassReverse / http://server6/

  配置完成后,监控负载均衡的情况需要设置 Log Server。首先,把 Log 文件集中到一台机器(Log


Server ) , 让 syslogd 进 程 来 处 理 。 然 后 , syslogd 将 处 理 后 的 Log 文 件 传 给 Central Logging
Server。

开源 2008 年第 7 期 82
经验技巧

  在 Log Server 的/etc/syslog.conf 文件里加入如下内容:

local5.info /var/log/apache_access_log
local6.* /var/log/apache_error_log

  然后在 syslogd 的启动命令中加上“-r”参数,这样才可以接收网络传送的 Log 文件。


使用如下命令重启 syslogd 进程:

#killall -HUP syslogd

  接着在 Proxy Server 的 httpd.conf 配置文件里进行如下设置:

LogLevel warn
ErrorLog syslog:local6
CustomLog "|/usr/bin/logger -t APACHE -p local5.info" common

  随后在/etc/syslog.conf 文件中加入如下内容:

local5.info @logserver
local6.* @logserver

  重启 syslogd 进程和 Apache,即可读取负载均衡所产生的日志了:

# killall -HUP syslogd && apachectl

利用 Pound

  Apache 的 mod_proxy 模块在性能和安全性上都有所欠缺,Pound 是专门设计来提高负载均衡效率


和安全性的第三方软件。该软件安装及相关说明可以到其英文网站 http://www.apsis.ch/pound 去详细
了解。这里只给出一份基本的 Pound 配置文件:

## Minimal sample pound.cfg


## see pound(8) for details

#######################
## 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

## Logging: (goes to syslog by default)


## 0 no logging
## 1 normal
## 2 extended
## 3 Apache-style (common log format)
LogLevel 1

## check backend every X secs:


# 每三十秒检查哪一台 Server 无标志
Alive 30

#######################
## listen, redirect and ... to:
ListenHTTP 0.0.0.0,80

# 客户端要求的 URL 字符串,用 regex


UrlGroup ".*"

# 在 Web Server 1~5 之间进行负载均衡


BackEnd 192.168.0.1,80,1
BackEnd 192.168.0.2,80,1
BackEnd 192.168.0.3,80,2
BackEnd 192.168.0.4,80,3
BackEnd 192.168.0.5,80,4
EndGroup

  其中笔者给出中文注释的代码需要根据实际情况进行设置。“BackEnd 192.168.0.1,80,1”一行最
后的数字“1”表示访问的优先级别,数字越小被访问的机率就越大。

开源 2008 年第 7 期 84
经验技巧

挂载(mount)命令使用技巧
  Linux 系统在使用光盘、软盘或 U 盘时,必须先执行挂载(mount)命令。挂载命令会将这些存储
介质指定成系统中的某个目录,以后直接访问相应目录即可读写存储介质上的数据。

  1.挂载光盘
  挂载光盘的命令如下:

# mount -t is09660 /dev/cdrom /mnt/cdrom

  该命令将光盘挂载到/mnt/cdrom 目录,使用“ls /mnt/cdrom”命令即可显示光盘中数据和文件。


卸载光盘的命令如下:

# umount /mnt/cdrom

  2.挂载软盘
  将软盘挂载到/mnt/floppy 目录的命令如下:

# mount /dev/fd0 /mnt/floppy

  卸载软盘的命令如下:

#umount /mnt/floppy

  3.挂载 U 盘
  挂载 U 盘相对复杂一些。首先使用“fdisk -l”命令查看外挂闪存的设备号,一般为/dev/sda1。然
后用“mkdir /mnt/usb”命令建立一个挂载 U 盘用的目录。之后使用如下命令挂载 FAT 格式的 U 盘:

# mount -t msdos /dev/sda1 /mnt/usb

  使用如下命令挂载 FAT32 格式的 U 盘:

# mount -t vfat /dev/sda1 /mnt/usb

开源 2008 年第 7 期 85
经验技巧

  4.挂载外挂硬盘分区
  挂载外挂硬盘分区(FAT32 格式)同样需要先用“fdisk -1”查看外挂的硬盘分区设备号,假设
为/dev/hda1。建立/mnt/vfat 挂载目录后,使用如下命令进行挂载:

# mount -t vfat /dev/hda1 /mnt/vfat

  注意,默认情况下 Linux 只允许 root 用户执行 mount 命令。如果想让一般用户也能挂载,并且希


望在系统启动时自动挂载光盘或软盘,需要修改/etc/fstab 配置文件,加入以下内容:

LABEL=/ / ext3 defaults 11


/dev/cdrom/mnt/cdrom iSo9660 auto,owner,kudzu,ro,user 00
/dev/fdo /mnt/floppy auto auto,owner,kudzu,ro,user 00

  其中,“user”表示将 mount 命令赋予一般用户使用。


  /etc/fstab 文件在 Linux 的帮助手册中讲得很详细,读者不妨看一看。

“僵尸”进程必杀技

田海洋

  在 Linux 的日常维护与管理过程中,总会有重新启动或结束某个程序的需求。在 Red Hat 系统中,


一般的服务都可以通过“Service Name stop/restart”命令实现停止或启动,但是并不能完全解决所遇
到的问题,比如,Mozilla 偶然失去了反应,或者在后台执行了一个不能退出的程序。这个时候 kill 或
killall 命令就能解决这些问题。其实“Service Name stop/restart”也是调用了 kill 命令。执行“cat
/etc/logrotate.d/syslog”命令会看到如下代码:

/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null`

  这就是使用 kill 来重新启动 syslogd 服务的命令。

kill 和 killall 的区别


  kill 和 killall 最大的区别就在于 kill 命令后需要 PID(进程号);而 killall 后需要进程的名字。比如,
结束 Mozilla 进程可以使用如下命令:

# killall mozilla-bin

开源 2008 年第 7 期 86
经验技巧

  如果使用 kill 则需要先执行如下命令找到 Mozilla 进程的 PID:

# 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

  这个脚本可以实现精确查找指定进程 PID 的功能,省略了自己寻找的麻烦。使用方法如下:

# status mozilla
UID PID NAME
500 2033 /bin/sh
500 2043 /bin/sh
500 2048
/home/dianhaiyong/bin/local/mozilla/mozilla-bin

  需要注意的是,这个脚本匹配出的 PID 有时不一定是所需要的。这主要是由于在使用“awk”命令


过滤“ps”的输出时会有误差。因此笔者放弃了在这个脚本中直接添加 kill 功能的想法。同理,读者在编
写自己的服务控制脚本时,也应该充分考虑这一点。

开源 2008 年第 7 期 87
经验技巧

小结

  kill 和 killall 都是结束僵死进程的强大命令。作为系统管理员,熟练使用 kill/killall 对日常工作非常


有益,比如,可以用来将某个用户“踢”出系统(杀掉该用户的 Shell 进程即可)。尤其 killall 是 Linux
系统为了方便用户而特别推出的,但是使用过程中应该谨慎小心。
  读者还可以自己编写一些 Shell 脚本,扩展命令的功能。但是在使用之前如果不确定操作所带来的后
果,请务必事先进行实验,尤其是有一些危险性的命令。
  本文中没有具体说明 kill 和 killall 命令具体怎样使用,下面这些 Internet 资源可以作为补充。
  http://www.cbi.pku.edu.cn/chinese/documents/csdoc/cman/killall.html
  http://www.cbi.pku.edu.cn/chinese/documents/csdoc/cman/kill.html

轻松玩转 Firefox(2)

linuxpk.com kennycx

  在上一期杂志中,我们与各位读者分
享了 Firefox 下常用的一些扩展及插件,
其实 Firefox 下还有很多有趣的扩展应用,
接下来将对大家进行介绍。

Firefox 的天气预报

  记得 Windows 下的 Maxthon 的天


气插件是用的网页形式,也就是必须打开
左边的工具条才行。

  而 Firefox 的 ForecastFox 天气扩展


则是与状态条结合在一起的,也就是随时
都可以查看,并且可以设定最新的时间段。

图1

开源 2008 年第 7 期 88
经验技巧

  我们可以在 http://downloads.mozdev.org/forecastfox/forecastfox-0.8.xpi 下载到最新版并安装


它。
  Forecastfox 曾用名为 WeatherFox,是常用的天气预报插件,它调用的是 www.weather.com 网站
提供的天气信息,当然日期也是以 Weather.com 所在区域为准的。
  插件安装后,重新启动 Firefox,会自动打开一个配置
窗口。
  我们首先要输入你想要了解的预报区域的代码。先点击
“查找代码”按钮,在窗口中输入城市和国家,按下“搜索
”开始查找代码。其中城市可以拼音方式输入,国家则为英
文,比如“雅安”,可以输入为:“ya'an,China”。
 

         图 2           我们国家都用摄氏度,所以要设置温度单位,“公制”
为摄氏度,“英制”为华氏温度。你还可在设置界面设置天气预报的天数。(如图 1)
         
  设置完毕之后,Firefox 的右下角会出现未来几天的天气预报图标(如图 2)。看着状态栏上不断换
变的天气图标,也似乎能提醒自己,该接触一下大自然,不要成天泡在网上了 。

图3

开源 2008 年第 7 期 89
经验技巧

Firefox 下的 Google Toolbar

  Windows 下的 Google Toolbar 想必大家都用过吧,Google 于近期发布了支持 Firefox 的 Toolbar


工具条以及扩展。除了标准工具条外,Google 还为 Firefox 特别准备了 Send To Phone 以及 Suggest
两个 Firefox 独有扩展。Send ToPhone 可以将网页中的信息直接发送到你的移动电话中(美国本土)。
而 Suggest 则能够自动完成正在输入的搜索关键词。
  我们可以在 http://toolbar.google.com/firefox/extensions/index.html 下载并安装 Google
Toolbar。
  安装 Google Toolbar 后,重启 Firefox 会弹出个选项框,我们可以在这选择默认的搜索网站,并可
指定 Google 做为 Firefox 默认的搜索引擎。并可启用 PageRank 显示功能。

 Google Toolbar 带有即时翻译功能,只需要在网页上选定你需要翻译的单词,Google Toolbar 会在


旁边多出一行该单词的注释(如图 3),另外还具有拼写检查,网页翻译以及 PageRank 显示查询功能
等。

超级拖曳

  Maxthon 浏览网页时的超级拖拽功能,相信你用过以后就再也舍不得丢弃了。只要你装上
SuperDragAndGo 即可实现,这个插件无须设置。现在你只要把网页上的链接或文本拖至任意空白处,
即可在新标签页中打开或者直接到 Google 搜索。
  我们可以在 http://downloads.mozdev.org/superdragandgo/SuperDragAndGo-0.2.4.xpi 下载
到最新版本并安装它。
  安装后,我们用鼠标拖动网页链接,文本链接或者文本链接自动在新 Tab 中打开,选中一段文字后
用鼠标拖动,会在新 Tab 中调用选中的整合搜索引擎自动进行搜索,可以设置拖动一张图片,自动对图
片进行下载和保存,保存的路径在 SuperDragAndGo 的设置选单中设定。

Gmail 邮件通知

  Gmail 凭借其 2000M 的存储空间,无弹出式广告等特性吸引了一大批用户,笔者也是 Gmail 忠实的


用户,最喜欢的就是 Gmail 订阅新闻组的功能,并自动归类(Gmail,是需要邀请才能申请的,如有需
要的,可以联系笔者 kennycx@gmail.com)。Windows 下我们可以使用 Gmail Notifier 实时显示信箱
状况,在 Linux 下,我们可以通过 Gmail Notifier 扩展,将其整合到 Firefox 上,而 Firefox 用户则可以
在状态栏检测 Gmail 的信息了。

  我们在 http://www.nexgenmedia.net/extensions/ 可以下载到最新的版本。

开源 2008 年第 7 期 90
经验技巧

  安装重启后,在 Firefox 的状态栏会看到一个


信封的图表,那就是实时显示 Gmail 状态的 Gmail
Notifier。我们简单设置下,在 Gmail Notifier 参
数选择中,我们可以设置有新信件时的提示音,可
以设置每次检查新信件的时间,保存密码后我们可
以选上自动登录选项框。双击状态栏的信封图标,
会要求我们输入 Gmail 的合法帐号和密码,输入后
Gmail Notifier 就会自动工作了(如图 4)。

          

           图 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 主题更换

  Windows 下基于 IE 的浏览器一般都有很多可选的很漂亮的皮肤,当然


我们的 Firefox 更是有过之而无不及,Firefox 的主题也许是最多的,也是最
漂亮的。
  我们可以直接单击工具->主题->获取更多主题,浏览器会转向 mozilla
网站上的 Firefox 主题页面,这上面有非常多的主题,我们选择我们喜欢的
主题,直接点击 Install Now,Firefox 会调用内置的主题管理器自动安装了。
如果是我们下载下来的一个主题文件,可以把这个文件直接拖放到主题选项
框 中 就 可 以 完 成 安 装 。 如 还 存 在 问 题 , 我 们 可 以 在
http://www.extensionsmirror.nl/index.php?
showtopic=121&hl=theme 下载 Install New Theme 扩展,安装重启后
会在主题窗口添加一个“Install”的选项,单击它选择我们下载的主题文件,
就可以完成安装了。

优化 Firefox 提高上网速度

  我们可以优化 Firefox 的一些参数,已提高我们的上网速度。


  在浏览器地址栏输入:about:config,然后查找以下各项(没有就新建)
并修改成以下的参数(如图 7):
     图 6

  nglayout.initialpaint.delay 100 (解释网页并显示之前的延迟时间,单位毫秒。)


  network.http.keep-alive true (是否允许持久连接,这个默认就是 true。)
  network.http.keep-alive.timeout 300 (持久连接允许的保持时间,这个调大了没意义,因为一般
server 设置的就是 300。)
  network.http.max-connections-per-server 8 (连接同一个服务器允许的最大连接数,一般认为
在开启持久连接的情况下把这个数值调大没什么作用,需要调大的情况比方:你同时从网站下 10 个大文
件。)
  network.http.max-persistent-connections-per-server 2 (连接同一个服务器允许的最大持久连
接数,这个数值 HTTP/1.1 标准推荐的是 2。调大了反而增加你自己的网络消耗,而且一般一个服务器允
许的持久连接数是有限的,你调大了就可能造成别人可用的减少,如果大家都调大,就意味着网络效率
的丧失。)
  network.http.pipelining true(是否允许 pipelining,这个功能因为目前还是试验阶段,所以默认
没有打开。强烈建议打开。)
  network.http.pipelining.maxrequests 4(每个持久连接允许一次发送的请求数。如果 pipeline 里

开源 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 王乐

  不是每个私有软件都可以让人疯狂,对吗?一些软件,像 Norton Ghost,是任何人都用的优秀软


件。但是,这些软件有版权限制的事实让很多开源爱好者们十分恼火。软件的价格不是造成真正差别的
原因(尽管这是很多人从一个软件迁移到另一个软件的原因);事实上,私有软件的很多条件限制了用
户体验,也就是限制了用户。这些足以令任何开发者抓狂。
  下面这 50 个软件没有按照详细的次序来排列,仅仅是对应着它们的开源软件替代方案有大致的分类 。
在某些情况下,你用这里提到的私有软件写你自己的书可能会遭到挫折。然而,在另一些情况下,也许
你会发现开源软件替代方案并不能完全上手。而且,在其他情况下,你将会学习很多私有软件中真正的
精华,但是开源拥护者们也能够用来自所有开源项目中的同样优秀的软件和方案来替代这些精华。

  27、从 Adobe Acrobat 到 PDFCreator:的确,你可以通过 Adobe 免费试用 Acrobat 来创建


PDF。然而,PDFCreator 可以让你方便的从任何 Windows 程序中创建 PDF。可以把它当作一个输出工
具,用在 Word,StarCalc 或者其他 Windows 应用程序中。

  28、从 Adobe Framemaker 到 DocBook: Adobe Framemaker 软件对于希望通过多种语言来写


作和出版科技文档的科技交流者们来说代表了一个强有力的写作和出版解决方案。尽管这个软件是相当
可信赖的,不过 DocBook,一个开源出版工具,仍然是非常出色的。而且,你还有权使用所有的免费
wiki 资源和文档来学习如何安装,使用和定制工具以及风格。

  29、从 Microsoft Publisher 到 Scribus:当它来到桌面出版(DTP)界的时候,Microsoft


Publisher 就通过 DTP 导向的方法提供了比 Microsoft Word 更多的对于文档的控制方式。然而你,专业
用户仍然认为这个程序只是个初级应用程序。当它成为 Microsoft Office 中的一员时,很多用户发现它
实在是无足轻重。于是根据这种说法,Scribus 提供了一个开源的 DTP 选择。 通过快速输出和心的页面
布局的组合,为 Linux/Unix,MacOS X,OS/2 和 Windows 桌面用户带来了吸引人的专业的排版设计。
Scribus 支持许多专业的出版特性,比如 CMYK 色彩系统,分隔,ICC 色彩管理和 PDF 创建功能等。

通 信
  30、从 AIM 到 Pidgin:别再用它了。AIM,AOL 的即时通讯工具,已经不再一统天下了。开源的
Pidgin,一个支持多种协议的即时通讯终端允许你同时使用你所有的即时通讯账户。让我们别再用 AIM

开源 2008 年第 7 期 94
经验技巧

了:不管你用 Windows,Linux,BSD,还是其他类 Unix 操作系统,你都可以同时和你的朋友在


AIM,ICQ,Jabber/XMPP, MSN Messenger, Yahoo!, Bonjour, Gadu-Gadu, IRC, Novell GroupWise
Messenger, QQ, Lotus Sametime, SILC, SIMPLE, MySpaceIM,以及 Zephyr 上聊天。AIM 能做到吗?
不能?好了,别用它了。

  31、从 FeedDemon 到 RSS Bandit:Windows 平台上的 FeedDemon 不断的通过像普通的搜索那


样的使用关键字的 feed 搜索引擎来搜索。 它也可以通过预读取你订阅的 Feed 来实现脱机阅读。
NewsGator 也可以通过 FeedDemon 来同步,所以你不用电脑就可以优先获得新闻。若不是
FeedDemon 不开源的话,它真是一个理想的,完善的阅读器。不过,对于开源狂热者们来说,RSS
Bandit 提供了同样强大的 RSS 阅读器,可以让你看到所有你订阅的 feed。它的报纸阅读模式可以定制,
模板和 FeedDemon 是兼容的。而且,RSS Bandit 允许你和 NewsGator 在线同步每一件新闻。最后,
RSS Bandit 也提供权限去在新闻服务器上发布新闻(和 Google Groups 类似)——它使用 NNTP 来阅
读和发送新闻到网上任何一个新闻组。它通过在他们的网站上做链接,和 Google Groups 融为一体。

  32、从 Microsoft MSN Messenger 到 aMSN:Microsoft 把 MSN Messenger 作为一个


Windows 上的免费软件提供给人们,它从一个简单的即时通讯软件成为了竞争市场上一个创新的产品。
特性包括了语音和视频聊天,游戏,远距离支持——建立在它可以当你不在电脑前时通过移动设备登录。
aMSN,一个开源 MSN 替代工具,目标是尽可能的模仿它的那个私有软件竞争对手。 它的许多额外功
能都可以通过插件添加。你可以在有空时添加 POP3 邮件支持和传送,声音剪辑,网络摄像头支持,聊
天日志,会议支持等等。

  33、从 Microsoft Outlook 到 Thunderbird:是说如果你决定使用 OpenOffice,但是你又需要一


个邮件客户端来替代 Microsoft 的 Outlook。试试的 Mozilla 的 Thunderbird,一个有着简单的界面并
且非常易用的应用程序 。此外,你可以使用 Lighting 来使 Mozilla 的 Sunbird 日历程序和 Thunderbird
融为一体。

  34、从 Skype 到 Wengophone:Skype 是电信业里一个十分强大的免费网络 VOIP(Voice over


IP)产品。它开始于一个简单的和免费的 PC-to-PC 电话,但是现在提供完整的电话系统。Skype 现在提
供语音邮件,视频聊天和发送短信的服务。它的开源替代方案,WengoPhone,也提供免费的 PC-to-
PC 电话以及聊天和视频会议。Wengo 创造的这个电话同样提供 SMS 和外部呼叫服务,可以让用户们以
一个合理的价格和拨打任何电话来和他们的朋友交流。

媒体
  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
等等。哦,还用我们说它非常易用吗?

  37、从 Quicktime 到 Darwin Streaming Server:Apple 的 Quicktime 7 Pro 适合任何人,从创建


搏客到转换超过 12 种格式的媒体。而且,这款软件较之其他产品并不是很贵。但是,为什么不用可以和
Quicktime Streaming Server 分享相同代码的开源应用程序呢?Darwin Streaming Server 是一个开源
项目,它非常适合那些希望把 Quicktime 和 MPEG-4 变成像 Windows、Linux、和 Solaris 平台上的流
媒体的开发者。

  38、从 TiVo Desktop 到 Galleon.tv:Tivo-to-Go 的用户们失望的发现他们的 Tivo 不能在


Windows Vista 上工作。这个问题的一些解决方法包括花大量的时间和金钱在各种不同的解决方案上,
有的也许要重建软件的所有功能。一个解决方案包括使用开源软件,Galleon,代替尝试修理 Tivo 和
Windows Vista 。Galleon 是一个免费的开源媒体服务器,面向 TiVo DVR ,允许你享受各种目录和你
电视上的交互式应用程序。这个服务器运行在你的家用电脑上,组织你的媒体收藏,所以你能够在你的
家用网络上观看节目。Gallein 也使用网络目录和你电视上的应用程序。

  39、从 Windows Media Player 到 Miro:这个程序似乎是无处不在的,不管你是不是要尝试打开


它,Windows Media Player 都是那么的胆大妄为,对吗?用 Miro 替代它那胆大妄为的态度吧,一个开
源的程序,可以把你的电脑变成一个网络电视。Miro 有 2500 个无限制的频道,在一个庞大可选的高清
目录里。另外,你还有权力读取任何用 video RSS feeds 发布的内容,包括 YouTube,Revver,Blip 等
等。

功 能
  40、从 CuteFTP 到 Filezilla:确实,CuteFTP 是可爱的,但是它并不免费。确实,它是可信赖的,
但是许多其他的 FTP 应用程序同样可信赖。试试 Filezilla,一个快速的 Windows 上的 FTP 和 SFTP 终端,
有着许许多多的特点——易于安装,易于使用,值得信赖,可靠安全,而且开源。

  41、从 iBackup 到 ZManda:你能把你的备份文件交给谁来管理呢?这很难决定,价格也许不意味


什么。你希望安全可靠的服务,或者这个工具可以保证的你的备份是可以恢复的和完整无缺的。iBackup
是经过证实的,可靠的,可以胜任这个工作,但是你也许也想看看 ZManda。这个开源的解决方案保护
着超过 50 万的服务器和个人电脑,这些电脑运行着世界上各种各样的 Linux,UNIX,BSD,Mac OS X
和 Microsoft Windows 操作系统。它不仅备份信息,而且可以复原。

开源 2008 年第 7 期 96
经验技巧

  42、从 Norton Ghost 到 Partition Image:Norton Ghost 不是一个破旧的备份系统,它是一个完


整的工具,可以备份你的所有东西。如果你有一个完整的磁盘完全失效了,Norton Ghost 可以使它在一
个新的磁盘上恢复它(尽管你不需要每次都做一个完整的备份)。你可以把这些备份到外部设备,CD 或
者 DVD。如果你是一个开源拥护者的话,无论如何,Norton Ghost 也不会赢得你这个用户了。你想要
一些软件像 Partition Image(for Linux)或者 Ghost for Unix(G4U)对于 Windows 或者 Unix 用户。
这个两个都是磁盘克隆工具,虽然角色不同,但都像 Norton Ghost 一样强大。在你使用之前可以在它
们各自的网站上阅读更多内容。(对于一个完整磁盘恢复方案,包括 Partition Image,可以看
SystemRescueCd)。

  43、从 Rational Purify 到 Valgrind:IBM 的 Purify 是一个很好的调试工具。它使用一流的内存错


误和溢出检查来找出任何应用程序中的 bug。作为一个开源的替代,Valgrind 也能找出程序中与内存有
关的错误。而且,它还能发现线程 bug,包括一个曲线图,表明了代码中的错误。还有线程错误。用户
们也许会说 Valgrind 比 Purify 还好,尽管它是开源的。

  44、从 WinZip 到 7-Zip:我们中的一些人和 WinZip 一起成长,所以,如果要我们和它说再见或


许还有些伤心。但是,我们都必须在适当的时候离开家,当开源的 7-Zip 召唤我们的时候,你应该答应
它的呼叫…

安 全
  45、从卡巴斯基杀软个人版到 Winpooch:卡巴斯基杀毒软件由于其突出的查毒效率,也许是
Windows 上杀软市场的顶级产品了。它具有多种进程,所以能对付普通病毒,脚本病毒,扫描压缩文件
(比如 zip 文件),还能邮件中移除病毒。它也提供间谍软件保护和广告软件保护。作为一个开源的代替,
Winpooch 也能扫描你电脑上的文件,发现感染的文件,对付所有的病毒,木马和其他卡巴斯基能够发
现和解决的问题。顺便说一下,Winpooch,还有实时扫描功能,这是 ClamWin(下面将提到)所没有
的。

  46、从 McAfee VirusScan 到 ClamWin:McAfee 是杀软市场的一个老公司的名牌产品了。这个软


件公司适合很多独特的需要,所以它作为许多新的 Windows 电脑操作系统的软件包一起发售。McAfee
的原则是可信赖的和提供 24/7 的支持。但是它不开源使它的市场份额在下降。ClamWin,一个
Microsoft Windows 98/Me/2000/XP/2003 平台上的免费杀软。它的特性包括高效的查毒,定时工作,
自动下载升级病毒库和 Microsoft Outlook 插件。但是上面也提到了,ClamWin 不提供实时扫描功能,
不过 Winpooch 已经把这个功能加进去了。

  47、从 Norton Personal Firewall 到 WIPFW:许多人能在他们睡觉的时候使用 Norton 来工作,


所以 Norton 在行业中领先了这么久。Norton Personal Firewall for Windows 可以监视和检查所有的
网络通信,能够阻挡任何试图闯入的攻击信息。无处不在的弹出窗口和允许成了游戏的一部分,看起来

开源 2008 年第 7 期 97
经验技巧

似乎每一个新的网站都要使它不成为 Norton 所禁止的对象。作为一个替代,WIPFW 是一个 Windows


上防火墙,基于 FreeBSD UNIX 上的 IPFW。事实上,它提供和 Norton Personal Firewall 相似的特性、
功能和用户界面。有什么大的区别吗?WIPFW 是开源的。

金 融
  48、从 Authorize.net 到 OpenSSL:Authorize.net 是首选的支付和交流途径,AIM 为商人们交易
提供了高级的和可定制的安全的平台。但是,当你可以免费获得一个开源产品的时候,为什么还要为可
靠的 SSL 付钱呢?OpenSSL 项目致力于发展一个健全的,商务级别的,功能完善的,和开源的工具,支
持保密插口层(SSL v2/v3)和传输层安全性(TLS v1)协议以及有力的密码机制。全世界的志愿者们通
过互联网来交流、计划和发展 OpenSSL 工具箱,它用文档的形式来管理这个项目。

  49、从 Microsoft Money Plus 到 TurboCash:尽管 Microsfot Money Plus 远远超过了个人的理


财软件,但是 Turbocash 仍然能够骄傲地说自己超过它很多。turbocash 是开放源代码的,并且可以免
费使用。事实上,你可能会用 Quickbooks 和 TurboCash 进行比较,而不是用 Microsoft Money。无
论如何,作为一个个人理财工具,与 Compiere 相比,TurboCash 对于大部分国内编制预算的人来说还
是非常实用的。

  50、从 Quickbooks 到 Compiere:由于这款软件已经进入了很多小型企业的电脑,以至于很多人


都熟悉 Quickbooks。如果你认为转变的机会仍然不多,请再想想。Compiere 由 Global Era 制造,提
供一个解决办法来开放源码 ERP (企业资源规划)和 CRM (客户关系管理)的解决方案,使其适用于
小型到大型的企业。 Compiere 3.0 标志着 Compiere Professional Edition 的正式发布,全新的豪华版
目标直指需要从 Compiere 获取更多高级服务和商用许可的大型机构。

  你喜欢这篇文章,是吗?那么…

开源 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

  为了构造基本的 chroot 环境,需要一些 RPM 包,这些


包可以从 Red Hat 9.0 光盘获得,并存放在 basic 目录中(如图 1)。
  除了这些包以外,因为在 chroot 环境中还需要编译环境,所以还需要所列各包(如图 2),存放在
compile 目录中。
  接下来,简单介绍安装基本的 chroot 环境。安装 basic 目录中的各包:

#rpm -ivh --root=/chroot /tmp/rpm/basic/*.rpm

  注意,命令中的--root=/chroot 参数,目的是以“/chroot”目录作为“/”目录来安装 RPM 包。


用同样的方法安装编译需要的包:

#rpm -ivh --root=/chroot --nodeps /tmp/rpm/compile/*.rpm

开源 2008 年第 7 期 99
企业应用

图1

图2

开源 2008 年第 7 期 100
企业应用

  在启动 chroot 前,需要对 chroot 中的系统做必要的配置。为了简便,可以直接把配置文件复制到/


chroot 下的相应目录:

  
#cp /etc/hosts /chroot/etc
#cp /etc/resolv.conf /chroot/etc
#cp /etc/fstab /chroot/etc

  其中,hosts 文件用于名称解析,resolv.conf 用于指定 DNS 服务器,fstab 中是需要 mount 的文件


系统。至此,一个基本的 chroot 环境就构建完成。下面的工作便是在其上安装应用服务。因为 chroot
环境中没有安装 tar、gzip 等工具,所以对于.tar.gz 包需要事先进行解压缩。这里没有将解压缩工具安装
进去的原因是,考虑到如果在 chroot 环境中安装过多工具,这个环境恐怕会太大了。所以,如上所述的
那些 RPM 包已经足够构建一个可以编译程序的 chroot 环境了。
  
  将安装服务所需要的包复制到/chroot/soft 目录中,具体包括如下包:

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 中配置各种应用

  启动 chroot 后,如何在其中建立各种应用呢?答案是和没有 chroot 环境一样。下面以配置一个基


于名称的虚拟主机为例,演示应用的建立过程。虚拟主机服务是在一台主机上提供不同域名的 Web 服务。

开源 2008 年第 7 期 101
企业应用

如果是多个域名对应一个 IP 地址,则称为基于名称的虚拟主机;如果是多个域名对应多个 IP 地址,则称


为基于 IP 的虚拟主机。

  1.MySQL 数据库的安装、配置和安全调整

  (1)安装和配置 MySQL(限于篇幅,屏幕输出基本略去)

#chroot /chroot //启动 chroot


bash-2.05b#useradd normal //建立一个普通权限用户,用于对源码 configure
bash-2.05b#passwd normal
bash-2.05b#useradd mysql //创建一个 mysql 用户,用于 mysql 进程运行
bash-2.05b#passwd mysql
bash-2.05b#su normal //现在切换到普通用户
$cd /soft/mysql-4.0.15a
$./configure --prefix=/usr/local/mysql \ --with-mysqld-user=mysql \ --with-unix-
socket-path=/usr/local/mysql/var/mysql.sock \ --with-mysqld-ldflags=-all-static
$make
$exit
exit
bash-2.05b#make install
bash-2.05b#strip /usr/local/mysql/libexec/mysqld
bash-2.05b#scripts/mysql_install_db
bash-2.05b#chown -R root /usr/local/mysql
bash-2.05b#chown -R mysql /usr/local/mysql/var
bash-2.05b#chgrp -R mysql /usr/local/mysql
bash-2.05b#cp support-files/my-medium.cnf /etc/my.cnf
#chown root:sys /etc/my.cnf
#chmod 644 /etc/my.cnf

 
  (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!');

  删除默认用户数据库:

mysql> drop database test;


mysql> use mysql;
mysql> delete from db;
mysql> delete from user where not (host="mylinux" and user="root");
mysql> flush privileges;

  给管理员改名,防止猜测 root 账户密码:

mysql> update user set user="vdata" where user="root";


mysql> flush privileges;

  把历史记录扔到黑洞里面:

bash-2.05b#cat /dev/null > ~/.mysql_history

  关闭服务:

bash-2.05b#/usr/local/mysql/bin/mysqladmin -u vdata -p shutdown


Enter password:
031006 08:27:37 mysqld ended

开源 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
  部分配置文件如下:

### Section 1: Global Environment


# Basic settings
ServerName 192.168.0.99:80
User apache
Group apache
ServerRoot "/usr/local/apache"
......
# General settings
Listen 80
ServerAdmin guochunzhong@msn.com
UseCanonicalName Off
ServerSignature Off
HostnameLookups Off
ServerTokens Prod
......
# Virtual hosts
NameVirtualHost *
<VirtualHost *>

开源 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

  注意,必须有 LoadModule 一行,否则 PHP 编译出错。

  (3)Apache 服务的开启和关闭

bash-2.05b# /usr/local/apache/bin/httpd -k start


bash-2.05b# /usr/local/apache/bin/httpd -k stop

  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

bash-2.05b#cp php.ini-dist /usr/local/apache/conf/php.ini


bash-2.05b#exit
exit
#vi /chroot/usr/local/apache/conf/php.ini
safe_mode = On
safe_mode_gid = Off
display_errors = Off
log_errors = On
error_log = /usr/local/apache/logs/php.log

  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.
#

  这样,一个虚拟主机服务器便配置完成,可以提供基于名称的虚拟主机,用户可以使用 FTP 上传和


下载自己的 Web 页面。初学者如果对编译所使用的参数,以及修改配置文件的过程有疑问,可以参看
Apache、MySQL 和 PHP 说明文件或其主页。

  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 环境

  回顾在文章开始时提出的 chroot 到底有多安全的问题,事实上,chroot 环境并非不能突破。虽然非


root 身份运行的进程将永远无法逃离 chroot 环境,但以 root 身份运行的进程却可以“越狱”。所以,
这些服务不能以 root 身份运行,chroot 中也不能存在 setuid=0 的进程,因为黑客可以利用有漏洞的
setuid=0 的程序获取 root 权限。
  检查一下刚才搭建的 chroot 环境及其中的服务是否安全。先看看有哪些编译器:

bash-2.05b#rpm -qa|grep gcc


gcc-3.2.2-5
libgcc-3.2.2-5
gcc-c++-3.2.2-5

  这里用到了 C 编译器 GCC,这是必须要删除的,因为 GCC 编译 C 程序源码需要 root 权限。

bash-2.05b#rpm -e nodeps gcc


bash-2.05b#rpm -e nodeps gcc-c++

  其实,完全可以将编译需要的 RPM 包都卸载掉,因为 chroot 环境里的 RPM 包越少越好。chroot


中运行的服务不同,需要删除的包和必须保留的包也不一样。
  接下来,检查有哪些以 root 身份运行的应用:

#ps -aux|grep mysql


#510 6920 0.0 0.9 5392 1152 pts/1 S 23:16 0:00 /bin/sh
/usr/local/mysql/bin/mysqld_safe --user=mysql
#510 6938 0.0 9.1 52940 11584 pts/1 S 23:16 0:00 /usr/local/mysql/libexec/mysqld
--basedir=/usr/local/mysql --datadir=/usr/local/mysql/var --pid-
file=/usr/local/mysql/var/ASONE.pid --skip-locking –socket=/tmp/mysql.sock
root 7025 0.0 0.5 4824 660 pts/1 S 23:31 0:00 grep mysql
#ps -aux|grep http
root 7002 0.0 2.7 10504 3416 ? S 23:26 0:00 /usr/local/apache/bin/httpd -k start
#504 7003 0.0 2.7 10560 3500 ? S 23:26 0:00 /usr/local/apache/bin/httpd -k start
......
#ps -aux|grep proftp
#501 581 0.0 0.3 2192 460 ? S Aug20 0:00 proftpd: (accepting connections)
......

开源 2008 年第 7 期 109
企业应用

  可以看到,mysqld 进程以 mysql 身份运行,httpd 以 apache 身份运行,proftpd 以 proftp 身份在


运行。接着,还要在当前目录及其子目录中查找并删除所有 setuid=0 及 setgid=0 的文件:

bash-2.05b#find . -type f \( -perm -04000 -o -perm -02000 \) -exec rm {} \;

  这样的 chroot 环境是不是就天衣无缝了呢?不要忽略在命令“ps -aux|grep httpd”的输出中有一


个以 root 身份运行的进程。这是由于在进入 chroot 环境后,是以 root 身份启动 httpd 进程的。尽管
Apache 本身有安全机制,随后将进程用普通用户和组的权限来运行,但是,该 root 进程却无法去除。
原因何在呢?可以做下面这样一个试验。用 vi 编辑器修改/chroot/etc/passwd,将用户 apache 的 Shell
修改为/bin/bash(试验后记得重新修改为/sbin/nologin),然后执行“chown -R apache /usr/local/
apache”,让用户 apache 成为目录 apache 及其子目录和文件的宿主。接下来切换到用户 apache,并
启动 httpd 进程:

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

  注意屏幕输出中加黑的那一行。因为绑定的端口小于 1024,需要 root 权限方能完成,所以该 root


进程是无法去除的。可以通过修改 httpd 监听的端口号,将其改为监听 1024 以上的端口来解决这一问题。

#vi /chroot/usr/local/apache/conf/httpd.conf
......
Listen 8080
......

  这里,将监听端口修改为 8080。重新检查 httpd 服务:

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
企业应用

  显然,所有进程都是以非 root 身份在运行了。问题虽然得到解决,但却会对主页的所有访问者带来


麻烦,他们并不知道要使用 8080 端口来访问该主页。如果仍然想通过 80 端口来访问主页,则可以设定
一个 NAT 服务器,将 80 端口映射到真正的 Web 服务器的 8080 端口。这样,用户仍可以从 80 端口通
过 NAT 服务器访问 Web 服务器,同时也保证了 HTTP 服务中没有以 root 身份运行的进程。

小结

  没有绝对的安全,只有相对的安全。安全不是一个产品,而是一个过程。在这个过程中,人所扮演
的角色始终是最主要的。建立完善的安全制度,在技术上对安全进行加固,并严密监控系统的运行,安
全就有了一定程度的保障。黑客攻击与安全防范这场没有硝烟的战争注定了是一场持久战,在这样反复
的较量中,技术得以不断革新和进步。

邮件客户端整合 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 的配置方法:

  1. 启动 Outlook 后,选“工具


”->“电子邮件帐户”
  2. 选择“添加新目录或通讯簿”,
选“Internet 目录服务(LDAP)”
  3. 服务器名称填
“192.168.1.5”,点“其他设置”,
选“搜索”,在“搜索基础”处填
ou=people, dc=shallot,dc=com
完成后要重新启动 Outlook 设置才

              图 2 会生效。
  搜索的时候选“工具”->“通讯簿”,点“

配置方法以及需要注意的问题 查找”即可。

  Outlook 从 2002sp2 开始比较好的支持   用 Outlook 做客户端查找 LDAP 数据的时候

LDAP,建议使用 Outlook2003。假设 LDAP 服 需 要 注 意 , OpenLDAP 的 后 台 数 据 库 不 能 是

务器的 IP 地址为 192.168.1.5,并且运行于默认 ldbm,不然会报错,建议用 bdb 做后台数据库。

的 389 端口。 Thunderbird 的配置大体上和 Outlook 相同,值


得 一 提 的 是 Evolution 支 持 LDAP 中 标 准 的

  Outlook Express6 的配置方法 jpegPhoto 属性,在发邮件的时候可以把用户的


照片显示出来。

  1. 打开 Outlook Express 以后选“工具”->   在做具体应用的时候用户可能会有更多的要

“通讯簿” 求,例如,只有认证通过的用户才可以查看企业

  2. 然后在“通讯簿”的页面里选择“工具”- 内部的用户信息。在配置邮件客户端的时候都会

>“帐户”,点“添加” 有这样的安全选项,例如员工甲在服务器中对应

  3. “Internet 目录(LDAP)服务器”填 LDAP 的 DN 是 uid=panyu, ou=people,

服务器的地址,192.168.1.5 dc=shallot,dc=com,以 Outlook 为例,只要在

  4. 最后在“目录服务”栏中选中刚才设置的 配置 Outlook 的过程中,在“用户名”的地方输

项目击“属性”,在“搜索库”中填入 入这个 DN,并提供相应的密码即可。同样,在

ou=people,dc=shallot,dc=com , 即 目 录 树 中 服务器短也要修改 OpenLDAP 配置文件中 ACL

开源 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
企业应用

使用开源 CRM 进行客户关系管理

顾宏军

化,标准化。

VtigerCRM 客户关系系统不能做什么?
  VtigerCRM 不是万能的,不可能时候任何场
合,它只适用普通的中小企业,几个人到几十个
人的公司,特别是贸易企业,销售团队,服务企
业等,如果有分公司,子公司等可能不太适合,
如果希望进行生产管理也不适合,因为它没有生
产管理功能,默认的财务管理功能也比较弱。
  和所有客户关系管理系统一样,VtigerCRM

  上一期已经介绍了 VtigerCRM 系统的安装 系统只是个辅助工具,真正 CRM 系统的使用效

过程,本文使用开源 CRM 系统进行客户管理系 果,与订单情况等等还要看各个具体的公司状况,

列的第二篇,主要介绍 VtigerCRM 适用场合, 企业管理团队,产品本身质量,价格等,众多因

不适场合,实施的困惑,系统工作流程等。下期 素。

具体介绍 VtigerCRM 模块介绍与初始化,并模


拟整个销售过程,依反馈情况与需求,再考虑是 安装 VtigerCRM 系统后,员工都不使用怎么办?

否继续各个模块的具体使用与开发等内容,本文   很多企业安装 CRM 系统后,无人使用,并

部分内容整理自网络。 最终导致 CRM 引入失败。任何习惯都是养成的,


也是需要引导和诱惑的,企业要使用 CRM 系统,

VtigerCRM 客户管理系统能做什么? 除了行政命令规定必学使用外,其实更可以变通

  VtigerCRM 系统是一个适合中小企业的客户 下,将"要我用"变成"我要用"。

管理工具,帮助管理公司业务,从市场、销售、   CRM 系统安装初期一俩月内,抽调一俩文员

采购、库存、客服等全程跟踪客户,最大可能获 或者各个部门抽个把人成立信息录入组,将公司

得订单,提高客户满意度;比较适合销售团队, 的各种客户的历史数据,进行分类录入,然后相

贸易公司,服务型企业使用;部分作用如下: 关负责人或相关部门对录入内容进行审核,在系

A. 统一记录与管理客户资料,不再担心资料丢失; 统中有一定数据量后,各个业务人员,客服人员

B. 随时随地搜索查找客户资料,及时联系客户; 等自然而然的会喜欢上 CRM 系统,因为它能简

C. 自动化的统计分析您的客户信息、销售情况等; 化它的工作,减少不少的工作量,因为见到好处,

D. 全面掌握公司业务信息,避免人员离职等导致 没有人不会喜欢。

客户流失;   软件安装后无人使用的问题,不只是 CRM

E. 通过 CRM 系统的工作流使公司业务流程自动 才有的现象,比如,大量预装的 Linux 系统,客

开源 2008 年第 7 期 115
企业应用

户购买后装回盗版的 Xp,很多学校搞网上教学, 踪后完成!这充分说明了跟踪的重要性。


在线课堂,也是花钱装个系统,然后就没有下文 VtigerCRM 也提供了客户跟踪所需的各种功能。
了,空空的个系统放那根本不能啥实际作用(除   通常,销售从接触到成交要经历多个阶段,
了政绩作用,呵呵);软件以用为要,安装只是 例如初期沟通、立项评估、需求分析、方案指定、
起点。 招投标/竞争、商务谈判和谈成结束等,这些阶段
在各行各业会有所不同,需要根据本公司业务确
如何利用 VtigerCRM 收集潜在客户? 定销售阶段和每个阶段要做的事情。可以利用
  客户是企业最重要的资源,只有拥有了客户 CRM 系统来分享有经验业务人员的销售经验,制
企业才能有所发展。获得客户的第一步,那就是 定适合公司的销售阶段,同时通过工作流指定每
收集潜在客户,收集潜在客户有很多方法,例如 个销售阶段应该做的事情,当销售机会到达某个
朋友介绍、参加行业展览会、网络搜索,B2B 网 阶段时,CRM 自动通过邮件,IM 等提醒业务人
站等,这些都可以通过业务人员主动收集,还可 员当前阶段要做的事情。
以通过公司网站进行。随着互联网的发展,越来   在跟踪过程中,业务人员可以查看销售机会
越多的人习惯通过在网上搜索来采购物品,所以 的历史记录,充分了解和分析所跟踪的客户和销
如果在网站上做好收集潜在客户的工作也许可以 售机会,并制定下一步的跟踪计划。业务经理也
达到事半功倍的效果,而且一般的企业网站每年 可通过统计报告了解业务人员的业务情况,在关
的最基本费用也就几百块。 键的销售阶段可以给业务人员提一些建议,协助
  当潜在客户通过搜索引擎等方式接访问公司 业务人员完成销售机会。这样,在 CRM 系统的
网站的时候,很有必要让访问网站的客户留下联 辅助下和业务人员多次有效的跟踪,就能逐步和
系信息,当获得潜在客户的联系信息后,业务人 客户签单。
员就可以对这些潜在客户做进一步的跟踪。   这正是销售自动化的内涵:CRM 系统使每个
VtigerCRM 提供 WebForm 工具,让网站访客留 业务环节高效处理,业务链的环节之间自动推进。
下联系方式;当访客在公司网站填写联系方式后, VtigerCRM 系统正是借助工作流,使销售机会的
联系方式会自动录入到 VtigerCRM 系统中,系 跟踪自动推进,业务人员根据系统自动分配的任
统可以通过工作流根据设定的规则自动分配潜在 务对客户进行有效跟踪。通过 VtigerCRM 系统
客户。当业务人员登录 VtigerCRM 时,会在自 不仅能分享有经验业务人员的经验,也能帮助新
己的日程安排里看到需要跟踪潜在客户的任务和 手快速提高业绩,从而提供整个公司的销售业绩。
指示(需设置工作流),业务人员根据分配的任务   有人可能会问,如果业务人员实在不能签单
开始跟踪客户… …。 怎么办,那只有放弃客户或让其他业务人员继续
跟踪。VtigerCRM 系统可以通过设置自定义字段,
如何通过 VtigerCRM 软件跟踪客户? 收回客户资源让其他业务人员继续跟踪。而且公
  有统计表明,2%的销售是在第一次接洽后完 司客户也满足 80-20 法则,CRM 系统可协助进
成;3%的销售是在第一次跟踪后完成;5%的销 行决策,对一些没有效益,又没有多少潜在效益
售是在第二次跟踪后完成;10%的销售是在第三 的客户进行放弃处理。
次跟踪后完成;80%的销售是在第四至十一次跟

开源 2008 年第 7 期 116
嵌入式

嵌入式

uC/OS-II 在 SkyEye 上的移植分析

北京亚嵌专家讲师(www.akaedu.org ) 李明

  SkyEye 仿真调试器是基于 ARM7TDMI 核的,因此移植 uC/OS-II 到 SkyEye 上可以借鉴网上已有


的例如 Sansung S3C3410X 的移植代码,这在 uC/OS-II 的主页上很容易找到。 当然自己动手做移植也
是对 ARM 体系结构和汇编语言的进一步熟悉,同时对于 uC/OS-II 内核的调度机制会有更深的认识。

  整个移植工作可以分为两个方面,一部分是和 ARM 相关,一部分是和移植原理相关。在开始实际


的移植工作前,需要对这两部分有一定的背景知识,尤其是和侧重于和移植工作相关的概念和原理,下
面分别做一些介绍。

ARM 的体系结构

  ARM(Advanced RISC Machines)是目前在嵌入式领域里应用最广泛的 RISC 微处理器结构,以


其低成本、低功耗、高性能的特点占据了嵌入式系统应用领域的领先地位。ARM 系列的处理器当前有
ARM7、ARM9、ARM9E、ARM10 等多个产品,此外 ARM 公司合作伙伴,例如 Intel 也提供基于
XScale 微体系结构的相关处理器产品。所有的 ARM 处理器都共享 ARM 通用的基础体系结构,所以开发
者在不同的 ARM 处理器上做操作系统移植时,可以将节省相当多的工作量,这无疑将大大降低软件开发
成本。
  要详细完整的了解 ARM 的体系结构,当然是去读 ARM Architectur Reference Manual ,这是一
个 13M 的 pdf 文档,有 800 多页,可以从 ARM 的网站下载,也可以到北京亚嵌教育研究中心的 FTP 服
务器( http://www.akae.cn/ftp/ )上找到。北航出的一本《ARM 嵌入式处理器结构与应用基础》基本上
翻译了这个 pdf 中大部分重要的内容,可以作为入门的中文教材。这里我们仅仅对其中和移植工作密切
相关的概念做简要介绍。

  1.处理器模式: ( cpu mode )


  ARM 的处理器可以工作在 7 种模式,如图 1 所示。

开源 2008 年第 7 期 117
嵌入式

图1

  这里除 usr 模式以外的其他模式都叫做特权模式,除 usr 和 sys 外的其他 5 种模式叫做异常模式。


在 usr 模式下对系统资源的访问是受限制的,也无法主动地改变处理器模式。异常模式通常都是和硬件
相关的,例如中断或者是试图执行未定义指令等。这里需要强调的是和移植相关的两种处理器模式:svc
态和 irq 态,分别指操作系统的保护模式和通用中断处理模式。这两种模式之间的转换可以通过硬件的方
式,也可以通过软件的方式。uC/OS-II 内核在执行过程中,大部分时间都是工作在 svc 态,当有硬件中
断,例如时钟中断到来时,cpu 硬件上会自动完成从 svc 态进入 irq 态,在中断处理程序的结束处,则需
要通过编程的方法使得 cpu 从 irq 态恢复到 svc 态,这个在移植代码中可以找到。

  2.程序状态寄存器: ( PSR:Program status register )


  在任何一种处理器模式中,都使用同一个寄存器来标识当前处理器的工作模式:这个寄存器叫做
CPSR ( Current Program Status Register ),它的 [0--4] 位用来表示 cpu mode,如图 2、图 3 所示。

图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
嵌入式

态之后 cpu 自动完成的,不能在其他态下硬性赋值,因为 SPSR_irq 是其他状态下不可见的。

图3

  3.ARM 寄存器:( register )


  ARM 处理器一共有 37 个寄存器,其中 31 个是通用寄存器,包括一个程序计数器 PC。另外 6 个就
是上面提到的程序状态寄存器。

  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

  这里需要说明两点,一是当前任务堆栈初始化完成后,OSTaskStkInit 返回新的堆栈指针 stk,在


OSTaskCreate()执行时将会调用 OSTaskStkInit 的初始化过程,然后通过 OSTCBInit()函数调用将
返回的 sp 指针保存到该任务的 TCB 块中。二是初始状态的堆栈其实是模拟了一次中断发生后的堆栈结构,
因为任务被创建后并不是直接就获得执行的,而是通过 OSSched()函数进行调度分配,满足执行条件
后才能获得执行的。为了使这个调度简单一致,就预先将该任务的 pc 指针和返回地址 lr 都指向函数入口,
以便被调度时从堆栈中恢复刚开始运行时的处理器现场。

开源 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
嵌入式

都是在非异常模式下进行的,因此区别于中断级别的任务切换。它的工作是先将当前任务的 cpu 现场保


存到该任务堆栈中,然后获得最高优先级任务的堆栈指针,从该堆栈中恢复此任务的 cpu 现场,使之继
续执行。这样就完成了一次任务切换。

  OSIntCtxSw()
  中断级的任务切换,它是在时钟中断 ISR(中断服务例程)中发现有高优先级任务等待的时钟信号到
来,则需要在中断退出后并不返回被中断任务,而是直接调度就绪的高优先级任务执行。这样做的目的
主要是能够尽快地让高优先级的任务得到响应,保证系统的实时性能。它的原理基本上与任务级的切换
相同,但是由于进入中断时已经保存过了被中断任务的 cpu 现场,因此这里就不用再进行类似的操作,
只需要对堆栈指针做相应的调整,原因是函数的嵌套。

  OSTickISR()
  时钟中断处理函数,它的主要任务是负责处理时钟中断,调用系统实现的 OSTimeTick 函数,如果
有等待时钟信号的高优先级任务,则需要在中断级别上调度其执行。其他相关的两个函数是
OSIntEnter()和 OSIntExit(),都需要在 ISR 中执行。

  ARMEnableInt()& ARMDisableInt()
  分别是退出临界区和进入临界区的宏指令实现。主要用于在进入临界区之前关闭中断,在退出临界
区的时候恢复原来的中断状态。它的实现比较简单,可以采用方法 1 直接开关中断来实现,也可以采用
方法 2 通过保存关闭/恢复中断屏蔽位来实现。

我的移植体会

  移植 uC/OS-II 的绝大部分工作都集中在 os_cpu_a.S 文件的移植,这个文件的实现集中体现了所要


移 植 到 处 理 器 的 体 系 结 构 和 uC/OS-II 的 移 植 原 理 ; 在 这 个 文 件 里 , 最 困 难 的 工 作 又 集 中 体 现 在
OSIntCtxSw 和 OSTickISR 这两个函数的实现上。这是因为这两个函数的实现是和移植者的移植思路以
及相关硬件定时器、中断寄存器的设置有关。在实际的移植工作中,这两个地方也是比较容易出错的地
方。
  OSIntCtxSw 最重要的作用就是它完成了在中断 ISR 中直接进行任务切换,从而提高了实时响应的速
度。它发生的时机是在 ISR 执行到 OSIntExit 时,如果发现有高优先级的任务因为等待的 time tick 到来
获得了执行的条件,这样就可以马上被调度执行,而不用返回被中断的那个任务之后再进行任务切换,
因为那样的话就不够实时了。
  实现 OSIntCtxSw 的方法大致也有两种情况:一种是通过调整 sp 堆栈指针的方法,根据所用的编译
器对于函数嵌套的处理,通过精确计算出所需要调整的 sp 位置来使得进入中断时所作的保存现场的工作
可以被重用。这种方法的好处是直接在函数嵌套内部发生任务切换,使得高优先级的任务能够最快的被
调度执行。但是这个办法需要和具体的编译器以及编译参数的设置相关,需要较多技巧。

开源 2008 年第 7 期 124
嵌入式

  另一种是设置需要切换标志位的方法,在 OSIntCtxSw 里面不发生切换,而是设置一个需要切换的


标 志 , 等 函 数 嵌 套 从 进 入 OSIntExit => OS_ENTER_CRITICAL() => OSIntCtxSw() =>
OS_EXIT_CRITICAL() => OSIntExit 退出后,再根据标志位来判断是否需要进行中断级的任务切换。这
种方法的好处是不需要考虑编译器的因素,也不用做计算,但是从实时响应上不是最快,不过刚开始学
习这种方法比较容易理解,实现起来也简单。SkyEye 目前的移植就是基于第二种方法的。
  在中断态下进行任务切换,需要特别说明的一个问题是如何获得被中断任务的 lr_svc 。因为进入中
断态后,lr 变成了 lr_irq ,原来任务的 lr_svc 无法在中断态下获得,这样要得到 lr_svc ,就必须在中断
ISR 里面进行一次 cpu mode 强制转换,即对 CPSR 赋值为 0x000000d3 ,只有返回到 svc 态之后才能
得到 原来任务的 lr ,这个对于任务切换很重要。还有一个需要留意的问题是在强制 CPSR 变成 svc 态之
后,SPSR 也会相应地变成 SPSR_irq ,这样就需要在强制转变之前保存 SPSR ,也就是被中断任务中断
前的 CPSR 。
  全部移植代码在 SkyEye 仿真器上调试通过,在 SkyEye 的主页上可以下载获得。欢迎大家访问我们
的主页 【 http://www.skyeye.org 】。 另外在 Linuxfans.org 的论坛上 【 http://www.linuxfans.org/
bbs/forum-58-1.html 】 , 有 关 于 SkyEye 进 展 的 最 新 讨 论 , 和 另 一 个 嵌 入 式 开 源 项 目
【www.lumit.org 】的大量资料下载, 【 http://www.linuxfans.org/bbs/forum-66-1.html 】。希望
大家对我们的工作提出建议和批评,更希望有越来越多的人关注和参与进来。

总结
  移植 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
嵌入式

嵌入式 Linux 培训之路

李阳

所以当时看到了 AKAE,心中一亮,更坚定了自
己不去加入那些盲目去招聘会的大军里了。终于
在七月份,我毕业了,也如愿的来到了由中国一
些开源项目领头羊们带领的 AKAE。

学习全景实录

  下面进入了第一周的学习,是 LINUX 的一些


入门操作,这周对我最大的改变是,现在我感觉

嵌入式 Linux 就业班学员合影留念 如果用鼠标去右键新建一个东西好麻烦,好慢。


如果偶尔在 WIN 下,写些东西,经常不由的

  转眼间在 AKAE 的学习即将结束了,回忆二 ESC->:->w,而不是 CTRL+S 了。我知道,我已经

个月前一个刚迈出校园的我,和现在的我,可以 对 WIN 上的很多东西陌生了,对 LINUX 又已经

说已经完全的改变。 是爱不释手了。

  自己接触电脑应该是在小学,第一次在妈妈   第二周的学习,是一些 C 语言的编程。看看

工作的地方,看到了 DOS,现在还记得在那个黑 现在自己编的 CODE,又看了看在学校自己编过

黑的屏幕下编出第一个批处理程序的喜悦而且并 的一些程序,一个.c 叫一个程序,最惨的还有一

在为什么这个机器竟然会做这么人性化的事情上 个.c+一个 main 叫一个程序。又看看在 AKAE 编

困惑了很多年,有可能现在才真的知道为什么吧。 的 code,一个程序,不,应该说是一个小项目吧,

不过在那时就有了以后要成为一个电脑高手的想 有一个或多个文件夹,里面有 README,加了

法(当然,当时肯定不知道黑客这个词了)。原 (#ifndef,#define,#endif)的头文件,和规范的编

来在大学,在同学里自认为已经是个高手了,可 码风格的.c,里面还有一些#ifdef DEBUG 等语句

以帮人家解决一下 WINDOWS 上的一下小问题, 的代码。现在还有点不敢相信二个月的我的变化

帮同学免费的在网吧上网,在院里可以和老师一 了。

块做项目。但是真正发觉自己只是在电脑业余爱   第三周,是对自己编程的升华了,都知道

好者的行列中的时候是在大四时,参加了计算机 UNIX 和 C 的关系,那么 UNIX 环境的编程无疑

那些科班出身的人的一个项目。做完项目后,大 是对 C 语言的深入理解。在这周里,我学到了一

家都在找工作了,我心里非常明确的告诉自己不 直非常想得到的但书本上不会讲的东西。例如,

能做一个肤浅的“高级程序员”。自己想了解更 一个 a.out 的形成一步一步是怎么过来的,它在

多电脑背后那些神秘的东西,当时知道 LINUX 给 运行时的堆栈的样子,在内存中的布局是什么样

了我一个机会,自己又是一个自动化出身的学生, 子。站在了这种角度再去编程,再去 debug,爽

开源 2008 年第 7 期 126
嵌入式

的感觉可能只有自己能够体会的到吧。 机世界的命脉-处理器的体系架构。原来在学校
  真正对思想的改变还是对 UNIX 编程的学习, 只是学过微机原理,现在看到了精简指令集架构
IO 编程,进程,信号量,线程,还有网络的编程 的美,知道了 2/8 原则的成功思想,无奈那些老
中,我学到了很多操作系统级的知识,和网络协 牌的 CISC 的处理器要兼顾它以前的东西。当了
议的知识。当然更重要的是,在 AKAE 众多武林 解了一些“大脑”-处理器是怎么干活的时候,
高手的指点下,自己也有勇气并可以看懂一些传 例如:异常,中断,内存管理,流水线,等知识
说中的葵花宝典级的书了。 后,感觉自己离计算机这个世界又进了一步。
  增加内功后,自己知道了 UNIX 编程的名言   这周的试验更是有趣,看着自己编的跑马灯,
“尽量提供机制,而不提供策略”。自己编程是 听着蜂鸣器发出的音乐(虽然音质上。。。),
站在用户态呢,还是内核态。当在用户态编程时, 不过这都是自己的成果呀,一个字--“享受”。
我的程序的进程上下文是什么样的,自己调用的   第五周进入了实用的嵌入式 LINUX 的应用
一些标准库函数和系统调用时,他们是如何陷入 的学习了,通过这周的学习和具体的试验,让我
内核态执行的。现在编程时脑子里就会有这么一 真正的理论联系了实践。自己建立交叉编译环境,
个立体的画面,爽。(谁都喜欢知道自己到底在 了解 BOOTLOADER,自己编译内核自己做文件
做什么,自己做得事情后面真正在发生什么。) 系统,完全的 DIY 的计算机出来了。
  UNIX 编程的另一大特点莫过于同步了,想   第六周对 C 进行了一些强化的编程训练,也
一想在同一时刻,你的程序在同时做着很多不同 算是前一段的总结和让我看到变化的一周。而且
的事情,即使只有一个处理器,也可以让你感觉 在这周里,最重要的是我知道我自己是一名程序
到一种并发的效果,这样有很多问题会得到简化, 员了,我编出来的程序不是为了兴趣自己用了,
很多程序更加高效合理。(例如像交互这种“慢 我的用户可能是一些街上的大妈,所以我不得不
”系统调用) 当自己真的可以真正的理解和考虑 站在它们的角度去提供一些功能,和做出一些出
到同步的精髓时,自己可能又会小骄傲一下吧。 错处理。对出错处理这方面感觉收益非浅。自己
现在只是知道在多进程,线程(LINUX 里好像线 在编程时也对内存这个“雷区”更加小心了。
程也是用进程实现的吧)编程时,如何通过信号   李明老师提出的状态机的编程思路使我内功
量来同步每个进程,如何用锁的机制来保护共享 又一次的提高,因为李老师刻意的反复提出,我
资源。加锁的顺序和技巧,避免死锁。当然信号 知道了它的重要性,上网一查更知道这个属于编
更是个很广很有用的概念,以后要通过实践继续 译原理的概念是一个应用非常广泛的思想。谢谢
总结。 老师们还教给了我们他们的宝贵经验和方法。
  还有 AKAE 的大作业制度真的很好,让我体   第七周,不敢相信自己要开始编写设备驱动
验到了网络编程的乐趣,几个人用自己编的程序 了,不过这是真的,现在可以编写一个简单的字
聊天的感觉,又是一种从未有过的喜悦。 符设备驱动了,还有一些关于硬件中断的驱动例
  第四周我们进入了 ARM 嵌入式体系结构的 程。脑子里有了字符设备,块设备,网络设备的
学习中,有人说,其实计算机就二条命脉:处理 编程逻辑,现在头脑中就可以呈现出内核态的一
器+操作系统。在前三周在自己不知不觉的编程 些样子。站在内核态编程是一种挑战,也是一种
中,学到了自己一直希望得到的操作系统的知识 升华吧。以后一定会在工作的实践中去进一步的
后,这周 AKAE 又一次及时的给出了另一条计算 尝试。

开源 2008 年第 7 期 127
嵌入式

  第八周,内核,对就是这个 LINUX 最宝贵的 的老师们那种对计算机技术的执著,对中国开源


东西,这个计算机技术发烧友的珍宝。不过它也 的贡献,他们的实力可以说比外面一些这个 CEO
是最复杂的了。AKAE 的高手给我指明了一条学 那个高级架构师强很多,但是他们依然朴素的生
习内核的明路,让我不会走进一个森林而迷路。 活,抱着共同的理想和目标。他们才是真正搞技
以后内核肯定是要深入的研究的,这个摆在自己 术的,他们是中国程序员的骄傲。这个是我在
面前最大最好的东西不能浪费了! AKAE 学到的最大的财富了,让我以后更加坚定
的钻研技术,以后我要更加努力的学习,争取加
一点感想 入他们这个大家庭,做一些有意义的事情。

  说实话,这几个月自己在 AKAE 学到了太多 作者简介:李阳,本科毕业于北京工商大学 ,


太多,“外功”,“内功”同时大增。更重要的 2006 年秋在北京亚嵌学习嵌入式 Linux 就业班 ,
是我还学到了看到了另一种精神,看到了 AKAE 毕业后就职于 EPSON(爱普生)北京公司。

如何看懂 man page?

亚嵌教育(www.akaedu.org) 宋劲杉

  看懂 man page 是做 Linux 开发最基本的要求,然而很多新手非常不喜欢看 man page,我们在教


学中发现,虽然从第一天讲编程就开始强调一定要看 man page,rtfm=read the f*cking manual,但
结果是很多学生都想方设法绕过看 man page,一个月以后,从没来仔细看过一个 man page 的学生仍
然有半数以上。
  比如有一本《Linux 常用 C 函数(中文版)》就是学生们的最爱,虽然我们从来没有推荐过也没有提
供过这本书的电子版或印刷版,但是学生几乎人手一份。这本书的风格和 man page 截然不同,函数接
口的说明非常简略,远远没有涵盖 man page 的要点,然而每个函数后面都不厌其烦地举一个例子,即
使这个函数的用法已经像秃头上的虱子那么明显了也要举个例子,而且通常这个例子写得极不规范,例
如从来不判断出错返回值。让我说,这本书就是垃圾,这本书的存在不仅浪费空间,而且害人不浅。适
合新手速查是没有错,但人都是有惰性的,新手往往都会依赖上这本书,不用去看 man page,也不想
去看,看 man page 干吗?东拉西扯说了那么多,费半天劲也看不懂,而且最后连个例子都没有,看完
还是不知道怎么调用这个函数,哪有看这本书学得轻松,连字都不用看,直接把例子粘贴到自己的代码
中就行了。
  新手就这样被毒害了:第一,刚才说了,这些例子极不规范,bug 很多,就是垃圾代码,谁用了它
谁的代码也就成了垃圾代码;第二,说明得太简略,容易让人产生片面理解和误解。第三,助长了新手
的惰性,虽然靠这本书能写出很多程序,但英文能力、理解能力和技术水平都长期停滞不前,根本不能

开源 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 是帮
不了你的。

  REGEX(3) Linux Programmer’s Manual REGEX(3)

  NAME
  regcomp, regexec, regerror, regfree - POSIX regex functions

  SYNOPSIS
  #include <sys/types.h>
  #include <regex.h>

  int regcomp(regex_t *preg, const char *regex, int cflags);

  int regexec(const regex_t *preg, const char *string, size_t nmatch,


  regmatch_t pmatch[], int eflags);

  size_t regerror(int errcode, const regex_t *preg, char *errbuf,

开源 2008 年第 7 期 129
嵌入式

  size_t errbuf_size);

  void regfree(regex_t *preg);

  这个 man page 描述了四个函数的用法。本来我只是想用一个正则表达式匹配一个字符串,并取得


匹配结果,也就是说我想要的是这样一个函数:

  int my_expect_func(传入:正则表达式, 传入:目标字符串, 传出:匹配结果);


  返回:错误码

  怎么会有四个函数呢?哪个跟我想要的函数最相关?其它函数又是做什么的?这是一个好的阅读习
惯:你要主动去猜测,而不是被动地接受信息。理解的过程应该是拿你的猜测去和文字描述相比较,如
果相符就说明理解对了,如果不符就要提出一个新的猜测去比较,完全被动地接受信息那不叫理解。
  传入参数和传出参数是一个重要的提示,Linux 的库函数原型都是非常规范的,const 指针一定是传
入参数,非 const 指针一定有传出值(可能是传出参数,也可能是传入-传出参数),所以,函数原型就
已经非常清楚地告诉你应该怎么调用这个函数了,根本没必要给出代码例子。看第一个函数:

  int regcomp(regex_t *preg, const char *regex, int cflags);

  preg 是传出参数,需要事先分配该对象的内存然后把地址传给 regcomp 函数,regex 是传入参数,


cflags 是标志位,preg 不知道是什么,但 regex 就是 regular expression,正则表达式,又是 char *型
的,应该没错了,不用看下面的说明就可以猜测这个函数是这样调用的:

  regex_t regobj;
  regcomp(&regobj, "正则表达式", 标志位 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 是什么?不知道,但是跟下面一个函数对比来看:

  int regexec(const regex_t *preg, const char *string, size_t nmatch,


  regmatch_t pmatch[], int eflags);

  这个函数有个参数叫 eflags。所以 c 是 regcomp 的 c,而 e 是 regexec 的 e,一个是编译时的


flags,一个是执行时的 flags,这两种 flags 的取值必然不同,下文必然会分别说明。这又是
一种猜测:猜测下文的行文逻辑。这种猜测同样是非常有助于理解的。后面几个函数的函数名和参数名
是怎么缩写的,留给读者自己练习。
  preg 参数在 regcomp 中是传出参数,在 regexec 中却是传入参数,根据推理,preg 是由
regcomp 函数填写好之后传给 regexec 函数用的,也就是说正则表达式以转换之后的二进制格
式传给 regexec 函数来用。regexec 又有一个字符串传入参数 string,还有两个 match 参数表示匹配结
果,pmatch 是传出参数,表示缓冲区首地址,nmatch 表示缓冲区长度(根据经验,这类似于
strncpy),这必然就是我一开始想要的 my_expect_func 了:

  int my_expect_func(传入:正则表达式, 传入:目标字符串, 传出:匹配结果);


  返回:错误码

  preg 对应正则表达式,pmatch 和 nmatch 对应匹配结果,因此 string 这个传入参数必然是目标字


符串了。pmatch 是一个指针变量,但是写成 pmatch[],说明它指向的是一组而不是一个 regmatch_t
类型的对象,这一组有多少个呢?用 nmatch 参数表示。和 strncpy 类似,这一组 regmatch_t 对象应该
由我们事先分配好再传给函数。因此这两个函数应该是这样调用的:
  regex_t regobj;
  regcomp(&regobj, "正则表达式", 标志位 1|标志位 2|...);
  regmatch_t matchbuf[10];
  regexec(&regobj, "目标字符串", 10, matchbuf, 标志位 1|标志位 2|...);

开源 2008 年第 7 期 131
嵌入式

  regmatch_t 对象如何表示一个匹配呢?如果一个正则表达式模式在一个目标字符串中有五次出现,
如何表示这五次出现呢?可以猜测这个 regmatch_t 结构体一定包含了在目标字符串中的匹配位置信息。
另外,我传进去 10 个 regmatch_t 对象,如果只有五次匹配,函数返回后我怎么知道前面五个对象是有
效的匹配信息而后面是无效的呢?是不是通过一个参数或返回值表示匹配次数的?该函数并没有额外的
参数,而且快速翻看一下 man page 的 RETURN VALUE 节,这个函数返回值是错误码,也不表示匹配
次数。那这个函数一定会在后面无效的 regmatch_t 对象里填充一个特殊值,这就是推理,这个猜测将会
在阅读后面的文字时证实或证伪,不管猜得对不对,一定会在后面得到答案。

  后面还有两个函数:

  size_t regerror(int errcode, const regex_t *preg, char *errbuf,


  size_t errbuf_size);

  void regfree(regex_t *preg);

  根据以往的经验 regerror 相当于 perror 或者 strerror,将错误码翻译成一个可读性好的字符串,


regfree 相当于 free,用来释放 preg。但是 preg 不是我们自己事先分配的对象么?既然不是由这一组函
数动态分配的,为什么需要用这一组函数来 free?由这个问题引出一个新的猜测,regex_t 这种结构体中
一定有指针类型的成员,regcomp 函数一定是动态分配了一块内存然后让 preg 中的指针成员指向该内
存,所以需要用 regfree 来释放一下,后者循着 preg 参数找到它的指针成员,然后释放先前分配的内存。
再结合经验,正则表达式的长短不同,复杂程度肯定不同,如果用状态机表示那么需要的状态数量肯定
不同,不可能所有正则表达式的二进制表示都用 sizeof(regex_t)这么大就够用,必然需要动态分配内存。
这种推理和猜测不仅有助于解决如何使用函数的问题,而且对于这些函数的实现机制也获得了一些
insight,这种能力对于读代码尤其重要。注意,释放内存的函数虽然是传入参数的,不传出任何有意义
的值,但是函数原型中的参数不使用 const 修饰,因为释放内存也是一种修改。
  刚把 SYNOPSIS 看完,还没有看下面的说明,就已经差不多会用这些函数了,靠的是什么?1、推理
2、经验 3、对英文缩写敏感。下面一边看说明,一边验证以上猜测。

  DESCRIPTION
  POSIX Regex Compiling
  regcomp() is used to compile a regular expression into a form that is
  suitable for subsequent regexec() searches.

  没错,regcomp 确实是用来把正则表达式转换成一种二进制格式以适合 subsequent 的 regexec()


处理。这个 subsequent 就说明先调用 regcomp 再调用 regexec。
  理解文档的时候,表示概念的文字和表示概念之间关系的文字是最重要的。像 man page 这种简洁

开源 2008 年第 7 期 132
嵌入式

的文档中,表示概念之间关系的文字尤其容易被忽视,因为不像下定义那么明显,往往一个词就带过。
作为练习,请读者注意后面的文字中有哪些表示概念之间关系的词。

  regcomp() is supplied with preg, a pointer to a pattern buffer storage


  area; regex, a pointer to the null-terminated string and cflags, flags
  used to determine the type of compilation.

  All regular expression searching must be done via a compiled pattern


  buffer, thus regexec() must always be supplied with the address of a
  regcomp() initialized pattern buffer.

  preg, a pointer to a pattern buffer storage area 就说明 preg 这个对象的空间是需要我们自己分


配的,分配完了再传一个地址也就是 preg 给 regcomp。man page 不会直接说你应该自己分配了空间
再传给我,这么说也太贰了。但你要自己体会出它真正想传达给你的信息。

  cflags may be the bitwise-or of one or more of the following:

  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.

  A non-matching list ([^...]) not containing a newline does not

开源 2008 年第 7 期 133
嵌入式

  match a newline.

  Match-beginning-of-line operator (^) matches the empty string


  immediately after a newline, regardless of whether eflags, the
  execution flags of regexec(), contains REG_NOTBOL.

  Match-end-of-line operator ($) matches the empty string immedi‐


  ately before a newline, regardless of whether eflags contains
  REG_NOTEOL.

  POSIX Regex Matching


  regexec() is used to match a null-terminated string against the precom‐
  piled pattern buffer, preg. nmatch and pmatch are used to provide
  information regarding the location of any matches. eflags may be the
  bitwise-or of one or both of REG_NOTBOL and REG_NOTEOL which cause
  changes in matching behavior described below.

  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)

  前面猜测过了,cflags 和 eflags 既然不叫同一个名字,肯定分别有不同的取值,并且通常这些取值


都是 bitwise-or 起来用的。本文重点在于讲如何阅读理解 man page,而不在于讲具体的技术,所以这
些标志都起什么作用不详细解释了。但是再做几个猜缩写的练习,这不仅有助于理解,更有助于记忆这
些标志,有些常用的标志把它记住了就不必每次用都查手册了。REG_ICASE,ICASE 表示 ignore case,
这种缩写很常见。REG_NOSUB,SUB 有些时候表示 substitute,有些时候表示 substring,在这里就表
示 substring。REG_NOTBOL,初看不知道 BOL 是什么,看是再看和它对称的 REG_NOTEOL,根据经
验,我们已经知道 EOF 是 end of file,那么这个 EOL 应该是 end of line,那么相对地 BOL 就应该是
beginning of line。

开源 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.

  The regmatch_t structure which is the type of pmatch is defined in


  <regex.h>.

  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.

  没错,先前我们猜测,regmatch_t 对象表示匹配的位置信息,从 regexec 函数返回后,那组


regmatch_t 对象后面无效的部分一定是用一个特殊值来表示无效,这个特殊值就是-1。
    匹 配 位 置 信 息 包 括 起 始 位 置 和 结 束 位 置 , 再 一 猜 就 知 道 , rm_so 表 示 regmatch start
offset,rm_eo 表示 regmatch end offset,要有这样的敏感性,rm_so 和 rm_eo,别的字母都
一样,就 s 和 e 不一样,表示相对概念的 s 和 e 就是 start 和 end,这在程序代码中很常见。还有一个很
常见的现象是结构体成员名字有一个前缀是结构体名字的缩写,比如这里的 rm_表示 regmatch。

  Posix Error Reporting


  regerror() is used to turn the error codes that can be returned by both
  regcomp() and regexec() into error message strings.

  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
嵌入式

  POSIX Pattern Buffer Freeing


  Supplying regfree() with a precompiled pattern buffer, preg will free
  the memory allocated to the pattern buffer by the compiling process,
  regcomp().

  这也和先前猜测的一致。regerror 是把错误码翻译成可读性好的字符串。regfree 是把 preg 对象中


分配的内存释放掉。

  RETURN VALUE
  regcomp() returns zero for a successful compilation or an error code
  for failure.

  regexec() returns zero for a successful match or REG_NOMATCH for fail‐


  ure.

  man page 为了保持形式上的整齐,把 RETURN VALUE 单独拿出来凑成一节,这一直让我觉得很不


舒服。如果在一个 man page 里描述了多个函数,那么每看完一个函数的说明都应该跳到这里来看一下
返回值是什么,而不是把其它函数的说明全部看完了再看这里。事实上这个 man page 做得也不够整齐,
regerror 的返回值就写在上面的说明文字中而没有写在这里。可见把返回值在最后单列出来很不符合书
写和阅读习惯。现在这样搞得很不好,有的返回值单列在后面,有的又写在说明文字中,看手册就得满
世界找返回值在哪儿。我认为这是 man page 的一大缺点。相反,让新手很不舒服的是 man page 太过
简洁,并且没有代码例子,这不是 man page 的缺点而应该是优点。

  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/.

  GNU 1998-05-08 REGEX(3)

  man page 的最后这一段比较有价值的是 SEE ALSO。由于每个 man page 都有自己的主题,而不


会去扯一些离题的话,有时候就需要把几个相关的 man page 结合起来看,从一系列的相关主题中把握
一个 overview。有的 man page 有 BUGS 节,这也是非常重要的,最典型的是 gets(3),前面描述了半
天这个函数是干吗用的,最后在 BUGS 节里面说,Never use gets(),如果没看见这一句,前面的都白
看。

作者简介:宋劲杉,清华大学自动化系硕士,北京亚嵌教育研究中心(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
开源小知识

什么是商业软件(Business Software)? 禁止的,要么需要你申请许可,要么它限制你不


能充分自由地使用它。
  “商业软件”(Business Software)是指通   自由软件基金遵守规定,不在计算机中安装
过交易或贸易方式面向社会公众发行的各种商品 任何私有软件,除非为了编写那个程序的替代品
化的软件。作为商业软件,其功能、性能通常已 而暂时安装到计算机上。除此之外,我们找不到
经过严格测试因而相当可靠,其使用方法应该相 其他借口要安装私有程序。例如,在 80 年代,
当便利。供应商不仅应该向用户提供程序(通常 我们认为在计算机安装 Unix 是正当的,因为我
是目标码文本)和使用说明(通常是手册的形 们要编写一个 Unix 的免费替代品。现在,由于
式),而且应该向用户提供包括版本更新在内的 有了自由操作系统,因此这个借口就不再使用了;
技术服务。 我们消除了所有的非自由操作系统,任何新计算
机上安装的都是自由操作系统。我们不能强迫
开源软件与商业软件是什么关系? GNU 的用户或 GNU 的贡献者必须依此规则行事;
它只是给我们自己制定的规则,但我们希望你能
  商业软件由商业公司开发,通过收取使用费 下决心遵从它。
而牟利。“商业”和“私有”不是一回事。大多
数商业软件是“私有的”,但也有商业自由软件, 什么是公有软件?
也有非商业、非自由的软件。例如,GNU Ada
永远在 GNU GPL 条款下进行分发,而且,每一     所 谓 “ 公 有 软 件 ” ( Public Domain
个拷贝都是免费的,但它的开发者却有付费支持 Software,也可译成“公有领域软件”)是指著
合同。当推销员对用户这样说,有时用户回说, 作权中的经济权利(包括复制权、修改改编权、
“我们觉得商业编译器比较安全一些。”,推销 发行权等专有权利)有效期已经届满的软件,以
员则回答, “GNU Ada 是商业软件,只不过碰 及权利人由于不准备使之商品化而已经明确声明
巧它也是一个自由软件。” 放弃著作权的软件。需要指出,公有软件不同于
  对“商业”的含义可能存在不同理解,但可 开放源代码软件,因为对于开放源代码软件而言,
以确定的虽然开源软件本身可能不会带来很大的 其著作权仍然由其权利人享有,受到著作权法规
收益,但是利用开源软件的商业模式的确可以实 保护。
现商业利益,提供了源代码以外的服务等客户所   对于公有软件,其特点在于:(1)人们可以
需的要素就可以获得持续、稳定的商业利益。 任意复制、传播;(2)人们也可以对公有软件进
行反汇编或者反编译,可以进行反向工程;(3)
什么是私有软件? 人们可以使用、改编、甚至将之纳入为赢利目的
而开发的商业软件,但不得限制其他人也这样做。
  “私有软件”(即 Proprietary Software , 这类软件的知识产权被用尽的或放弃任何知识产
或称“专有软件”),是 FSF 将其作为“自由软件 权的软件,因其进入了公有领域(public
”和“非自由软件”的对立面而对软件作出的分 domain),没有任何人可以对其请求任何的权
类。FSF 对私有软件的解释为: 私有软件不是自 利。
由及非自由软件,对它的使用、传播、或修改是

开源 2008 年第 7 期 140
开源小知识

什么是共享软件? 如何理解“Free Software ”的“Free”?

  试用软件(Share ware,国内也往往译成“   第一层含义是自由。自由软件模式为开发者


共享软件”)。它比普通的商业软件要便宜得多。 提供了将个人智力成果以不同传统的方式贡献给
所谓“试用软件”,是指其复制品也可以通过网 公众的自由, 并保证这种自由符合法律的要求;
络在线服务、电子公告板(BBS)或者从一个用 同时自由软件没有妨碍并且为公众提供了额外的、
户的手里传给另一个用户等途径自由地传播。这 选择的自由。开发者自愿地将其对于软件的自由
种软件的使用说明通常也以文本文件的形式同程 权利授权给其他人,保证了更多人享受到使用软
序一起提供。这种试用软件通常附有一个用户注 件的自由。
意事项,其内容是说明权利人保留对该软件的权   第二层涵义是一定条件下的免费。由于自由
利,因此试用软件受著作权保护;本软件居于试 软件的授权模式不强制免费许可也不强制收费许
用软件,用户通过两个阶段试用之后,如果希望 可,因此,对于已经进入社区(流通领域)的开
继续使用,就应该向供应者办理使用注册手续。 源软件而言,获得这些软件大都不必付费。
用户注意事项中通常包含一份注册表格,并说明   了解哲学观念中“没有绝对的自由”是理解
如何以及向何处办理注册手续,在办理注册手续 这个概念的一把钥匙,开发者和用户的“自由”
时可能会要求用户交纳一定费用,实际上就是使 都是建立在符合法律和协议要求的前提下的自由;
用许可费,需要交付的使用许可费的款额通常是 “天下没有不要钱的午餐”这句话的道理不在于
很低的(几美元或者几十美元)。 这个午餐是不是一定要付钱,而是说是不是要有
  对免费软件通常的理解是不必支付费用就可 代价,“免费”获得开源软件也是一样道理。
以免费获得使用权的软件。而恰巧开源软件在多   总之,“自由”和“免费”都是附有条件的,
数场合被称作“Free software”。在许多语言中, 这个条件就是协议(合同)规定的“对价”,自
“free”一词有两种意义:一是自由,二是免费。 愿地履行开源协议的“对价”不存在对合同任何
如 法 语 的 “ libre” 和 “ gratuit” , 英 语 的 一方造成损害,不过可以确定的是,如果不履行
“gratis”都明白无误地指价格(免费),但没 “对价”,合同就可能不成立,这显然对合同双
有明白无误地说明“自由”的意义。这是不幸的 方都没有好处,不能实现订立合同的宗旨。
因为如果有这个词,在此处它将非常有用。
什么是“开放源代码”?
开源软件与免费软件的关系如何?
  OSI 给出开放源代码的定义的目的是:把所
  开源软件通常以免费方式发布,大部分开源 确信的、由软件开发团体所公认的“开放源代码
软件可以免费获得。但是只要开源软件的许可人 ”的含义作为一组具体的准则写下来。该准则确
或再许可人愿意,可以收取费用。开源是不排斥 保按照开放源代码许可证发布的软件可以得到与
收费行为的,而免费软件一定是免费获得的。同 其他软件同样认真的评审、使软件可以不断地得
时免费软件可能是专有软件,只授权免费使用, 到改良和遴选,从而提供非开放软件所难以提供
但不开放供源代码。因此,开源软件与免费软件 的可靠性与能力。
是两个不同层面的概念,需要区别对待。   OSI 认为开放源代码定义涵盖了由绝大多数

开源 2008 年第 7 期 141
开源小知识

软件团体使用的术语“开放源代码”的最初含义 Windows 源代码,但用户只能看或提出修改意


和当前含义。然而,该术语被广泛地应用,并且 见,而不能对它有任何修改。
它的含义变得不精确了。   开放源代码与公开源代码的相同之处是二者
都保证源代码被公开,即源代码以某种方式为人
“开放”源代码就是“公开”源代码吗? 所知悉。但“开源”与“公开”源代码存在根本
的查差别。开源软件的许可人不仅仅提供源代码
  以微软为代表的“共享源代码”( Shared 以供其他人参考,同时还许可其他人可以将软件
Source )的实质是仅仅公开源代码(且非全部公 运行、修改和再授权。更直白的解释就是“公开
开)。这是微软为应对“开放源代码运动”而提 ”源代码只能“看”,“不能用、不能改、更不
出的新策略,它与 Open Source 最大的不同在 能再发布”;而“开放”源代码不仅能看,还“
于,微软向他的大客户拷贝其绝对机密的 能用、能改、能再发布”。

开源 2008 年第 7 期 142
开源小知识

开源 2008 年第 7 期 143

You might also like