瑞星卡卡安全论坛技术交流区系统软件 =====Linux/Unix 应用宝典=====

1234   2  /  4  页   跳转

=====Linux/Unix 应用宝典=====

升级Linux硬件驱动结构
硬件驱动程序是界于硬件和Linux内核之间的软件接口,是一种低级的、专用于某一硬件的软件组件。这种软件组件可以使硬件与更普遍的高级应用程序接口产生互动。为某一具体的子系统或硬件端口(例如SCSI、USB或PCMCIA)提供支持,不同于为所有SCSI、USB或PCMCIA硬件设备提供支持。由于新的硬件每天都在产生,因此测试每一个可能用于某一具体子系统的硬件是不可能的。内核只为具体的一些子系统提供支持,硬件驱动程序也只是为使用这些子系统具体的某些硬件提供支持。新内核保持高级应用程序接口与低级硬件功能的分离。用户可以通过编写合适的硬件驱动程序或修改内核,更容易地为现有系统增加对新硬件的支持。

    Linux硬件驱动可以通过两种方式集成到内核中:一是将其直接编译进行内核从而一劳永逸;二是将其编写成一种目标格式,在需要添加某种硬件时,内核可以将其调入。当用户对Linux内核进行设置时,每个内核设置编译器都可显示各个可用内核设置变量的描述信息,从而使用户决定哪个变量要被消除,哪个需要写入内核,还有哪个可以编写成一种可加载内核模块。

    直接将硬件驱动程序写入内核优点在于,用户可以随时对它进行调用而无需安装。但是这样大大增加内核占用的空间。将硬件驱动程序编写成一种可加载的内核模块,虽然会因为寻找驱动模块而增加系统资源的占用和运行时间,但是与庞大的内核所消耗的资源相比显得微不足道。将硬件驱动程序编写成一种可加载的内核模块,还可为软件开发提供许多便利。当用户需要对某一硬件驱动程序进行开发或纠错时,用户可以动态地卸载旧的版本并加载新的版本,但是如果用户的驱动程序已写入内核,那么必须对内核进行重新编写,并且每次对修改后的程序进行测试时,都必须重新启动系统。另外,将硬件驱动程序视为可加载的内核模块进行开发和配置,这样用户就可以将硬件驱动程序作为一种独立的系统进行升级,而不必对内核进行改动了。

    用户要做的只是编译并安装可加载内核模块,其它的工作由模块自已来完成。当系统首次访问某一硬件设备时,只要存在使用“depmod”命令建立的模块从属关系树,与之对应的模块就可以自动加载。可加载内核模块通常情况下安装在系统/lib/modules目录的一个子目录下。该子目录的名称由建立内核的Makefile中的VERSION、PATCHLEVEL、SUBLEVEL和EXTRAVERSION等变量的值决定。

    Linux 2.6内核为硬件驱动程序带来一个新的、统一的框架。用户对原本运行于旧版本内核下的硬件驱动程序进行定制。新驱动程序框架通过定义各种接口,为硬件的即插即用和电源管理提供全面支持。子系统可以通过这些接口与各个驱动程序进行通信。新驱动程序框架更加明确了总线和驱动程序之间的责任界限。Linux 2.6内核还引入了sysfs文件系统为每个系统的硬件树进行分级处理。Linux 2.6内核还对可加载内核模块规定了新的命名方法,使用的是.ko扩展名,而不是旧版本标准的.o (object)扩展名。

    这里将重点阐述2.6内核下的硬件驱动程序与以往内核下的硬件驱动程序在主体结构上的不同之处。

    升级硬件驱动程序的基本结构

    Linux 2.4内核下的硬件驱动标准模板如下:

#define MODULE
#include linux/module.h>
#include linux/config.h>
#include linux/init.h>
static int __init name_of_initialization_routine(void) {
    /*
    * code here
    */
}
static void __exit name_of_cleanup_routine(void) {
    /*
    * code here
    */
}
module_init(name_of_initialization_routine);
module_exit(name_of_cleanup_routine);



    旧版本内核下的硬件驱动程序有一个普遍的问题,就是对初始化模块和清除功能的名称进行假设。当开发人员编写旧版本内核下的硬件驱动程序时,如果使用缺省的名称init_module()和cleanup_module(),那么就不需要对初始化模块和清除功能的名称进行记录。这种方法经常会出现错误,已逐渐被淘汰。在2.6内核下,用户必须使用module_init()宏和module_exit()宏对初始化和退出规程的名称进行记录。

    另外,在2.6内核下,用户无论是在源代码中还是在Makefile文件中都不再需要对#define MODULE进行描述。内核搭建系统会自动对此类符号进行定义并校验。当用户为2.6内核编写硬件驱动程序时,必然会用到此类搭建系统。

    要想对已有的模块进行编译,并使之加载到2.6内核,必须首先完成一些基本的结构变化。然而,当用户利用此类结构加载模块时,会注意到在标准输出设备和系统日志上会显示一个坏模块的出错信息。为了消除这条信息,用户需要为MODULE_LICENSE()宏增加一个示例,例如MODULE_LICENSE("GPL")。这种2.4内核以后的版本才引入的宏,可以将模块定义为获得GPL Version 2或更新版本许可的模块。其它有效的值还有"GPL v2"、"GPL and additional rights"、"Dual BSD/GPL"(选择BSD或GPL许可)、"Dual MPL/GPL"(选择Mozilla 或GPL许可)和"Proprietary"。

    2.6内核下硬件驱动程序最简单的类属模板如下:

#include img src="/files/misc/lt.gif">linux/module.h>
#include img src="/files/misc/lt.gif">linux/config.h>
#include img src="/files/misc/lt.gif">linux/init.h>
MODULE_LICENSE("GPL");
static int __init name_of_initialization_routine(void) {
    /* code goes here */
    return 0;
}
static void __exit name_of_cleanup_routine(void) {
    /* code goes here */
}
module_init(name_of_initialization_routine);
module_exit(name_of_cleanup_routine);



    除了硬件驱动自身所需要的变化外,在Linux 2.6内核下,与之相应的最重要的变化是在内核搭建过程中完成的。
gototop
 

接第十条
模块搭建过程中的变化

    对于所有开发可加载硬件驱动程序的人来说,对他们影响较大的一个基本变化不是源于内核源代码,而是将外部模块编译过程整合为标准的内核搭建机制。如果用户使用的不是集成开发环境(例如TimeSys公司的TimeStorm,它可以检测内核版本并自动建立Makefile),那么用户需要手工为硬件驱动程序建立Makefile。

    在2.4和更旧版本的内核下,模块的开发和编译位置不受限制,只要将适当的编译标记移到命令行或模块的Makefile中就可以了。这些标记包括两个编译模块时必须的符号定义和一个指针。该指针指向包含有内核所含文件的目录。以下面的语句为例,用户可以建立一个名为testmod.o的可加载内核模块:
    #gcc -D__KERNEL__ -DMODULE -I/usr/src/linux-2.4.21/include -O2 -c testmod.c

    为2.6内核搭建模块的过程比较简单,但是要想满足所有成功编译所需要的条件就不那么容易。用户既不需要手工指定以模块为导向的说明(例如MODULE, __KERNEL__等),也不必指定新的符号(如KBUILD_BASENAME和KBUILD_MODNAME等),只要对外部模块植入标准内核搭建系统的过程进行整合就可以了。用户也不必指定诸如-O2之类的选项,因为用户编译的模块与其它可加载内核模块一样,进程会自动调用所有的强制性标志。至于Makefile的编写就简单得多了,例如为testmod.ko模块编写的可与2.6内核兼容的Makefile如下所示:
    obj-m := testmod.o。

    然而,为了建立外部模块,用户必须先完成内核源代码树接口的编写。这样可以建立一些临时目录以供编译时使用。下面是一个为2.6内核构建模块的命令行。它可以从包含模块源代码目录下执行:
    # make -C /usr/src/linux-2.6.1 SUBDIRS=$PWD modules

    此示例命令假设用户的模块源代码和Makefile所在的目录与用户正在运行的命令中的相同。如果用户不使用POSIX命令(例如BASH),那么可以通过“SUBDIRS=`pwd`”命令,用$PWD变量代替SUBDIRS参数。这样用户就可以使用“pwd”命令识别工作目录。建立出口的命令如下所示:

#make: Entering directory `/usr/src/linux-2.6.1'
*** Warning: Overriding SUBDIRS on the command line can cause
***          inconsistencies
make[1]: `arch/i386/kernel/asm-offsets.s' is up to date.
  Building modules, stage 2.
  MODPOST
  CC      /home/wvh/timesys/2.6/testmod/testmod.mod.o
  LD [M]  /home/wvh/timesys/2.6/testmod/testmod.ko
#make: Leaving directory `/usr/src/linux-2.6.1'



    "make"命令的成功完成将产生testmod.ko模块。对该模块的命名使用的是新的内核模块命名规则。如果用户已经对系统的启动程序进行了修改,以便通过名称清楚地加载模块,那么用户需要确定在升级到2.6内核后,这些模块的命名是否遵循了新的命名规则。

    适应2.6内核的内部变化

    Linux 2.6内核还带来了许多内部变化,用户需要改变已有的驱动程序以适应这种变化。这些变化包括内核的异步I/O机理、DMA支持层、存储器与页分配机理、数据块硬件驱动程序和新的类属硬盘接口等。例如,用来分配并管理存储器与页的功能就发生了新的变化。在2.6内核下,系统使用了一种名叫mempool的标准接口。对模块参考计数的使用和管理也发生了变化。模块参考计数主要用于决定一个模块是否正在使用,并对没有被使用的模块进行安全卸载。在2.6内核下,命令序列已被工作序列所代替,其中,对大量不同驱动程序产生影响的一个重要变化是参数模块的新接口。MODULE_PARM()宏已由详细的参数说明所代替。这种说明来源于新的module_param()宏。

    Linux 2.6内核的优先能力和对SMP的识别能力,为驱动程序编写人员带来一些新问题。在单处理机系统中,在无优先能力的Linux内核下,一些驱动程序可以假设在两个处理器间不必再提供重入接口,因为它们无法同时运行驱动程序。驱动程序可以使用“spinlock”或“mutex”命令来保护那些可从多进程访问的数据。这些问题的考虑对于为嵌入式环境(如TimeSys Linux)编写高性能和实时硬件驱动程序的人来说尤为重要。

    其它考虑因素

    如果用户较为依赖Linux 2.6内核的工作,那么还需要对驱动程序做一些其它的改动。例如,尽管自从2.3内核诞生后,devfs文件系统已经被写入内核,并且在2.6内核设置中被标注为舍弃指令,但是它却经常在一些特殊领域中使用。例如在嵌入式计算中, devfs可提供较强的灵活性和一个紧缩的/dev文件名。devfs文件系统是介于hardcoded硬件节点间的中间步骤。此类节点主要用于早期的Linux和Unix系统中。同时,它还是udev、hotplug和sysfs文件系统的综合。对udev的支持技术目前正在被写入Linux 2.6内核。TimeSys公司已经开发出了拥有此类技术的商业Linux系统。如果用户正在使用其它的Linux发行版,那么用户也许会发现devfs支持和集成技术对于驱动程序来说十分重要。

    如果用户想使用devfs文件系统,那么必须首先在搭建内核时激活对它的支持。这一步可以在内核设置编辑程序的File systems→Pseudo filesystems中完成。使用devfs还需要改变硬件驱动程序对硬件节点的识别方法。当用户使用传统的/dev目录作为Linux硬件描述符文件的放置位置时,硬件驱动程序通过启动register_blkdev() 或register_chrdev()函数来注册新硬件。具体使用哪一个,要看驱动程序注册的是一个数据块硬件还是字符硬件,而且必须事先知道硬件的主号码和次号码。另外,因为udev是一个可热插拔程序,它可以自动建立并删除/dev目录下的登录项,所以这一方法同样也适用于新的udev硬件机理。

    使用devfs硬件文件系统时,硬件驱动程序必须使用devfs_register()系统呼叫来注册它们的硬件。驱动程序可以继续使用此前指定的主次编码,也可通过为devfs_register()呼叫指定DEVFS_FL_AUTO_DEVNUM 标志,由devfs自动指定编码。
gototop
 

在Linux上快速搭建计数器
对外发布网站会有人不断访问,那么怎么来统计访问网站的人数呢?目前有很多方法,例如流量统计和IP统计等。这里介绍的是计数器(Counter)。通过计数器,网站人员能及时掌握浏览网站的人数。现在互联网上的很多服务器采用的都是Linux操作系统,那么如何在Linux上快速搭建属于自己的计数器呢?

    安装与配置

    在Linux平台上有wwwcount-2.6-3.i386.rpm软件包,可搭建基本的计数器,而且很简单。该软件包的安装和配置方法如下:

    1.首先下载wwwcount-2.6-6.i386.rpm。网址是http://speakeasy.rpmfind.net/linux/RPM/PLD/dists/ra/PLD/i386/PLD/RPMS/wwwcount-2.6-6.i386.html。输入下面的命令:
    #rpm -Uvh wwwcount-2.6-6.i386.rpm

    此时,系统会自动在/var/lib/wwwcount/data目录下打开一个my.dat文件。用户需要设置my.dat文件的权限,并在/var/www/html中打开一个范例文件wc-example.html。用户只要察看wc-example.html文件的源代码,即可将计数器挂上网站。

    2.接着下载wwwcount2.6.tar.gz文件。网址是http://www.muquit.com/muquit/software/Count/Count2.6/Count2.6/download/src/wwwcount2.6.tar.gz。下载完后,就开始安装、设置与使用了。

    3.登录Linux主机,进入/usr/local/src目录,对wwwcount2.6.tar.gz文件进行解压操作。命令如下:
    # cd /usr/local/src
    # tar -zxvf wwwcount2.6.tar.gz

    4.接着开始对刚解压的文件进行设置,可以参见下面的过程:

# ./Count-config  //开始设定
……
◆ cgi-bin dierctory [/usr/local/etc/httpd/cgi-bin]:
/usr/local/apache/cgi-bin  //Apache默认的cgi-bin的目录
……
◆ Base directory [/usr/local/etc/Counter]:
/usr/local/Counter // wwwcount安装的目录
You need to enter the directory of the configuration file.
◆ Config directory [/usr/local/Counter/conf]:  //默认按回车键
You will create this file later by running the program “Gen_conf”.
◆ Name of the configuration file [count.cfg]:  //默认按回车键
You need to enter the directory of the counter data file.
◆ Data directory [/usr/local/Counter/data]:  //默认按回车键
You need to enter the directory of the Log file.
◆ Log directory [/usr/local/Counter/Log]:  //默认按回车键
◆ Name of the log file [Count2.6.log]:    //默认按回车键
You entered:
++++++++++++++++++++++++++++++
CgiBinDir=/usr/local/apache/cgi-bin
……
++++++++++++++++++++++++++++++
Everything looks ok [y|n]? y  //确定以上设置没问题后就按y



    5.接下来输入“./configure”命令,开始一些测试主机情况。

    6.如果想要让计数器每点击一次就增加一个数的话,在Makefile文件中找到“Makefile #COUNT_RELOAD= -DCOUNT_RELOAD=1 ”这行(大约在33行),将注解“#”符号取消,保存后退出。

    7.输入命令“make clean”,然后开始编译可执行文件。

    8.接着使用“./Gen-conf”命令设置主机信息,过程如下:

……
Continue [y|n]? y  //按下y确定
Enter your fully qualified domain name [no default]:
game1.com.cn //需要输入主机名与域名
◆ Enter your IP address [no default]: 221.7.128.164 
◆ Does your host have any nickname [y|n]:
? y  //如果主机有多个名称,那就按y,否则按n
◆ Enter your host's nickname (FQDN) [no default]:
www.game1.com.cn  //如果上面按y,才会出现需要填另一个主机名
◆ Do you want to allow automatic file creation [y|n]
? n  //通常不希望自动产生文件
◆ Do you want the program to run in strict mode [y|n]? y 
◆ Do you want to ignore access hits from your own host [y|n]? y
//用户自己访问,如果想计入其内,就按y。
……



    9.开始进行安装,过程如下:

# ./Count-install
Your configuration:
……
Continue [y|n]? y  //查看上面的设置信息是否正确,正确的话就开始安装
◆ Do you know the user and group id of httpd' child process [y|n]:? y 
◆ Enter user id of httpd's child process [no default]:? nobody 
◆ Enter group id of httpd's child process [no default]:? nobody
//如果用户不清楚,可以在httpd.conf文件中查找相关的设置



    到此,安装就完成了。

    应用

    要使用上面搭建的计数器也很简单,只要在网页文件中的任何地方加入下面代码,就可以显示出计数器图形了:

<img SRC=“http://www.game1.com.cn/cgi-bin/Count.cgi?dd=A&ft=0&sh=T&pad=Y&df=test.dat”>



    其中test.dat文件放在/usr/local/Counter/data目录下,用户可以参照下面对这个文件进行一些操作:

#cd /usr/local/Counter/data
#echo 1 > test.dat
#chown nobody:nobody test.dat
#chmod 644 test.dat

gototop
 

建造成本为零的超级计算机
无论是中国还是外国,都有一个“石头汤”的寓言。寓言中讲到一个掉队的士兵来到了一个非常贫穷的村庄,他对村民们说他可以只用一个大锅和一个石头就做出一锅可口的汤。刚开始煮的时候,村民对此非常怀疑,但不久以后就有村民为其提供了一些白菜、几个胡萝卜、一点牛肉……最终,这口大锅里盛满了足以让大家喝饱的汤。这个寓言说明,团结一致在有些时候可以做到一些意想不到的事情。即使我们每个人所做的贡献可能是微不足道,但把这些贡献汇集起来就可以做成一些大事。

Hargrove和Hoffman两位科学家正是利用了寓言所阐述的道理来构建自己的超级计算机。通常,功能强大的计算机可以达到每秒数十亿次的处理能力。大部分超级计算机采用的都是并行处理的技术。它们通常配备有很多功能强大的处理器,用来解决天气预报、原子弹爆炸模拟等复杂的问题。这些超级计算机一般由IBM、SGI等业界巨头生产,其价格也高得惊人,大都需要上千万美元。对于经费紧张的科学研究小组来说,这显然过于昂贵。于是一些实验室和大学里就开始使用廉价的PC来自己构建超级计算机,并且自己编写软件来处理一些非常复杂的问题。

问题的提出

1996年,ORNL(Oak Ridge National Laboratory,美国田纳西州橡树岭国家实验室,http://www.ornl.gov/)的Hargrove和Hoffman在工作中就是遇到了一个问题。他们需要绘制一个美国的生态地图,该地图包含的信息有:气候相同的区域、地形和土壤特征等。为了创建美国大陆的高分辨率地图,需要将国家分成780万个小方格,每个小方格代表一平方公里。而每一个方格中需要考虑的变量多达25个。很显然,PC或者普通的工作站不可能完成这样的任务。也就是说,他们需要一个具有并行处理能力的超级计算机来完成这项工作,但这种计算机的价格已经远远超出他们的承受能力。

最后,他们采取的解决办法是使用ORNL准备丢弃的陈旧计算机和捐赠得来的计算机建造一个计算机集群。该集群被命名为“石头汤计算机(Stone Souper Computer,http://stonesoup.esd.ornl.gov)”。之所以采用这样的名字,是为了表示建造它主要依靠的是各界的捐赠。结果这个由废弃PC组成的超级计算机功能非常强大,它为Hargrove和Hoffman绘制出了高分辨率的生态地图。当时,其它的研究小组更是采用同样的方法设计出了可以和世界上最好的超级计算机相媲美的计算机集群系统。由于具有极佳的性价比,这种方法同样也受到了厂商和公司用户的极大关注。事实上,这种集群的概念为所有的研究组织、学校和企业机构提供了非常强大的处理能力,从而引起了一场观念上的变革。

集群系统的起源

把计算机连接起来提供强大的计算机能力的方法由来已久。早在20世纪50年代,美国空军就建立了一个名为SAGE的网络真空管计算机,用于预防前苏联的核攻击。20世纪80年代中期,DEC公司将其中端VAX小型机整合到了更加大的系统中,并且最终提出了“集群”一词。当时,网络工作站(一般比小型机慢但比PC机快)在研究机构中得到了非常广泛的应用。到20世纪90年代,由于微处理器芯片和以太网设备的价格大幅下降,科学家们开始考虑建造一个PC集群。

而软件的发展也为建造PC集群做好了充分的准备。20世纪80年代,Unix成为了科研领域应用最为广泛的操作系统。不幸的是,该操作系统缺乏在PC上应用的灵活性。1991年,Linux诞生,当时Linus Torvalds将其免费放在Internet上供人下载。在很短的时间里,成千上万的程序员开始为Linux的发展做出贡献。现在Linux已经成为了举世瞩目的操作系统,而它也是建造PC集群的理想操作系统。

第一个PC集群于1994年诞生于NASA戈达德空间飞行中心(NASA Goddard Space Flight Center)。此前,NASA一直在寻找一种廉价的,可以解决地球和太空科学领域里有关计算的一些问题的方案。科学家们需要一台可以达到gigaflops(每秒可以达到10亿次浮点运算,一次浮点运行相当于进行一次加或者乘的简单运算)运行级别的计算机。在当时,能够达到这个运行能力的超级计算机的价格大约是100万美元。这对于从事某一领域研究的科研小组来说实在是太贵了。

当时,一个名叫Sterling的科学家决定自己购买PC然后建造一个集群。Sterling和他在戈达德研究中心的同事Donald J. Becker总共连接起了16个PC。每个PC包含有一个Intel 486处理器,使用的操作系统是Linux,连接设备也是普通的网卡。当时,这个PC集群达到了70megaflops的运算能力,即每秒钟可以进行7千万次浮点运算。虽然从今天的标准来看,这算不了什么,但在当时,这已经达到了一些商业小型超级计算机的运算能力。而当时这个集群只花费了4万美元,只相当于1994年时具有同等计算能力计算机十分之一的价格。

gototop
 

接上
NASA的研究人员将他们建造的集群称之为Beowulf(http://www.beowulf.org)。从此以后,这个名字就成为了使用PC的低成本集群系统的代名词。1996年,出现了Beowulf的两个继承者:Hyglac(由加利佛尼亚技术学院和美国Jet Propulsion Laboratory的研究人员建造)和Loki(它由美国的Los Alamos National Laboratory建造)。这两个集群分别使用了16个Intel Pentium Pro 200 CPU,网络为100Mbits/s Fast Ethernet,操作系统采用 Linux,数据传输用 MPI (Message Passing Library) 。它们的性能都达到了1gigaflops,而价格则都低于5万美元。

“石头汤计算机”的构建

看起来,采用Beowulf的方法似乎可以满足Hargrove和Hoffman绘制美国生态地图的要求。因为每一台单一的工作站只能处理几个州的数据,而他们不可能将不同的区域分配给不同的工作站来处理(因为整个国家中每个部分的环境数据都必须同时进行比较和处理)。换句话说,他们需要一个能够进行并行处理的系统。于是,在1996年,Hargrove和Hoffman向自己的上级部门提交了一个申请,准备购买64台包含奔腾2处理器的PC来建一个和Beowulf类似的集群系统。然而,这个计划却没有得到批准。出于无奈,他们决定寻求替代的方案。他们获知美国能源部橡树岭办公室经常会使用一些新的PC来替代旧的PC,而这些旧的PC则会在内部网上作为废弃的设备进行拍卖。而现在就有数百台被废弃的机器等着处理。于是,他们开始在ORNL一个闲置的房间里通过收集废弃的PC来建造“石头汤计算机”。

并行计算系统的设计理念是“各个击破”,也就是并行系统将一个复杂的问题分解成了一些小的任务。然后这些任务被分配到了系统的各个节点(比如Beowulf集群中的PC),而这些节点可以同时处理问题。并行处理的效率在很大程度上取决于所要处理的问题。一个需要考虑的非常重要的因素是各个节点之间以什么样的频率进行中间结果的共享。有些问题必须被分成无数细小的任务,而这些过于细化的分配需要各节点间进行频繁的通信,因此并不适于进行并行计算。与之相比,一些问题可以被分成比较大的子问题,而这些子问题间无需频繁的通信,因而通过并行系统处理起来就要快得多。这样的问题就比较适于使用这种系统来处理。

在构建任何一个Beowulf集群之前,都要对所要构建的系统进行一些设计。连接PC的方法可以选择普通的以太网,也可以选择更加专业快速的网络。由于缺乏预算,Hargrove和Hoffman采用了普通的以太网进行连接,因为这是免费的。他们选择其中一个PC作为前端节点,并且在其中安装了两个网卡。其中一个网卡用于和外面的用户通信,另外一个则和剩下的节点进行通信,而这些节点则通过自己的专有网络进行连接(如图1)。各个PC之间的合作是通过相互之间传送信息来完成的。现在有两种最流行的信息传送方式,其中一种是MPI,它的全称是Message Passing Interface。另一种是PVM,它的全称是Parallel Virtual Machine。MPI和PVM各有各的优点,PVM虽然应用得比较早,但缺少标准化,它比较适用于异种机环境。比较来看,PVM的性能较低,而且它的函数功能不如MPI丰富。MPI不仅提供大量的函数功能,并且它有一个共同遵守的标准受到广泛的支持。MPI的发展也很快。二者都可以免费从网上获得。在“石头汤计算机”的建造中,两种方式都被使用到了。

很多Beowulf集群系统的硬件组成都很一致,也就是说所使用的所有PC的处理器和其它硬件都一样。这种一致简化了集群的管理和使用,但却并不是必须的。“石头汤计算机”就包含了各种处理器,因为它在建造之初的设计就是使用所有可用的设备。刚开始,“石头汤计算机”包含有一些使用Intel 486的机器,接下来,使用的机器至少都是奔腾以上,且内存至少为32MB,硬盘则为200MB以上。

事实上,在建造这个集群系统的过程中,Hargrove和Hoffman发现很少有机器可以满足这种需求,于是他们就将不同PC的比较好的组件组合在一起。

每为集群添加一个节点,他们就为其安装上Linux操作系统。后来他们更是简化了这个过程,使得每一节点的安装过程更加简便。“石头汤计算机”第一次运行是在1997年。到2001年的时候,其所包含的节点已经达到了133个。这其中包含有75个486 PC、53个奔腾机器和5个Compaq公司产的Alpha工作站(如图2和图3)。

对“石头汤计算机”的升级过程非常简单,只需要将其中最慢的节点进行替换即可。作为集群的一个例行任务,每隔一个小时,每一个节点就会进行一次简单的速度测试。测试得到的值将帮助对集群进行调整。与商业机器不一样的是,“石头汤计算机”的性能一直在持续上升,因为它会不断得到来自各方免费赠送的机器对其进行升级。

gototop
 

接上
并行处理问题

与设置和装配Beowulf系统的硬件相比,并行程序的开发更需要技巧和创造力,因而也更具有挑战性。Beowulf集群中最常用的程序模式是Master-Slave。这种模式中,一个节点作为Master,它负责指挥与之相关联的一个或者多个Slave。

另外一个挑战是在集群中的PC间实现负载均衡。因为“石头汤计算机”中包含有各种不同速度的处理器,所以不能将工作量进行平均分配(因为这样将导致快的机器长时间等待慢的机器)。解决这个问题的办法是开发一个算法程序,让Master给那些更快完成数据处理的节点传送更多的任务。这样,那些快的PC就可以做更多的工作,而速度慢的机器也可以被充分利用起来。

最终效果

经过一段时间的努力,Hargrove和Hoffman终于使用“石头汤计算机”成功绘制出了完整的美国生态地图。该地图于1999年在波特兰举行的超级计算机年会上在ORNL的展台上展出(如图4)。

除了绘制当前的生态地图外,功能强大的“石头汤计算机”还可以预测出随着全球气候变暖的影响,2099年时美国生态地图的情况。图5显示的就是分别采用两种模型(British Hadley模型和Canadian Climate Centre模型)得出的结果。

小结

据称,“石头汤计算机”的峰值处理能力曾达到过150gigaflops。不过该集群系统的建造者坦言,他们从来没有对该集群系统做过正式的性能测试。他关心的是能够使用该系统来完成他们的工作,不过他们也表示,该系统的理论处理能力应该达到1.2gigaflops左右。

在写本文的时候,“石头汤计算机”集群系统已经在完成了它的使命之后停止了运行。不过作为开放源码应用的一个经典案例,该集群的网站(http://stonesoup.esd.ornl.gov)至今也没有关闭。目的是让我们能够从中得到更多的启示。

就我国而言,集群系统有极其广泛的应用前景,它将促进我国系统集成的发展和自有软件开发和推广。以前一些在大型机运行的国外大型软件都是国外公司与国外计算机生产厂商的紧密合作开发出来的。而我国由于不可能得到一些计算机厂商的底层技术,因此大大限制了国有软件的发展速度及高性能计算的认识水平。现在许多国外大型软件公司都致力将软件移植到PC机系统上,而Linux的发展更是加速了这种更新的步伐。在集群技术日益发展和更新的今天,我们应紧跟国际发展趋势,研究我国的具体应用,开发出更高性能的自有集群系统,普遍提高我国高性能计算水平。

gototop
 

这软件用得不太习惯
gototop
 

这是因为红旗操作系统在中国好像不太流行。
gototop
 

linux应用软件谈之远程桌面控制
这里我要说的不是telnet,rsh之类的远程控制工具,而是指远程控制桌面应用.
X window比MS windows先进的地方是,X window是个基于网络的的图形视窗系统,本身就具有远程控制的强大功能.用户在远程系统上登录执行X 应用程序,并将Xclients执行的结果传回本地主机.这就是我下面要介绍的Remote X


一、Remote X
假设本地主机ip为172.16.1.1,远程的主机ip为172.16.1.2

第一步,在本地主机上的任意一个xterm中执行xhost,用来允许远程的其它主机可以和本地主机的X server联网:
xhost + 172.16.1.2
如果不指定任何ip地址,则表示权限完全放开,这会带来安全问题,要小心!

第二步,确认本地主机的xfs是运行的.用ps检查一下进程.

第三步,从本地主机(172.16.1.1)上通过网络登录到远程主机172.16.1.2上,你用telnet,ssh,rsh都可以.设置DISPLAY变量.
export DISPLAY=172.16.1.1:0

第四步,现在可以使用远程主机上的X 应用程序了.

这么样,很方便吧,但是你还不能掌控整个桌面环境,这个工作就交给vnc吧!Remote X 在局域网上运行效果很不错,普通的电话拨号就不用试了,速度太慢了.


二、vnc
我相信有不少人在windows环境用过pcanywhere,但你想不想用一个免费的,可以在linux,win9x/nt上都可以使用的pcanywhere,这就是vnc.
vnc就是vitual network computing的缩写,它支持许多操作平台,甚至可在浏览器中操作.
我主要介绍vncviewer的用法,以及用linux远程控制linux或nt.
vnc client通过架构在tcp/ip上的vnc协议与vnc server沟通,通过认证后,把X server的桌面环境,输入设备,和X 资源交给vncserver掌控,vnc server将桌面环境通过vnc 协议送给vnc client端.让vnc client来操纵vnc server桌面环境和输入设备.
首先下载到vnc的linux版本和windows版本.
当前的linux版本是vnc-3.3.3r1_x86_linux_2.0.tgz
当前的windows版本是vnc-3.3.3r7_x86_win32.zip

1.安装linux版的vnc
(1)安装
tar zxvf vnc-3.3.3r1_x86_linux_2.0.tgz
cd vnc_x86_linux_2.0
cp *vnc* /usr/local/bin/
mkdir /usr/local/vnc
cp -r classes/ /usr/local/vnc/
(2)设置vnc server的访问密码
vncpasswd
(3)启动vnc server
vncserver
注意运行后显示的信息,记下所用的端口号,一般从1开始,因为0被x server占用了.现在,你就能提供vnc服务了.vnc client的用法等会介绍.

2、安装nt版的vnc
1)安装
解开vnc-3.3.3r7_x86_win32.zip包后,会产生winvnc和vncviewer两个目录.winvnc目录中是vnc server的安装程序,vncviewer目录中是vnc client的安装序.我只关心vnc server,在winvnc目录中执行setup即可.
2)设置
首先执行install default registry settings.
run winvnc(app mode)就是执行vnc server
这时可看到winvnc运行的小图标,用鼠标右键点击图标,在properties/incoming connections中设定密码.默认配置即可.
现在,你的nt就能提供vnc服务了.

3、使用vncviewer
vnc server启动成功后,你就可用vncviewer来远程控制桌面了.
vncviewer xxx.xxx.xxx.xxx:display number
例如,vncviewer 172.16.1.2:1
按要求输入密码就可以看到远程的桌面了.
注意:viewers需要在16位色的显示模式下工作,如果您的操作系统中没上16位色,那么请您及时的调整您计算机的显示模式。不然vncviewer无法正常工作。

4、linux版vnc server的改进.
linux上的vnc server内定的桌面管理环境是twm,实在是太简陋了.
修改$HOME/.vnc/xstartup这个文件.
把所有内容的行前加上#,再在接尾部份加上:
startkde &
你当然可用你喜好的桌面代替.我这是用kde来代替twm,速度会慢少少,但用起来方便不少.
注意要重新启动vnc server.

5、通过浏览器使用vnc
通过浏览器使用vnc,要注意端口号的变化.
假设vnc server是172.16.1.2:1的话,那么,可用浏览器访问http://172.16.1.2:5801
端口号=display number + 5800
好了,心动不如行动,just do it !


gototop
 

Linux下的硬盘提速方案


  目前很多朋友都用上了大容量的DMA或UDMA-33标准的硬盘。在微软的Windows98下为了使得DMA或UDMA-33标准的硬盘提高数据传输速率,可以在计算机的CMOS或操作系统中打开IDE硬盘的DMA(直接存储器存取)这项功能。但是在Linux平台中,Linux是不会自动的打开DMA模式,所以在Linux中使用这些IDE接口的UDMA-33标准的硬盘感觉数据传输远远没有在Windows中快。事实上,Linux平台中也可以通过软件来打开DMA模式,以下就是Linux下的硬盘提速的具体做法。


  首先,在Linux下打开DMA模式之前,最重要的事情就是备份硬盘上的数据。因为在开启DMA模式之后谁也无法预料到硬盘是否还能正常工作,数据是否还完整。把Linux下所有的重要数据备份到其他硬盘或是CD-R等存储媒介上是最好的选择,请不要把数据备份在同一块硬盘上,更不能把数据备份到同一个硬盘分区。
第二步需要修改hdparm目录下的一些设备节点参数。但是修改这些参数必须以超级用户(ROOT)的身份登陆Linux系统才行。普通Linux用户没有这个权限修改hdparm目录下的东西。下面就是一个修改硬盘设备节点参数的例子,注意,不同型号,不同容量的硬盘可能列出的参数不太一样,但是修改的过程和方法大体上是一样的。

# /sbin/hdparm /dev/hda
/dev/hda:
multcount = 0 (off)
I/O support = 0 (default 16-bit)
unmaskirq = 0 (off)
using_dma = 0 (off)
keepsettings = 0 (off)
nowerr = 0 (off)
readonly = 0 (off)
readahead = 8 (on)
geometry = 629/240/63, sectors = 9514260, start = 0
#

  要注意的是,OFF代表此参数不起作用,ON表示打开此功能或模式。上面的参数列表写的非常清楚,Multcount(多扇区读) 没有打开;此硬盘格式为16位格式;DMA数据传输模式没有打开。很显然,这样的参数并没有使硬盘达到最佳的优化,没有能完全发挥当今高速IDE硬盘的性能。
为了优化硬盘,提高硬盘的数据传输速率,首先还是要了解以下这些参数的含义:

c3 :就是把硬盘的16位格式转换为32位模式。
m16 :改变硬盘的多路扇区的读功能,-m16可以使得硬盘一次读入16个扇区的数据。但是不是所有的硬盘都支持这个功能。使用hdparm -i /dev/hda 可以察看您的硬盘最大能读写的扇区数目。
d1X34 在支持DMA-capable的硬盘中,这个参数可以支持双DMA通道的数据传输模式。
d1X66 在支持UDMA-capable的硬盘中,这个参数可以支持双DMA通道的数据传输模式。
  了解以上参数的作用和含义之后,现在请您仔细检查硬盘上面上的标签,看看您的硬盘是否支持DMA 或者 UDMA模式,然后才对照这些参数来优化您的硬盘,以防出现不可预见的错误。
优化硬盘的参数,也可以参考下面的例子,注意,不是所有的硬盘都适用一下的优化参数,请按照实际情况来设置参数:


# hdparm -d1X66 -m16 -c3 /dev/hda
# hdparm /dev/hda
/dev/hda:
multcount = 16 (on)
I/O support = 3 (32-bit w/sync)
unmaskirq = 0 (off)
using_dma = 1 (on)
keepsettings = 0 (off)
nowerr = 0 (off)
readonly = 0 (off)
readahead = 8 (on)
geometry = 629/240/63, sectors = 9514260, start = 0

  修改完这些参数之后,有时候并不能一次性把硬盘优化成功。如果在硬盘还在正常工作的时候修改这些数据,硬盘会进入“休眠”状态。这就需要等硬盘灯会熄灭,硬盘不处于繁忙状态下优化硬盘参数比较容易成功。

  hdparm的改变是一个临时的状态,下次再次启动Linux系统的时候hdparm将会消失。所以要想永久的保存修改后的信息,就必须把修改后的参数和数据写入/etc/rc.d/rc.local或者/etc/rc.local文件,甚至比启动过程要早运行的程序中。

  最后要提醒大家的是,如果您的主板的芯片组或Linux内核kernel(比如内核kernel版本过于陈旧,2.2版以前)如果不支持UDMA模式,那就没有必要去修改硬盘设备的参数了。升级主板或者kernel是解决这个问题的较好选择。

gototop
 
1234   2  /  4  页   跳转
页面顶部
Powered by Discuz!NT