工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.wdlinux.cn 注册 | 登陆
浏览模式: 标准 | 列表全部文章

深度解析开源软件与赢利模式

在开源的世界里,研究与开发是分离的,二者由不同的实体完成。社区或志愿者进行研究活动,发布研究成果——源代码,而商业公司根据公开的源代码继续开发,将源代码转变为软件产品、服务,从而获利。这样,既促进了知识的共享,同时又能确保知识转化为可靠的商品。

“开源软件”的由来

2005年8月3日,以Firefox浏览器而闻名的开源软件领军组织之一Mozilla基金会,宣布成立一家名为Mozilla Corporation的全资子公司,希望通过这一盈利机构推动开源软件的发展。此消息一经传出,立即在全球开源社区引发了不小的震动。

不少开源社区成员表示愤慨,认为这是对开源精神的玷污。然而,仔细追溯开源软件运动的来龙去脉后,可以肯定的是,Mozilla基金会既不是第一家,也肯定不是最后一家投入到资本和商业怀抱的开源组织。

20年前,由于无法忍受商业软件对知识分享和创新的压制与扼杀,里查德·斯托尔曼(Richard Stallman)率领一帮技术高手揭杆而起,向以微软为代表的商业软件组织发动了一场浩浩荡荡的挑战——自由软件运动。

自由软件运动高举“自由、共享”的旗帜,大力揭露并批判传统商业软件组织封闭软件源代码,利用知识霸权扼杀创新的行径。它掀开了软件发展史上崭新的一页,越来越多的人积极投身到这一历史洪流中,而以Linux为代表的自由软件也如同雨后春笋一般涌现出来。

斯托尔曼本人被尊为“自由软件之父”。

然而,在打倒商业软件知识霸权这样一个极端的同时,自由软件运动似乎在打造另外一个极端。斯托尔曼在批判资本的同时,却忽视或有意忽略了资本及商业运作对软件产业的促进作用,将“自由软件”与“商业运作”刻意对立起来。

自由软件的授权许可协议GPL中就生动地体现了这种对立:你一旦使用了以GPL协议发布的软件,就必须在后续开发中永远使用GPL协议,不得用于商业目的。这种对立在一定程度上阻碍了自由软件的发展。

幸运的是,在对“自由软件运动”以及斯托尔曼的一片狂热追捧中,另一位著名人士终于对这种狂热和极端说“不”了。他就是《大教堂与市集》一书的作者、“自由软件运动”的理论家艾瑞克·雷蒙德(Eric Raymond)。

1998 年,雷蒙德和Debian工程的创始人Bruce Perens一道,号召用“开放源代码软件”(简称“开源软件”)代替“自由软件”。虽然这一举动被斯托尔曼斥责,但越来越多的人接受了雷蒙德的提法。研究表明,“开源软件”一词的使用频率已经远远超过了“自由软件”。

深层解读开源软件

从自由软件到开源软件,雷蒙德从概念和理论上清除了“开源”和“商业”之间的障碍,“开源软件”可以进行商业化运作,“商业软件”同样也可以选择“开源”。

“开源”的目的是方便知识共享,而商业化运作则是为了将停留在“知识”层面的软件代码与文档转变为“软件商品”,从而使知识转化为现实生产力。

对于个人用户而言,他们更喜欢那些源码开放的自由软件,并不在乎软件背后是否有正规的企业提供升级、打补丁等服务,但是企业用户却不会为了便宜就信任一家随时可能消失的软件组织,享受免费的服务。

而要想深入理解自由软件和开源软件之间的区别,以及为什么开源软件也可以进行商业化运作,就必须从软件生产的本质——“知识创新”谈起。

知识创新可以分为两个阶段:研究与开发。研究阶段的产物是纯粹的知识,不是直接提供给用户应用,而是提供给研究人员自己,作为继续开发的基础。开发阶段则是将研究成果加以商业化应用,将其转变为用户可以直接使用的产品。

那么,按照这种划分标准,软件的源代码应该是研究阶段的产物,因为它们本身不能被用户直接应用,还必须对源代码进行编译、连接、打包、部署,并辅以齐全的质量保证措施与售后服务,才转变为用户可以直接使用的软件产品。

由此,构思和编写源代码的过程可以看作是软件的研究阶段,而将源代码转变为软件包并提交给用户的过程可以看作是软件的开发阶段。

传统的商业软件公司将软件的研究与开发完全置于内部的创新模式之下,包括以下步骤:

编写源代码——申请软件专利——将专利转变为软件产品、服务。

而“自由软件”则完全与之相反,软件的研究与开发过程完全由松散的社区完成。

不难看出,传统商业软件和自由软件是两个极端。前者对知识的共享和相互借鉴有一定的妨碍作用,而后者则无法保证将知识转化为商品。

而开源软件则采取了折中方式,它将研究活动与开发活动进行分离,由不同的实体加以完成:由社区或志愿者进行研究活动,发布研究成果——源代码。而商业公司继续开发公开的源代码,将源代码转变为软件产品与服务,从中获利。

这样,既促进了知识的共享,同时又确保知识转化为可靠的商品。社区成员可以借鉴并利用他人的研究成果,每个人都只需要贡献自己微薄的力量便可产生“众人拾柴火焰高”的累积效应。而企业将社区的研究成果转变为产品,促进了社区的研究成果的应用,反过来又可以为社区提供大量资金。社区与企业相互促进,形成了开源软件不断发展、创新的良性循环。

开源软件的商业化历程

开源软件的商业化历程大致经历了以下几个阶段:

萌芽阶段(1995年以前)

在1995年红帽软件公司正式成立以前,开源社区基本上没有考虑过商业化运作的问题。大家都在热火朝天地探讨各种技术问题,在社区中发布各种很酷的开源软件新版本,几乎没人想到从开源软件中赚钱。

与开源软件有关的商业活动仅限于出售开源软件安装盘及书籍、印有开源软件标志的文化衫等小玩意。

但是这种商业行为当时并没有获得开源社区的尊重,从事这些活动的人也被社区的成员嗤为小商贩。

当初谁也没有想到是,就在这群毫不起眼的小商贩中,竟然走出了两位后来在开源界赫赫有名的大人物,他们就是红帽软件公司的两位创始人Young和Marc Ewing。

探索阶段(1995~2001年)

1995年,Young购买了Ewing的股份,把新公司命名为红帽软件,同时发布Redhat Linux2.0。红帽公司的成立,拉开了开源软件探索商业运作的序幕。

在红帽的率领和激励下,越来越多的人从开源软件身上嗅到了商机,各种从事开源软件事业的商业机构蓬勃发展。在中国,1999~2000年间,短短两年就涌现出红旗Linux、中软Linux、蓝点Linux、冲浪Linux、TurboLinux、TomLinux等品牌,联想也推出了“幸福Linux”。

不过在这一阶段,开源软件并没有找到真正的商业模式,大部分只停留在概念炒作层面。因此,当潮流退去后,一些当年大出风头的开源厂商也销声匿迹了。

发展阶段(2001~2003年)

2002年前后,随着网络泡沫的破灭,开源软件的神话也随之被打破。大量缺乏真正商业模式的开源软件企业面临尴尬境地,要么倒闭,要么退出开源软件市场。剩下几家经受住了市场锤炼的开源软件厂商慢慢冷静下来,潜心寻找适合自己的商业模式。

在寻找的过程中,一些较早探索出商业模式的开源企业,挺过了IT行业的寒冬,发展迅速,如红帽、JBoss、MySQL等。

融合阶段(2004~2006年)

2003年11月,曾叱咤风云的软件巨头Novell收购了排名全球第二的Linux发行商Suse,借助Linux实现战略转型。

Novell的做法为开源软件的商业运作提供了全新思路,产生了深远影响。

在Novell的推动下,开源软件开始与商业软件和平共处,开源软件不再停留在小打小闹阶段,而是走进金融、电信等行业大户的视野,刷新了在企业用户心目中的形象。

与此同时,原来在幕后支持开源软件的IT巨头也开始更直接地介入开源软件的发展。如IBM于2005年5月收购开源软件Gluecode,2005年11月率众成立开源文档基金会;SUN公司从2005年6月开始,逐步开放Solaris等多款软件的源代码。

困惑软件界许久的“保护知识产权”与“促进知识共享及创新”之争逐渐平息,现在关注的焦点转换为:开放到哪一程度以及以什么方式开源。

欧盟委员会曾于2004年3月以滥用市场垄断地位,违反欧盟公平竞争法为由,要求微软向其竞争对手公布必要的技术信息,并处以微软处5亿欧元罚款。2006年初,微软终于作出让步,开放Windows部分源代码。

这表明,自由软件和传统商业软件所代表的两个极端终于各让一步,初步达成妥协,妥协达成的折中点是就是“开源软件”。斯托尔曼所希望的自由软件战胜商业软件的结局并没出现,还是雷蒙德笑到了最后。

开源软件的商业模式

经过研究与归纳,开源软件的商业模式大致包括以下几种:

1.免费软件+收费硬件

IBM、SUN、惠普等公司,在开源软件领域投入巨大,但这一切并非是做善事,它们可以从配置了开源软件的硬件中获取巨额回报。

2.免费知识+收费书籍(培训)

开源软件出版商O’Reilly公司组织各种开源软件会议,推进开源理念和开源软件技术的传播与发展,以出售书籍赢利。中国的即时科研集团目前也在大力开展Linux培训,其赢利模式如出一辄。

3.免费程序+收费实施

一些开源软件厂商免费提供系统的程序代码,靠提供技术服务赚钱。JBoss就是这种模式的典型代表。JBoss应用服务器软件程序完全免费,而技术文档、培训、二次开发支持等技术服务则是收费的。

4.免费社区版+收费企业版

对于一些通用软件,如操作系统和数据库软件,开源软件厂商一般采用针对不同用户,提供不同版本的方式。在这种模式中,利用免费版本软件为赢利的收费版本创造或维持一种市场地位。这种模式较为普遍。

例如,MySQL产品就同时推出面向个人和企业的两种版本,即开源版本和专业版本,分别采用不同的授权方式。开源版本完全免费以便更好的推广,公司通过专业版的许可销售和支持服务获得收入。

5.开源软件+商业软件

将免费的开源软件与可赢利的商业软件捆绑销售,以开源软件带动商业软件的销售,这也是不错的商业模式。

比如Novell就将自己原来丰富的中间软件和应用软件迁移到Linux平台上,通过与Linux捆绑,为客户提供高价值的综合解决方案。红旗和Turbolinux也在积极加强与应用软件厂商的联系或自己开发商业软件,通过附加更多的商业软件来增加收入。

6.免费软件+收费专业服务

这种模式的典型代表是SourceLabs公司和SpikeSource公司。这些公司并不主推自己的产品品牌,而是与多方开源软件厂商或社区合作,利用他人提供的开源软件,提供技术测试、集成、维护等服务。

这种模式中,公司的角色跟原来的系统集成商有点类似。他们把开源软件打包到事先经过鉴定、并且受支持的标准化堆栈中。为了让各种各样的软件组件正常地协同工作,他们帮助客户配置及测试这些软件组件,而预先设计并经过鉴定的堆栈有助于缩短配置与测试时间。

结语

目前在中国,对于开源软件的商业运作问题存在两个严重问题:一是依然按照传统商业软件的模式来运作开源软件,从国际开源社区那里免费地获取源代码,稍作修改后变成自己的产品,然后出售软件许可。

二是紧抱“自由软件”的陈旧概念,认为软件产品就应该“自由”(其实是免费)地使用,低估了软件产品和服务的价值,与全球正在积极推进的知识产权保护做法背道而驰。

“开源软件”强调的是“开源”,可不少人和公司依然简单地把它理解为另一款或另一种产品,这是十分危险的。现在,IBM在开源,SUN在开源,甲骨文在开源,微软也在开源。等到某一天,微软完全开源了,国内的这些“开源软件”企业还有什么卖点可以鼓吹呢?

疯狂的一夜

今晚去喝酒,去唱K,可以说,玩得很疯.算得生平中最疯狂的一次.应该说是那个场面.可我却玩不起劲来....

男人,女人,在一起,便是疯狂的开始.

也第一次听女人说,好男人,就是笨男人.想想好像也很有道理.

 

中日韩Linux项目组建新公司进入倒计时

来自:腾讯科技讯
日前,中科红旗新任CEO贾栋向腾讯科技表示,Asianux公司的组建将在年内正式完成。同时,今年也将有两个亚洲国家Linux公司新加入Asianux。

Asianux是中日韩三国民间企业所推出的一个联合Linux品牌,在亚洲统一推广。三家企业分别为,中国中科红旗,日本Miracle Linux公司,及韩国韩软公司。 2006年4月,中科红旗曾对外宣布,Asianux公司的总部会设立在北京点击查看北京及更多城市天气预报,并成为Asianux开发、技术支持和营销活动的中心。

贾栋介绍,Asianux公司正式成立后,希望在3年内成为亚洲市场排名第一的Linux企业。而中方有望担任新公司的首位领导者。

根据介绍,新公司有望在年内正式获批。同时,2个月后将有两个亚洲国家的Linux公司新加入Asianux,使三国变成五国。这一数字还将继续扩充,贾栋表示,一年后,Asianux公司所囊括的公司将变成7家。不过,中科红旗没有介绍即将加入的公司的名单及其所处国家。

此前资料显示,Asianux希望继续寻找其它亚洲合作伙伴,拓展市场范围,目标是IT市场年平均复合增长率(CAGR)在10%以上的国家,例如印度、泰国、马来西亚、印度尼西亚、菲律宾和越南等地。

目前Asianux采用的是共同研发Linux 操作系统,并由参与方独占当地市场及提供一线城市技术支持这一方式进行。按照进展,Asianux将于7月底正式发布Linux操作系统服务器3.0版(Asianux Server 3)。中科红旗销售总监耿增强介绍说,从Asianux Server 3开始,Asianux将使用统一品牌,一改此前在各国市场采用当地各自公司品牌的做法。

耿增强也透露,Asianux有计划推出自己的桌面版Linux操作系统,甚至计划推出自己的移动版操作系统,以结束只有服务器版本的历史。只是尚未透露具体的时间安排。

Linux网络安全经验之谈

关于分区
  
  一个潜在的黑客如果要攻击你的Linux服务器,他首先就会尝试缓冲区溢出。在过去的几年中,以缓冲区溢出为类型的安全漏洞是最为常见的一种形式了。更为严重的是,缓冲区溢出漏洞占了远程网络攻击的绝大多数,这种攻击可以轻易使得一个匿名的Internet用户有机会获得一台主机的部分或全部的控制权!
  
  为了防止此类攻击,我们从安装系统时就应该注意。如果用root分区纪录数据,如log文件和email,就可能因为拒绝服务产生大量日志或垃圾邮件,从而导致系统崩溃。所以建议为/var开辟单独的分区,用来存放日志和邮件,以避免root分区被溢出。最好为特殊的应用程序单独开一个分区,特别是可以产生大量日志的程序,还有建议为/home单独分一个区,这样他们就不能填满/分区了,从而就避免了部分针对Linux分区溢出的恶意攻击。
  
  关于BIOS
  
  记着要在BIOS设置中设定一个BIOS密码,不接收软盘启动。这样可以阻止不怀好意的人用专门的启动盘启动你的Linux系统,并避免别人更改BIOS设置,如更改软盘启动设置或不弹出密码框直接启动服务器等等。
  
  关于口令
  
  口令是系统中认证用户的主要手段,系统安装时默认的口令最小长度通常为5,但为保证口令不易被猜测攻击,可增加口令的最小长度,至少等于8。为此,需修改文件/etc/login.defs中参数PASS_MIN_LEN(口令最小长度)。同时应限制口令使用时间,保证定期更换口令,建议修改参数PASS_MIN_DAYS(口令使用时间)。
  
  关于Ping
  
  既然没有人能ping通你的机器并收到响应,你可以大大增强你的站点的安全性。你可以加下面的一行命令到/etc/rc.d/rc.local,以使每次启动后自动运行,这样就可以阻止你的系统响应任何从外部/内部来的ping请求。
  
  echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
  
  关于Telnet
  
  如果你希望用户用Telnet远程登录到你的服务器时不要显示操作系统和版本信息(可以避免有针对性的漏洞攻击),你应该改写/etc/inetd.conf中的一行象下面这样:
  
  telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h
  
  加-h标志在最后使得telnet后台不要显示系统信息,而仅仅显示login。
  
  关于特权账号
  
  禁止所有默认的被操作系统本身启动的且不需要的帐号,当你第一次装上系统时就应该做此检查,Linux提供了各种帐号,你可能不需要,如果你不需要这个帐号,就移走它,你有的帐号越多,就越容易受到攻击。
  
  为删除你系统上的用户,用下面的命令:userdel username
  
  为删除你系统上的组用户帐号,用下面的命令:groupdel username
  
  在终端上打入下面的命令删掉下面的特权用账号:
  
  userdel adm
  
  userdel lp
  
  userdel sync
  
  userdel shutdown
  
  userdel halt
  
  userdel mail
  
  如果你不用sendmail服务器,就删除这几个帐号:
  
  userdel news
  
  userdel uucp
  
  userdel operator
  
  userdel games
  
  如果你不用X windows 服务器,就删掉这个帐号。
  
  userdel gopher
  
  如果你不允许匿名FTP,就删掉这个用户帐号:
  
  userdel ftp
  
  关于su命令
  
  如果你不想任何人能够su为root的话,你应该编辑/etc/pam.d/su文件,加下面几行:
  
  auth sufficient /lib-
  
  /security/pam_rootok-
  
  .so debug
  
  auth required /lib-
  
  /security/pam_wheel-
  
  .so group=isd
  
  这意味着仅仅isd组的用户可以su作为root。如果你希望用户admin能su作为root.就运行下面的命令:
  
  usermod -G10 admin
  
  suid程序也是非常危险的,这些程序被普通用户以euid=0(即root)的身份执行,只能有少量程序被设置为suid。用这个命令列出系统的suid二进制程序:
  
  suneagle# find / -perm -4000 -print
  
  你可以用chmod -s去掉一些不需要程序的suid位。
  
  关于账户注销
  
  如果系统管理员在离开系统时忘了从root注销,系统应该能够自动从shell中注销。那么,你就需要设置一个特殊的 Linux 变量“tmout”,用以设定时间。 同样,如果用户离开机器时忘记了注销账户,则可能给系统安全带来隐患。你可以修改/etc/profile文件,保证账户在一段时间没有操作后,自动从系统注销。 编辑文件/etc/profile,在“histfilesize=”行的下一行增加如下一行:
  
  tmout=600
  
  则所有用户将在10分钟无操作后自动注销。注意:修改了该参数后,必须退出并重新登录root,更改才能生效。
  
  关于系统文件
  
  对于系统中的某些关键性文件如passwd、passwd.old、passwd._、shadow、shadown._、inetd.conf、services和lilo.conf等可修改其属性,防止意外修改和被普通用户查看。 如将inetd文件属性改为600:
  
  # chmod 600 /etc/inetd.conf
  
  这样就保证文件的属主为root,然后还可以将其设置为不能改变:
  
  # chattr +i /etc/inetd.conf
  
  这样,对该文件的任何改变都将被禁止。 你可能要问:那我自己不是也不能修改了?当然,我们可以设置成只有root重新设置复位标志后才能进行修改:
  
  # chattr -i /etc/inetd.conf
  
  关于用户资源
  
  对你的系统上所有的用户设置资源限制可以防止DoS类型攻击,如最大进程数,内存数量等。例如,对所有用户的限制, 编辑/etc/security/limits.con加入以下几行:
  
  * hard core 0
  
  * hard rss 5000
  
  * hard nproc 20
  
  你也必须编辑/etc/pam.d/login文件,检查这一行的存在:
  
  session required /lib/security/pam_limits.so
  
  上面的命令禁止core files“core 0”,限制进程数为“nproc 50“,且限制内存使用为5M“rss 5000”。
  
  关于NFS服务器
  
  由于NFS服务器漏洞比较多,你一定要小心。如果要使用NFS网络文件系统服务,那么确保你的/etc/exports具有最严格的存取权限设置,不意味着不要使用任何通配符,不允许root写权限,mount成只读文件系统。你可以编辑文件/etc/exports并且加:
  
  /dir/to/export host1.mydomain.com(ro,root_squash)
  
  /dir/to/export host2.mydomain.com(ro,root_squash)
  
  其中/dir/to/export 是你想输出的目录,host.mydomain.com是登录这个目录的机器名,ro意味着mount成只读系统,root_squash禁止root写入该目录。最后为了让上面的改变生效,还要运行/usr/sbin/exportfs -a
  
  关于开启的服务
  
  默认的linux就是一个强大的系统,运行了很多的服务。但有许多服务是不需要的,很容易引起安全风险。这个文件就是/etc/inetd.conf,它制定了/usr/sbin/inetd将要监听的服务,你可能只需要其中的两个:telnet和ftp,其它的类如shell, login, exec, talk, ntalk, imap, pop-2, pop-3, finger, auth, etc. 除非你真的想用它。否则统统关闭之。
  
  你先用下面的命令显示没有被注释掉的服务:
  
  grep -v "#" /etc/inetd.conf
  
  这个命令统计面前服务的总数:
  
  ps -eaf|wc -l
  
  需要提醒你的是以下三个服务漏洞很多,强烈建议你关闭它们:S34yppasswdd(NIS服务器)、S35ypserv(NIS服务器)和S60nfs(NFS服务器)。
  
  我们可以运行#killall -HUP inetd来关闭不需要的服务。当然,你也可以运行
  
  #chattr +i /etc/inetd.conf
  
  如果你想使inetd.conf文件具有不可更改属性,而只有root 才能解开,敲以下命令
  
  #chattr -i /etc/inetd.conf
  
  当你关闭一些服务以后,重新运行以上命令看看少了多少服务。运行的服务越少,系统自然越安全了。我们可以用下面命令察看哪些服务在运行:
  
  netstat -na --ip
  
  如果你用的是Redhat那就方便多了。^_^ Redhat提供一个工具来帮助你关闭服务,输入/usr/sbin/setup,然后选择"system services",就可以定制系统启动时跑哪些服务。另外一个选择是chkconfig命令,很多linux版本的系统都自带这个工具。脚本名字中的数字是启动的顺序,以大写的K开头的是杀死进程用的。
  
  关于日志
  
  所有的日志都在/var/log下(仅对linux系统而言),默认情况下linux的日志就已经很强大了,但除ftp外。因此我们可以通过修改/etc/ftpaccess 或者/etc/inetd.conf,来保证每一个ftp连接日志都能够纪录下来。下面是一个修改inetd.conf的例子,假如有下一行:
  
  ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -L -i -o
  
  注释:
  

  -l每一个ftp连接都写到syslog
  
  -L纪录用户的每一个命令
  
  -i文件received,纪录到xferlog
  
  -o文件transmitted,记录到xferlog
  
  不过你也不要太相信日志,因为绝大部分黑客都有“擦脚印”的“好”习惯啰!如果你不放心,最好安装一个Sniffer吧。
  
  关于TCP_WRAPPERS
  
  默认的,Redhat Linux允许所有的请求,这是很危险的。如果用TCP_WRAPPERS来增强我们站点的安全性简直是举手之劳,你可以将禁止所有的请求放入“ALL: ALL”到/etc/hosts.deny中,然后放那些明确允许的请求到/etc/hosts.allow中,如:
  
  sshd: 192.168.1.10/255.255.255.0 gate.openarch.com
  
  对IP地址192.168.1.10和主机名gate.openarch.com,允许通过ssh连接。配置完了之后,用tcpdchk检查,你可以直接执行:tcpdchk 。在这里,tcpchk是TCP_Wrapper配置检查工具,它检查你的tcp wrapper配置并报告所有发现的潜在/存在的问题。
  
  关于补丁
  
  你应该经常到你所安装的Linux系统发行商的主页上去找最新的补丁。例如:对于Redhat系统而言可以在:http://www.redhat.com/corp/support/errata/上找到补丁。幸运的是,在Redhat6.1以后的版本带有一个自动升级工具up2date,它能自动够测定哪些rpm包需要升级,然后自动从Redhat的站点下载并完成安装。这对某些懒惰的管理员来说,可是个省精神的福音哦!^_^

转截

Linux下忘记root密码的解决方法

  使用单用户模式  
  在Linux启动后出现boot:提示时,输入linux single 或 linux 1,就能进入系统了.进了系统,就可以改密码或是增加用户了.或者直接编辑Passwd文件,去掉root一行中的x即可。
  这里也存在一个安全问题,如果你的机器能让非授权的人接触到,就可以用这个方法进入到你的系统.或者你进入别人的系统.


  防范对策
  
  以超级用户(root)进入系统,编辑/etc/inittab文件,改变id:3:initdefault的设置,在其中额外加入一行(如下),让系统重新启动进入单用户模式的时候,提示输入超级用户密码:
  
  ~~:S:walt:/sbin/sulogin
  
  然后执行命令:/sbin/init q,使这一设置起效

使用 SystemTap 调试内核

原文:http://www.ibm.com/developerworks/cn/linux/l-systemtap/
 

桂 剑 (guijian@cn.ibm.com), IBM 中国开发中心,Linux Performance 项目软件工程师

2006 年 12 月 14 日

 


 

SystemTap 是一种新颖的 Linux 内核诊断工具,提供了一种从运行中的 Linux 内核快速和安全地获取信息的能力。SystemTap 是内核开发人员和系统管理员的福音,因为这使得他们可以通过编写或者重用简单的脚本来收集内核的实时数据,而不需要再忍受修改源码、编译内核、重启系统的漫长煎熬。本文介绍了 SystemTap 的安装、使用和基本原理,并用一些有趣的例子揭示了 SystemTap 提供的强大能力。

在 SystemTap 出现之前,对于 Linux 程序员或者系统管理员而言,调试内核往往是一场噩梦。例如,你怀疑传递给系统调用 read 的参数 fd 出了问题,想把它打印出来,你需要做的是:首先得到一份内核源码,找到 sys_read() 的函数体中插入 printk() 语句,接下来重新编译内核,然后用新的内核重新启动系统。谢天谢地,你总算看到了你想要看到的东西,不过你马上会发现遇到了一个新的麻烦:除非重新启动系统到原来的内核,printk() 会无休止地打印下去。

SystemTap 的目的就是要把人们从这种泥潭中解救出来。SystemTap 提供了一个简单的命令行接口和强大的脚本语言,同时预定义了丰富的脚本库。基于内核中的 kprobe,SystemTap允许你自由地从运行中的内核无害地收集调试信息和性能数据,来用于之后的分析和处理。你可以随时开始或者停止这种收集过程,而无需漫长的修改代码、编译内核和重启系统的悲惨循环。SystemTap 使得上面的问题变得简单了,简单得只需要一条命令就可以做到:


stap -e 'probe syscall.read { printf("fd = %d\n",fd) }

SystemTap的功能和Sun的DTrace和IBM的dprobe工具相似。但是和它们不同的是, SystemTap是遵循GPL的开源软件项目。它的出现使得Linux社区也拥有了功能强大而且易于使用的动态内核调试工具。目前,SystemTap的主要开发成员来自于RedHat、IBM、Intel和Hitachi,其中还包括来自IBM中国开发中心的工程师。



安装SystemTap

在安装SystemTap之前,需要确保系统中已经安装了其它两个软件包:

  • kernel-debuginfo RPM:SystemTap需要通过内核调试信息来定位内核函数和变量的位置。对于通常的发行版,并没有安装kernel-debuginfo RPM,我们可以到发行版的下载站点下载。对于我的ThinkPad上的Fedora Core 6,这个地址是: http://download.fedora.redhat.com/pub/fedora/linux/core/6/i386/debug/
  • elfutils RPM:SystemTap需要elfutils软件包提供的库函数来分析调试信息。目前的SystemTap要求安装elfutils-0.123以上版本。目前最新的版本是0.124-0.1。如果需要,我们可以从SystemTap的站点下载RPM或者源码来升级。下载地址是: ftp://sources.redhat.com/pub/SystemTap/elfutils/i386/

接下来就可以安装SystemTap了,这有通过RPM或者源码安装两种方式:

1. 通过RPM安装 Fedora Core 6缺省情况下已经安装了systemtap。如果没有,也可以从如下的地址下载: http://download.fedora.redhat.com/pub/fedora/linux/
core/updates/testing/6/i386/SystemTap-0.5.10-1.fc6.i386.rpm

2.通过源码安装:

从SystemTap的FTP站点下载最新的源码

ftp://sources.redhat.com/pub/SystemTap/snapshots/SystemTap-20061104.tar.bz2

然后安装如下:


/root > tar -jxf SystemTap-20061104.tar.bz2
/root > cd src
/root/src> ./configure
/root/src> make
/root/src> make install




 

运行SystemTap

运行SystemTap首先需要root权限。

运行SystemTap有三种形式:

1. 从文件(通常以.stp作为文件名后缀)中读入并运行脚本:stap [选项] 文件名

2. 从标准输入中读入并运行脚本: stap [选项] -

3. 运行命令行中的脚本:stap [选项] -e 脚本

4. 直接运行脚本文件(需要可执行属性并且第一行加上#!/usr/bin/stap):./脚本文件名使用"Ctrl+C"中止SystemTap的运行。

systemtap的选项还在不断的扩展和更新中,其中最常用的选项包括:

-v -- 打印中间信息

-p NUM -- 运行完Pass Num后停止(缺省是运行到Pass 5)

-k -- 运行结束后保留临时文件不删除

-b -- 使用RelayFS文件系统来将数据从内核空间传输到用户空间

-M -- 仅当使用-b选项时有效,运行结束时不合并每个CPU的单独数据文件

-o FILE -- 输出到文件,而不是输出到标准输出

-c CMD -- 启动探测后,运行CMD命令,直到命令结束后退出

-g -- 采用guru模式,允许脚本中嵌入C语句

其它更多选项请参看stap的手册。



SystemTap的语法

我们利用一个简单的systemtap脚本来介绍一下SystemTap的语法:


#!/usr/local/bin/stap
global count
function report(stat) {
        printf("stat=%d\n", stat)
}
probe kernel.function("sys_read") {
        ++count
}
probe end {
        report()
}

  • 探测点(probe):每个systemtap脚本中至少需要定义一个探测点,也就是指定了在内核的什么位置进行探测。探测点名称后面紧跟的一组大括号内定义了每次内核运行到该探测点时需要运行的操作,这些操作完成后再返回探测点,继续下面的指令。这里给出了systemtap目前支持的所有探测点类型。
  • 全局变量(global):用来定义全局变量。单个探测点函数体中使用的局部变量不需要预先定义,但是如果一个变量需要在多个探测点函数体中使用,则需要定义为全局变量。
  • 函数(function):用来定义探测点函数体中需要用到的函数。除了可以用脚本语言定义函数以外,还可以用C语言来定义函数,只是这时函数名后面的大括号对需要换成%{ %}。例如,前面的report()函数可以写成:
    function report(stat) %{
    		_stp_printf("stat=%d\n", THIS->stat);
    	%}



SystemTap的例子

了解了SystemTap的基本用法,下面让我们来看几个有趣的例子。

统计当前系统中调用最多的前10个系统调用

在进行性能分析的时候,我们常常需要知道那些函数调用次数最多,才能有的放矢地展开分析。下面这个简单的例子可以打印出在过去的5秒钟里调用次数最多的那些系统调用。


#!/usr/bin/env stap
#
# display the top 10 syscalls called in last 5 seconds
#
global syscalls
function print_top () {
        cnt=0
        log ("SYSCALL\t\t\t\tCOUNT")
        foreach ([name] in syscalls-) {
                printf("%-20s\t\t%5d\n",name, syscalls[name])
                if (cnt++ == 10)
                        break
        }
        printf("--------------------------------------\n")
        delete syscalls
}
probe syscall.* {
        syscalls[probefunc()]++
}
probe timer.ms(5000) {
        print_top ()
}

它的输出结果一目了然:


图

看看是谁在偷偷动我的文件

有时候,我们如果中了恶意的病毒软件,会发现某些文件莫名其妙的被修改,下面这个例子可以帮你监视谁在修改你的文件。


#!/usr/bin/env stap
#
# monitor who is messing my file of secrets
#
probe generic.fop.open {
        if(filename == "secrets")
                printf("%s is opening my file: %s\n", execname(), filename)
}

我们运行这个脚本,在另外一个窗口做一些操作,来看看它的输出结果:


图

打印ANSI字符串

SystemTap不仅仅是一个简单的调试工具,强大的脚本语言能力让它同样能做一些有趣的事情,下面这个例子就可以对输出的字符进行美化:


#!/usr/bin/env stap
#
# print colorful ANSI strings
#
probe begin {
        printf("a \\ b |");
        for (c = 40; c < 48; c++)
                printf("   %d   ", c);
        printf("\12");
        for (l = 0; l < 71; l++)
                printf("-");
        printf("\12");

        for (r = 30; r < 38; r++)
                for (t = 0; t < 2; t++) {
                        printf("%d    |", r);
                        for (c = 40; c < 48; c++)
                                printf("\033[%d;%d%s %s \033[0;0m",
                                        r, c, !t ? "m" : ";1m", !t ? "Normal" : "Bold  ");
                        printf("\12");
                }
        exit();
}

来看看它的输出:


图


SystemTap的基本原理


图

现在,大家已经熟悉了SystemTap的基本用法。在结束之前,让我们再来了解一下SystemTap的基本原理和工作流程以加深理解。

可以看出,SystemTap运行的过程依次分为五个阶段,通常称为Pass 1 - Pass 5。就像前面介绍用法的时候提到的,在命令行中加上-p NUM选项可以使得SystemTap在运行完Pass NUM之后停止,而不是运行到Pass 5。这允许你分析SystemTap在每一个阶段的输出,对于调试脚本尤其有用。

下面来介绍每一个阶段的主要功能:

  • Pass 1 - parse:这个阶段主要是检查输入脚本是否存在语法错误,例如大括号是否匹配,变量定义是否规范等
  • Pass 2 - elaborate:这个阶段主要是对输入脚本中定义的探测点或者用到的函数展开,不但需要综合SystemTap的预定义脚本库,还需要分析内核或者内核模块的调试信息
  • Pass 3 - translate: 在这个阶段,将展开后的脚本转换成C文件。前三个阶段的功能类似于编译器,将.stp文件编译成为完整的.c文件,因此又被合起来称为转换器(translator)
  • Pass 4 - build:在这个阶段,将C源文件编译成内核模块,在这过程中还会用到SystemTap的运行时库函数。
  • Pass 5 - run:这个阶段,将编译好的内核模块插入内核,开始进行数据收集和传输。



小结

SystemTap是一个全新的工具,但已经表现出了强大的功能和广泛的适用性。SystemTap使得动态收集Linux内核信息和性能数据变得轻而易举,这就使人可以从繁琐的数据采集中解放出来,而专注于数据的处理和分析,这无疑是内核开发人员和系统管理人员的福音。随着越来越多用户的体验,越来越多的bug会被报告和修正,越来越多的新功能会被添加,SystemTap也会变得越来越稳定和完善。



 

参考资料



 

关于作者

 

桂剑,IBM 中国开发中心 Linux Performance 项目的软件工程师,有五年的 Linux 开发经验,对编译器、调试技术、操作系统很感兴趣。

Linux通用系统优化

[转自vitter's Blog]

针对系统的优化工作需要根据不同的系统采用不同的办法。本文旨在描述通用的优化 Linux 的一些办法。
一、编译选项
“etc/profile”文件含有系统大量的环境和启动程序的配置信息。你在该文件中进行的配置,可以通过申请全局环境变量来实现。因此,在该文件中设置优化标志,是一种明智的选择。要想使x86程序获得最佳性能,可以在编译时,使用最佳的优化选项-O9 。许多程序的“Makefile”文件中已经含有-O2选项,而-O9使编译器采用最高级别的优化。尽管它将增加最终程序的大小,但这样可以获得更高的运行速度。编译时,使用“-fomit-frame-pointer”选项,程序运行时,访问变量时将使用堆栈。但是,使用这一选项,生产的代码将无法调试。使用“-mcpu=cpu_type”和“-march=cpu_type”选项,Gcc将针对这种型号CPU进行专门的优化,但生成的代码只能在所指定的CPU或更高系列的CPU上运行。当我们采用 -O9 来编译程序时,或许文件字节数是最大的,但是往往其运行速度也是最快的。根据不同的机器架构,你可以把下面的语句加入 /etc/profile 。

对于CPU i686或PentiumPro、Pentium II、Pentium III等:
CFLAGS='-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions'

对于CPU i586或Pentium:
CFLAGS='-O3 -march=pentium -mcpu=pentium -ffast-math -funroll-loops -fomit-frame-pointer -fforce-mem -fforce-addr -malign-double -fno-exceptions'

对于CPU i486:
FLAGS='-O3 -funroll-all-loops -malign-double -mcpu=i486 -march=i486 -fomit-frame-pointer -fno-exceptions'
在进行完以上设置之后,紧接者着把“CFLAGS LANG LESSCHARSET”加入到“etc/profile”文件中的“export”行中:
export PATH PS1 HOSTNAME HISTSIZE HISTFILESIZE USER LOGNAME MAIL INPUTRC CFLAGS LANG LESSCHARSET
然后,重新登录,这时,环境变量CFLAGS已经被赋值,编译器和其它配置工具可以使用它。对Pentium(Pro/II/III)的优化必须使用egcs或pgcc编译器。Linux的缺省安装中,已经装上了egcs,所以无需担心。
另外,安装程序时,使用 tarball 格式总要比 RPM 格式来得好,因为, tarball 需要重新编译,能针对你的机器架构作优化,得到最好的性能。

二、重新编译内核
一般的 Linux 发行商发布的 Linux 版本,其内核总是会带有一些对你来说不是很实用的东西,例如对HAM Radio的支持,对 Token Ring 的支持等。可以查看下面的两个网站的资料:
Linux Kernel Howto: www.linuxdoc.org/HOWTO/Kernel-HOWTO.html
Linux Kernel : www.kernel.org
编辑/usr/src/linux/Makefile文件,可以根据具体的cpu优化内核编译。以下的参数设置将得到优化的内核性能。
① vi +18 /usr/src/linux/Makefile ,将HOSTCC =gcc改为 HOSTCC =egcs.
② vi +25 /usr/src/linux/Makefile
将CC =$(CROSS_COMPILE)gcc D__KERNEL__ -I$(HPATH)
改为 CC =$(CROSS_COMPILE)egcs D__KERNEL__ -I$(HPATH).
③ vi +90 /usr/src/linux/Makefile
将CFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
改为CFLAGS = -Wall -Wstrict-prototypes -O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions
④ vi +19 /usr/src/linux/Makefile
将HOSTCFLAGS =-Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
改为HOSTCFLAGS =-Wall -Wstrict-prototypes -O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions
根据以上修改后的makefile文件重新编译内核将得到较优的性能。

三、停止不使用的服务
Sendmail, httpd, crond, kudzu, mysql, portmap, postgresql, smb, snortd, webmin, inetd (或者 xinetd) 等都是很棒的程序,但是如果你不会使用他们,干吗要让他们占用您宝贵的资源呢?而且,这些程序都会带来安全隐患。一般说来,一套“干净”的 Linux 系统,只需要gpm, network, syslog, ssh 和 xfs。如果临时有需要,就手工启动好了。这些启动脚本一般都在 /etc/rc.d/init.d 目录下。
检查自己的机器上使用中的服务,可以采用 nmap 工具扫描。

[xyj@freelamp.com]$ nmap -p1-65535 211.94.129.28
Starting nmap V. 2.54BETA30 ( www.insecure.org/nmap/ )
Interesting ports on freelamp.com (211.94.129.28):
(The 65492 ports scanned but not shown below are in state: closed)
---Edited version of the output due to space considerations--
Port State Service
...
514/tcp open shell
1025/tcp open listen
1099/tcp open unknown
1214/tcp open unknown
...
检查特定端口上正在运行的程序名,可以采用:
[root@freelamp.com /root]# netstat -anp|more
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
....
tcp 0 0 203.199.66.200:8007 203.199.66.197:1060 CLOSE 1005/java
tcp 0 0 203.199.66.200:22 203.199.66.197:3768 ESTABLISHED 1381/sshd
tcp 0 0 203.199.66.200:23 192.168.57.46:1546 ESTABLISHED 1229/in.telnetd: 19
....
最后一列显示运行的程序及其 PID。
我们还可以采用 ps 命令检查机器上正在运行的守护程序:
[root@freelamp.com root]# ps xc -u 0
PID TTY STAT TIME COMMAND
...
1475 ? S 0:02 sendmail
1498 ? S 0:04 gpm
16539 ? S 0:01 httpd
...

四、优化磁盘
1、优化分区
在安装系统之前,您就需要对硬盘做好恰当的规划。划分一定的文件系统,不仅仅是系统本身的需要,而且在安全层面上也十分有意义。在Linux系统中,我们可以自由地组织磁盘分区。一个优化的分区策略,可以很好地改进Linux系统的性能,减少磁盘碎片,提高磁盘I/O能力。根据磁盘的特点,我们知道越是靠磁盘外部的柱面,旋转越快,而且每次旋转时,磁盘读写头可以覆盖较多的区域,也就意味着靠外部的柱面可以得到较好的性能。所以在分区时,我们应该考虑将访问频率高的,对系统性能影响相对较大的分区置于磁盘的靠外部分。同时,为了减少磁盘碎片,应将内容经常改变的目录放在单独的分区。从方便备份数据的角度考虑,因为很多备份工具对整个分区进行备份的效率要高,所以我们应将Linux系统的几个主要的目录作为单独的文件系统,为它们各自分配一个区。推荐的分区策略如图一:

在上图中,磁盘还有一部分未分区的空间,为什么不在安装系统时,将整个磁盘分区呢?现在的硬盘空间比较大,而在安装系统时,也许你所安装的文件加上以后增长所需要的空间用不到整个磁盘存储空间。保留一部分未分区空间,当以后有新的需要时,就可以用fdisk重新将之分区。在分区时,需要注意的是,根据系统将来运行的需要或过去的经验来估计各个分区的大小,以免将来空间不够。
/dev/hda5 swap swap defaults,pri=5 0 0
/dev/hdc5 swap swap defaults,pri=5 0 0
当然,如果你的系统内存足够大,而你的系统又远远用不了那么多的内存,那也就用不到什么虚存了。分区时你就可以考虑去掉交换分区。不过作为一个Linux服务器,即使你的内存足够大,还是应该设置交换分区。如果有多个硬盘的话,可以在每个硬盘上各开 swap 分区,另外,建议 swap 分区的大小为物理内存的两倍。
2、使用hdparm改善Linux系统性能
如果你的Linux系统运行于IDE硬盘,可以使用hdparm工具来提高磁盘I/O的性能。不过使用hdparm要小心,因为可能破坏硬盘上的数据。所以在使用hdparm之前,仔细阅读你的硬盘手册。根据你具体的硬盘规格来使用相应的hdparm开关参数。对一块UltraATA/66 EIDE 硬盘,其控制芯片支持多 PIO 模式和DMA,我们使用以下命令来调谐磁盘性能:
# /sbin/hdparm -x66 -d1 -u1 -m16 -c3 /dev/hda
选项说明:
① c3 :就是把硬盘的16位格式转换为32位模式(32-bit mode w/sync)。控制数据如何从pci总线传递到控制器。
② m16 :改变硬盘的多路扇区的读功能,-m16可以使得硬盘在一次i/o中断中读入16个扇区的数据(据具体硬盘而定)。
③ d1:打开DMA模式。
④ x66 :在支持UDMA-capable的硬盘中,这个参数可以支持双DMA通道的数据传输模式。
⑤ u1 :Linux在处理磁盘中断时,可以unmask其他的中断或者响应其他中断相关的任务。
查看以上的更改情况可以使用命令:
# /sbin/hdparm /dev/hda
测试磁盘I/O性能可以使用命令:
# /sbin/hdparm -tT /dev/hda
如果磁盘的性能有改进的话,可以使用以下命令来保存设置:
# /sbin/hdparm -k1 /dev/hda
3、Linux下使用软RAID
RAID(磁盘冗余阵列)是通过将数据分布在多个磁盘上来增强磁盘性能和可靠性的技术。如果你的系统没有硬件RAID控制器的话,在Linux下可以通过软件来实现RAID。RAID的有很多的级别,不同的级别对硬件有不同的要求,相应也会得到不同的性能和可靠性。RAID0为数据分割,数据块被交替写到磁盘,可以得到最好的读写性能,但是不提供数据冗余。RAID1为磁盘镜像,写到磁盘1中的一切也写到磁盘2中,从任何一个磁盘都可以读取。RAID3除了数据分割之外,还指定一个磁盘驱动器来存储奇偶信息。
在LINUX下通过软件来实现RAID, 需要LINUX的内核支持,可以通过编译新内核来添加对RAID的支持。然后还需编译并安装 raidtools 软件包。raidtools 是可以初始化、启动、停止及控制 RAID 阵列的用户级工具。下面是我们用两块IDE硬盘在LINUX内核2.4上实现RAID0的方法。
设置分区 使用RAID0至少需要两个分区,它们位于不同的磁盘。最好做RAID0的两个分区有相同的大小。创建分区时,将分区类型指定为 "FD"。以使 Linux 内核能将它们识别为 RAID 分区,这样,这些分区就可在每次引导时自动被检测并启动。如果您没有以这种方式标记 RAID 分区,则在每次引导之后,必须首先输入 "raidstart --all" 才能挂载 RAID 阵列。我们做成RAID0的两个分区为hda5和hdc5。
编辑/etc/raidtab文件 创建/etc/raidtab文件以描述RAID阵列的配置信息。Linux 内核使用这些信息在引导时自动检测并启动 RAID 阵列,因此必须对创建的每个 RAID 阵列进行这种配置。将分区hda5和hdc5组成md0 RAID0阵列的配置文件如下:
raiddev /dev/md0
raid-level 0
nr-raid-disks 2
persistent-superblock 1
chunk-size 32
device /dev/hda5
raid-disk 0
device /dev/hdc5
raid-disk 1
在raidtab文件中,"raiddev" 条目指明要创建的 RAID 阵列;"nr-raid-disks" 指定阵列中的磁盘数目;"persistent-superblock" 设置为 1,告诉 raid 工具何时创建该卷;"chunk-size" 以K字节指定 RAID0 使用的块大小;最后,要指定的是组成该阵列的设备即分区。
mkraid 和创建文件系统 使用命令"# mkraid /dev/md0" 命令初始化/dev/md0分区,同时将启动md0 RAID0阵列。接下来,即可在md0上创建你想要得文件系统。我们在Linux服务器上使用的是Reiserfs日志文件系统,创建的命令为"# mkreiserfs /dev/md0"。
这样,就可以像其它文件系统那样来加载新创建的基于RAID0的文件系统了。
4 使用elvtune调谐磁盘I/O
在Linux内核2.4以后的版本中,可以通过磁盘I/O的调度操作,来控制磁盘I/O的响应时间和吞吐量。通过调整I/O请求在队列中的最大等待时间,可以在响应时间和吞吐量之间调谐。如果要求较少的响应时间,那么吞吐量将降低,反之,较长的响应时间则可以得到较大的吞吐量。可以使用工具"/sbin/elvtune"来改变最大的响应时间值。使用方法如下:
查看当前的设置
# /sbin/elvtune /dev/hda1
修改当前的配置
# /sbin/elvtune -r 2000 -w 4000 /dev/hda1
其中-r参数针对读操作,-w参数针对写操作.
可以通过命令"iostat -d -x /dev/hda1"得到的平均信息(包括平均请求大小和平均队列长度)来监视以上I/O配置的效果,并调整配置,以得到最佳的性能。一般来讲,对于读写频繁,但操作的数据量较少的Linux服务器,且对实时性要求较高,那么可以将参数调小。反之如果对于读写不频繁,但要求具有较大的吞吐量的Linux服务器,可以将参数调大,以获得较大的吞吐量。

五、文件及文件系统调谐
1、块大小
创建文件系统时,可以指定块的大小。如果将来在你的文件系统中是一些比较大的文件的话,使用较大的块大小将得到较好的性能。将ext2文件系统的块大小调整为4096byte而不是缺省的1024byte,可以减少文件碎片,加快fsck扫描的速度和文件删除以及读操作的速度。另外,在ext2的文件系统中,为根目录保留了5%的空间,对一个大的文件系统,除非用作日志文件,5%的比例有些过多。可以使用命令
# mke2fs -b 4096 -m 1 /dev/hda6
将它改为1%并以块大小4096byte创建文件系统。
使用多大的块大小,需要根据你的系统综合考虑,如果系统用作邮件或者新闻服务器,使用较大的块大小,虽然性能有所提高,但会造成磁盘空间较大的浪费。比如文件系统中的文件平均大小为2145byte,如果使用4096byte的块大小,平均每一个文件就会浪费1951byte空间。如果使用1024byte的块大小,平均每一个文件会浪费927byte空间。在性能和磁盘的代价上如何平衡,要看具体应用的需要。
2 不使用atime属性
当文件被创建,修改和访问时,Linux系统会记录这些时间信息。记录文件最近一次被读取的时间信息,当系统的读文件操作频繁时,将是一笔不少的开销。所以,为了提高系统的性能,我们可以在读取文件时不修改文件的atime属性。可以通过在加载文件系统时使用notime选项来做到这一点。当以noatime选项加载(mount)文件系统时,对文件的读取不会更新文件属性中的atime信息。设置noatime的重要性是消除了文件系统对文件的写操作,文件只是简单地被系统读取。由于写操作相对读来说要更消耗系统资源,所以这样设置可以明显提高服务器的性能。注意wtime信息仍然有效,任何时候文件被写,该信息仍被更新。
比如在你的系统中,要为/home文件系统设置notime选项,可以修改/etc/fstab文件相应的行如下:
LABEL=/home /home ext2 noatime 1 2
要使该设置立即生效,可运行命令"#mount -oremount /home"。这样以后系统读取/home下的文 件时将不会再修改atime属性。
3 调整缓冲区刷新参数
Linux内核中,包含了一些对于系统运行态的可设置参数。缓冲刷新的参数可以通过调整 /proc/sys/vm/bdflush文件来完成,这个文件的格式是这样的:
# cat /proc/sys/vm/bdflush
30 64 64 256 500 3000 60 0 0
每一栏是一个参数,其中最重要的是前面几个参数。第一个数字是在"dirty"缓冲区达到多少的时候强制唤醒bdflush进程刷新硬盘,第二个数字是每次让bdflush进程刷新多少个dirty块。所谓dirty块是必须写到磁盘中的缓存块。接下来的参数是每次允许bd flush将多少个内存块排入空闲的缓冲块列表。 以上值为RedHat Linux 7.1中的缺省值。如何修改它们呢?对不同的系统有以下两种方法
(1)# echo "100 128 128 512 5000 3000 60 0 0">/proc/sys/vm/bdflush 并将这条命令加到/etc/rc.d/rc.local文件中去。
(2)在/etc/sysctl.conf 文件中加入如下行: vm.bdflush = 100 128 128 512 5000 3000 60 0 0
以上的设置加大了缓冲区大小,降低了bdflush被启动的频度,同时也增加了万一系统崩溃丢失数据的危险性。VFS的缓冲刷新是Linux文件系统高效的重要原因之一,如果性能对你真的很重要,应该考虑调整这个参数。
4 调整文件句柄数和i-节点数
在一个大型的网站服务器其中,可能Linux默认的同时可打开最大文件数不能满足系统需要,我们可以通过调整文件句柄数和i-节点数来增加系统的缺省的限制。不同的Linux内核版本有不同的调整方法。
在Linux内核2.2.x中可以用如下命令修改:
# echo '8192' > /proc/sys/fs/file-max
# echo '32768' > /proc/sys/fs/inode-max
并将以上命令加到/etc/rc.c/rc.local文件中,以使系统每次重新启动时配置以上值。
在Linux内核2.4.x中需要修改源代码,然后重新编译内核才生效。编辑Linux内核源代码中的 include/linux/fs.h文件,将 NR_FILE 由8192改为 65536,将NR_RESERVED_FILES 由10 改为 128。编辑fs/inode.c 文件将 MAX_INODE 由16384改为262144。
一般情况下,最大打开文件数比较合理的设置为每4M物理内存256,比如256M内存可以设为16384,而最大的使用的i节点的数目应该是最大打开文件数目的3倍到4倍。
5 使用内存文件系统
在Linux中可以将一部分内存当作分区来使用,我们称之为RamDisk。对于一些经常被访问的文件,而它们又不会被更改,可以将它们通过RamDisk放在内存中,即可明显地提高系统的性能。当然你的内存可要足够大了。RamDisk有两种,一种可以格式化,加载,在Linux内核2.0/2.2就已经支持,其不足之处是大小固定。另一种是内核2.4才支持的,通过Ramfs或者tmpfs来实现,它们不能被格式化,但是用起来灵活,其大小随所需要的空间而增加或减少。这里主要介绍一下Ramfs和Tmpfs。
Ramfs顾名思义是内存文件系统,它工作于虚拟文件系统(VFS)层。不能格式化,可以创建多个,在创建时可以指定其最大能使用的内存大小。如果你的Linux已经将Ramfs编译进内核,你就可以很容易地使用Ramfs了。创建一个目录,加载Ramfs到该目录即可。
# mkdir -p /RAM1
# mount -t ramfs none /RAM1
缺省情况下,Ramfs被限制最多可使用内存大小的一半。可以通过maxsize(以kbyte为单位)选项来改变。
# mkdir -p /RAM1
# mount -t ramfs none /RAM1 -o maxsize=10000
以上即创建了一个限定了最大使用内存大小为10M的ramdisk。
Tmpfs是一个虚拟内存文件系统,它不同于传统的用块设备形式来实现的ramdisk,也不同于针对物理内存的Ramfs。Tmpfs可以使用物理内存,也可以使用交换分区。在Linux内核中,虚拟内存资源由物理内存(RAM)和交换分区组成,这些资源是由内核中的虚拟内存子系统来负责分配和管理。Tmpfs就是和虚拟内存子系统来"打交道"的,它向虚拟内存子系统请求页来存储文件,它同Linux的其它请求页的部分一样,不知道分配给自己的页是在内存中还是在交换分区中。Tmpfs同Ramfs一样,其大小也不是固定的,而是随着所需要的空间而动态的增减。使用tmpfs,首先你编译内核时得选择"虚拟内存文件系统支持(Virtual memory filesystem support)" ,然后就可以加载tmpfs文件系统了。
# mkdir -p /mnt/tmpfs
# mount tmpfs /mnt/tmpfs -t tmpfs
为了防止tmpfs使用过多的内存资源而造成系统的性能下降或死机,可以在加载时指定tmpfs文件系统大小的最大限制。
# mount tmpfs /mnt/tmpfs -t tmpfs -o size=32m
以上创建的tmpfs文件系统就规定了其最大的大小为32M。不管是使用ramfs还是tmpfs,必须明白的是,一旦系统重启,它们中的内容将会丢失。所以那些东西可以放在内存文件系统中得根据系统的具体情况而定。
6 使用日志文件系统
如果Linux系统由于意外情况而没有正常关机,则可能引起文件系统中某些文件的元数据(meta-data即和文件有关的信息,例如:权限、所有者以及创建和访问时间)遭到破坏。文件系统需要维护文件的元数据来保证文件的可组织和可存取,如果元数据处于不合理或不一致的状态,那么就不能访问和存取文件。当系统重新启动时,fsck将扫描/etc/fstab文件中所列出的所有文件系统,确保它们的元数据处于可用的状态。如果发现元数据不一致,fsck将扫描和检测元数据,并纠正错误。如果文件系统很大,这个过程将需要很长的时间。为解决这个问题,可以使用日志文件系统。日志文件系统用独立的日志文件跟踪磁盘内容的变化,在写入文件内容的同时写入文件的元数据。每次修改文件的元数据时,都要先向称为"日志"的数据结构登记相应的条目。这样,日志文件系统就维护了最近更改的元数据的记录。当加载日志文件系统时,如果发现了错误,不会扫描整个文件系统的元数据,而是根据日志检查最近被更改的元数据。所以相对于传统的文件系统(如ext2),日志文件系统大大地加快了扫描和检测的时间。
Linux下可用的日志文件系统很多,如XFS,JFS,Reiserfs,ext3等等。日志文件系统主要被设计为服务器环境提供出色性能和高可用性。当然, Linux 工作站和家用机器也可从具有高性能的可靠日志文件系统中获益。安装日志文件系统,一般需要下载相应的压缩包、为内核打补丁、重新配置和重新编译内核。 详细的安装过程可访问相应文件系统的官方网站。
新版本的 Linux 都支持日志文件系统,这类文件系统不仅提供文件完整性上快速恢复,在读写速度上也较普通的 ext2 文件系统有很大提升。
文件的最后存取时间,对很多人来说没有任何用处,因此,我们可以关闭操作系统记录文件最后存取时间的功能,修改: /etc/fstab :
把 dev/hda6 /home ext2 defaults 1 2
改为:
/dev/hda6 /home ext2 defaults,noatime 1 2

六、关闭多余的虚拟控制台
我们知道从控制台切换到 X 窗口,一般采用 Alt-F7 ,为什么呢?因为系统默认定义了 6 个虚拟控制台,所以 X 就成了第7个。实际上,很多人一般不会需要这么多虚拟控制台的,修改
/etc/inittab ,注释掉那些你不需要的。
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
#4:2345:respawn:/sbin/mingetty tty4
#5:2345:respawn:/sbin/mingetty tty5
#6:2345:respawn:/sbin/mingetty tty6

七、进程限制“ulimit”参数
Linux对于每个用户,系统限制其最大进程数。可以在用户根目录下的“.bashrc”文件或者实际使用与“.bashrc”功能相当的shell的脚本中加入这种限制。为提高性能,可以设置超级用户root的最大进程数为无限。编辑“.bashrc”文件(例如:vi /root/.bashrc)并加入下面一行:
ulimit -u unlimited
然后退出,重新登录。为了验证,可以以root身份登录,然后键入: “ulimit –a”,在最大用户进程数一项中应该显示“unlimited”,例如:
[root@deep]# ulimit -a
core file size (blocks) 1000000
data seg size (kbytes) unlimited
file size (blocks) unlimited
max memory size (kbytes) unlimited
stack size (kbytes) 8192
cpu time (seconds) unlimited
max user processes unlimited * this line.
pipe size (512 bytes) 8
open files 1024
virtual memory (kbytes) 2105343
注意:你可能更倾向于在命令行键入“unlimit –u”而不是把它加入到文件“/root/.bashrc”中。但为保险起见,建议还是把它加入文件“/root/.bashrc”中。
一些更改用户限制的例子如下:
ulimit -n 4096 将每个进程可以打开的文件数目加大到4096,缺省为1024
ulimit -m 4096 限制每个进程使用的内存数。

八、其它方面的优化
1 调谐buffermem
文件buffermen和内核虚拟内存子系统密切相关。文件/proc/sys/vm/buffermem控制多大内存被用于缓冲区(百分数表示)。内核2.4的缺省值为:: "2 10 60"。可以按如下方法修改:
# echo "70 10 60" >/proc/sys/vm/buffermem
并将之加到脚本文件/etc/rc.d/rc.local 中。或者在/etc/sysctl.conf文件中加入
vm.buffermem = 70 10 60
第一个参数 70意味着至少分配70%的内存用作缓冲区。后两个参数保持系统的默认值。第一个参数设置为多大合适,依赖于系统的内存大小和系统高负载时内存的使用情况(可用free监视)。
2 关闭 X 相关的软件
除非有必要否则不要安装图形界面,如果安装了把机器启动后的缺省界面为 Console :
修改: /etc/inittab 把
id:5:initdefault:
修改为:
id:3:initdefault:

结论:
系统优化的哲学可以简单的归结为四个字:“少就是多”;只运行那些你需要的服务,使用正确的应用来完成任务,使用命令行方式,只有充分精简了你的系统后,你的系统性能才能充分发挥。Linux是一个灵活而又开放的系统。用户可以针对具体的应用环境,从系统的外围到系统的 内核进行调谐。系统的外围的调谐包括系统硬件的配置到系统安装和系统服务的优化等。系统内核的调谐包括参数的修改和改进系统的源代码。我们除了针对系统内外的调谐之外,还应该针对不同的应用进行调谐,比如我们在针对用作mysql数据库服务器的Linux系统的调谐中,针对mysql数据库的特点,按照本文的各个调谐方面外,另外还包括网络的调谐,对应用系统性能进行了综合调谐等。同样针对不同应用要做不同的调整,比如apache,oracle,mysql,informix等等。

Coyote Linux 的国外资源链接

官方资源: 其它维护开发者资源: 语言工具:
 
Claudio 之站点上之文章以及软件: 其它文章:
 
LCD 专题:(因为很多人在做这个,所以我干脆弄了个专题)

由于 dolly 做之大部分模块都已经集成在较新版本之CL当中或者放在claudio之站点上,所以这里不再重复列出,似乎dolly已经不再为CL开发模块了。不过下面这个还是很不错之。

RRDStats monitoring package:http://dolly.czi.cz/coyote/rrd.asp
相关之 RRDtool 链接:http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/
 
 
CL 德国站点(www.coyotelinux.de)上之资源,Jens R&ouml;siger 维护:
Claudio 之站点 http://www.rictec.com.br/claudio/coyote/ 已经取消了,本贴相关之下载作废。
部分软件可以在 http://www.brazilfw.com.br/forum/ 下载。