分类: LINUX
2006-08-18 23:00:18
一般情况,内核的配置对于一个安装好的操作系统来说,是一定的,不需要修改的。但如果遇到以下情况
比如:默认情况内核只能认到一个LUN,如果要支持多LUN是需要修改内核的。通过编译重新编译内核这个问题就可以解决。但是
重新编译内核步骤繁琐,也容易出错。因此出现了一个折中的方法??在内核启动的时候,传递一个更新的内核参数,来让启动起来的内核
具有新的功能,而且也不需要重新编译内核。
这种方法同样适用于临时屏蔽掉一些跟系统有冲突的功能能,比如临时禁止使用ACPI(高级电源管理)等
对于grub用户来说,在出现grub提示的时候点"a",可以进入传递内核参数的条目
一般会出现
kernel /vmlinuz-2.4.21-xx ro root=LABLE=/
在这行后面添加一个空格,然后写入相应的内核参数便可以生效
比如
kernel /vmlinuz-2.4.21-xx ro root=LABLE=/ single
表示启动单用户模式
这种方法可以让用户不需要root密码就可以进入系统,并且可以更改root密码
适用于忘记root密码的用户
以下罗列一些常用的传递参数,注意其中有一些参数是在安装系统的时候,用光盘启动,在boot提示符号前用的
apic
该命令绕过在 Intel 440GX 芯片集 BIOS 中可能会普遍遇到的错误,它只应该使用安装程序内核来执行。
apm=allow_ints
该命令改变挂起服务的处理方式(对于某些便携电脑来说可能是必要的)。
apm=off
该命令禁用 APM(高级电源管理)。它很有用处,因为某些 BIOS 的电源管理(APM)问题重重,很容易崩溃。
apm=power_off
该命令会使 Red Hat Linux 默认关闭(断电)系统。它对于不默认关闭的 SMP 系统来说有用。
apm=realmode_power_off
某些 BIOS 在试图关闭(断电)机器时崩溃。该命令把操作方法从 Windows NT 方式改为 Windows 95 方式。
dd
这个参数会导致安装程序提示你使用驱动程序盘。(只适用于系统安装时候)
display=IP:0
该命令允许远程显示转发。其中,IP 应该用你想充当显示系统的 IP 地址替换。
在你想用来显示的系统上,你必须执行 xhost +remotehostname 命令,这里的 remotehostname 是你运行显示命令的主机名称。使用 xhost +remotehostname 命令限制了对远程显示终端的访问,而且不允许来自没有被确切授予远程访问权的人员和系统的访问。
driverdisk
该命令执行的功能和 dd 命令相同,它还会在 Red Hat Linux 安装中提示你使用驱动程序盘。(只适用于系统安装时候)
ide=nodma
该命令禁用所有 IDE 设备上的 DMA,在遇到 IDE 相关的问题时可能有用。
isa
该命令提示你输入 ISA 设备配置。
lowres
该命令强制图形化(GUI)安装程序使用较低的分辨率运行(640x480)。
mem=xxxM
该命令允许你超越内核在机器上检测到的内存数量。在某些较老的仅检测到 16 MB 的系统上,以及某些较新的视频卡与主内存共享视频内存的机器上,你可能需要使用该命令。当执行这项命令时,xxx 应该用以 MB 为单位的内存数量替换。
nmi_watchdog=1
该命令启用内建的内核死锁检测器。它可以用来调试硬性内核锁定。通过执行定期的 NMI(不可屏蔽中断)中断,内核可以监控 CPU 是否被锁,并在需要时打印出调试消息。
noapic
该命令告诉内核不要使用 APIC 芯片。它对于某些带有不良 APIC(如 Abit BP6)或错误重重的 BIOS 的母板有帮助。
noathlon
该命令告诉内核禁用 Athlon 优化。若 Athlon 优化在某些芯片集上被发现无效,它就会起到作用。
noht
该命令禁用超线程(若在 SMP 系统中可用)。
nomce
该命令禁用在 CPU 上执行的自我诊断检查。内核默认启用 CPU 的自我诊断(称为机器检查意外,Machine Check Exception)。在一些较老的 Compaq 机器上,这类检查运行的太频繁,可能需要禁用。
nopass
该命令禁止把键盘和鼠标信息传递给安装程序的第二阶段。当执行网络安装时,它可以用来在安装的第二阶段测试鼠标和键盘配置屏幕。
nopcmcia
该命令忽略系统上的任何 PCMCIA 控制器。
noprobe
该命令禁用硬件检测,相反,它提示用户来提供硬件信息。(只适用于系统安装时候)
noshell
该命令禁止在安装时进入第二虚拟控制台上的 shell。(只适用于系统安装时候)
nousb
该命令禁止在安装中载入 USB 支持。如果安装程序在进程早期容易挂起,该命令就能够起到作用。(只适用于系统安装时候)
nousbstorage
该命令在安装程序的载入程序中禁止载入 usbstorage 模块。它对 SCSI 系统上的设备排序可能有帮助。
resolution=
告诉安装程序要运行哪种视频模式。它接受所有标准的分辨率,如 640x480、 800x600、 1024x768 等等。
serial
该命令启用串行控制台支持。
skipddc
该命令跳过 ddc 显示器探测, 这种探测在某些系统上会导致问题。
红联Linux论坛:
__________________
希望能和你相互交流,愿意和您分享学习、进步中的每分喜悦与快乐
---------------------------------------------
http://tzhsuccess.itpub.net
向版主反映这个帖子 查看tzhsuccess 的IP地址
71楼 旧帖 06-07-17 23:22
[ 大 中 小 ] 给予该贴好评 编辑/删除 引用/回复
tzhsuccess
高级会员
注册日期: 2004 Apr
来自: 太?系-?子座
技术贴数:7934
论坛积分:31670
论坛排名:67
论坛徽章:23
会员2006贡献徽章 行业板块每日发贴之星 每日论坛发贴之星 ERP板块每日发贴之星
Linux任务控制的几个技巧
Linux/Unix 区别于微软平台最大的优点就是真正的多用户,多任务。因此在任务管理上也有别具特色的管理思想。
我们知道,在 Windows 上面,我们要么让一个程序作为服务在后台一直运行,要么停止这个服务。而不能让程序在前台后台之间切换。而 Linux 提供了 fg 和 bg 命令,让你轻松调度正在运行的任务。
假设你发现前台运行的一个程序需要很长的时间,但是需要干其他的事情,你就可以用 Ctrl-Z ,终止这个程序,然后可以看到系统提示:
[1]+ Stopped /root/bin/rsync.sh
然后我们可以把程序调度到后台执行:(bg 后面的数字为作业号)
#bg 1
[1]+ /root/bin/rsync.sh &
用 jobs 命令查看正在运行的任务:
#jobs
[1]+ Running /root/bin/rsync.sh &
如果想把它调回到前台运行,可以用
#fg 1
/root/bin/rsync.sh
这样,你在控制台上就只能等待这个任务完成了。
红联Linux论坛:
__________________
希望能和你相互交流,愿意和您分享学习、进步中的每分喜悦与快乐
---------------------------------------------
http://tzhsuccess.itpub.net
向版主反映这个帖子 查看tzhsuccess 的IP地址
72楼 旧帖 06-07-17 23:22
[ 大 中 小 ] 给予该贴好评 编辑/删除 引用/回复
tzhsuccess
高级会员
注册日期: 2004 Apr
来自: 太?系-?子座
技术贴数:7934
论坛积分:31670
论坛排名:67
论坛徽章:23
会员2006贡献徽章 行业板块每日发贴之星 每日论坛发贴之星 ERP板块每日发贴之星
Linux上系统容错的实现
这个特性允许你为一个系统提供硬件冗余。容错是更一般的术语。Novell公司用SFT来描述NetWare中的容错特征。SFT允许你安装两个硬盘,并且在辅硬盘上的内容是主硬盘内容的镜像(参见“磁盘镜像和磁盘双工”)。如果主硬盘发生故障,辅硬盘就 接替它的工作。磁盘控制器也可以双份,或双工工作以进一步防止硬件发生故障。SFT Level Ⅲ(可选)通过双工整个服务器而进一步提供了冗余性。假如主服务器停机时,辅服务器无间断地接替它的工作。
一台服务器,两块intel 1000 Mbps 网卡,运行Redhat Linux ,两台交换机(CISCO 3750) ,如何配置SFT?
经过几天的试验,终于调试通过,现将试验步骤总结如下:
(环境:一台服务节点,运行Redhat Linux 9.0 ,配置两块Intel 千兆网卡,分别为eth0,eth1 ,其中至少一块是服务器网卡,我用的是intel82545EM,并将两块网卡分别接到两台交换机上,交换机的 STP 要启动 )
要求:在intel网站下载 iANS.3.1.2a.tar.gz ,解压,make;make install;
1、修改/etc/rc.local
insmod ians
ifconfig eth0 down
ifconfig eth1 down
ianscfg -a -t team1 -M SFT -V
ianscfg -at team1 -m eth0 -p primary
ianscfg -at team1 -m eth1 -p secondary
ianscfg -at team1 -v vadapt1 -i 10
ianscfg -at team1 -v vadapt2 -i 15
ianscfg -c team1
ianscfg -s
ifconfig vadapt1 192.168.1.1 netmask 255.255.255.0
ifconfig vadapt2 192.168.1.1 netmask 255.255.255.0
2、修改/etc/sysconfig/network-scripts/ifcfg-eth0
[root@localhost network-scripts]# cat ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.1.1
NETMASK=255.255.255.0
3、修改/etc/sysconfig/network-scripts/ifcfg-eth1
[root@localhost network-scripts]# cat ifcfg-eth1
DEVICE=eth1
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.1.1
NETMASK=255.255.255.0
4、注意 eth0 和 eth1 一定要配置IP地址。由于是要求交换机冗余,因而用 SFT 选项,且 -V 必须!
5、用ianscfg ?s 可以查看其状态
6、拔掉一根网线,再看状态,可见两块网卡和交换机互为热备!
红联Linux论坛:
__________________
希望能和你相互交流,愿意和您分享学习、进步中的每分喜悦与快乐
---------------------------------------------
http://tzhsuccess.itpub.net
向版主反映这个帖子 查看tzhsuccess 的IP地址
73楼 旧帖 06-07-17 23:23
[ 大 中 小 ] 给予该贴好评 编辑/删除 引用/回复
tzhsuccess
高级会员
注册日期: 2004 Apr
来自: 太?系-?子座
技术贴数:7934
论坛积分:31670
论坛排名:67
论坛徽章:23
会员2006贡献徽章 行业板块每日发贴之星 每日论坛发贴之星 ERP板块每日发贴之星
Linux文件系统被破坏时的处理方法
当文件系统被破坏时,如果使用的是ext2fs类型的文件系统,就可从软盘运行e2fsck命令来修正文件系统中被损坏的数据。对于其他类型的文件系统,可以使用相应的fsck命令。当从软盘上检查文件系统时,最好不要mount安装。
注:文件系统被破坏的常见原因是超级块被损坏,超级块是文件系统的“头部”。它包含文件系统的状态、大小和空闲磁盘块等信息。如果损坏了一个文件系统的超级块(例如不小心直接将数据写到了文件系统的超级块分区中),那么系统可能会完全不识别该文件系统,这样也就不能安装它了,即使采用e2fsck命令也不能处理这个问题。
不过,ext2fs类型的文件系统将超级块的内容进行了备份,并存放于驱动程序的块组(block group)边界。可以用如下的命令通知e2fsck使用超级块的备份:
# e2fsck -b 8193是指文件系统所在的分区,-b 8193选项用于显示存放在文件系统中的8193块的超级块备份数据。
恢复丢失的文件
如果不小心删除了重要的系统文件,虽然没有办法直接恢复,但是还可以将相应的文件利用急救盘复制到硬盘上。例如,如果删除了文件/bin/login,此时系统无法正常运行到登录界面,可以用急救盘启动系统,将硬盘文件系统安装到/mnt目录下,然后使用如下命令:
#cp -a /bin/login /mnt/bin
其中 “-a”选项用于告诉cp在拷贝时保持文件的访问权限。 当然如果被删除的基本文件不在“急救盘组”中,也就不能用这种方法了。如果以前做过系统备份的话,那么也可以用以前的备份来恢复。
红联Linux论坛:
__________________
希望能和你相互交流,愿意和您分享学习、进步中的每分喜悦与快乐
---------------------------------------------
http://tzhsuccess.itpub.net
向版主反映这个帖子 查看tzhsuccess 的IP地址
74楼 旧帖 06-07-17 23:23
[ 大 中 小 ] 给予该贴好评 编辑/删除 引用/回复
tzhsuccess
高级会员
注册日期: 2004 Apr
来自: 太?系-?子座
技术贴数:7934
论坛积分:31670
论坛排名:67
论坛徽章:23
会员2006贡献徽章 行业板块每日发贴之星 每日论坛发贴之星 ERP板块每日发贴之星
Linux文件系统的反删除方法简介
作为一个多用户、多任务的操作系统,Linux下的文件一旦被删除,是难以恢复的。尽管删除命令只是在文档节点中作删除标记,并不真正清除文件内容,但是其它用户和一些有写盘动作的进程会很快覆盖这些资料。不过,对于家庭单机使用的Linux,或者误删档后及时补救,还是可以恢复的。
1.Ext2文件系统结构的简单介绍
在Linux所用的Ext2文件系统中,文件是以块为单位存储的,默认情况下每个块的大小是1K,不同的块以块号区分。每个档还有一个节点,节点中包含有档所有者,读写权限,文件类型等信息。对于一个小于12个块的档,在节点中直接存储档数据块的块号。如果档大于12个块,那么节点在12个块号之后存储一个间接块的块号,在这个间接块号所对应的块中,存储有256个档数据块的块号(Ext2fs中每个块号占用4字节,这样一个块中所能存储的块号就是1024/4=256)。如果有更大的档,那么还会在节点中出现二级间接块和三级间接块。
2。恢复被误删档的方法
大多数Linux发行版都提供一个debugfs工具,可以用来对Ext2文件系统进行编辑操作。不过在使用这个工具之前,还有一些工作要做。
首先以只读方式重新挂载被误删的档所在分区。使用如下命令:(假设文件在/usr分区)
mount ?r ?n ?o remount /usr
-r表示只读方式挂载;-n表示不写入/etc/mtab,如果是恢复/etc上的档,就加上这个参数。如果系统说xxx partion busy,可以用fuser命令查看一下是哪些进程使用这个分区上的?:
fuser ?v ?m /usr
如果没有什么重要的进程,用以下命令停掉它们:
fuser -k ?v ?m /usr
然后就可以重新挂载这些文件系统了。
如果是把所有的档统一安装在一个大的/分区当中,可以在boot提示符下用linux single进入单用户模式,尽量减少系统进程向硬盘写入资料的机会,要不干脆把硬盘挂在别的机器上。另外,恢复出来的资料不要写到/上面,避免破坏那些有用的资料。如果机器上有dos/windows,可以写到这些分区上面:
mount ?r ?n /dev/hda1 /mnt/had
然后就可以执行debugfs:(假设Linux在 /dev/hda5)
#debugfs /dev/hda5
就会出现debugfs提示符debugfs:
使用lsdel命令可以列出很多被删除的文件的信息:
debugfs:lsdel
debugfs: 2692 deleted inodes found.
Inode Owner Mode Size Blocks Time deleted
164821 0 100600 8192 1/ 1 Sun May 13 19:22:46 2001
…………………………………………………………………………………
36137 0 100644 4 1/ 1 Tue Apr 24 10:11:15 2001
196829 0 100644 149500 38/ 38 Mon May 27 13:52:04 2001
debugfs:
列出的档有很多(这里找到2692个),第一字段是档节点号,第二字段是档所有者,第三字段是读写权限,接下来是档大小,占用块数,删除时间。然后就可以根据档大小和删除日期判断那些是我们需要的。比如我们要恢复节点是
196829的文件:
可以先看看文件资料状态:
debugfs:stat <196829>
Inode: 196829 Type: regular Mode: 0644 Flags: 0x0 Version: 1
User: 0 Group: 0 Size: 149500
File ACL: 0 Directory ACL: 0
Links: 0 Blockcount: 38
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x31a9a574 -- Mon May 27 13:52:04 2001
atime: 0x31a21dd1 -- Tue May 21 20:47:29 2001
mtime: 0x313bf4d7 -- Tue Mar 5 08:01:27 2001
dtime: 0x31a9a574 -- Mon May 27 13:52:04 2001
BLOCKS:
594810 594811 594814 594815 594816 594817
………………………………….
TOTAL: 38
然后就可以用dump指令恢复文件:
debugfs:dump <196829> /mnt/hda/01.sav
这样就把档恢复出来了。退出debugfs:
debugfs:quit
另一种方法是手工编辑inode:
debugfs:mi <196829>
Mode [0100644]
User ID [0]
Group ID [0]
Size [149500]
Creation time [0x31a9a574]
Modification time [0x31a9a574]
Access time [0x31a21dd1]
Deletion time [0x31a9a574] 0
Link count [0] 1
Block count [38]
File flags [0x0]
Reserved1 [0]
File acl [0]
Directory acl [0]
Fragment address [0]
Fragment number [0]
Fragment size [0]
Direct Block #0 [594810]
…………………………….
Triple Indirect Block [0]
使用mi指令后每次显示一行信息以供编辑,其它行可以直接按回车表示确认,把deletion time改成0(未删除),Link count改成1。改好后退出debugfs:
debugfs:quit
然后用fsck检查/dev/hda5
fsck /dev/hda5
程序会说找到丢失的数据块,放在lost+found里面。这个目录里的文件就是我们要的东东。
Now all O.K. Good Luck.
红联Linux论坛:
__________________
希望能和你相互交流,愿意和您分享学习、进步中的每分喜悦与快乐
---------------------------------------------
http://tzhsuccess.itpub.net
向版主反映这个帖子 查看tzhsuccess 的IP地址
75楼 旧帖 06-07-17 23:23
[ 大 中 小 ] 给予该贴好评 编辑/删除 引用/回复
tzhsuccess
高级会员
注册日期: 2004 Apr
来自: 太?系-?子座
技术贴数:7934
论坛积分:31670
论坛排名:67
论坛徽章:23
会员2006贡献徽章 行业板块每日发贴之星 每日论坛发贴之星 ERP板块每日发贴之星
Linux文件系统的桌面应用
本文中要介绍一个所谓的"Linux 文件系统的守护神",这是指一个能实时地观察 Linux 文件系统的变化情况的程序模块。能够实时的观察文件系统的变化情况,并做出及时的适当的反应,这对于应用 Linux 做桌面计算机系统来说,是十分的有趣,也是十分的重要的。本文还要介绍 Linux 文件系统的异步 I/O 的扩展。同样,这对于 Linux 系统的桌面应用也是关键的。
1、Linux 文件系统的守护神
传统的 Linux 文件系统呈现给用户程序的界面,确实是十分的干净利落。用户程序可以打开一个文件,向文件中线性的写入数据,从文件的某一位置开始,线性的读出数据,关闭一个文件,删除一个文件,创建一个文件,等等。请看,只有这么若干个简洁的操作原语,可是却能提供这么多丰富的应用。但是,我们注意到,用于访问 Linux 的文件系统的这些操作原语,并没有提供非常复杂的加锁解锁的功能。这是一件很奇妙的事情,如果来自不同的用户程序的请求发生了冲突怎么办呢?
我们不妨走的再靠近一点,仔细的看看删除一个文件是怎样进行的。如果已经有一个用户程序在访问一个文件,而另外一个用户程序正好要删除这一个文件,这时会发生些什么呢?我们知道,Linux 的文件系统是基于所谓的 inode 的,每个文件都相伴有一个 inode。在 inode 中记录了关于这个文件的一些系统信息,比如文件的所有者,文件相关的一些权限记录,关于文件的若干个时间戳,等等。在内存中的 inode 还维持着一个关于自己的使用计数。每当一个 inode 所代表的文件被打开一次,这个 inode 就把关于自己的使用计数加一。每当这个 inode 所代表的文件一被关闭,这个 inode 就把关于自己的使用计数减一。当用户程序删除一个文件的时候,相关的系统调用很快就返回到这个用户程序,告诉它,相应的文件已经被删除了。但是相应的 inode 还是保留在系统中,inode 首先要检查自己的使用计数,如果使用计数为零,那么 Linux Kernel 才可以真正的去删除这个文件。如果使用计数大于零,也就是说,还有其它的用户程序在访问这一个文件,那么 Linux Kernel 需要等待这些其他的用户程序一个个都完成对这一个文件的访问才行。也就是说,要等到这个 inode 的使用计数掉到零,才能真正的去删除这一个文件。
我们可以设想一下,如果有一个 MP3 播放程序在播放一首 MP3 音乐,我们觉得它不好听,就到硬盘上找到这个文件,把它 rm 掉了。这时候,MP3 播放程序并不受到影响,还是可以继续播放这首 MP3 音乐,虽然这时候在文件系统上用 ls 已经找不到这个 MP3 音乐文件了。实际上,一直要到 MP3 播放程序停止播放这首 MP3 音乐,然后 Linux 文件系统才真正的从硬盘上删除这个 MP3 文件。这个经验和我们在 Windows 平台上遇到的截然不同。
在 Windows 平台上,当我们试图在文件夹窗口中用鼠标点击右键菜单删除 Winamp 正在播放的一首 MP3 音乐的时候,Windows 系统会用一个弹出对话框告诉我们,这个文件正在被使用,没办法删除。Windows 系统的关于删除文件的这样一个解释,如果使用不当的话,会带来一个滑稽可笑的问题。我们可以设想一下,用户的一个 P2P 的文件共享程序提供了一个 MP3 文件以供别人下载,恰巧这个 MP3 音乐文件十分的热门,不断的有人来下载,这个用户最终决定要节省一下带宽,想要把这个 MP3 音乐文件删除掉,但是 Windows 系统却不允许用户这样做,因为这个 P2P 的文件共享程序总是在使用这个 MP3 文件。用户要想删除这个文件,不得不先把 P2P 的文件共享程序给停下来!呵呵。
但是 Linux 的文件系统的操作原语也有它自己的问题。我们知道,在一个 Linux Shell 的命令行上,先 rm,然后再 ls,非常的干净,被 rm 的文件没有了,被删除了。但是我们可以设想有一个图形界面的文件管理程序,当用户从 Shell 的命令行上 rm 掉一个文件的时候,这个图形界面的文件管理程序并没有收到任何人发给它的任何消息,它还以为什么都没有发生,被删除掉的文件还在那儿。这实在是很 U.G.L.Y. 啊。
那么要想解决这个问题,一个明显的但是非常不好的办法,就是让一个后台进程 Daemon 每隔一个很短的时间间隔,就检查一下文件系统上这个目录的情况,看看有没有发生什么变化。这个办法的缺点真的是显而易见的,不但系统的性能受到影响,而且它的反应也还不是实时的。
如果我们需要用户程序能够实时地了解文件系统上某一个目录的变化情况,从实时这个角度出发,显然,我们需要有一个中断机制。我们都知道,硬件中断能够实时地把系统某一个部件的情况反映给中央处理器,同样的,要想把位于系统内核中的文件系统的情况实时地反映给用户程序,我们也需要一个由操作系统内核到达用户进程的软件中断机制。熟悉 Linux 系统编程的读者朋友们立即就会想到,这个中断机制在 Linux 系统中早已就有了,这就是信号传递 signal。
找到了信号传递这样一个中断用户进程的机制,一切似乎都已齐备,看来可以动手实现这样一个 Linux 文件系统的守护神,来实时地监视文件系统的变化情况,并且及时地把消息通知给用户程序了。不过且慢,让我们搜索一下 Linux Kernel,看看是否有别人也在做同样的工作。哈哈,果不其然,原来这样一个实时地监视文件系统情况的机制早已在 Linux 内核中实现了。下面一段就是取自 Linux Kernel 文档的一段小小例程,说明了 Linux Kernel 中的 dnotify 功能的用法。dnotify 就是指 directory notification,监视文件系统上一个目录中的情况。
#define _GNU_SOURCE /* needed to get the defines */
#include values defined */
#include #include #include
static volatile int event_fd;
// 信号处理例程
static void handler(int sig, siginfo_t *si, void *data)
{
event_fd = si->si_fd;
}
int main(void)
{
struct sigaction act;
int fd;
// 登记信号处理例程
act.sa_sigaction = handler;
sigemptyset(&act.sa_mask);
act.sa_flags = SA_SIGINFO;
sigaction(SIGRTMIN, &act, NULL);
// 需要了解当前目录"."的情况
fd = open(".", O_RDONLY);
fcntl(fd, F_SETSIG, SIGRTMIN);
fcntl(fd, F_NOTIFY, DN_MODIFY|DN_CREATE|DN_MULTISHOT);
/* we will now be notified if any of the files
in "." is modified or new files are created */
while (1) {
// 收到信号后,就会执行信号处理例程。
// 而 pause() 也就结束了。
pause();
printf("Got event on fd=%d\n", event_fd);
}
}
上面这一小段例程,对于熟悉 Linux 系统编程的读者朋友们来说,是很容易理解的。程序首先注册一个信号处理例程,然后通知 Kernel,我要观察 fd 上的 DN_MODIFY 和 DN_CREATE 和 DN_MULTISHOT 事件。(关于这些事件的详细定义,请读者朋友们参阅文后所列的参考资料。) Linux Kernel 收到这个请求后,把相应的 fd 的 inode 给做上记号,然后 Linux Kernel 和用户应用程序就自顾自去处理各自的别的事情去了。等到 inode 上发生了相应的事件,Linux Kernel 就把信号发给用户进程,于是开始执行信号处理例程,用户程序对文件系统上的变化也就可以及时的做出反应了。而在这整个过程中,系统以及用户程序的正常运行基本上未受到性能上的影响。这里还需要说明的是,dnotify 并没有通过增加新的系统调用来完成它的功能,而是通过 fcntl 来完成任务的。增加一个系统调用,相对来说是一个很大的手术,而且如果设计不当,处理得不好的话,伤疤会一直留在那里,这是 Linux Kernel 的开发者们所非常不愿意见到的事情。
2、Linux 文件系统的异步 I/O 扩展
对于桌面计算机系统来说,能够快速的响应用户的请求,这也是十分关键的。换句话说,当用户移动鼠标的时候,不管系统正在进行什么天大的、重要的、神圣的、不可打断的工作,它都得立即停下,并且要让鼠标立即流畅的在计算机屏幕上完美地运动起来。对于习惯在传统的 Linux 命令行上工作的读者朋友们来说,让鼠标能够在任何时间都可以在计算机屏幕上向无头苍蝇一样地乱窜,竟然被当成是最重要的系统任务,这实在有一点让人难以接受。不过,当你从 Linux 命令行上转移到 GNOME 或者 KDE 这样的图形界面的用户环境的时候,鼠标被锁死,百分之百的也是会让你失去理智的。所以,还是让我们接受这一个现实,看一看如何才能增加系统的响应速度吧。
从文件系统的角度讲,特别是考虑到网络文件系统,它的响应速度有可能会相当的慢。当用户在文件管理程序中,选择了对文件进行某一个操作以后,文件系统可能会需要相当长的时间,才能完成这一操作。如果文件管理程序必须要等待文件系统完成这一操作,然后才能继续的话,这显然会给文件管理程序的用户带来非常不愉快的经历。解决这一个问题的办法,就是要实现异步的文件系统 I/O。
在 Linux 的 Gnome 桌面环境中,由 GnomeVFS 包裹了真正的 Linux 文件系统 I/O,实现了一个异步的文件系统 I/O 接口 API。我们可以看到下面这个用 GnomeVFS 打开文件的例子。
enum _GnomeVFSOpenMode {
GNOME_VFS_OPEN_NONE = 0,
GNOME_VFS_OPEN_READ = 1 << 0,
GNOME_VFS_OPEN_WRITE = 1 << 1,
GNOME_VFS_OPEN_RANDOM = 1 << 2
};
typedef enum _GnomeVFSOpenMode GnomeVFSOpenMode;
typedef void (* GnomeVFSAsyncOpenCallback)
(GnomeVFSAsyncHandle *handle,
GnomeVFSResult result,
gpointer callback_data);
GnomeVFSResult gnome_vfs_async_open
(GnomeVFSAsyncHandle **handle_return,
const gchar *text_uri,
GnomeVFSOpenMode open_mode,
GnomeVFSAsyncOpenCallback callback,
gpointer callback_data);
我们注意到,上面的代码段中,用户程序为了打开一个文件,向 GnomeVFS 注册了一个 call back 例程。在注册了这一个 call back 例程之后,函数调用就立即返回给用户程序,用户程序就可以处理自己的别的事情去了。
3、小结
我们在本文中了解了 Linux Kernel 中的 dnotify,可以帮助我们实时地监视文件系统目录树中的变化情况;也了解了 Gnome 桌面环境的 GnomeVFS 异步文件系统 I/O 扩展;可以帮助用户程序不至于被文件系统的请求所 Block。这两个功能对于 Linux 系统在桌面上的应用都是很重要的。
红联Linux论坛:
__________________
希望能和你相互交流,愿意和您分享学习、进步中的每分喜悦与快乐
---------------------------------------------
http://tzhsuccess.itpub.net
向版主反映这个帖子 查看tzhsuccess 的IP地址
76楼 旧帖 06-07-17 23:23
[ 大 中 小 ] 给予该贴好评 编辑/删除 引用/回复
tzhsuccess
高级会员
注册日期: 2004 Apr
来自: 太?系-?子座
技术贴数:7934
论坛积分:31670
论坛排名:67
论坛徽章:23
会员2006贡献徽章 行业板块每日发贴之星 每日论坛发贴之星 ERP板块每日发贴之星
Linux系统操作常用快捷键
1.使用虚拟控制台
登录后按“Alt+F2”键可以看到“login:”提示符, 这就是第二个虚拟控制台。 一般新安装的Linux有四个虚拟控制台, 可以用“Alt+F1”到“Alt+F4”来访问。虚拟控制台最有用的时候是当一个程序出错锁住输入时可以切换到其他虚拟控制台,登录进入后用kill命令杀掉这个出错的进程。
2.拷贝与粘贴
字符界面(不管是Slackware 还是RedHat 的)安装后,每次启动时都会自动运行一个叫gpm的程序, 该程序运行后就可以用鼠标来拷贝与粘贴了。具体做法是按住鼠标左键拖动使要拷贝的文字反白, 这时反白的区域已经被拷贝, 再按鼠标右键拷贝的内容就会被粘贴在光标所在位置了。
在X-Window下,拷贝操作与字符界面下一样, 如果你用的是三键鼠标,按中键进行粘贴, 如果是两键鼠标,则可同时按左右键粘贴(条件是必须在配置XF86时在鼠标的设置里选择 Emulate 3 Button)。
3.快速进入某些目录
键入cd~可进入用户的home目录。键入cd-可进入上一个进入的目录。
4.在RedHat下显示彩色目录列表
打开/etc/bashrc, 加入如下一行:
alias ls=″ls --color″
下次启动bash时就可以像在Slackware里那样显示彩色的目录列表了, 其中不同颜色的含义如下:
蓝色→目录
绿色→可执行文件
红色→压缩文件
浅蓝色→链接文件
灰色→其他文件
5.命令文件的路径
当你键入一些命令(如find、shutdown、mount、startx)时是否想知道这些文件究竟放在哪个目录里?用命令“whereis”可以实现,如:
#whereis startx
6.查找文件
find 命令要加一些参数才能查到文件,如:
#find /usr -name XF86Setup -print
在/usr里查找文件XF86Setup。
7.删除无用的core文件
程序运行完后,有时候会产生一个名为core的文件, 这个文件一般很大而且没什么用, 可以删除掉以释放空间。
8.Linux里的Norton Commander
在提示符下键入命令mc后你就会看到一个与Norton Commander很相似的界面, 实际上功能也很相似甚至更强大, 比如可以直接对.tar.gz 压缩包里的文件进行操作(有点像ZipMagic)。
9.后台运行 X-Window程序
执行一个X-Window程序时别忘了在后面加一个&号(如#netscape &),否则,在你退出执行的程序之前再无法在那个终端窗口里输入命令了。
10.强行退出 X-Window
有时候在 X-Window里由于程序出错,使鼠标键盘都不起作用, 这时候不用着急, 因为在Linux下几乎不会像在Win 9x里那样恶性死机, 你只须键入Ctrl+Alt+BackSpace键就可以回到字符界面下了。
红联Linux论坛:
__________________
希望能和你相互交流,愿意和您分享学习、进步中的每分喜悦与快乐
---------------------------------------------
http://tzhsuccess.itpub.net
向版主反映这个帖子 查看tzhsuccess 的IP地址
77楼 旧帖 06-07-17 23:24
[ 大 中 小 ] 给予该贴好评 编辑/删除 引用/回复
tzhsuccess
高级会员
注册日期: 2004 Apr
来自: 太?系-?子座
技术贴数:7934
论坛积分:31670
论坛排名:67
论坛徽章:23
会员2006贡献徽章 行业板块每日发贴之星 每日论坛发贴之星 ERP板块每日发贴之星
Linux系统的定期检查和维护
引:俗话说:“道高一尺,魔高一丈”。只要是连上网的计算机,就有可被入侵。因此系统的定期检查和维护是相当重要的,对于及时发现入侵很有帮助,有助于我们亡羊补牢。
我们要赶在入侵者还没有破坏系统和数据之前把它们清理出去。所以下面就给大家讲一下这方面的技巧。
一、优化分区结构
这对维护很有好处,我们应该把Linux的文件系统分成几个主要的分区,每个分区分别进行不同的配置和安装,一般情况下至少要建立/、 /usr/local、/var和/home等分区。/usr可以安装成只读并且可以被认为是不可修改的。如果/usr中有任何文件发生了改变,那么系统将立即发出安全报警。当然这不包括用户自己改变/usr中的内容。/lib、/boot和/sbin的安装和设置也一样。在安装时应该尽量将它们设置为只读,并且对它们的文件、目录和属性进行的任何修改都会导致系统报警。
当然将所有主要的分区都设置为只读是不可能的,有的分区如/var等,其自身的性质就决定了不能将它们设置为只读,但应该不允许它具有执行权限。
二、保护log文件
当与log文件和log备份一起使用时不可变和只添加这两种文件属性特别有用。这通常需要在log更新脚本中添加一些控制命令。
红联Linux论坛:
__________________
希望能和你相互交流,愿意和您分享学习、进步中的每分喜悦与快乐
---------------------------------------------
http://tzhsuccess.itpub.net
向版主反映这个帖子 查看tzhsuccess 的IP地址
78楼 旧帖 06-07-17 23:24
[ 大 中 小 ] 给予该贴好评 编辑/删除 引用/回复
tzhsuccess
高级会员
注册日期: 2004 Apr
来自: 太?系-?子座
技术贴数:7934
论坛积分:31670
论坛排名:67
论坛徽章:23
会员2006贡献徽章 行业板块每日发贴之星 每日论坛发贴之星 ERP板块每日发贴之星
Linux系统管理员秘技:用快捷命令一招制胜
Linux的命令行方式有着强大的功能,对于熟练的Linux系统管理员来说,往往只需要通过各种技巧,组合构成一条复杂的命令,从而完成用户任务。
那么一条复杂的Linux命令怎样构成呢?下面来介绍几个技巧。
利用输入/输出重定向
在Linux命令行模式中,如果命令所需的输出不是来自键盘,而是来自指定的文件,这就是输入重定向。同理,命令的输出也可以不显示在屏幕上,而是写入到指定文件中,这就是输出重定向。
接下来看看标准输入/输出重定向在构造一条Linux命令中的实际应用。
1.输入重定向和输出重定向
# wc home.txt
第一条命令将文件aa.txt作为wc命令的输入,统计出aa.txt的行数、单词数和字符数。第二条命令将ls命令的输出保存在一个名为home.txt的文件中。如果>符号后边的文件已存在,那么这个文件将被重写。
2.同时使用输入和输出重定向
# iconv -f gb18030 -t utf-8 new-aa.txt
这条命令里同时用到了输入重定向(new-aa.txt)。aa.txt实际是一个gb18030编码的文件,而new-aa.txt则是将aa.txt的内容转换成utf-8格式的新文件。
利用管道
利用Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。下面来看看管道是如何在构造一条Linux命令中得到应用的。
1.利用一个管道
# rpm -qa|grep licq
这条命令使用一个管道符“|”建立了一个管道。管道将rpm -qa命令的输出(包括系统中所有安装的RPM包)作为grep命令的输入,从而列出带有licq字符的RPM包来。
4.利用多个管道
# cat /etc/passwd | grep /bin/bash | wc -l
这条命令使用了两个管道,利用第一个管道将cat命令(显示passwd文件的内容)的输出送给grep命令,grep命令找出含有“/bin/bash”的所有行;第二个管道将grep的输入送给wc命令,wc命令统计出输入中的行数。这个命令的功能在于找出系统中有多少个用户使用bash。
利用命令替换
在Linux命令行模式下,当遇到一对“`” (上分割符)时,将首先执行“`”中间包含的命令,然后将其输出结果作为参数代入命令行中,这就是命令替换了。它类似于输入输出的重定向功能,但区别在于命令替换是将一个命令的输出作为另外一个命令的参数。下面来看它的实际应用。
1.使用命令替换
# touch `date +%Y%m%d%k%M%S`.txt
该命令使用了一次命令替换,date +%Y%m%d%k%M%S命令将首先执行,它将按指定格式输出当前的时间。然后,这个时间将被作为touch命令的参数,其结果是建立了一个以当前时间为文件名的文件。
2.使用命令替换
# kill `/sbin/pidof smbd`
该命令将杀掉sshd的所有进程。这里用pidof这个命令给出进程号,因为kill是针对进程号进行操作的。两者通过命令替换,实现了只用一条命令就杀掉sshd所有进程的功能。
综合应用
在理解和熟悉了前面的几个技巧后,将它们综合运用起来就是较高的技巧了。同时,一些常用的、且本身用法就比较复杂的Linux命令一定要熟练掌握。在构造Linux命令中常常用到的一些基础的、重要的命令有grep、tr、sed、awk、find、cat和echo等,下面来看一些综合应用的例子。
1.
# man ls | col -b > ls.man.txt
这条命令同时运用了输出重定向和管道两种技巧,作用是将ls的帮助信息转成一个可以直接阅读的文本文件。
2.
# kill -9 `ps -ef | grep smbd | tr -s ' ' | awk -F' ' '{print $2}'`
这个例子的功能和上面的功能是一样的,不过它不依赖pidof命令,使用的是多数Unix类系统中都有的命令,适用于更多的系统环境。但是它看起来更复杂一些,使用了三个管道和一次命令替换,另外使用了grep、tr和awk三个与字符操作相关的命令。
从前面的介绍可以看出,通过几种技巧的组合,Linux命令可以完成复杂的功能。除此之外,还可以将这些命令组织到一个脚本中来,加上函数、变量、判断和循环等功能,再加入一些编程思想,就是功能更强大的Shell脚本了。
红联Linux论坛:
__________________
希望能和你相互交流,愿意和您分享学习、进步中的每分喜悦与快乐
---------------------------------------------
http://tzhsuccess.itpub.net
向版主反映这个帖子 查看tzhsuccess 的IP地址
79楼 旧帖 06-07-17 23:24
[ 大 中 小 ] 给予该贴好评 编辑/删除 引用/回复
tzhsuccess
高级会员
注册日期: 2004 Apr
来自: 太?系-?子座
技术贴数:7934
论坛积分:31670
论坛排名:67
论坛徽章:23
会员2006贡献徽章 行业板块每日发贴之星 每日论坛发贴之星 ERP板块每日发贴之星
LINUX系统性能调谐
本文从磁盘,文件及文件系统,内存和编译等方面详细的讲述了如何对Linux系统性能进行调谐。不管是Linux服务器还是客户机或者用户单机,按照本文提供的调谐方法,均可不同程度地改善Linux系统的性能。
1. 引言
实践证明Linux是高性能、稳定可靠而又相当灵活的操作系统,近年来,世界上许多大软件公司纷纷推出各种Linux服务器系统及Linux下的应用软件。目前,Linux已可以与各种传统的商业操作系统分庭抗礼,在服务器市场,占据了相当大的份额。Linux的服务器系统多种多样,可用作web服务器,邮件服务器,ftp服务器,文件服务器以及数据库服务器等等。针对不同的系统以及具体的应用环境,可以对Linux的性能进行相应的调谐。下面分别从磁盘调谐,文件系统,内存管理以及编译优化等方面来论述Linux系统的优化调谐策略。
2.磁盘调谐
2.1 优化的分区
在安装Linux系统之初,就应该考虑怎样使linux系统得到最好的性能。在Linux系统中,我们可以自由地组织磁盘分区。一个优化的分区策略,可以很好地改进Linux系统的性能,减少磁盘碎片,提高磁盘I/O能力。
根据磁盘的特点,我们知道越是靠磁盘外部的柱面,旋转越快,而且每次旋转时,磁盘读写头可以覆盖较多的区域,也就意味着靠外部的柱面可以得到较好的性能。所以在分区时,我们应该考虑将访问频率高的,对系统性能影响相对较大的分区置于磁盘的靠外部分。同时,为了减少磁盘碎片,应将内容经常改变的目录放在单独的分区。从方便备份数据的角度考虑,因为很多备份工具对整个分区进行备份的效率要高,所以我们应将Linux系统的几个主要的目录作为单独的文件系统,为它们各自分配一个区。推荐的分区策略如图一:
在上图中,磁盘还有一部分未分区的空间,为什么不在安装系统时,将整个磁盘分区呢?现在的硬盘空间比较大,而在安装系统时,也许你所安装的文件加上以后增长所需要的空间用不到整个磁盘存储空间。保留一部分未分区空间,当以后有新的需要时,就可以用fdisk重新将之分区。在分区时,需要注意的是,根据系统将来运行的需要或过去的经验来估计各个分区的大小,以免将来空间不够。
如果你的系统有多块硬盘,可以考虑使用多个交换分区。每个磁盘上划分一个交换分区。通过在/etc/fstab文件中设置pri 选项,可使多个交换分区具有同样的优先级。Linux系统即可并行地使用它们。这样即可提高交换分区的性能。
/dev/hda5 swap swap defaults,pri=5 0 0
/dev/hdc5 swap swap defaults,pri=5 0 0
图(二)多个交换分区设置相同的优先级
当然,如果你的系统内存足够大,而你的系统又远远用不了那么多的内存,那也就用不到什么虚存了。分区时你就可以考虑去掉交换分区。不过作为一个Linux服务器,即使你的内存足够大,还是应该设置交换分区。
2.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
2.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阵列的配置文件如下:
QUOTE:
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文件
在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的文件系统了。
2.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服务器,可以将参数调大,以获得较大的吞吐量。
3. 文件及文件系统调谐
3.1 块大小
创建文件系统时,可以指定块的大小。如果将来在你的文件系统中是一些比较大的文件的话,使用较大的块大小将得到较好的性能。将ext2文件系统的块大小调整为4096byte而不是缺省的1024byte,可以减少文件碎片,加快fsck扫描的速度和文件删除以及读操作的速度。另外,在ext2的文件系统中,为根目录保留了5%的空间,对一个大的文件系统,除非用作日志文件,5%的比例有些过多。可以使用命令"# mke2fs -b 4096 -m 1 /dev/hda6"将它改为1%并以块大小4096byte创建文件系统。
使用多大的块大小,需要根据你的系统综合考虑,如果系统用作邮件或者新闻服务器,使用较大的块大小,虽然性能有所提高,但会造成磁盘空间较大的浪费。比如文件系统中的文件平均大小为2145byte,如果使用4096byte的块大小,平均每一个文件就会浪费1951byte空间。如果使用1024byte的块大小,平均每一个文件会浪费927byte空间。在性能和磁盘的代价上如何平衡,要看具体应用的需要。
3.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.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文件系统高效的重要原因之一,如果性能对你真的很重要,应该考虑调整这个参数。
3.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倍。
3.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为单位)选项来改变。
QUOTE:
# 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,必须明白的是,一旦系统重启,它们中的内容将会丢失。所以那些东西可以放在内存文件系统中得根据系统的具体情况而定。
3.6 使用日志文件系统
如果Linux系统由于意外情况而没有正常关机,则可能引起文件系统中某些文件的元数据(meta-data即和文件有关的信息,例如:权限、所有者以及创建和访问时间)遭到破坏。文件系统需要维护文件的元数据来保证文件的可组织和可存取,如果元数据处于不合理或不一致的状态,那么就不能访问和存取文件。当系统重新启动时,fsck将扫描/etc/fstab文件中所列出的所有文件系统,确保它们的元数据处于可用的状态。如果发现元数据不一致,fsck将扫描和检测元数据,并纠正错误。如果文件系统很大,这个过程将需要很长的时间。为解决这个问题,可以使用日志文件系统。日志文件系统用独立的日志文件跟踪磁盘内容的变化,在写入文件内容的同时写入文件的元数据。每次修改文件的元数据时,都要先向称为"日志"的数据结构登记相应的条目。这样,日志文件系统就维护了最近更改的元数据的记录。当加载日志文件系统时,如果发现了错误,不会扫描整个文件系统的元数据,而是根据日志检查最近被更改的元数据。所以相对于传统的文件系统(如ext2),日志文件系统大大地加快了扫描和检测的时间。
Linux下可用的日志文件系统很多,如XFS,JFS,Reiserfs,ext3等等。日志文件系统主要被设计为服务器环境提供出色性能和高可用性。当然, Linux 工作站和家用机器也可从具有高性能的可靠日志文件系统中获益。安装日志文件系统,一般需要下载相应的压缩包、为内核打补丁、重新配置和重新编译内核。 详细的安装过程可访问相应文件系统的官方网站。
4.其它方面的调谐
4.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监视)。
4.2 进程限制
Linux对于每个用户,系统限制其最大进程数。为提高性能,可以设置超级用户root的最大进程数为无限。编辑.bashrc文件(vi /root/.bashrc)增加行"ulimit -u unlimited"即可消除超级用户的进程限制。
核心和系统对用户进程其它的一些限制也可以通过ulimit命令来查看和更改。"ulimit -a" 用来显示当前的各种用户进程限制。一些更改用户限制的例子如下:
ulimit -n 4096 将每个进程可以打开的文件数目加大到4096,缺省为1024
ulimit -m 4096 限制每个进程使用的内存数。
4.3 优化gcc编译
将优化标志放在/etc/profile文件中。在pentium III级的处理器上使用以下优化标志将得到最优的应用程序:
CFLAGS=-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro -march=pentiumpro -fomit-frame-pointer -fno-exceptions
再将如下行加到/etc/profile 更靠后的位置:
export PATH PS1 HOSTNAME HISTSIZE HISTFILESIZE USER LOGNAME MAIL INPUTRC CFLAGS LANG LESSCHARSET
使用以上的优化,gcc或者egcs编译的程序将得到最佳的性能。
4.4 编译内核优化
编辑/usr/src/linux/Makefile文件,可以根据具体的cpu优化内核编译。以下的参数设置将得到优化的内核性能。
QUOTE:
① 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文件重新编译内核将得到较优的性能。
5. 结束语
Linux是一个灵活而又开放的系统。用户可以针对具体的应用环境,从系统的外围到系统的 内核进行调谐。系统的外围的调谐包括系统硬件的配置到系统安装和系统服务的优化等。系统内核的调谐包括参数的修改和改进系统的源代码。我们在针对用作db2数据库服务器的Linux系统的调谐中,针对db2数据库的特点,按照本文的各个调谐方面,另外还包括网络的调谐,对系统性能进行了综合调谐。在对调谐后的系统的综合测试来看,系统的性能有很大的改进。
参考资料:
Gerhard Mourani . Securing and Optimizing Linux[M] , OpenNA Inc, May 2001
Daniel Robbins, Advanced filesystem implementor's guide[J/OL], www-106.ibm.com/developerworks/library
Fergus Donohue . System Tuning Info for Linux Servers[R] , people.redhat.com/alikins
Moshe Bar, Linux 技术内幕[M], 清华大学出版社,2001
作者介绍:
邓延军,男,湖南永州人,西安电子科技大学软件工程研究所硕士研究生,主要研究方向多播协议,系统调谐。您可以通过电子邮件 deng.yanjun@163.com 和他联系。
红联Linux论坛: