今晚去喝酒,去唱K,可以说,玩得很疯.算得生平中最疯狂的一次.应该说是那个场面.可我却玩不起劲来....
男人,女人,在一起,便是疯狂的开始.
也第一次听女人说,好男人,就是笨男人.想想好像也很有道理.
Submitted by admin on 2007, July 22, 3:16 AM
今晚去喝酒,去唱K,可以说,玩得很疯.算得生平中最疯狂的一次.应该说是那个场面.可我却玩不起劲来....
男人,女人,在一起,便是疯狂的开始.
也第一次听女人说,好男人,就是笨男人.想想好像也很有道理.
Submitted by admin on 2007, July 20, 11:47 AM
来自:腾讯科技讯
日前,中科红旗新任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操作系统,甚至计划推出自己的移动版操作系统,以结束只有服务器版本的历史。只是尚未透露具体的时间安排。
Submitted by admin on 2007, July 20, 11:35 AM
关于分区
一个潜在的黑客如果要攻击你的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的站点下载并完成安装。这对某些懒惰的管理员来说,可是个省精神的福音哦!^_^
转截
Submitted by admin on 2007, July 20, 10:57 AM
使用单用户模式
在Linux启动后出现boot:提示时,输入linux single 或 linux 1,就能进入系统了.进了系统,就可以改密码或是增加用户了.或者直接编辑Passwd文件,去掉root一行中的x即可。
这里也存在一个安全问题,如果你的机器能让非授权的人接触到,就可以用这个方法进入到你的系统.或者你进入别人的系统.
防范对策
以超级用户(root)进入系统,编辑/etc/inittab文件,改变id:3:initdefault的设置,在其中额外加入一行(如下),让系统重新启动进入单用户模式的时候,提示输入超级用户密码:
~~:S:walt:/sbin/sulogin
然后执行命令:/sbin/init q,使这一设置起效
Submitted by admin on 2007, July 19, 5:50 PM
桂 剑 (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了,这有通过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首先需要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的语法:
#!/usr/local/bin/stap global count function report(stat) { printf("stat=%d\n", stat) } probe kernel.function("sys_read") { ++count } probe end { report() } |
function report(stat) %{ _stp_printf("stat=%d\n", THIS->stat); %} |
![]() ![]() |
![]() |
了解了SystemTap的基本用法,下面让我们来看几个有趣的例子。
在进行性能分析的时候,我们常常需要知道那些函数调用次数最多,才能有的放矢地展开分析。下面这个简单的例子可以打印出在过去的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) } |
我们运行这个脚本,在另外一个窗口做一些操作,来看看它的输出结果:
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运行的过程依次分为五个阶段,通常称为Pass 1 - Pass 5。就像前面介绍用法的时候提到的,在命令行中加上-p NUM选项可以使得SystemTap在运行完Pass NUM之后停止,而不是运行到Pass 5。这允许你分析SystemTap在每一个阶段的输出,对于调试脚本尤其有用。
下面来介绍每一个阶段的主要功能:
![]() ![]() |
![]() |
SystemTap是一个全新的工具,但已经表现出了强大的功能和广泛的适用性。SystemTap使得动态收集Linux内核信息和性能数据变得轻而易举,这就使人可以从繁琐的数据采集中解放出来,而专注于数据的处理和分析,这无疑是内核开发人员和系统管理人员的福音。随着越来越多用户的体验,越来越多的bug会被报告和修正,越来越多的新功能会被添加,SystemTap也会变得越来越稳定和完善。
![]() |
||
|
![]() |
桂剑,IBM 中国开发中心 Linux Performance 项目的软件工程师,有五年的 Linux 开发经验,对编译器、调试技术、操作系统很感兴趣。 |
Submitted by admin on 2007, July 19, 5:26 PM
[转自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等等。
Submitted by admin on 2007, July 18, 3:17 PM
官方资源:
|
Claudio 之站点上之文章以及软件:
|
RRDStats monitoring package:http://dolly.czi.cz/coyote/rrd.asp
相关之 RRDtool 链接:http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/
部分软件可以在 http://www.brazilfw.com.br/forum/ 下载。
Submitted by admin on 2007, July 18, 2:16 PM