MySQL 4.1 对多语言的支持有了很大变化 (这导致了问题的出现);
尽管大部分的地方 (包括个人使用和主机提供商),MySQL 3 仍然占主导地位;但 MySQL 4.1 是 MySQL 官方推荐的数据库,已经有主机提供商开始提供并将会越来越多;
许多 PHP 程序以 MySQL 作为默认的数据库管理软件,但它们一般不区分 MySQL 4.1 与 4.1 以下版本的区别,笼统地称“MySQL 3.xx.xx 以上版本”就满足安装需求了;
因为 latin1 在许多地方 (下边会详细描述具体是哪些地方) 作为默认的字符集,成功的蒙蔽了许多 PHP 程序的开发者和用户,掩盖了在中文等语言环境下会出现的问题;
简单的说,MySQL 自身的变化和使用 MySQL 的 PHP 程序对此忽略,导致了问题的出现和复杂化,而由于大部分用户使用的是英文,使这种问题不被重视。这里提到的 PHP 程序,主要就 WordPress 而言。

[separator]



MySQL 4.1 字符集支持的原理MySQL 4.1 对于字符集的指定可以细化到一台机器上安装的 MySQL,其中的一个数据库,其中的一张表,其中的一栏,应该用什么字符集。但是,传统的 Web 程序在创建数据库和数据表时并没有使用那么复杂的配置,它们用的是默认的配置,那么,默认的配置从何而来呢?

编译 MySQL 时,指定了一个默认的字符集,这个字符集是 latin1;
安装 MySQL 时,可以在配置文件 (my.ini) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的;
启动 mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的;
此时 character_set_server 被设定为这个默认的字符集;
当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为 character_set_server;
当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集;
在这个数据库里创建一张表时,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集;
当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集;
这个字符集就是数据库中实际存储数据采用的字符集,mysqldump 出来的内容就是这个字符集下的;
简单的总结一下,如果什么地方都不修改,那么所有的数据库的所有表的所有栏位的都用 latin1 存储,不过我们如果安装 MySQL,一般都会选择多语言支持,也就是说,安装程序会自动在配置文件中把 default_character_set 设置为 UTF-8,这保证了缺省情况下,所有的数据库的所有表的所有栏位的都用 UTF-8 存储。

当一个 PHP 程序与 MySQL 建立连接后,这个程序发送给 MySQL 的数据采用的是什么字符集?MySQL 无从得知 (它最多只能猜测),所以 MySQL 4.1 要求客户端必须指定这个字符集,也就是 character_set_client,MySQL 的怪异之处在于,得到的这个字符集并不立即转换为存储在数据库中的那个字符集,而是先转换为 character_set_connection 变量指定的一个字符集;这个 connection 层究竟有什么用我不大明白,但转换为 character_set_connection 的这个字符集之后,还要转换为数据库默认的字符集,也就是说要经过两次转换;当这个数据被输出时,又要由数据库默认的字符集转换为 character_set_results 指定的字符集。

一个典型的环境典型的环境以我自己的电脑上安装的 MySQL 4.1 为例,我自己的电脑上安装着 Apache 2,PHP 5 和 WordPress 1.5.1.3,MySQL 配置文件中指定了 default_character_set 为 utf8。于是问题出现了:

WordPress 按照默认情况安装,所以所有的表都用 UTF-8 存储数据;
WordPress 默认采用的浏览字符集是 UTF-8 (Options->Reading 中设置),因此所有 WP 页面的 meta 中会说明 charset 是 utf-8;
所以浏览器会以 utf-8 方式显示所有的 WP 页面;这样一来 Write 的所有 Post,和 Comment 都会以 UTF-8 格式从浏览器发送给 Apache,再由 Apache 交给 PHP;
所以 WP 从所有的表单中得到的数据都是 utf-8 编码的;WP 不加转换的直接把这些数据发送给 MySQL;
MySQL 默认设置的 character_set_client 和 character_set_connection 都是 latin1,此时怪异的事情发生了,实际上是 utf-8 格式的数据,被“当作 latin1”转换成……居然还是转换成 latin1,然后再由这个 latin1 转换成 utf-8,这么两次转换,有一部分 utf-8 的字符就丢失了,变成 ??,最后输出的时候 character_set_results 默认是 latin1,也就输出为奇怪的东西了。
最神奇的还不是这个,如果 WordPress 中设置以 GB2312 格式阅读,那么 WP 发送给 MySQL 的 GB2312 编码的数据,被“当作 latin1”转换后,存进数据库的是一种奇怪的格式 (真的是奇怪的格式,mysqldump 出来就能发现,无论当作 utf-8 还是当作 gb2312 来读都是乱码),但如果这种格式以 latin1 输出出来,居然又能变回 GB2312!

这会导致什么现象呢?WP 如果使用 MySQL 4.1 数据库,把编码改用 GB2312 就正常了,可惜,这种正常只是貌似正常。

如何解决问题如果你已经不耐烦了 (几乎是肯定的),google 一下,会发现绝大部分的解答是,query 之前先执行一下:SET NAMES 'utf8',没错,这是解决方案,但本文的目的是说明,这为什么是解决方案。

要保证结果正确,必须保证数据表采用的格式是正确的,也就是说,至少能够存放所有的汉字,那么我们只有两种选择,gbk 或者 utf-8,下面讨论 utf-8 的情况。

因为配置文件设置的 default_character_set 是 utf8,数据表默认采用的就是 utf-8 建立的。这也应该是所有采用 MySQL 4.1 的主机提供商应该采用的配置。所以我们要保证的只是客户端与 MySQL 交互之间指定编码的正确。

这只有两种可能,客户端以 gb2312 格式发送数据,或者以 utf-8 格式发送数据。

如果以 gb2312 格式发送:

SET character_set_client='gb2312'
SET character_set_connection='utf8' 或者
SET character_set_connection='gb2312'

都是可以的,都能够保证数据在编码转换中不出现丢失,也就是保证存储入数据库的是正确的内容。

怎么保证取出的是正确的内容呢?考虑到绝大部分客户端 (包括 WP),发送数据的编码也就是它所希望收到数据的编码,所以:

SET character_set_results='gb2312'

可以保证取出给浏览器显示的格式就是 gb2312。

如果是第二种情况,客户端以 utf-8 格式发送 (WP 的默认情况),可以采用下述配置:

SET character_set_client='utf8'
SET character_set_connection='utf8'
SET character_set_results='utf8'

这个配置就等价于 SET NAMES 'utf8'。

WP 应该作什么修改还是那句话,客户端要发给数据库什么编码的数据,数据库是不可能确切知道的,只能让客户端自己说明白,所以,WP 是必须发送正确的 SET... 给 MySQL 的。怎么发送最合适呢?台湾的 pLog 同仁给出了一些建议:

首先,测试服务器是否 >= 4.1,编译时是否加入了 UTF-8 支持;是则继续
然后测试数据库以什么格式存储 ($dbEncoding);
SET NAMES $dbEncoding
对于第二点,WP 的情况是不同的,按照上面的典型配置,只要用 WP,肯定数据库是用 UTF-8 存储的,所以要根据用户设置的以 GB2312 还是 UTF-8 浏览来判断 (bloginfo('charset')),但这个值是要连接数据库以后才能得到的,所以效率最高的方式是连接数据库之后,根据这个配置设置一次 SET NAMES,而不必每次查询之前都设置一遍。

我的修改方式是这样的,在 wp_includes/wp-db.php 中增加:

function set_charset($charset)
{
// check mysql version first.
$serverVersion = mysql_get_server_info($this->dbh);
$version = explode('.', $serverVersion);
if ($version[0] < 4) return;

// check if utf8 support was compiled in
$result = mysql_query("SHOW CHARACTER SET like 'utf8'",
$this->dbh);
if (mysql_num_rows($result) < = 0) return;

if ($charset == 'utf-8' || $charset == 'UTF-8')
$charset = 'utf8';;
@mysql_query("SET NAMES '$charset'", $this->dbh);
}

在 wp-settings.php 的 require (ABSPATH . WPINC . '/vars.php'); 后增加:

$wpdb->set_charset(get_bloginfo('charset'));


1. MySQL 4.1 在文字上有很大改进,它有了 Character Set 与 Collation 的慨念。

2. 在 MySQL 4.0 ,一般的程式都会将文字以拉丁文 ( latin) 来储存,就算我们输入中文字,结果仍是放在以拉丁文设置的文字栏里头,这对 MySQL 4.0 与以 MySQL 4.0 为基楚的程式来说,并不会有问题。

3. 可是 MySQL 4.1 的系统编码是预设用 UTF-8 的,当要 restore MySQL 4.0 的 backup 档到 MySQL 4.1 时,乱码就出现了。原因在于 MySQL 4.1 将 latin 码转换过来,而后转换是并不完全完美的,这导致了出现少量文字出现乱码现象。

4. 要解决这乱码问题并不难。首先,在 MySQL 4.0 备份时,先将所有文字栏变成 binary 类型,然后进行正常备份。第二步,可在 MySQL 4.1 里将刚才的备份 restore。最后,将较早前所变更到 binay 类型的文字栏,再次复原到文字类型。这样中文编码的问题就应该可以完全解决。

5. 将文字栏变更到 binay 类型时,必需设定 binary 栏的长度大过或等于 (>=) 文字栏的长度,否则资料会失去。

6. 另外,经这样升级的 MySQL 数据库,在 MySQL 4.1 里将会正常工作,就算是怎样 backup 与 restore 都不会再有乱码问题。
作者: MySQL 发布日期: 2005-12-14
mysql4.1是比较烦人,支持多语言的细化设置,再加上phpmyadmin2.6也比较笨,默认就是改不动的utf8,怎么弄都乱码。
好了,废话少说,我们来一步步解决这个问题:
1.修改/etc/my.cnf文件,改成这样:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
default-character-set=utf8

[mysql.server]
user=mysql
basedir=/var/lib

[mysqld_safe]
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

注意:就是加入了一句default-character-set=utf8。

2./etc/init.d/mysqld restart 重新启动mysql;
3.打开phpmyadmin,选择lang为"Chines simplifies(zh-utf-8)",选择"MySQL 连接校对"为"utf8_general_ci "点“显示 MySQL 的运行信息”--“变量”,可以看到:
character set client utf8 utf8
character set connection utf8 utf8
character set database utf8 utf8
character set results utf8 utf8
character set server utf8 utf8
character set system utf8 utf8
collation connection utf8_general_ci utf8_general_ci
collation database utf8_general_ci utf8_general_ci
collation server utf8_general_ci utf8_general_ci
从这里可以看到character全部变成utf8了。
有人要问,为什么都要改成utf8呢?改成GB2312不行吗?
解释如下:
我也不想改成utf8,只是phpmyadmin2.6在mysql4.1的时候只会用utf8,连其他页面的charset也都是utf8,改成gb2312一定会乱码,我们只能凑phpmyadmin了。
只有在mysql3.23的时候,phpmyadmin才会多一个gb2312的页面charset,这时候是正常的。
3.将以前的mysql3的库文件导入mysql4.1的库
有两种情况:
一是从phpmyadmin上导入,这时候你要注意的是在选择库文件的页面左下脚有个“文件的字符集:”,默认是utf8,要改成gb2312,否则导进去乱码;
二是在linux下导入,这时候你需要先在库文件的头部加一行:
SET NAMES 'gb2312';; 注意最后也是;号,别漏了。
然后执行mysql -u用户名 -p密码 xxx.sql > 库名
导入完成以后再用phpmyadmin打开看,里面的中文字就是正确的。
4.从mysql4.1里导出库文件
一.用phpmyadmin导出
导出倒是问题不大,如果phpmyadmin的浏览页面里显示的中文是正常的,那么导出肯定也是正常的
二.在linux上导出
如果用mysqldump导出出现了乱码也没有关系,可以运行iconv来转换一下
iconv -c -f UTF-8 -t GB2312 库文件名 > 新的gb2312的库文件名

综上所述,你要注意:
1。尽量在需要导入的库文件的开头加入SET NAMES 'gb2312';;告诉mysql你要导入的是一个gb2312的文件;
2。可能你需要这个:
SET NAMES 'utf8';;
在登陆到mysql后用,把character的一些默认参数改到utf8上,有时可以减少一些困扰,不过也不是必须的。
在mysql上使用:
SHOW VARIABLES LIKE 'character_set_%';;
用来查看当前的状态。
3.如果出现乱码也不要怕,一是你要注意留存原有的备份,二是用iconv来进行转化。
在正常使用之前注意做导入导出的测试,确保万无一失。

最后加一句:www.quicklinux.org原创文章,转载请注明出处。呵呵
邮件:support@quicklinux.org
作者: MySQL 发布日期: 2005-12-14
我升级了MYSQL到4.1.2,phpmyadmin用的是2.6.2。数据表里面有中文的字段中文都变成了乱码,导出数据也是乱码。我用以前的2.5.7没有问题,想问一下,应该在phpmyadmin的那个文件里改哪个设置一下才能显示出来的是正常的中文字?

和字符相关的变量中这几个和sql很有关系:
character_set_client
character_set_connection
character_set_results
此外就是数据库中对相应字段设置的charact set,如果没有对字段设置,缺省是table的charact set,table也没有指定则缺省使用database的。
上面3个变量的作用是这样的,client表示客户端发送过来的字符集,results表示发送到客户端的字符集(这两个分开是因为发送过来和发送过去的不一定是同一个客户端),connection则在客户端和数据库起一个连接作用。
具体是这样:比如我在mysql命令行设置client为gbk,connection为utf8,results为gbk,数据库为big5,
当我发送一个insert语句的时候,这个语句作为gbk代码,先转为utf8代码(connection),再转为big5(database)插入数据库。
而运行一个select语句的时候,从数据库得到的结果则相反的过程,由big5转为utf8,再转为gbk,你得到gbk的结果。
因此最主要的是让client和results和你使用的客户端一致。比如你的网页是utf8编码,你就要设置这两个为utf8。
而在mysql命令行的时候,我用的是2000,需要设置为gbk
而我们用的set names XXX,实际上就是同时设置这3个变量为XXX。
在这样的情况下,我们可以把一个数据库中的不同表或不同字段设为不同的字符集,只要上面3个设置正确,就可以在数据库中同时使用不同的字符集。
注意要保证你的数据库中的字符已经使用了正确的字符集,比如如果一开始你设置错误,插入数据后,本身数据的编码就是不正确的,然后即使设置改回来,也不可能得到正确的显示了。
还有一个是编码互相之间的兼容性,如果一个字符在gbk中有,在utf8中没有,那么在gbk-》utf8-》gbk的过程中,它就变成了“?”
再说一下具体解决的办法。
首先要指定你的升级后的database及table及field的character set,一般来说我们用gb2312或者utf8的,如果不同时使用多种编码,只要指定database就可以,可以在建库的sql语句加上相应的character set,在phpMyAdmin里也可以修改。
然后是导入旧数据。首先要确定自己的数据文件的编码。如果用phpMyAdmin导入,在界面上有文件编码的选项,一定要和数据文件的编码一致。
如果从mysql的命令行导入,就要自己设置上面说到的3个变量,set names xxx。
使用其它的客户端程序一样要注意。
这样就可以让旧数据转入新数据库后的编码才是正确的,如果这一步错了,后面不可能得到正确的显示。
然后是自己的程序,在连接后就可以执行一次set names xxx,根据你的网页编码而定。
这样基本就可以保证编码正确了。
你很有可能是导入的数据编码已经不对了
posted @ 2006-06-06 23:38 edsonjava 阅读(155) | 评论 (0)编辑 收藏
 
前言   有同事已经通过艰苦的工作完成了长达好几百页的关于Linux的文档。事实上,在网上还有超过好几万页的各种关于Linux的技术精华,还不包括英文的。有数万程序员和网络专家在为这个软件努力工作。这就是自由的魅力。   我使用Linux有不少时间了,期间也经历过无数的挫折,同时也得到过很多高手的帮助。我一向喜欢言简意赅的文字。通过下面的简单句子和代码,我希望能够表达出我使用Linux的体会。也许本文的结构比较凌乱,但我希望它的每一句话都是对你有用的。当然,你要知道一些更详细的东西,请参阅我同事写的文档。   当然,能够通过查阅这个文档,使你的工作顺利是我最大的心愿。 一、关于Linux的误区   1、Linux干什么用?   首先,很少有人用Linux做桌面系统,因为Windows桌面系统已经足够好了。我们主要把Linux用作网络服务器的操作系统。如果你和你的应用符合下面的几条,那么你合适使用Linux:   *不愿意花钱在操作系统和网络应用上。   *用D版系统受良心谴责或害怕承担责任。   *想得到和花钱的系统差不多的性能。   *在用户面前显得水平较高。   *认识几个弄Linux的高手,或者知道在哪里能够找到问题答案。   2、每种Linux发行包差别很多吗?   如果你在上世纪80年代末到95年之前这段时间大量使用PC机的话,那对于Linux你应该很好理解:它就象一个有着32位抢先多任务核心的DOS,其区别在于外表看起来像是一种UNIX。Linux是好多人用智慧堆砌起来的,初学者经常问:“RedHat好还是Slackware好?”。这个人同时还面临上百种选择,这的确让人头痛。大部分Linux发行包实际上很简单,几乎所有的发行包都有相同的内核(也许是不同版本),外部命令和数据文件的差别也仅仅局限于在文件系统中的存放位置不同(这导致了某些兼容性问题,因为在某些地方找不到特定的文件嘛)。另外就是有些发行包为了显示自己的卓而不群,在发行包中增加了一些自己的实用程序。实际上动手修改内核的厂商不算太多,因为这样会内核官方版本的不断更新而手忙脚乱。当然有一些嵌入式系统开发商在Linux基础上做了自己的系统另说。   拥有众多的发行包是Linux的一个很讨厌的问题,在这一点上,我更喜欢FreeBSD,因为它只有一个官方发行版本,也运行得比较稳定。可给Linux做软件的程序员太多了,Linux上面的资料也更多。记住:当一个家伙跟你说用哪个发行版本无所谓的时候,那他就是专家。   3、Linux业余爱好者的东西吗?   这样的宣传给了很多人这样的印象。其实,Linux是一个严肃的操作系统,拥有一切操作系统共有的特性。它可以用在很多严肃的场合。   4、Linux性能比Windows更好吗?   这里的答案会让你失望,据我以往的实际测试,2.2版本的Linux核心的性能比windows2000要低。值得欣慰的是2.4版本的核心性能有大幅度提高基本上接近了Windows2000。但Windows2000复杂的图形界面占用了相当的系统资源。   5、Linux比Windows更复杂更专业吗?   从复杂度上说,Windows2000要比Linux复杂很多。在核心技术上,Windows也更先进。   6、Linux更可靠吗?   应该从两个角度评价系统的可靠性。(1)系统自身的可靠性,两者象差不多。人们普遍认为的Windwos不如Linux可靠的印象来源于Windows众多的良莠不齐的软件。当然,Linux比Windows结构简单,在一定程度上也可以提高可靠性。(2)从安全性角度来说,Linux远远高于Windows系统,道理很简单:树大招风嘛。另外,Linux的源代码开放机制使得漏洞发现和消灭得很快。而Windows相对就显得比较官僚了。这里补充一点,我用过的最可靠的系统是BSD类的OS,可靠性和安全性都可圈可点。   7、Linux真的不用花一分钱吗?   大部分的发行包需要花少量的钱购买。当然你也可以从网络上DOWN。其实这些发行包未必符合你的应用,一般都需要经过一些改动和定制才能运行好。当然,花的钱跟Windows没法比。 二、Linux安装注意事项   现在的大部分发行包都很容易安装,基本上都是图形向导式的,每个发行包都不太相同,也无法一一描述,如果你连安装都不明白,那就别用Linux了。这里仅仅说明几个注意的问题。   1、如果要和Windows混装,一定要先装Windows,后装Linux。   2、分区的时候,根据计划安装的软件灵活决定分区。一般分区有:/,/root,/usr,/var和swap分区,其中swap分区类型和其他不同需要专门选择一下,它的空间一般是物理内存的两倍即可。/root分区是紧急情况root用的,有64兆就行了。   3、当然,为了方便,你可以安装发行包给你做好的软件。但我安装Linux的习惯做法是开始就安装一个最小系统,然后安装所有的编译工具。安装编译工具的方法一般都通过你用的发行包的包管理工具实现,这样最方便。比如在TurboLinux中,运行/usr/sbin/Turbopkg就可以了。在管理工具中选择所有关于Developoment相关的选项或gcc相关选项,一般就可以了。   4、lilo一定要装。否则一旦出现分区问题都不好办。   5、如果和Windows混装的时候,装完了系统起不来了。可以用98启动盘启动,然后用FDISK /MBR回复主引导分区来保住Windows分区。   在安装了最小系统和全套的编译器后,我们应该得到一个比较干净的系统。在这个系统上,可以下载和安装各种应用软件了。 三、基本使用   1、文件系统   无论有多少个分区,整个文件系统都是一棵完整的树结构。经常用到的目录有:   (1)/usr:存放各种应用程序文件用。其中的/usr/local用来存放后安装的软件   (2)/var:用来存放所有的数据文件   (3)/proc:里面的文件用来表示系统内核的各种配置和状态。这一块不是真正的文件系统,而是内存里面的各种数据。可以从这里得到一些常用的系统信息。比如CPU内存什么的。   (4)/etc:这里是放置所有的系统配置文件。一般情况下,后安装的软件的配置文件不会放到这里。除非你是用RPM安装的随发行包配的软件或者故意这样做。我不喜欢把不同软件的文件混在一起,因此通常让不同的软件的配置文件放在各自的目录中。   2、常用的命令   这里我列出一些经常用的命令,具体的用法可以参见相关手册页(希望你的英文不象我这么差)。   vi(一定要会用这个你非常讨厌的东西,如果你屈服了,可以选择另一个叫做pico的编辑器,它有点象DOS的edit)   head(用来看很长的文件用)   tail(同上)   netstat(看网络状态)   tar(解开.tar.gz的压缩包)   ps(察看进程)   kill(干掉进程)   top(看系统状况)   shutdown(关闭系统)   cat(看文件内容)   ping (看网络连通状况)   ftp(传输文件)   man(手册)   上面这些命令都是最最常用的,一定要把基本用法记牢。事实上,每人能记住全部命令或一个命令的全部参数,记住几个常用的就行了。其他的查书。   3、内核升级   如果你不愿意冒险,可以跳过这个部分。不过根据我实际使用的经验,2.4.x版本的内核性能比2.2.x的性能至少提高40%,还是很值得一试的。现在最新的发行包几乎都带有新的2.4内核,但是版本号想对保守。这里,我的建议是在决定升级任何部分的时候,一定要首先看一下所谓的“currect version release note”信息,里面告诉你本次版本升级都有些什么改动。如果改动的内容不涉及你当前的环境或需求,只是增加了一些邪门设备的驱动,你大可不必急着升级。补充一句话:Linux的内核版本号的中间一位是奇数的是非稳定版本,比如2.3,是偶数的才是稳定版本。   升级内核的步骤如下:   (1)首先在网上找到你打算升级的内核文件,一般名字是:linux-2.x.xx.tar.gz,把这个文件复制到/usr/src。(不知道在哪里找?看看:http://www.kernel.org ,最好找到.tar.gz格式的,比如这里:http://www.kernel.org/pub/linux/kernel/v2.x/)。下面的升级举例是从2.2.18升级到2.5.7(这是最新的内核了,你使用其它的版本别忘了改变版本号)   (2)解压缩:tar zxvf linux-2.5.7.tar.gz后生成一个目录:linux-2.5.7。   (3)进入/usr/src,用ls –l 命令可以看到src里面有一个连接,类似于:linux -> linux-2.2.18/ (连接指向你当前用的内核版本)。首先删除这个连接(rm linux),用ln -s linux-2.5.7 linux 命令重建连接。我想你一定不会连这里的版本号都照抄吧?   (4)进入linux-2.5.7 目录,如果不是第一次编译这个内核,最好用命令:make mrproper 删掉上次编译产生的.o文件等,当然以前保存的配置也丢了。   (5)用命令:make menuconfig命令调整内核配置以适应你目前的环境,记住,不懂的配置不要乱动。首要任务是调整各种硬件的环境,比如SCSI卡:SCSI support/SCSI low-level drivers,不知道现在的SCSI卡型号?在/proc/scsi中可以找到。还有网卡,在Network Device Support 里面。不知道现在的网卡型号?在这个文件里面写着呢:/proc/net/PRO_LAN_Adapters/eth0.info或/proc/pci文件中也可以找到 。在menuconfig中用空格键改变选项状态,前面的<*>表示该功能编译在内核中,主要是运行速度快。< >表示不需要该功能。表示把该功能编译成模块,通常为了减小尺寸,和更换方便而把某些驱动编译成模块。   (6)下面的事情比较程序化,照着做:make dep (检查文件的完整性,过程很复杂)   (7)make bzImage 注意大小写(真正开始编译了耶!我觉着这个最过瘾了,屏幕“哗啦哗啦”的,这时候你会感觉到,多少不知名的程序员在这个复杂的系统中贡献了自己的一份力量)   (8)make modules (编译那些被标记为的功能模块或驱动程序)   (9)make modules_install(把编译好的模块复制到指定地点,一般是:/lib/modules/ 。注意:不同版本号的模块是完全分开在不同目录中的,因为modules跟内核是紧密相关的,混用容易导致系统崩溃)   (10)cd /usr/src/linux-2.5.7/arch/i386/boot ,用命令:cp /usr/src/linux2.5.7/arch/i386/boot/bzImage /boot/vmlinuz-2.5.7 把文件bzImage文件改名成vmlinuz-2.5.7复制到/boot/   (11)cp /usr/src/linux-2.5.7/System.map /boot/System.map-2.5.7   (12)进入/boot目录,rm System.map   (13)在/boot目录中运行ln System.map-2.5.7 System.map 10-13两个步骤每次重新编译都要做。   (14)我开始提醒过的,但愿你安装了lilo (否则你就高唱:“神啊,救救我吧!”),编辑文件:/etc/lilo.conf ,做下面的编辑:   boot=/dev/sda   map=/boot/map   install=/boot/boot.b   prompt   timeout=50   lba32   default=linux-2.5.7   image=/boot/vmlinuz label=linux initrd=/boot/initrd read-only root=/dev/sda5   image=/boot/vmlinuz-2.5.7 label=linux-2.5.7 initrd=/boot/initrd read-only root=/dev/sda5   黑体字部分是后加的和修改的。万一你没有安装lilo,你只能修改/boot下面的连接指向你新的System.map和vmlinuz , 而不用修改lilo了。这样也能启动,但是一旦出现问题,你的机器就启动不了了。   (15)执行命令:lilo (用来更新lilo数据),注意输出的结果:带星号的是缺省的。   (16)祈祷,然后reboot 系统重新启动后,用uname –a 可看到新的内核起作用了。如果出现任何问题不能引导了,你需要在lilo的引导界面选择原来的内核启动,进入系统后重新改变内核参数,调整硬件或其他配置。然后重复前面所有过程。 【发表回复】【查看论坛原帖】【添加到收藏夹】【关闭】 -------------------------------------------------------------------------------- lsw 回复于:2002-12-23 11:39:14 四、主要的软件安装  前面说过,我的习惯是,装系统的时候就安装一个内核和编译系统,得到了一个干净的系统后,再安装其他的软件就比较清晰。另一点,除非搞不到源代码版本,一般情况下我都会下载官方版本的源代码文件,来重新编译之。同样的,选择软件版本要根据该软件的Release Note来决定,并非越新越好。这就是为什么很多软件都是几个版本齐头并进的发展之原因。这些软件不同版本之间的安装方法会有少许不同,安装前一定要仔细阅读目录中的README文件和INSTALL文件,否则这些少许不同会造成不少得麻烦。下面描述的安装过程都核版本号紧密相关。另外,所有的软件都把程序文件的包拷贝到/usr/local/src目录中再解压缩,这是习惯。因为在Linux中习惯于把后来的软件装在/usr/local中。   (1)安装DNS服务器   1、从www.isc.org下载bind 域名服务器软件。我们这里用的是bind8.3.0,bind8分支和bind9分支是并行发展的。根据自己的实际情况选择合适的bind版本。   2、mkdir /usr/src/bind83   3、下载的文件叫bind-src.tar.gz,复制到/usr/local/src/bind83目录下。   4、cd /usr/local/src/bind83   5、tar zxvf bind-src.tar.gz   6、cd src   7、make stdlinks   8、make clean   9、make depend   10、make all   11、make install   12、编辑配置文件:/etc/named.conf内容如下,需要更改的部分用黑体标出:   /*    * This is a worthless, nonrunnable example of a named.conf file that has    * every conceivable syntax element in use. We use it to test the parser.    * It could also be used as a conceptual template for users of new features.    */   /*    * C-style comments are OK    */   // So are C++-style comments   # So are shell-style comments   // watch out for ";" -- it‘s important!   options { directory "/var/named";       // use current directory named-xfer "/usr/libexec/named-xfer";       // _PATH_XFER dump-file "named_dump.db";       // _PATH_DUMPFILE pid-file "/var/run/named.pid";       // _PATH_PIDFILE statistics-file "named.stats";       // _PATH_STATS memstatistics-file "named.memstats";       // _PATH_MEMSTATS check-names master fail; check-names slave warn; check-names response ignore; host-statistics no; deallocate-on-exit no;       // Painstakingly deallocate all       // objects when exiting instead of       // letting the OS clean up for us.       // Useful a memory leak is suspected. // Final statistics are written to the // memstatistics-file. datasize default; stacksize default; coresize default; files unlimited; recursion yes; fetch-glue yes; fake-iquery no; notify yes;      // send NOTIFY messages. You can set // notify on a zone-by-zone // basis in the "zone" statement // see (below) serial-queries 4;      // number of parallel SOA queries // we can have outstanding for master // zone change testing purposes auth-nxdomain yes; // always set AA on NXDOMAIN. // don‘t set this to ‘no‘ unless // you know what you‘re doing -- older // servers won‘t like it. multiple-cnames no;    // if yes, then a name my have more // than one CNAME RR. This use // is non-standard and is not // recommended, but it is available // because previous releases supported // it and it was used by large sites // for load balancing. allow-query { any; }; allow-transfer { any; }; transfers-in 10;      // DEFAULT_XFERS_RUNNING, cannot be    // set > than MAX_XFERS_RUNNING (20) transfers-per-ns 2; // DEFAULT_XFERS_PER_NS transfers-out 0; // not implemented max-transfer-time-in 120; // MAX_XFER_TIME; the default number // of minutes an inbound zone transfer // may run. May be set on a per-zone // basis. transfer-format one-answer; query-source address * port *;   /* * The "forward" option is only meaningful if you‘ve defined * forwarders. "first" gives the normal BIND * forwarding behavior, i.e. ask the forwarders first, and if that * doesn‘t work then do the full lookup. You can also say * "forward only;" which is what used to be specified with * "slave" or "options forward-only". "only" will never attempt    * a full lookup; only the forwarders will be used.    */ forward first; forwarders { };     // default is no forwarders topology { localhost; localnets; };     // prefer local nameservers listen-on port 53 { any; };     // listen for queries on port 53 on    // any interface on the system    // (i.e. all interfaces). The    // "port 53" is optional; if you    // don‘t specify a port, port 53    // is assumed. /* * Interval Timers */ cleaning-interval 60;     // clean the cache of expired RRs    // every ‘cleaning-interval‘ minutes interface-interval 60;     // scan for new or deleted interfaces    // every ‘interface-interval‘ minutes statistics-interval 60;     // log statistics every    // ‘statistics-interval‘ minutes maintain-ixfr-base no;     // If yes, keep transaction log file for IXFR max-ixfr-log-size 20;     // Not implemented, maximum size the    // IXFR transaction log file to grow   };   /*    * Control listeners, for "ndc". Every nameserver needs at least one.    */   controls { inet * port 52 allow { any; }; // a bad idea unix "/var/run/ndc" perm 0600 owner 0 group 0;        // the default   };   zone "rd.21vianet.com" in { type master;       // what used to be called "primary" file "rd.21vianet.com.db"; check-names fail; allow-update { none; }; allow-transfer { any; }; allow-query { any; }; // notify yes;       // send NOTIFY messages for this // zone? The global option is used // if "notify" is not specified // here. also-notify { };       // don‘t notify any nameservers other // than those on the NS list for this // zone   };   zone "223.99.211.in-addr.arpa" in { type master; // what used to be called "secondary" file "211.99.223.db"; };   zone "0.0.127.in-addr.arpa" in { type master; file "127.0.0.db";   };   zone "." in { type hint;        // used to be specified w/ "cache" file "named.root";   };   logging { /* * All log output goes to one or more "channels"; you can make as * many of them as you want. */ channel syslog_errors {       // this channel will send errors or syslog user;       // or worse to syslog (user facility) severity error; }; category parser { syslog_errors; // you can log to as many channels default_syslog;      // as you want }; category lame-servers { null; };      // don‘t log these at all channel moderate_debug { severity debug 3;      // level 3 debugging to file file "foo";      // foo print-time yes;     // timestamp log entries print-category yes;      // print category name print-severity yes;      // print severity level /* * Note that debugging must have been turned on either * on the command line or with a signal to get debugging * output (non-debugging output will still be written to * this channel). */ }; /* * If you don‘t want to see "zone XXXX loaded" messages but do * want to see any problems, you could do the following. */ channel no_info_messages { syslog; severity notice; }; category load { no_info_messages; }; /* * You can also define category "default"; it gets used when no * "category" statement has been given for a category. */ category default { default_syslog; moderate_debug; }; };   13、在/var/named/中生成/etc/named.conf中标记的文件:rd.21vianet.com.db,内容如下,需要修改和调整相应部分:   ;Authoriative data for rd.21vianet.com   ;   $TTL 3600   @ IN SOA compaq.rd.21vianet.com. tandongyu.rd.21vianet.com. (     20020101 ;Serial     3600 ;Refresh 1 hour     900 ;Retry 15 mins     604800 ;Expire 7 days     86400) ;Mini 24 hours   ;Name server NS records   @ IN NS compaq.rd.21vianet.com.   ;Mail Exchange (MX) records   rd.21vianet.com. IN MX 0 compaq   ;Address (A) records.   localhost IN A 127.0.0.1   compaq IN A 211.99.223.9   tls65 IN A 211.99.223.8   fbsd IN A 211.99.223.7   14、在/var/named/中生成/etc/named.conf中标记的文件:211.99.223.db,内容如下,你需要修改相应部分:   ;   ;   $TTL 3600   @ IN SOA compaq.rd.21vianet.com. tandongyu.rd.21vianet.com. (     20020101 ;Serial     3600 ;Refresh     900 ;Retry 15 mins     604800 ;Expire 7 days     86400) ;Mini 24 hours   ;NameServer (NS) records   @ IN NS compaq.rd.21vianet.com.   ;Address Point to Name (PTR) records   9 IN PTR compaq.rd.21vianet.com.   8 IN PTR tls65.rd.21vianet.com.   7 IN PTR fbsd.rd.21vianet.com.   15、在/var/named/中生成/etc/named.conf中标记的文件:127.0.0.db,内容如下,你需要修改相应部分:   ; 0.0.127.in-addr.arpa   $TTL 3600   @ IN SOA compaq.rd.21vianet.com. tandongyu.rd.21vianet.com. (      20020101;serial 3600 ;refresh 1800 ;retry 604800 ;expiration 3600 ) ;minimum IN NS compaq.rd.21vianet.com.   1 IN PTR localhost.   16、在/var/named/中生成/etc/named.conf中标记的文件:named.root,内容大致如下。该文件标记了14个域名服务器。可以从ftp.rs.internic.net获得该文件的最新样本:named.hosts,然后改名成你需要的名字,比如:named.root   ; This file holds the information on root name servers needed to   ; initialize cache of Internet domain name servers   ; (e.g. reference this file in the "cache . "   ; configuration file of BIND domain name servers).   ;   ; This file is made available by InterNIC registration services   ; under anonymous FTP as   ; file /domain/named.root   ; on server FTP.RS.INTERNIC.NET   ; -OR- under Gopher at RS.INTERNIC.NET   ; under menu InterNIC Registration Services (NSI)   ; submenu InterNIC Registration Archives   ; file named.root   ;   ; last update: Aug 22, 1997   ; related version of root zone: 1997082200   ;   ;   ; formerly NS.INTERNIC.NET   ;     . 3600000 IN NS A.ROOT-SERVERS.NET.     A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4   ;   ; formerly NS1.ISI.EDU   ;     . 3600000 NS B.ROOT-SERVERS.NET.     B.ROOT-SERVERS.NET. 3600000 A 128.9.0.107   ;   ; formerly C.PSI.NET   ;     . 3600000 NS C.ROOT-SERVERS.NET.     C.ROOT-SERVERS.NET. 3600000 A 192.33.4.12   ;   ; formerly TERP.UMD.EDU   ;     . 3600000 NS D.ROOT-SERVERS.NET.     D.ROOT-SERVERS.NET. 3600000 A 128.8.10.90   ;   ; formerly NS.NASA.GOV   ;     . 3600000 NS E.ROOT-SERVERS.NET.     E.ROOT-SERVERS.NET. 3600000 A 192.203.230.10   ;   ; formerly NS.ISC.ORG   ;     . 3600000 NS F.ROOT-SERVERS.NET.     F.ROOT-SERVERS.NET. 3600000 A 192.5.5.241   ;   ; formerly NS.NIC.DDN.MIL   ;     . 3600000 NS G.ROOT-SERVERS.NET.     G.ROOT-SERVERS.NET. 3600000 A 192.112.36.4   ;   ; formerly AOS.ARL.ARMY.MIL   ;     . 3600000 NS H.ROOT-SERVERS.NET.     H.ROOT-SERVERS.NET. 3600000 A 128.63.2.53   ;   ; formerly NIC.NORDU.NET   ;     . 3600000 NS I.ROOT-SERVERS.NET.     I.ROOT-SERVERS.NET. 3600000 A 192.36.148.17   ;   ; temporarily housed at NSI (InterNIC)   ;     . 3600000 NS J.ROOT-SERVERS.NET.     J.ROOT-SERVERS.NET. 3600000 A 198.41.0.10   ;   ; housed in LINX, operated by RIPE NCC   ;     . 3600000 NS K.ROOT-SERVERS.NET.     K.ROOT-SERVERS.NET. 3600000 A 193.0.14.129   ;   ; temporarily housed at ISI (IANA)   ;     . 3600000 NS L.ROOT-SERVERS.NET.     L.ROOT-SERVERS.NET. 3600000 A 198.32.64.12   ;   ; housed in Japan, operated by WIDE   ;     . 3600000 NS M.ROOT-SERVERS.NET.     M.ROOT-SERVERS.NET. 3600000 A 202.12.27.33   ; End of File   17、我们还需要配置/etc/resolv.conf、/etc/hosts、/etc/hosts.conf文件以适应新的状况。   18、一切都结束后,用/usr/sbin/ndc start命令启动bind,同样的可用stop、restart、reload等命令参数操作。   19、启动后用nslookup命令(有的系统推荐使用dig命令)检验是否正确。如果出现错误,该命令将不能启动。一般的错误都是数据库文件或配置文件笔误所至。比如少个“.”或者文件明不正确等等。   (2) 安装sendmail服务器   1、从www.sendmail.org下载最新的版本(这个snedmail倒是有必要升级为最新的版本,因为它的升级主要是安全漏洞问题)。这里说明的是用的sendmail-8.12.2.tar.gz   2、cd /usr/local/src/   3、把文件下载到:/usr/local/src中   4、tar zxvf sendmail-8.12.2.tar.gz   5、cd /usr/local/src/sendmail-8.12.2   6、chmod go-w / /etc /etc/mail /usr /var /var/spool /var/spool/mqueue   7、chown root / /etc /etc/mail /usr /var /var/spool /var/spool/mqueue   8、cd /usr/local/src/sendmail-8.12.2/sendmail   9、sh Build   10、cd /usr/local/src/sendmail-8.12.2/cf/cf   11、建立文件sendmail.mc内容如下,你可根据需要修改相应部分。   divert(-1)   dnl This is the macro config file used to generate the /etc/sendmail.cf   dnl file. If you modify thei file you will have to regenerate the   dnl /etc/sendmail.cf by running this macro config through the m4   dnl preprocessor:   dnl m4 /etc/sendmail.mc > /etc/sendmail.cf   dnl You will need to have the Sendmail-cf pacage installed for this to work.   include(`/usr/local/src/sendmail-8.12.2/cf‘) define(`confDEF_USER_ID‘,`8:12‘) OSTYPE(`linux‘) undefine(`UUCP_RELAY‘) undefine(`BITNET_RELAY‘) define(`confTO_CONNECT‘, `1m‘) define(`confTRY_NULL_MX_LIST‘,true) define(`confDONT_PROBE_INTERFACES‘,true) define(`PROCMAIL_MAILER_PATH‘,`/usr/bin/procmail‘) define(`SMART_HOST‘,compaq.rd.21vianet.com)     <---这条用于(非HUB)缺省使用HUB发送邮件 MASQUERADE_AS(`rd.21vianet.com‘) <------------------------- FEATURE(`masquerade_entire_domain‘)      <---这三条用于邮件地址伪装 FEATURE(`masquerade_envelope‘)       <------------------------- FEATURE(`smrsh‘,`/usr/sbin/smrsh‘) FEATURE(`mailertable‘,`hash -o /etc/mail/mailertable‘) FEATURE(`virtusertable‘,`hash -o /etc/mail/virtusertable‘) FEATURE(redirect) FEATURE(always_add_domain) FEATURE(use_cw_file) FEATURE(local_procmail) FEATURE(`access_db‘) FEATURE(`blacklist_recipients‘) FEATURE(`accept_unresolvable_domains‘) MAILER(smtp) MAILER(procmail) dnl We strongly recommend to comment this one out if you want to protect dnl yourself from spam. However, the laptop and users on computers that do dnl not hav 24x7 DNS do need this. dnl FEATURE(`relay_based_on_MX‘)   12、sh Build install-cf   13、groupadd smmsp   14、useradd smmsp   15、cd cd /usr/local/src/sendmail-8.12.2/sendmail   16、sh Build install   17、cd /usr/local/src/sendmail-8.12.2/makemap   18、sh Build clean   19、sh Build all   20、sh Build install   21、cd /usr/local/src/sendmail-8.12.2/   22、在本域DNS主数据库文件中增加MX纪录:   rd.21vianet.com. IN MX 0 compaq   注意修改相应部分。那个0是有几个邮件集中器的时候用于标记先后顺序的。当有好几个MX的时候,建议顺序写为10、20、30…   23、在/etc/mail目录下创建access文件,内容类似如下: 127.0.0.1 RELAY 211.99.223 RELAY 211.99.221.238 RELAY   然后:makemap hash access.db < access   24、创建文件/etc/mail/local-host-names,其内容为本机的拥有的域名信息。   rd.21vianet.com   compaq.rd.21vianet.com   25、创建文件/etc/mail/aliases,内容类似:   MAILER-DAEMON: postmaster postmaster: root bin: root daemon: root nobody: root   运行newaliases创建数据库。   创建别名文件的意义之一在于当邮件发往域中其他邮件服务器的用户而不是mail HUB用户的时候用。   比如增加一条:   atan: atan@fbsd   则导致邮件发往mail HUB的时候自动转发到atan@fbsd.rd.21vianet.com   26、启动sendmail: /usr/sbin/sendmail -bd -q30m   排错:如果有问题导致启动不了,大部分问题和DNS配置有关,可以使用nslookup检查DNS是否正常。挨个检查/etc/mail中的文件内容也是排错的好办法。另外,修改配置,不建议直接编辑sendmail.cf文件,建议使用m4宏编译工具,因为有些带有安全漏洞或过时的宏在编译的时候会有提示,这样以免造成相关安全问题。 -------------------------------------------------------------------------------- lsw 回复于:2002-12-23 11:40:34 (3)安装DHCP服务器  1、源程序下载地址是:ftp://ftp.isc.org/isc/dhcp/dhcp-3.0.tar.gz ,我们的版本是:dhcpd-3.0   2、复制到:/usr/local/scr后解压:tar zxvf dhcp-3.0.tar.gz   3、cd /usr/local/src/dhcp-3.0.tar.gz   4、./configure   5、make(如果不是第一次编译,先make clean)   6、make install   7、cp ./server/dhcpd.conf /etc   8、编辑这个文件,看起来类似下面这样:(要更改的地方用粗体标出)   # dhcpd.conf   #   # Sample configuration file for ISC dhcpd   #   # option definitions common to all supported networks...   option domain-name "rd.21vianet.com";   option domain-name-servers compaq.rd.21vianet.com;   default-lease-time 86400;   max-lease-time 172800;   ddns-update-style ad-hoc;   # If this DHCP server is the official DHCP server for the local   # network, the authoritative directive should be uncommented.   #authoritative;   # Use this to send dhcp log messages to a different log file (you also   # have to hack syslog.conf to complete the redirection).   log-facility local7;   # No service will be given on this subnet, but declaring it helps the   # DHCP server to understand the network topology.   # This is a very basic subnet declaration.   subnet 211.99.223.0 netmask 255.255.255.224 {     range 211.99.223.2 211.99.223.6;     option routers 211.99.223.1;   }   # This declaration allows BOOTP clients to get dynamic addresses,   # which we don‘t really recommend.   #subnet 10.254.239.32 netmask 255.255.255.224   {     # range dynamic-bootp 10.254.239.40 10.254.239.60;     # option broadcast-address 10.254.239.31;     # option routers rtr-239-32-1.example.org;   #}   # A slightly different configuration for an internal subnet.   #subnet 10.5.5.0 netmask 255.255.255.224 {   # range 10.5.5.26 10.5.5.30;   # option domain-name-servers ns1.internal.example.org;   # option domain-name "internal.example.org";   # option routers 10.5.5.1;   # option broadcast-address 10.5.5.31;   # default-lease-time 600;   # max-lease-time 7200;   #}   # Hosts which require special configuration options can be listed in   # host statements. If no address is specified, the address will be   # allocated dynamically (if possible), but the host-specific information   # will still come from the host declaration.   #host passacaglia {   # hardware ethernet 0:0:c0:5d:bd:95;   # filename "vmunix.passacaglia";   # server-name "toccata.fugue.com";   #}   # Fixed IP addresses can also be specified for hosts. These addresses   # should not also be listed as being available for dynamic assignment.   # Hosts for which fixed IP addresses have been specified can boot using   # BOOTP or DHCP. Hosts for which no fixed address is specified can only   # be booted with DHCP, unless there is an address range on the subnet   # to which a BOOTP client is connected which has the dynamic-bootp flag   # set.   #host fantasia {   # hardware ethernet 08:00:07:26:c0:a5;   # fixed-address fantasia.fugue.com;   #}   # You can declare a class of clients and then do address allocation   # based on that. The example below shows a case where all clients   # in a certain class get addresses on the 10.17.224/24 subnet, and all   # other clients get addresses on the 10.0.29/24 subnet.     #class "foo" {   # match if substring (option vendor-class-identifier, 0, 4) = "SUNW";   #}   #shared-network 224-29 {   # subnet 10.17.224.0 netmask 255.255.255.0 {   # option routers rtr-224.example.org;   # }   # subnet 10.0.29.0 netmask 255.255.255.0 {   # option routers rtr-29.example.org;   # }   # pool {   # allow members of "foo";   # range 10.17.224.10 10.17.224.250;   # }   # pool {   # deny members of "foo";   # range 10.0.29.10 10.0.29.230;   # }   上面这个文件中后面都是注释,是原来系统给你的配置做的例子,可以不要。当然除非你用到它们,并且清楚它们的含义。   9、建立空文件:touch /var/state/dhcp/dhcpd.leases空文件   10、检查内核编译选项:Networking options-----Packet socket: mmapped IO和Socket Filtering选项是否被选中(不知道怎么看?看看前面的文章,用make menuconfig呀),如果没有就需要重新编译内核了。   11、route add -host 255.255.255.255 dev eth0   12、roote add -host localhost dev eth0   13、在/etc/rc.d/rc.local最后增加一行route add -host 255.255.255.255 dev eth0   14、reboot系统   15、用dhcpd命令启动DHCP,用其他的机器试试看能不能自动配置网络了。 (4) 安装apache+mysql+php+gd+png+zlib+jpeg+freetype+sslmod   这么一大堆东西为什么要一块说呢?因为他们中间是有紧密联系的,尤其是那个PHP,用到其他所有的模块。要想PHP功能全,只能一步步来了。   1、首先安装MYSQL:从http://www.mysql.com/downloads/index.html下载自己觉得合适的版本。这里用3.23.42版本。   2、进入目录/usr/local/src(这个以后就不用说了吧?)解压缩:tar zxvf mysql-3.23.42.tar.gz   3、cd mysql-3.23.42/   4、configure --prefix=/usr/local/mysql   5、make   6、make install   7、useradd mysql ; groupadd mysql ; su mysql ;(建立命名为mysql的用户和组,并切换为mysql身份)   8、scripts/mysql_install_db (建立数据库结构)   9、cd /usr/local/mysql/bin   10、./safe_mysqld & (启动了)   11、./mysqladmin -u root password "new-password"(你的新密码,记住MYSQL的密码核系统密码是独立的,缺省是没有密码)   12、用mysql程序试试看。   下面的步骤都很程式化,我尽量简洁地写出。   13、下载相关的软件包:地址表格如下   软件     版本     地址 jpegsrc.v6b.tar.gz  6b ftp://ftp.uu.net/graphics/jpeg zlib.tar.gz 1.1.3 ftp://ftp.uu.net/graphics/png/src freetype-2.0.8.tar.gz 2.0.8 http://www.freetype.org libpng-1.0.10.tar.gz 1.0.10 ftp://ftp.uu.net/graphics/png/src gd-1.8.4.tar.gz 1.8.4 http://www.boutell.com/gd apache_1.3.23.tar.gz 1.3.23 http://www.apache.org php-4.1.1.tar.gz 4.1.1 http://www.php.net number4.tar.gz 4 http://www.php.net/extra rsaref20.tar.Z 2.0 ftp://ftp.ai.mit.edu/pub/deberg openssl-engine-0.9.6c.tar.gz 0.9.6c http://www.openssl.org/source mod_ssl-2.8.6-1.3.23.tar.gz 2.8.6 http://www.modssl.org   下齐了就放在/usr/local/src目录下,除了number4.tar.gz和rsaref20.tar.Z以外,其他一律用tar zxvf XXXX.tar.gz解压缩。(过瘾吧?)   特殊的,rsaref20.tar.Z 需要先建立一个rsaref-2.0目录,然后把rsaref20.tar.Z复制到改目录下用tar zxvf rsaref30.tar.Z释放压缩。Number4.tar.gz需要复制到php-4.1.1目录内,然后用tar zxvf number4.tar.gz解压缩。   下面的描述我想简单一点,只写出进入目录后执行的命令。那些目录都是释放的时候自己建立的,如果你这些操作都在/usr/local/src下面执行,所有的目录就都在这里面。最好按照顺序执行。再罗嗦一句:如果不是第一次编译,一般情况请执行一次make clean后再编译。   14、[jpeg-6b]:生成JPEG图像的函数库。   ./configure   make   make test   make install   15、[zlib-1.1.3]:压缩算法库,是PNG和JPEG需要的   make test   make install   16、[freetype-2.0.8]:字体库,在图像上使用字体的时候需要用到,   ./configure --prefix=/usr/local   make   make install   17、[libpng-1.0.10]:生成PNG图像的函数库   cp scripts/makefile.linux makefile   make test   pngtest pngnow.png   (如果都通过测试了,请继续。否则,看看错误提示,改正错误)   make install   18、[gd-1.8.4]:GD库,用来动态生成图像用,这里主要是配合PHP生成图像。   编辑Makefile 文件:   把下列行取消注释符号(#):   CFLAGS=-O -DHAVE_LIBXPM -DHAVE_LIBPNG -DHAVE_LIBJPEG   -DHAVE_LIBFREETYPE -DHAVE_LIBTTF   LIBS=-lgd -lpng -lz -ljpeg -lfreetype -lm -lttf   注释下列行(增加#):  CFLAGS=-O -DHAVE_LIBPNG -DHAVE_LIBJPEG   LIBS=-lgd -lpng -lz -lm   修改下列行:  INCLUDEDIRS=-I. -I/usr/local/include/freetype2 -I/usr/include/X11     -I/usr/X11R6/include/X11 -I/usr/local/include      -I/usr/include/freetype   保存后执行:   make   make install   19、[apache_1.3.23]:步骤一 ./configure --prefix=/usr/local/apache   20、[php-4.1.1]:   如果不是第一次安装,请删除:config.cache文件,然后执行先执行make clean   接下来配置环境,输入一个比较长的命令:   ./configure     --with-apache=/usr/local/src/apache_1.3.23     --with-config-file-path=/local/apache/conf     --with-enable-versioning     --with-mysql=/usr/local/mysql     --with-ftp     --with-gd=/usr/local/src/gd-1.8.4     --with-enabled-bcmath=yes     --with-disable-debug     --enable-memory-limit=yes     --enable-track-vars     --with-zlib     --with-jpeg-dir=/usr/local/src/jpeg-6b     --with-png-dir=/usr/local/src/libpng-1.0.10     --with-freetype-dir=/usr//local/src/freetype-2.0.8   当然你也可以实现准备一个含有上述命令的sh文件,这样改起来方便些。我就是这样做的。   make   make install   21、[rsaref-2.0]:RSA加密模块   前面说过,这个目录的释放是特殊的,先见目录后释放,希望你是这样做的。   cp -rp install/unix local   cd local   make   mv rsaref.a librsaref.a   22、[openssl-engine-0.9.6c]:openssl引擎   ./config -prefix=/usr/local/ssl -L`pwd`/../rsaref-2.0/local/ rsaref –fPIC   make   make test   make install   23、[mod_ssl-2.8.6-1.3.23]   ./configure --with-apache=../apache_1.3.23   24、[apache_1.3.23]步骤二   ./configure --prefix=/usr/local/apache --enable-shared=ssl      --enable-module=ssl --activate-module=src/modules/php4/libphp4.a   make   make certificate TYPE=custom(回答一些问题)  make install   25、收尾工作:   编辑/usr/local/apache/conf/httpd.conf文件,增加一行:   AddType application/x-httpd-php .php   26、用命令/usr/local/apache/bin/apachectl configtest检查一下配置文件的正确性。   27、用/usr/lcoal/apache/bin/apachectl start启动apache服务器   28、在/usr/local/apache/htdocs建立一个test.php文件包含下列内容:       phpinfo();   >   29、在别的机器上用浏览器看一下这个机器:http://xxx.xxx.xxx.xxx/test.php会出现php的配置总汇,看看前面编译的模块都在不在。   30、检验ssl很麻烦,需要用apachectl startssl启动apache然后还要生成一大堆证书。这里就不讨论了。   31、把/usr/local/apache/bin/apachectl文件复制到/etc/rc.d/init.d中,然后在/etc/rc.d/rd3.d中建立个符号连接指向/etc/rc.d/init.d中的上述文件:   ln -s ../init.d/apachectl S70apachectl   这样系统启动的时候就可以自动启动apache和她的哪一大堆模块了。   呼~~~~(喘口气)到这里,就基本上完成了一个功能很全的WEB服务器系统了。   (5)安装 ftp 服务器   (6)安装 pop3服务器   有的邮件服务器自己带pop3功能(比如Qmail、Xmail),如果你用这几种邮件服务器软件,当然就不用安装pop3了。目前,常用的邮件服务器里面不带pop3的好象只有sendmail和postfix等少数几种。这几种邮件服务器软件使用的都是系统用户,而我们安装的pop3也只是对系统用户的邮件进行弹出操作的。这里我们使用的版本和下载地址是:   qpopper4.0.3.tar.gz     http://www.eudora.com/qpopper_general/   同样的,把文件下载到/usr/local/src中,按照下列步骤安装:   tar zxvf qpopper4.0.3.tar.gz   cd qpopper4.0.3   ./configure   make   make install   完成后,qpopper安装在/usr/local/sbin中(如果你愿意把它放在其他地方,可以在前面用./configure –prefix=/your_path指定),文件名叫作popper。通常情况下,popper是作为一个inetd(超级网络服务进程)的子进程加载的。这样需要编辑文件/etc/inetd.conf并做下面改动: ...   # POP3 mail server   #pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d   pop-3 stream tcp nowait root /usr/local/sbin/popper qpopper –s   ...   增加黑体的这一行,注释掉原来的(上面这一行),注意,如果你的安装路经不同,记着改过来呀。然后,用下面的命令得到inetd的进程号:   ps –ax | grep inetd   得到结果类似:   248 ? S 0:00 inetd   什么?哪个是进程号?就是最前面那个数字。然后用下面的命令重新启动inetd:   kill –HUP 248   用下面的命令看看pop3是不是启动了。   netstat -ln|grep 110   如果结果是这样,就恭喜了。   tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN   这里还要补充一点,少数情况下,pop3进程需要独立的监听端口,也就是不作为inetd的子进程装载,上面过程需要做如下改动:   ./configure的时候加上--enable-standalone参数。   编辑/etc/inetd.conf不增加黑体一行,但需要注释掉原来的pop-3一行(如果有的话)。   启动的时候,直接运行/usr/local/sbin/popper xxx.xxx.xxx.xxx:110即可。后面的参数是本地需要几监听的IP地址和端口。注意,没有特殊需要,端口必须是110。最后要说的是:其实最简单的办法就是用你使用的Linux发行包带的pop3软件,安装的时候直接选上即可。 -------------------------------------------------------------------------------- lsw 回复于:2002-12-23 11:43:32 (7)安装imap服务器  几乎所有的发行包都带有imap服务器软件(一般是华盛顿大学版本),最好的办法是用你的发行包安装IMAP服务器。事实上,我个人觉得IMAP服务器很少被使用。下载最常规的IMAP服务器源码地址是:ftp://ftp.cac.washington.edu/imap/imap.tar.Z   tar zxvf imap.tar.Z   cd imap-2001a   make slx   (如果不行依次试验一下其他你觉得可能的系统类型,用vi看一下Makefile中列的名称)   然后配置/etc/inetd.conf,让inetd允许imap服务。[本节内容没有试验成功,编译总是过不去]   (8)安装squid服务器   SQUID是一个优秀的代理服务器软件,它可以很灵活的被配置为各种应用形式,其中包括正向代理,反向加速模式和透明代理等。但是SQUID目前只能代理HTTP协议,代理FTP协议需要配置浏览器仿真主动FTP协议。下面的步骤是安装SQUID的过程。   1、下载反向代理服务器软件采用squid,下载地址:http://www.squid-cache.org/   下载后存放在/usr/local/src目录里,文件名是squid-2.4.STABLE2-src.tar.gz   2、tar zxvf squid-2.4.STABLE2-src.tar.gz 解压缩   3、cd /usr/local/src/squid-2.4.STABLE2 进入目录   4、./configure --prefix=/usr/local/squid --enable-heap-replacement --disable-internal-dns建立环境,把squid安装/usr/local/squid中。第二个参数是指定使用更先进的缓冲算法。第三个参数是取消内部DNS解析(如果使用在远程高速缓存模式,比如GSLB,需要增加选项:--disable-internal-dns,目的是关闭内部DNS.否则内部DNS不理睬你在etc/hosts中的设定,直接寻找域名服务器,这样就会造成转发循环。就是cache发送给物理服务器的更新请求(因为用域名)也会被用户的GSLN设备解析回来而形成循环。)   5、make 开始编译   6、make install 安装到刚才--prefix=指定的路径当中   7、安装完成后,会在您指定的安装路径里产生一个squid目录,squid目录下有四个目录:bin/ etc/ libexec/ logs/。其中etc里面是配置文件,bin里面是执行文件,logs里面是日志文件。   8、安装结束后就是调试服务器,使其按照您的要求工作。Squid的配置文件只有一个,在etc目录里,名字是squid.conf,所有的配置选项都在这个文件里面。而且每个配置项目都有注释说明。首先,在squid文件里面找到下列配置项:   cache_mem ---这里可以添上您准备给squid作为高速缓存使用的内存大小。注意,如果您的机器有N兆内存,那么,推荐您在这里添的数字是N/3。   cache_dir /usr/local/squid/cache 100 16 256 这里的第一个数字100是您准备给squid作为cache使用的硬盘空间大小,单位是兆。如果您想划100M空间当作cache,那么这里就写100。   cache_mgr webmaster@test.com.cn这里填写cache管理员的Email地址,系统出错会自动提醒cache管理员。   cache_replacement_policy和memory_replacement_policy的参数由于使用了--enable-heap-replacement编译参数,就不能使用缺省的lru算法了,你可以在下列三种里面选一个:   heap GDSF : Greedy-Dual Size Frequency   heap LFUDA: Least Frequently Used with Dynamic Aging   heap LRU : LRU policy implemented using a heap   例如:   cache_replacement_policy heap LRU   memory_replacement_policy heap LRU   下面设定ACL访问控制列表:为了简单起见,我们在这里开放所有的权限。ACL分为两个部分:ACL定义部分,和http_access部分。在access_http部分用到前面的定义。前面定义了:   acl all src 0.0.0.0/0.0.0.0   我们注释掉所有的http_access行加一句:   http_access allow all ---注意:all是前面acl定义的。   这样就开放了所有的权限。以后有需要的,再继续往上加各种限制即可。   9、以root身份创建组nogroup :   %su root (如果当前不是root)  #groupadd nogroup   #useradd nobody (如果没有这个用户)   10、进行目录/usr/local ,以root身份执行下面的命令,改变整个Squid目录的所有者为nobody.nogroup   #cd /usr/local   #chown nobody.nogroup -R squid   11、su 作为nobody,进行/usr/local/squid/bin目录,执行#squid -z 创建cache交换目录   #su nobody   $ cd /usr/local/squid/bin   $./squid -z   12、成功后,测试一下:/usr/local/squid/bin/squid -NCd1 该命令正式启动Squid。如果一切正常,你会看到一行输出 :Ready to serve requests.   13、用ctrl-c退出前台测试。   14、把squid作为守护进程启动就直接运行:/usr/local/squid/bin/squid   15、检查状态用squid –k check   16、停止squid用squid -k shutdown   如果是配置基本的正向代理,上面的已经可以使用了。下面的步骤用于配置支持多域名的反向代理服务器。还好,SQUID的所有配置都在/usr/local/squid/etc下面,和反向代理有关的几项介绍如下:   17、http_port 80 “http_port”参数指定Squid监听浏览器客户请求的端口号。   18、icp_port 0 “icp_port”参数指定Squid从邻居(neighbour)服务器缓冲内发送和接收ICP请求的端口号。这里设置为0是因为这里配置Squid为内部Web服务器的加速器,所以不需要使用邻居服务器的缓冲。   19、emulate_httpd_log on 打开“emulate_httpd_log”选项,将使Squid仿照Web服务器的格式创建访问记录。如果希望使用Web访问记录分析程序,就需要设置这个参数。   20、redirect_rewrites_host_header off 缺省地,Squid将改写任何重定向请求的主机头部。若系统运行Squid为加速器模式,则这时不需要重定向特性。该参数在负载过重的情况下要旁路重定向器时才打开   21、httpd_accel_host vartual 此处设置反向代理的主机名,如果对后面多个域名进行缓冲,请使用虚拟主机模式(如此)。   22、httpd_accel_port 80 此处设置反向代理的WEB服务端口号。   23、#httpd_accel_with_proxy off 把这行注释掉,此处设置开反向代理的同时,是否开普通代理缓存服务。如果这行不注释掉,就没有高速缓存功能。   24、定义访问控制列表:   acl port80 port 80   acl accel_host1 dstdomain .test.com   acl accel_host2 dstdomain .test.net   … …   http_access allow accel_host1 port80   http_access allow accel_host2 port80   http_access deny all;   25、完成后,用squid –k reconfigure重新装载配置文件。   (9)安装SSH   ---   (10)配置Linux为路由器   ---   (11)配置Linux网关和安装ipchains/iptables防火墙   在Linux上面的防火墙,最最常用的是ipchains,而且通常情况下是作为网关的附加部分安装的。Ipchains的规则是很复杂的,灵活性也很强,可以配制成各种五花八门的样子。这些都需要和你自己的实际情况相结合。这里,我们只介绍一种基于网关的简单配置。   安装IPCHAINS一般都不用你操心,因为几乎所有的Linux发行包都把该软件作为必须安装的却省配置。另一个原因是ipchains是跟内核(kernel)有很大的关系,因此最好在安装系统的时候选上相关选项(如果有)。在标题里面我们还提到了iptables,这个工具在表面上等同于ipchains,只不过是用于2.4内核的(2.4内核在这方面的代码几乎是重新写过的,功能有了长足的提高)。关于iptables工具的配置我们在后面介绍。你只需要记住2.2核心下使用ipchains,2.4核心下使用iptables即可。   首先,你的服务器需要两块网卡(或更多),这种机器叫做“多宿主主机”,是专门的用于做网关或路由器的。这里插一句:一般情况下,作为普通服务器的主机即使负载再重就需要一块网卡就够了,只有做网关或路由器的时候才需要多宿主主机。这并不象一般人认为得那样增加一块网卡可以增加一份带宽,事实上,一块网卡就可以提供足够的带宽。并且,还有人错误的把两块网卡接在同一个交换机上分配两个地址,这更是错误的,因为这样产生了额外的循环路由,会产生大量的内部警告错误,某些系统就会报警。   1、制作一个双界面(双宿主)的主机。   通常,现在的发行包的安装程序都可以识别两块网卡,这样就省事了。但是也有不少发行包只识别第一块网卡(也许是出于前面说的原因),或者你要在一台在用的机器上加一块网卡(因为你不愿意重装系统),那么就按照下面的办法处理。   1.1、我们就说PCI网卡。安装前首先看看网卡芯片,记住芯片的型号(希望你自己攒过机器)。   1.2、安装MAN手册(用发行包)   1.3、在/usr/doc/HOWTO/english/txt/Ethernet-HOWTO文件(如果是压缩的就释放)中搜索你的网卡型号,找到对应的驱动模块名称。   1.4、如果模块没有,还需要重新编译核心。在menuconfig网络设备一栏选中你的型号然后标记为*或M,编译完核心后别忘了编译模块:make modules;make modules_install。(不会的话再仔细温习一下前面编译内核的部分)   1.5、用depmod –a命令建立/etc/modules.conf(如果已经有就不用了),也有的发行包叫做conf.modules   1.6、编辑该文件加上一行:alias eth1 XXXX,其中XXXX是你刚才查到的模块名称。一般该模块文件位于:/lib/modules/内核版本号/net…中的XXXX.o文件。这个文件是你编译内核模块的时候产生的,你在内核配置的时候,凡是标记为M的都会被编译成.o文件放在这里。同样的,你选择的网卡驱动也是会编译成模块在这里的。   1.7、运行modprobe eth1使模块有效。   1.8、修改/etc/sysconfig/network文件中需要修改的部分。   1.9、建立或修改/etc/sysconfig/network-script/ifcfg-eth1文件(照抄那个eth0的即可),设定地址是你的真实情况,比如设为eth1要接的网段。这两个文件(eth0/eth1是启动的时候的脚本参数文件)   1.10、重新启动一下网络:/etc/rc.d/init.d/network restart   1.11、用ifconfig看看是否eth0/eth1都启动了。   1.12、大功告成   2、调整和编译核心:如果作为网关,有些核心选项需要配置。注意:这里的内核编译选项仅仅适合于2.2.X版本,2.4版本完全不同。   2.1、在/usr/src/linux中运行make menuconfig配置核心下列选项:   Networking options中 [*] Network firewalls   [*] IP: advanced router   [*] IP: firewalling   [*] IP: firewall packet netlink device   [*] IP: transparent proxy support   [*] IP: masquerading   [*] IP: ICMP masquerading   [*] IP: masquerading special modules support    IP: ipautofw masq support (EXPERIMENTAL)    IP: ipportfw masq support (EXPERIMENTAL)    IP: ip fwmark masq-forwarding support (EXPERIMENTAL)   [*] IP: masquerading virtual server support (EXPERIMENTAL)   (12) IP masquerading VS table size (the Nth power of 2)   具体选项不同版本的内核不尽相同,你看着差不多就可以了。编译成模块或编进核心[*]可以自由选择。   2.2、按照前面说的编译内核,重新启动后就具有网关功能了。启动后验证一下文件:/proc/sys/net/ipv4/ip_forward内容是否为1。(别告诉我不知道怎么看8-))   3、设置ipchains   本来这项工作是非常复杂的,但是我们这里讲的简单,让网关通了就行。   3.1、先看一下目前我们目前的假想环境:你的机器有两块网卡,一块连接在内网交换机配内部网络地址,另一块在外网交换机配公网地址。在这个机器ping 内网和外网的机器应该都能通。并且在内网的机器ping 该机器的外网地址也通,在外网的机器ping该机器内网的地址也同样通。这说明转发功能是有效的。   3.2、再试验一下:在内部网络把网关设为你的机器的内网地址,然后ping 外网的任一台机器(不是这台机器的外网地址),结果是不通。原因是ICMP包发出去后外网的机器不知道怎么回答,那里没有合适的路由,因为这个包的回应地址是内网。   3.3、现在设置ipchains:(ipchains软件适用2.2.X的内核,在2.4.X的内核中不适用。2.4.X的内核推荐使用iptables,关于该软件的用法在下面介绍)   ipchains –A forward –s 192.168.1.0/24 –j MASQ   黑体部分是内网地址。这句话的意思是,把所有内网发送的包都伪装成外部网的地址(那个机器的外网地址),这样,外部其他机器回应的时候就会发送到这台机器,经过转发就回来内网了。好了,一个简单的网关做好了。如果你需要实现防火墙(包过滤功能),则需要配置更加复杂的过滤规则,这些规则应该同时作用于input/output/forward链。   3.4、自动启动:设定了复杂的链,需要保存。在/etc/rc.d中建立一个文件:rc.ipfwadm把你的链脚本加进去就可以了。最后给这个文件+x属性(chmod +x rc.ipfwadm)。   4.在2.4.X内核中使用iptables建立Linux防火墙(网关)。   4.1 说明和下载   前面已经提到过2.4 内核中要使用iptables来做类似于ipchains在2.2内核中实现的事情。事实上,在2.4内核中的iptables包含了两个完全不同的部分:包过滤和地址转换。这两个功能在逻辑上是分开的,考虑到操作习惯上的问题才集成在一个配置程序(iptables)上。如果你安装了带有2.4内核的发行包,那么一般都带有iptables,并且在内核配置上也配置好了。如果要编译新的内核或者原来的内核没有支持iptables,需要选上相关的选项。使用make menuconfig 配置内核的时候操作:进入:Networking Options至少选择上:   [*] Network packet filtering (replaces ipchains)   [*] Network packet filtering debugging (NEW)   进入:IP: Netfilter Configuration --->   [*] Connection tracking (required for masq/NAT) (NEW) FTP protocol support (NEW) IRC protocol support (NEW)   等等……   把下面的选项全部标记<*>   逐级返回上面菜单后保存配置,然后按照编译内核的那一套程序进行即可(参见前面的内容)。这里需要说明的是,内核支持了iptables功能,还需要有外部程序才行。如果你是直接安装的带有2.4内核的发行包,应该已经带有iptables实用程序了。但是如果你是从2.2核心的发行包直接升级到2.4内核,尽管按照上面的做法配置的核心,但是还不能使用iptables。还必须下载和编译iptables外部程序才能使用iptables功能。下载的地址是:http://www.netfilter.org ,下载的文件是iptables-1.2.6a.tar.bz2或更新的版本。   4.2 安装:   这个.bz2文件比较奇怪吧?把文件复制到/usr/local/src中,然后用下列命令释放编译和安装: bzip2 -dc iptables-1.1.2.tar.bz2 |tar vxf - (最后那个‘- ’别忘了)   你的系统可能没有bzip2工具,如果没有,你就去下一个:   进入新生成的目录 :cd iptables-1.2.6a 编译和安装:make ; make install   4.3 配置   如果你需要配置一个简单的网关,你仅仅需要配置一个转发加地址转换功能即可,我提供的参考脚本如下:   #begin   echo 1 > /proc/sys/net/ipv4/ip_forward   modprobe iptable_nat   modprobe ip_conntrack   modprobe ip_conntrack_ftp   modprobe ip_nat_ftp   iptables -F INPUT   iptables -F FORWARD   iptables –F OUTPUT   iptables -F POSTROUTING -t nat   iptables -t nat -F   iptables -P FORWARD DROP   iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT   iptables -A FORWARD -i eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT   iptables -t nat -A POSTROUTING -o eth1 -s 192.168.1.0/24     -j SNAT --to 211.99.223.2   #end   其中3行modprobe是当你在内核中把iptables相关功能编译成模块(选成)的时候才用到的(也可能不止3行)。其中插入模块(modprobe)的几行比较重要,有时候当你作完NAT后,发现FTP不好用了,就要手工插入ip_nat_ftp模块(语法是:modprobe ip_nat_ftp)。黑体的地址部分可能是需要根据你网络的实际情况来决定的。最后一句话的意思是把凡是源地址是192.168.1.x的包做地址转换,转换为网关外侧地址211.99.223.2。好了,你已经建立起一个基本的网关了。其实iptables的功能及其强大,配置也非常灵活。其中的防火墙功能通过-t filter参数实现,地址转换功能通过-t nat实现(就像上面一样)。防火墙功能(packet filter)主要是3个链:INPUT,FORWARD,OUTPUT,地址转换功(nat)主要是3个链:PREROUTING,POSTROUTING,OUTPUT。观察当前的状态可以使用下面的命令:iptables –L –t filter 或 iptables –L –t nat。
posted @ 2006-06-01 15:39 edsonjava 阅读(218) | 评论 (0)编辑 收藏
 
 文件与目录操作命令
1.1文件内容查询命令 grep、fgrep、egrep
语法:grep[选项][查找模式][文件名1,文件名2,……]
选项: -E 每个模式作为一个扩展的正则表达式对待
-F 每个模式作为一组固定字符串对待,而不作为正则表达式
-i 比较时不区分大小写
-l 显示首次匹配匹配串所在的文件名并用换行符将其分开。当在文件中多次出现匹配串时,不重复显示次文件名;
-x 只显示整行严格匹配的行
1.2文件查找命令 find、locate
语法:find 起始目录 寻找条件 操作
以名称和文件属性查找
-name‘字串‘ 查找文件名匹配所给字串的所有文件,字串内可用通配符*、?、[]。
-lname‘字串‘ 查找文件名匹配所给字串的所有符号链接文件,字串内可用通配符*、?、[]。
-gid n 查找属于ID号为n的用户组的所有文件。
-uid n 查找属于ID号为n的用户的所有文件。
-group‘字串‘ 查找属于用户组名为所给字串的所有的文件。
-user‘字串‘ 查找属于用户名为所给字串的所有的文件。
-path‘字串‘ 查找路径名匹配所给字串的所有文件,字串内可用通配符*、?、[]。
-perm 权限 查找具有指定权限的文件和目录,权限的表示可以如711、644。
-type x 查找类型为 x的文件,
语法:locate 相关字
1.3文件的复制、删除和移动命令文件复制命令cp
[选项] 源文件或目录 目标文件或目录
选项:
- a 通常在拷贝目录时使用
-d 拷贝时保留连接
-f 删除已经存在的目标文件而不提示
-i 和f选项相反
-p 此时cp除复制源文件内容外,还将其修改的时间和访问权限也复制到新文件中
-r 若给出的源文件是一目录文件,此时cp将递归复制该目录下的所有的子目录和文件,此时目标文件必须为一个目录名;
-l 不作拷贝,只是链接文件
文件移动命令 mv
[选项] 源文件或目录 目标文件或目录
-i 交互式操作
-f 禁止交互式操作
文件删除命令 rm
[选项] 文件…
-f 忽略不存在的文件,从不给出提示
-r 指示rm将参数中列出的全部目录和子目录均递归地删除
-i 进行交互式删除
1.4文件链接命令ln
[选项] 目标 [链接名] 或 ln [选项] 目标 目录
选项:- s 建立符号链接
1.5目录的创建和删除命令
mkdir 创建一个目录
语法:mkdir [选项] dirname
选项:- m 对新建目录设置存取权限
-p 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录。
rmdir 删除空目录
语法:rmdir [选项] dirname
选项: - p 递归删除目录dirname,当子目录删除后其父目录为空时,也一同被删除。
1.6改变工作目录,显示目录内容命令
1、改变工作目录:cd [directory]
2、显示当前工作的目录的绝对路径: pwd
3、显示目录内容:ls [选项] [目录或是文件]
选项:
- a 显示指定目录下所有子目录与文件,包括隐藏文件;
-c 按照文件的修改时间排序
-C 分成多列显示各项
-d 如果参数是目录,只显示其名称而不显示其下的个文件
-F 在目录名后面标记“/”,可执行文件后面标记“*”,符号链接后面标记“@”,管道(或FIFO)后面标记“|”,socket文件后面标记“=”。
-l 以长格式来显示文件的详细信息
-L 若指定的名称为一个符号链接,则显示链接所指向的文件
-t 显示时按修改时间而不是名字排序
-u 显示时按文件上次存取的时间而不是名字排序
4、改变文件或目录的访问权限命令
chmod [who] [+| - | = ] [mode] 文件名?
Who选项:
- u表示用户,即文件和目录的所有者
-g表示同组用户
-o(other)表示其他用户
-a (all)表示所有用户
操作符号:
+ 添加某个权限 - 取消某个权限
= 赋予给定权限并取消其他所有的权限(如果有的话)
mode 选项:
- r 可读
-w 可写
-x 可执行
chgrp [-R] group filename? 改变目录或文件所属的组
chown [-Rv] 用户或组 文件
1.7备份与压缩命令
1、tar命令 为文件和目录创建档案
语法:tar [主选项+辅助选项] 文件或者目录
u 主选项
c 创建新的档案文件。如果用户想备份一个目录或是一些文件,则选此项
r 把要存档的文件追加到档案文件的末尾
t 列出档案文件的内容,查看已经备份了哪些文件;
u 更新文件
x 从档案文件中释放文件;
u 辅助选项
b 该选项为磁带机设定的,其后跟一位数字,用来说明区块的大小,系统预设值为20
f 使用档案文件或设备,这个选项通常是必选的
k 保存已经存在的文件。例如把某个文件还原,在还原的过程中,遇到相同的文件,不会进行覆盖;
m 在还原文件时,把所有文件的修改时间设定为现在;
M 创建多卷的档案文件,以便在几个磁盘中存放;
v 详细报告tar处理的文件信息
w 每一步都要求确认
z 用gzip来压缩/解压缩文件
2、gzip命令 压缩/解压缩命令
语法:gzip [选项] 压缩(解压缩)的文件名
选项:-c 将输出写到标准输出上,并保留原有文件
-d 将压缩文件解压
-l 显示每个压缩文件的详细信息
-r 递归式地查找指定目录并压缩其中的所有文件或者是解压缩
-t 测试、检查压缩文件是否完整
-v 对每一个压缩和解压的文件,显示文件名和压缩比
3、unzip 命令
用MS windows下的压缩软件winzip压缩的文件在linux系统下展开
语法:unzip [选项] 压缩文件名.zip
选项: -x 文件列表 解压缩文件,但不包括指定的file文件
-v 查看压缩文件目录,但不解压
-t 测试文件有无损坏 ,但不解压
-d 目录 将压缩文件解到指定目录下
-z 只显示压缩文件的注解
-n 不覆盖已经存在的文件
-o 覆盖已经存在的文件且不要求用户确认
-j 不重建文档的目录结构,把所有文件解压到同一目录下
1.8在LINUX环境下运行DOS命令
linux系统提供了一组称为mtools的可移植工具,可以让用户轻松地从标准的DOS软盘上读写文件和目录。
mcd 目录名 改变MSDOS目录
mcopy 源文件 目标文件 在MSDOS和UNIX之间复制文件;
mdel 目录名 删除MSDOS目录
mdir 目录名 显示MSDOS目录
mformat 驱动器号 在低级格式化的软盘上创建MSDOS文件系统
rnlabel 驱动器号 产生MSDOS卷标
mmd 目录名 删除MSDOS目录
mren 源文件 目标文件 重新命名已存在的MSDOS文件
mtype 文件名 显示MSDOS文件的内容
2 设备管理命令
linux采用下面的形式定义一个IDE硬盘:/dev/hd[drive][partition]
SCSI硬盘使用同样的机制表示: /dev/sd[drive][partition]
对于一般的LINUX分区,可以用mkfs将其格式化并生成文件系统,命令如下:
mk2fs -c <partition> <size>
装载文件系统:mount -t ext2 [-o optioms] partition mountpiont
其中,-t为指定装载文件系统的类型;-o指定一些选项,如只读ro,可读可写rw等等;partition定义分区名称;mountpiont定义文件系统被装载的目录名称。
装载CD-ROM文件系统:mount -t iso9660 -r /dev/cdrom /mnt/cdrom
装载软驱文件系统: mount -t msdos -rw /dev/fd0 /dev/mnt/floppy
卸载文件系统 umount /mnt/cdrom
磁带设备的安装要注意以下几点:
1、 首先要选择一个唯一的SCSI ID号,然后再将设备链接到适当的位置
2、 选择驱动程序。
3、 生成设备文件。SCSI磁带设备的主要设备号是9,次要设备号是0。设备文件名通常是/dev/nrst0(不支持回绕的磁带设备)或/dev/nst0(支持回绕的磁带设备)
用 ls /dev/*rst*
检查磁带设备文件是否存在,如果不存在,用
mknod -m 666 /dev/nrst0 c 9 9
mknod -m 666 /dev/rst0 c 9 0 生成
4、 可以对块长度、缓存、磁带密度等参数进行一些设置,例如
mt setblk 20 将块长度指定为20
mt setblk 0 指定块程度没有限制
5、 通过检查系统的启动信息可以确定系统是否识别了新的磁带设备。用dmesg命令,查看是否有以下类似的信息:
aha274x:target 4now synchronous at 4.4Mb/s
Vendor:TANDBERG Model:TDC 3800 Rev: =05:
Type: Sequential-Access ANSI SCSI revision: 02
Detected scsi tape st0 at scsi0, id4, lun0
Scsi : detected 1 SCSI tape 1 SCSI crom 1 SCSI disk total
3 软件包管理命令
3.1软件安装的步骤
在LINUX系统上安装软件的步骤有:
1、 查找所要安装软件的源文件
2、 把源文件解开放到一个目录中,命令如下:
tar zxvf <源文件名>
3、 针对本操作系统配置源文件。可以是编辑make文件或其他文件,也可能是运行该软件自带的自动配置工具,如./configure
4、 make源文件,通常是运行make命令,即执行 make
5、 安装二进制文件和其他支撑文件,运行命令: make install
6、 最后,完成所有其他必须的配置
3.2软件包管理命令
rpm -ivh <软件包>
// 安装指定的软件包,并在安装过程中用#表示安装的进度
rpm -Uvh <软件包>
// 更新一个已经存在的或还没安装好的软件包,并删除所有该软件包的旧版本。
rpm -e
//卸载一个rpm软件包
rpm -qa
// 查看系统中已经安装的软件包
rpm -q <软件包>
// 查看系统中某个软件包的版本号;
rpm -qlp <软件包>
//列出某个软件包中的所有文件
rpm -qf <软件包>
//找出一个文件属于哪个软件包
4 LINUX系统常用命令
4.1 与系统管理有关的命令
Wall (Write All)
对全部已 登录的用户发送信息,用户可以先反要发送的信息写好存入一个文件中,然后输入:# wall < FileName
例:Wall ‘Thank you !’
Write
向某一用户发送信息。
Write xxq
hello
posted @ 2006-06-01 15:30 edsonjava 阅读(128) | 评论 (0)编辑 收藏
 

Linux,在今天的广大电脑玩家耳中已经不再是那个曾经陌生又遥远的名字,大家提起Linux时,不再是把它当做与微软抗衡的一面大旗或自由软件爱好者的精神支柱。如果说几年前的Linux是星星之火的话,今天的它已经真正地形成了燎原之势。

  Linux,在今天的广大电脑玩家耳中已经不再是那个曾经陌生又遥远的名字,大家提起Linux时,不再是把它当做与微软抗衡的一面大旗或自由软件爱好者的精神支柱。如果说几年前的Linux是星星之火的话,今天的它已经真正地形成了燎原之势。随着越来越多成熟的Linux发行版的推出以及Linux推广的许多问题(安装不方便、中文化困难、软件匮乏、缺乏统一标准等)得到 圆满解决,现在Linux已经真正地向广大的电脑爱好者们敞开了大门。

  一、安装前的准备

  你完全可以打消Linux对计算机硬件是否支持的顾虑,放心大胆地安装。

  1.检查硬件支持

  在安装Linux之前,先确定你的计算机的硬件是否能被Linux所支持。

  首先,Linux目前支持几乎所有的处理器(CPU)。其次,早期的Linux只支持数量很少的显卡、声卡,而如今,如果要安装Linux,已经不需要再为硬件是否能被Linux支持担心了。经过十多年的发展,Linux内核不断完善,已经能够支持大部分的主流硬件,同时各大硬件厂商也意识到了Linux操作系统对其产品线的重要性,纷纷针对Linux推出了驱动程序和补丁,使得Linux在硬件驱动上获得了更广泛的支持。

  另外,如果你的声卡、显卡是非常新的型号,Linux内核暂时无法支持,那也不要紧,RedHat会自动把无法准确识别的硬件模拟成标准硬件来使用,让硬件一样可以在Linux发挥作用。

  由于设计Linux时的初衷之一就是用较低的系统配置提供高效率的系统服务,所以安装Linux并没有严格的系统配置要求,只要Pentium以上的CPU、64MB以上的内存、1GB左右的硬盘空间,就能安装基本的Linux系统并且能运行各种系统服务。但是如果要顺畅地运行X-Window,就需要有足够的内存,建议128MB以上。

  现在,你可以打消Linux对计算机硬件是否支持的顾虑,放心大胆地安装了吧。
 2.确认安装方式

  RedHat Linux9.0采用了稳定的内核Linux Kernel 2.4.20,配合GCC 3.2.1,以及GNU libc 2.3.2。这些最新的特性能够保证整个系统的优越表现。

  (1)从光盘安装

  最简单,最方便的安装方法当然是从CD安装,你可以享受最人性化的,类似于Windows的安装。你只要将计算机设置成光驱引导,把安装CD1放入光驱,重新引导系统,在安装界面中直接按回车,即进入图形化安装界面(图1)。



图 1

  由图可见,在提供“豪华”的图形化GUI安装界面的同时,REDHAT Linux 9.0仍然保留了以往版本中的字符模式安装界面,这对于追求安装速度与效率的用户一直是很有吸引力的。因为许多用户是将RedHat 9安装成服务器来使用的,不需要X-Window以及GUI安装界面。

  RedHat 9的安装步骤中比以往多了一个环节,那就是对安装光盘介质的检测。它允许在开始安装过程前对安装光盘介质进行内容校验,以防止在安装的中途由于光盘无法读取或是内容错误造成意外的安装中断,导致前功尽弃。

  REDHAT Linux 9.0如果完全安装将达到7张光盘,安装时间长达几十分钟。如果因为一张光盘的内容错误导致安装失败,这将浪费很多安装时间。所以,建议在安装之前对光盘进行介质检测与校验以保证安装顺利进行。
(2)从硬盘安装

  如果没有安装光盘,而是从网上直接下载Linux的ISO映像文件,能不能用下载的ISO文件进行安装而不用刻录成光盘呢?当然可以!

  从硬盘安装RedHat Linux 9.0通常需要三个文件①shrike-i386-disc1.iso;②shrike-i386-disc2.iso;③ shrike-i386-disc3.iso。这代表了安装时需要的三张光盘。由于是映像文件,系统无法直接读取,所以需要先将ISO里的文件还原。

  这里推荐大家使用Daemon Tool(http://www.linuxeden.com/download/winapps/daemon333.exe)这个Windows下的软件将ISO文件“解”到硬盘上。比方说shrike-i386-disc1.iso可以解压缩到C:盘的cd1目录,shrike-i386-disc2.iso解压缩到C:盘的cd2目录,shrike-i386-disc3.iso可以解压缩到C:盘的cd3目录待用。

  接下来重新启动系统进入MS-DOS方式,进入我们刚才解压出来的C\cd1目录,里面有个dosutils目录,执行里面一个名为autoboot.bat的DOS批处理文件,系统就会再次重新启动,进入Linux的安装界面。这时安装程序就会提示你选择是用光盘安装还是从硬盘安装,选择从硬盘安装后,系统会提示输入安装文件所在的目录。

  需要注意的是,我们刚解压缩的ISO文件是在Windows中操作的,如果直接输入c:\cd1,Linux安装程序是无法识别的,我们需要将c:\cd1对应到Linux安装程序能够识别的格式,因此这里应该输入的是/dev/hda1/cd1。

  二、正式开始安装

  你会觉得简直就和安装Windows一样了。

  通过上面的叙述,无论是从光盘安装,还是从硬盘安装,我们都可以方便地进入正式的安装过程。让我们来看看安装过程中几个重要的地方。

  1.选择系统默认语言

  RedHat支持世界上几乎所有国家的语言,这里只要在简体中文前面打上钩,并将系统默认语言选择为简体中文(图2),那么在安装过程结束,系统启动后,整个操作系统的界面都将是简体中文的了,用户不用做任何额外的中文化操作和设置。



图 2

  2.分区操作

  接下来,是磁盘分区的工作,这也许是整个安装过程中惟一需要用户较多干预的步骤,REDHAT Linux 9.0提供了两种分区方式——自动分区和使用DISK DRUID程序进行手动分区(图3)。



图 3

  (1)自动分区:如果是全新的计算机,上面没有任何操作系统,建议使用“自动分区”功能,它会自动根据磁盘以及内存的大小,分配磁盘空间和SWAP空间。

  这是一个“危险”的功能,因为它会自动删除原先硬盘上的数据并格式化成为Linux的分区文件系统(EXT3、REISERFS等),所以除非计算机上没有任何其他操作系统或是没有任何需要保留的数据,你才可以使用“自动分区”功能。

  (2)手动分区:如果硬盘上有其他操作系统或是需要保留其他分区上的数据,建议采用DISK DRUID程序进行手动分区。DISK DRUID是一个GUI的分区程序,它可以对磁盘的分区进行方便的删除、添加和修改属性等操作,它比以前版本中使用的字符界面Fdisk程序的界面更加友好,操作更加直观。下面我们来看看如何使用DISK DRUID程序对硬盘进行分区。

  因为Linux操作系统需要有自己的文件系统分区,而且Linux的分区和微软Windows的分区不同,不能共用,所以,需要为Linux单独开辟一个(或若干个)分区。Linux一般可以采用EXT3分区,这也是REDHAT Linux 9.0默认采用的文件系统。

  为Linux建立文件分区可以有两种办法,一种是利用空闲的磁盘空间新建一个Linux分区,另一种是编辑一个现有的分区,使它成为Linux分区。如果没有空闲的磁盘空间,就需要将现有的分区删除后,腾出空间,以建立Linux分区。
 DISK DRUID程序中有明显的新建、删除、编辑、重设等按钮。用户可以直观地对磁盘进行操作。在使用DISK DRUID对磁盘分区进行操作时,有四个重要的参数需要仔细设定:它们是挂载点、文件系统类型、驱动器、分区大小(图4)。



图 4

  挂载点:它指定了该分区对应Linux文件系统的哪个目录,Linux允许将不同的物理磁盘上的分区映射到不同的目录,这样可以实现将不同的服务程序放在不同的物理磁盘上,当其中一个物理磁盘损坏时不会影响到其他物理磁盘上的数据。

  文件系统类型:它指定了该分区的文件系统类型,可选项有EXT2、EXT3、REISERFS、JFS、SWAP等。Linux的数据分区创建完毕后,有必要创建一个SWAP分区,它实际上是用硬盘模拟的虚拟内存,当系统内存使用率比较高的时候,内核会自动使用SWAP分区来模拟内存。

  大小:指分区的大小(以MB为单位),Linux 数据分区的大小可以根据用户的实际情况进行填写,而SWAP大小根据经验可以设为物理内存的两倍,但是当物理内存大于1GB时,SWAP分区可以设置为2GB。

  允许的驱动器:如果计算机上有多个物理磁盘,就可以在这个菜单选项中选中需要进行分区操作的物理磁盘。

  经过磁盘分区的操作,安装过程中相对最复杂的一个步骤已经过去,接下来的安装将是一马平川。让我们来继续选择要安装的系统组件。
3.选择安装组件

  REDHAT Linux 9.0和先前的版本在安装组件的选择上非常相似,用户既可以选择桌面计算机、工作站、服务器、最简化安装这四个安装方法中的一个,也可以自己定义需要安装哪些软件包,并且安装程序会实时地估算出需要的磁盘空间,对用户非常方便。

  系统组件安装完毕后,安装程序会自动将用户选择的软件包从光盘介质拷贝到计算机的硬盘上,中途不需人工干预,并且在安装每个系统组件时都会对该组件做简短的说明。

  在选择软件包时,如果你想进一步配置系统,可以选定制软件包集合。建议定制,选上KDE桌面环境,这样你就有两个可以和WindowsXP媲美的真彩图标的桌面(图5)。



图 5

  怎么样,安装过程很简单吧?当然,这还不是最后一步,因为在安装完所有系统组件后,安装程序还会“体贴”地提醒你制作一张启动磁盘,以备不测。

  到此为止,Linux系统就已经顺利地安装完成了。
三、更改启动方式

  它比Windows更好玩一点。

  作为默认,REDHAT Linux 9.0在启动时会自动启动X-Window进入图形化操作界面。而许多Linux铁杆玩家已经习惯了在Console字符界面工作,或是有些玩家嫌X-Window启动太慢,喜欢直观快速的Console操作。

  1.进入字符界面

  为了在Linux启动时直接进入Console界面,我们可以编辑/etc/inittab文件。找到id:5:initdefault:这一行,将它改为id:3:initdefault:后重新启动系统即可。我们看到,简简单单地将5改为3,就能实现启动时进入X-Window图形操作界面或Console字符界面的转换,这是因为Linux操作系统有六种不同的运行级(run level),在不同的运行级下,系统有着不同的状态,这六种运行级分别为:

  0:停机(记住不要把initdefault 设置为0,因为这样会使Linux无法启动 )
  1:单用户模式,就像Win9X下的安全模式。
  2:多用户,但是没有 NFS 。
  3:完全多用户模式,标准的运行级。
  4:一般不用,在一些特殊情况下可以用它来做一些事情。
  5:X11,即进到 X-Window 系统。
  6:重新启动 (记住不要把initdefault 设置为6,因为这样会使Linux不断地重新启动)。

  其中运行级3就是我们要进入的标准Console字符界面模式。

  2.自由转换字符界面和X-Window图形界面

  在了解了启动自动进入X-Window图形操作界面和Console字符操作界面的转换后,也许你会想,这两种操作界面各有各的好处,我能不能“贪心”一点,同时拥有这两种操作界面呢?在无所不能的Linux操作系统中,这个要求当然是可以得到满足的。

  在X-Window图形操作界面中按“Alt+Ctrl+功能键Fnn=1~6”就可以进入Console字符操作界面。这就意味着你可以同时拥有X-Window加上6个Console字符操作界面,这是一件多么令人振奋的事情啊!

  在Console字符操作界面里如何回到刚才的X-Window中呢?很简单,按“Alt+Ctrl+F7”即可。这时Linux默认打开7个屏幕,编号为tty1~tty7。X-Window启动后,占用的是tty7号屏幕,tty1~tty6仍为字符界面屏幕。也就是说,用“Alt+Ctrl+Fn”组合键即可实现字符界面与X Window界面的快速切换。

  Linux的老用户们都知道,X-Window是一个非常方便地图形界面,它能使用户用鼠标最简单的进行操作,但是它也有不少缺点:比如启动和运行速度慢、稳定性不够、兼容性差、容易崩溃等。但是一旦X-Window系统出了问题,并不会使整个Linux系统的崩溃而导致数据丢失或系统损坏,因为当X-Window由于自身或应用程序而失去响应或崩溃时,我们可以非常方便地退出X-Window进入Console进行故障处理,要做的只是按“Alt+Ctrl+Backspace”键,这意味着只要系统没有失去对键盘的响应,X-Window出了任何问题,都可以方便地退出。

posted @ 2006-05-31 22:54 edsonjava 阅读(206) | 评论 (0)编辑 收藏
 
什么是ISO文件

ISO文件一般以iso为扩展名,是复制光盘上全部信息而形成的镜像文件,其文件格式为iso9660。
许多Linux操作系统的安装包都是以ISO文件的形式发布的。在得到相应的ISO文件后,可以将其内容烧录到光盘上。这样做出来的光盘与购买的安装光盘基本上是相同的。用这个光盘启动计算机,就可以安装Linux操作系统了。
本章所讨论的是硬盘安装法,是不需要烧录光盘的。但我们需要读取ISO文件中的信息。

Linux下操作ISO文件

在Linux下,以root身份执行以下格式的命令就可以从/path目录中读到xxx.iso这个文件中的内容。
实际使用时,应该根据实际情况修改/path和xxx.iso。
mount -t iso9660 -o loop xxx.iso /path
如果想制作ISO文件,把光盘放到光驱中,然后执行如下的拷贝命令就可以把光盘上的内容拷贝到一个ISO文件中去。实际使用时,应该根据实际情况修改xxx.iso。
cp /dev/cdrom xxx.iso


Windows下操作ISO文件

在windows下,一般需要专用工具软件才能操作ISO文件。比如WinISO、WinImage、Dameon Tools
等。
如果仅仅是想读取ISO文件中的内容,则可以用WinRAR。WinRAR3.0以上版本都支持iso9660文件
格式。用WinRAR打开ISO文件,选中需要的内容,将其解压出来就可以了。

Linux操作系统安装盘的ISO文件

红旗Linux4.1桌面版的iso安装文件在Linux环境下挂装到/mnt/iso目录后看到的内容。
如果把这个iso文件刻成光盘,那么看到的光盘内容也是这个样子。
值得注意的有两个目录。一个是images,在这个目录里包含了一些1.44MB软盘的镜像文件,其中bootdisk.img可以用来制作安装用启动软盘;另一个是dosutils,其中包含了一些DOS工具,比如rawrite.exe,用这个软件可以把软盘的镜像文件写到软盘里。
Linux启动安装法

这种方法需要制作一张Linux启动盘。
先把iso文件中images文件夹里的bootdisk.img读出来单独存储到硬盘上。
如果是在Linux下,就把软盘插入软驱,然后执行下面的命令把bootdisk.img写入软盘:
dd if=bootdisk.img of=/dev/fd0如果是在DOS/WINDOWS下,则还要把iso文件中dosutils文件夹里的rawrite.exe读出来并与 bootdisk.img保存在同一个目录下。然后在DOS提示符下执行rawrite,按提示插入软盘,将bootdisk.img写入软盘。
做好Linux启动盘后,用它引导启动计算机。当提示询问何种安装方式时,选择硬盘安装
方式(Hard Drive),并提供正确的iso文件位置信息,就能启动iso文件中的安装程序了。
按照安装程序的提示,就可以完成安装了。
在安装程序的引导下安装参见“启动虚拟主机安装Linux”。
posted @ 2006-05-31 22:51 edsonjava 阅读(336) | 评论 (0)编辑 收藏
 
轻松玩转VMware虚拟机(3)

应用以及技巧

在设置完和安装完虚拟机之后,我们需要开始考虑如何发挥其最大的作用。在笔者的使用过程中,发现对于一些初学者和玩家而言,极为有用和有趣的用途:

1.使用虚拟机虚拟老操作系统,在虚拟的系统中玩老游戏

这个作用也是朋友们使用最多的功能。由于最新的Windows XP操作系统已经完全取消了DOS,所以不少喜欢怀旧的朋友想要在新机器上运行老游戏的话,安装一个DOS系统是必不可少的。可是为了一个老游戏重新格式化安装系统的话,好像有些得不偿失,所以在此时,虚拟机就派上了用处。你只需要打开虚拟机,放入光盘或者软盘,简单设置和安装即可得到一个新的操作系统,这个虚拟的操作系统和你在物理机器上安装的操作系统是一摸一样的,你可以方便快捷地使用这个操作系统进行游戏。

2.使用虚拟机学习和体验新的操作系统和新技术

抛开发烧友和游戏来说,使用虚拟机的还有很大一部分用户都是需要采用虚拟机来模拟非当前操作系统或者比较复杂的网络环境,通过在虚拟的操作系统环境中进行操作,熟悉操作和新技术,来达到事半功倍的目的。VMware只是一个软件,可以帮助你在一个操作系统的环境下安装另一个操作系统,所以在安装操作系统之前,仍然需要对硬盘进行分区和格式化的操作。正因为此,我觉得虚拟机最好玩的地方在于,对于一个新手来说,这个东西可以让你学习如何对硬盘分区,并设置活动分区,然后格式化,然后装系统。像一些直接操作硬盘尤其是分区表和fat的软件,也可以用虚拟机来学习应用,这样不会对硬盘有什么大的伤害。同时由于VMware虚拟机软件允许同时装多个虚拟机,譬如说,主机的操作系统是Windows 2000,这样你可以再装一个Windows 98或Windows 2000,甚至Linux,这样就可以在Windows的环境下,一边用QQ,一边学习Linux了。

3.使用虚拟机来测试操作系统ISO文件

可能不少朋友都会觉得这个想法很奇怪,难道检测ISO文件不能使用别的办法而非要使用虚拟机吗?其实检测操作系统ISO的文件最简单的办法的确是使用VMware软件,因为如果想要检测该ISO文件的话,您需要把ISO文件刻盘,然后重新安装才能了解到刻出来的盘是否真的成功,程序文件是否完全,有无丢失,而当你使用了虚拟机软件之后,麻烦就少了许多,你现在完全可以使用虚拟机软件来检测ISO文件的好坏。首先使用VMware创建一个新的虚拟机,选择"Custom"然后选择"Windows XP Professional"作为操作系统。如果愿意,你可以编辑一下虚拟机的名称和保存位置。你也可以重新调整一下分配给虚拟机的内存大小,接着设置你的网络连接,这里我建议你选择"Do not use a network connection"因为它和我的网络连接有冲突,而且在这个测试中也没必要使用网络。选择"Create a new virtual disk",然后如果愿意你也可以重设一下虚拟机磁盘的大小,默认的大小就是可以使用的最大值。如果你仅仅是为了测试,用不了4GB,那么磁盘文件就不会占据4GB的空间,但如果虚拟机使用超过了4GB,软件会自动分配给虚拟机更多的磁盘空间。如果你想要测试OEM预安装模式,并且要使用6GB左右的空间,那么你最好在这里就调整得大一些。完成后,选择"Edit virtual machine settings",选中光驱,然后选择"Use ISO Image",选中你的ISO文件,点击“确定”,然后启动虚拟机,安装过程就开始了。等到安装结束后,你就得知这个刻录的ISO文件是否文件齐全,是否有错误了。

4.使用VMware虚拟机截图

可能很多朋友都不会想到这一点,但是这个好玩的做法的确存在。相信大家都看到过微软操作系统蓝屏的照片或者图片,大家在笑过之后是否会疑惑如果系统蓝屏了那我们该如何截图呢?如果有数码相机的话,很简单,只需要拍照就可以了。但是没有数码相机呢?那你就需要使用到VMware虚拟机了,所以大家见到的很多操作系统蓝屏和BIOS设置的图片都是使用VMware虚拟机截出来的图片。这下大家应该不再迷惑了,知道了那些图片是如何而来的了。

其实VMware虚拟机还有更多更有趣的玩法,这些都需要大家去慢慢摸索,笔者在这里介绍的也只是VMware虚拟机用途的冰山之一角,更多的好玩之处大家慢慢琢磨,相信大家会发现其拥有更多好玩和实用的功能。在这里笔者还要大家注意的就是VMware虚拟机软件的运行需要大量的资源,尤其是内存,不然会明显地感到机器很慢,机器一定要在256M内存以上才可安装使用,在这里也希望大家能快速上手。一台电脑装几十个系统?不是不可能嘛!

posted @ 2006-05-31 22:22 edsonjava 阅读(539) | 评论 (0)编辑 收藏
 
轻松玩转VMware虚拟机(2)

建立一个虚拟系统

双击桌面的“VMware”图标,即可进入VMware的主窗口,点击右侧的New Virtual Machine即可新建一个虚拟系统,之后选择Typical,再选择一种要安装的操作系统(如图2、图3)。

 

现在选择你建立的虚拟系统,点击上方工具栏中的POWER ON键便可开机了(如图4)。

其他按钮分别是POWER OFF:关机。Suspend:挂起,可以让虚拟机记录下当前虚拟系统的状态,下次可以用Resume重新恢复选择挂起时的运行状态,以便接着工作。Reset:重启,相当于物理计算机的RESET按钮。Full Screen:全屏,将虚拟机全屏显示。现在一台和真实计算机一样的机器已经建起来了,点击虚拟机的窗口,你的鼠标就融入虚拟系统了,你可以和使用一台真的计算机一样使用它了,而且任何设置都不会影响到你本机。如果想回到主机系统,则可以按Ctrl+Alt使鼠标回到主机系统。不要在虚拟机中使用Ctrl+Alt+Del组合键,因为主机系统同样也会对这个组合键做出反应,你应当使用Ctrl+Alt+Ins来代替。

虚拟机的启动过程和你的PC的启动过程也是没有什么不同的,一开始是自检,这时按F2可以进入BIOS设置。每一台虚拟机都有它自己的BIOS。

请到BIOS中去设置启动顺序(这里的BIOS当然是虚拟机中的BIOS)。之后便可使用光盘来启动安装(虚拟机可以用光盘镜像如:ISO、vcd文件作为光盘。比如从网上下载的Linux ISO文件,不需刻盘,可直接安装。软驱同理)。在光盘启动后要选择Text mode。实际上你即便是选择图形模式,安装程序检测后还是会跳到Text mode。而有时在检测的过程中会死机。在安装其他版本的Linux就没有这种情况。安装的时间可能比在一台单独的PC上安装的时间要略长。

你会发现在虚拟机中的设备和你实际的设备完全不一样,VMware为了保证系统的兼容性和稳定性,把现有的设备都虚拟成了最标准的、兼容性最好的设备。由于实际驱动设备的程序仍是在本机系统上运行的驱动程序,实际上的效率并没有多少降低。所以不要试图按照自己的机器配置系统。除此之外,在虚拟机中不用也不能安装任何驱动程序。(未完待续)

 

posted @ 2006-05-31 22:21 edsonjava 阅读(238) | 评论 (0)编辑 收藏
 
轻松玩转VMware虚拟机(1)

    笔者的一个朋友是个游戏狂人,他能够在Windows XP操作系统下装DOS玩DOS版的《红色警戒》、《三国志》和《大富翁》等游戏,甚至还为了一个日文的老游戏而装了日文版的DOS,他在电脑里安装了多个操作系统,甚至还使用了多重启动的管理软件来管理这些操作系统。其实不用这么麻烦,在一个操作系统平台上安装另外几个操作系统实在是太简单了。

    如果你厌倦了Windows,想尝试一下Linux,却害怕Linux的重新分区;也许你喜欢试一试各种软件,却讨厌重装系统;也许你已经安装了多个操作系统,可是当你需要切换操作系统的时候只能重新启动;也许你是个怀旧的游戏玩家,经常为操作系统不支持某游戏而恼火……那你一定要用VMware虚拟机,一切都会变得简单易行。

    VMware是VMware公司出品的一个多系统安装软件。利用它,你可以在一台电脑上将硬盘和内存的一部分拿出来虚拟出若干台机器,每台机器可以运行单独的操作系统而互不干扰,这些“新”机器各自拥有自己独立的CMOS、硬盘和操作系统,你可以像使用普通机器一样对它们进行分区、格式化、安装系统和应用软件等操作,还可以将这几个操作系统联成一个网络。在虚拟系统崩溃之后可直接删除不影响本机系统,同样本机系统崩溃后也不影响虚拟系统,可以下次重装后再加入以前做的虚拟系统。同时它也是唯一的能在Windows和Linux主机平台上运行的虚拟计算机软件。VMware虚拟机软件不需要重开机,就能在同一台电脑使用好几个OS,不但方便,而且安全。

    [点击下载VMware] http://software.pchome.net/system/sysenhance/4673.html

    安装虚拟平台

    在安装上没必要作过多的介绍,请大家注意的是VMware只能安装在WinNT/2000/XP或Linux,以及FreeBSD下。装好之后,你可以发现你多了两块名为VMware Virtual Ethernet Adapter (basic host-only support for VMnet1)和VMware Virtual Ethernet Adapter (Network Address Translation (NAT) for VMnet8)的虚拟网卡,这也是VMware的特色所在,因为在VMware下你可以使用虚拟网卡进行联网设置及其试验(如图1)。

posted @ 2006-05-31 22:19 edsonjava 阅读(179) | 评论 (0)编辑 收藏
 


网上有很多很多用js对表格进行排序的例子,比如说http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndude/html/dude07232001.asp
这个是微软的3个表格操作的例子,都做成了htc组件了
但是有个问题就是在mozilla等非IE浏览器下面都不能实现效果
于是去网上找了个例子,是可以进行在大部分浏览器下的排序的,可惜没有微软自己做的那么好,比如 显示目前是以何例何方式在排序的信息,对于此我特意改写了一下js代码,特意给出代码
注意是html和js混合的,没有分开,需要的可以自己分开来
经过我测试,效果良好:-)并且代码简洁易懂
以下是我改版国外的js后的代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!--************************************************************************-->
<!--* Copyright 2002 by Mike Hall                                          *-->
<!--* Please see http://www.brainjar.com for terms of use.                 *-->
<!--************************************************************************-->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>BrainJar.com: Table Sort</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<link href="/common/article.css" rel="stylesheet" type="text/css" />

<script type="text/javascript">//<![CDATA[
var blankImg="blank.gif";
var downImg="down.gif";
var upImg="up.gif";
var imgElsrc=new Array();

function setImg(obj,col)
{
 for(var i=0;i<imgElsrc.length;i++)
 {
  var imgTemp = document.getElementById("img"+i);
  if(i!=col)
  {
   imgTemp.src=blankImg;
  }else
  {
   if (obj.reverseSort[col])
   imgElsrc[col] = downImg;
   else
   imgElsrc[col] = upImg;
   
   imgTemp.src=imgElsrc[col];
  }
 }/*alert(imgElsrc.length)*/
}
function sortTable2(col) {

  // Get the table section to sort.
  var tblEl = document.getElementById("planetData2");
  // Set up an array of reverse sort flags, if not done already.
  if (tblEl.reverseSort == null)
    tblEl.reverseSort = new Array();

  // If this column was the last one sorted, reverse its sort direction.
  if (col == tblEl.lastColumn)
    tblEl.reverseSort[col] = !tblEl.reverseSort[col];

  // Remember this column as the last one sorted.
  tblEl.lastColumn = col;

  //初始化图片的数组
  colLength=tblEl.rows[0].cells.length;
 if (imgElsrc.length<colLength)
 {
 imgElsrc=new Array(colLength);
 }
  // Set Image
  setImg(tblEl,col);

  // Set the table display style to "none" - necessary for Netscape 6
  // browsers.
  var oldDsply = tblEl.style.display;
  tblEl.style.display = "none";

  // Sort the rows based on the content of the specified column using a
  // selection sort.

  var tmpEl;
  var i, j;
  var minVal, minIdx;
  var testVal;
  var cmp;

  for (i = 0; i < tblEl.rows.length - 1; i++) {

    // Assume the current row has the minimum value.
    minIdx = i;
    minVal = getTextValue(tblEl.rows[i].cells[col]);

    // Search the rows that follow the current one for a smaller value.
    for (j = i + 1; j < tblEl.rows.length; j++) {
      testVal = getTextValue(tblEl.rows[j].cells[col]);
      cmp = compareValues(minVal, testVal);
      // Reverse order?
      if (tblEl.reverseSort[col])
        cmp = -cmp;
      // If this row has a smaller value than the current minimum, remember its
      // position and update the current minimum value.
      if (cmp > 0) {
        minIdx = j;
        minVal = testVal;
      }
    }

    // By now, we have the row with the smallest value. Remove it from the
    // table and insert it before the current row.
    if (minIdx > i) {
      tmpEl = tblEl.removeChild(tblEl.rows[minIdx]);
      tblEl.insertBefore(tmpEl, tblEl.rows[i]);
    }
  }

  // Restore the table's display style.
  tblEl.style.display = oldDsply;

  return false;
}

//-----------------------------------------------------------------------------
// Functions to get and compare values during a sort.
//-----------------------------------------------------------------------------

// This code is necessary for browsers that don't reflect the DOM constants
// (like IE).
if (document.ELEMENT_NODE == null) {
  document.ELEMENT_NODE = 1;
  document.TEXT_NODE = 3;
}

function getTextValue(el) {

  var i;
  var s;

  // Find and concatenate the values of all text nodes contained within the
  // element.
  s = "";
  for (i = 0; i < el.childNodes.length; i++)
    if (el.childNodes[i].nodeType == document.TEXT_NODE)
      s += el.childNodes[i].nodeValue;
    else if (el.childNodes[i].nodeType == document.ELEMENT_NODE &&
             el.childNodes[i].tagName == "BR")
      s += " ";
    else
      // Use recursion to get text within sub-elements.
      s += getTextValue(el.childNodes[i]);

  return normalizeString(s);
}

function compareValues(v1, v2) {

  var f1, f2;

  // If the values are numeric, convert them to floats.

  f1 = parseFloat(v1);
  f2 = parseFloat(v2);
  if (!isNaN(f1) && !isNaN(f2)) {
    v1 = f1;
    v2 = f2;
  }

  // Compare the two values.
  if (v1 == v2)
    return 0;
  if (v1 > v2)
    return 1
  return -1;
}

// Regular expressions for normalizing white space.
var whtSpEnds = new RegExp("^\\s*|\\s*$", "g");
var whtSpMult = new RegExp("\\s\\s+", "g");

function normalizeString(s) {

  s = s.replace(whtSpMult, " ");  // Collapse any multiple whites space.
  s = s.replace(whtSpEnds, "");   // Remove leading or trailing white space.

  return s;
}

//]]></script>
</head>
<body>

<div id="main">


<p>Let's try it out. Here's another table with the same planet data. But this
one uses the modified version of <code>sortTable().</code></p>

<table border="1">
  <caption style="caption-side:bottom;">The Planets</caption>
  <thead>
    <tr style="vertical-align:bottom">
      <th style="text-align:left"  ><a href="" onclick="return sortTable2(0)">Name</a><image id="img0" src="blank.gif"></th>
      <th style="text-align:center"><a href="" onclick="return sortTable2(1)">Diameter (mi.)</a><image id="img1" src="blank.gif"></th>
      <th style="text-align:center"><a href="" onclick="return sortTable2(2)">Distance<br />(mi. x 1000000)</a><image id="img2" src="blank.gif"></th>
      <th style="text-align:center"><a href="" onclick="return sortTable2(3)">Rotation (hrs.)</a><image id="img3" src="blank.gif"></th>
      <th style="text-align:center"><a href="" onclick="return sortTable2(4)">Period (days)</a><image id="img4" src="blank.gif"></th>
    </tr>
  </thead>
  <tbody id="planetData2">
    <tr>
      <td style="text-align:left">Mercury</td>
      <td style="text-align:right">3032</td>
      <td style="text-align:right">36.0</td>
      <td style="text-align:right">1407.6</td>
      <td style="text-align:right">88</td>
    </tr>
    <tr>
      <td style="text-align:left">Venus</td>
      <td style="text-align:right">7521</td>
      <td style="text-align:right">67.2</td>
      <td style="text-align:right">5832.5</td>
      <td style="text-align:right">225</td>
    </tr>
    <tr>
      <td style="text-align:left">Earth</td>
      <td style="text-align:right">7926</td>
      <td style="text-align:right">93.0</td>
      <td style="text-align:right">23.9</td>
      <td style="text-align:right">365</td>
    </tr>
    <tr>
      <td style="text-align:left">Mars</td>
      <td style="text-align:right">4222</td>
      <td style="text-align:right">141.6</td>
      <td style="text-align:right">24.6</td>
      <td style="text-align:right">687</td>
    </tr>
    <tr>
      <td style="text-align:left">Jupiter</td>
      <td style="text-align:right">88846</td>
      <td style="text-align:right">483.8</td>
      <td style="text-align:right">9.9</td>
      <td style="text-align:right">4331</td>
    </tr>
    <tr>
      <td style="text-align:left">Saturn</td>
      <td style="text-align:right">74897</td>
      <td style="text-align:right">890.8</td>
      <td style="text-align:right">10.7</td>
      <td style="text-align:right">10747</td>
    </tr>
    <tr>
      <td style="text-align:left">Uranus</td>
      <td style="text-align:right">31763</td>
      <td style="text-align:right">1784.8</td>
      <td style="text-align:right">17.2</td>
      <td style="text-align:right">30589</td>
    </tr>
    <tr>
      <td style="text-align:left">Neptune</td>
      <td style="text-align:right">30775</td>
      <td style="text-align:right">2793.1</td>
      <td style="text-align:right">16.1</td>
      <td style="text-align:right">59800</td>
    </tr>
    <tr>
      <td style="text-align:left">Pluto</td>
      <td style="text-align:right">1485</td>
      <td style="text-align:right">3647.2</td>
      <td style="text-align:right">153.3</td>
      <td style="text-align:right">90588</td>
    </tr>
  </tbody>
</table>

<p>You can now change the sort direction of each column independently.</p>

<p>The sort function can be modified in other ways to better accommodate both
the table data and its presentation. We'll look at some ideas next.</p>

<p class="footer"><a href="default5.asp">Prev</a>
|
<a href="default7.asp">Next</a></p>
</div>

</body>
</html>
主要增加了图片显示状态的功能,即增加函数setImg

另外还提供一个非常简单的js排序函数,但是好像只可以在IE下使用,代码如下
/*表格排序是对表格而言的,与表格的生成无关。就是说,无论用何种方式产生的表格排序时都一样。这是排序函数,很简单。
分升序和降序,要求传入参数:obj 表格名或id; n 排序列,第一列为0*/
function table_sort_asc(obj,n) {
  var i,j;
  var tab = eval("document.all."+obj);
  if(tab.tagName != "TABLE") return;
  for(i=0;i<tab.rows.length-1;i++)
 for(j=i+1;j<tab.rows.length;j++)
  if(tab.rows[i].cells[n].innerHTML > tab.rows[j].cells[n].innerHTML)
   tab.rows[i].swapNode(tab.rows[j]);
}

function table_sort_desc(obj,n) {
  var i,j;
  var tab = eval("document.all."+obj);
  if(tab.tagName != "TABLE") return;
  for(i=0;i<tab.rows.length-1;i++)
 for(j=i+1;j<tab.rows.length;j++)
  if(tab.rows[i].cells[n].innerHTML < tab.rows[j].cells[n].innerHTML)
   tab.rows[i].swapNode(tab.rows[j]);
}

除了用js来进行排序外,还可以用xml+xslt进行排序,但是还是有浏览器不兼容的问题,比较麻烦,我搜集了一些网上常用的表格排序的例子,现在放在网站上,提供下载

posted @ 2006-05-30 17:55 edsonjava 阅读(978) | 评论 (0)编辑 收藏
 

Fun with Tables

Dave Massy
Microsoft Corporation

July 24, 2001

Ever find yourself staring at a table of statistical data, straining to fathom its full implications? If so, you're not alone. A static table of data displayed on the screen doesn't always lend itself to ready comprehension. There are, however, some cool, dynamic behaviors you can apply to standard HTML tables that will allow your users to see the data in a variety of ways. These behaviors not only add interest, they can help considerably in reading and comparing data in a table. This month we'll take a look at these behaviors, and how you can use them to make your tables communicate—dynamically.

Before we look at these behaviors in detail, let's recall what a behavior is and the benefits it can bring to a DHTML page. The best way to think of a behavior is as a reusable DHTML component. There are two types of behavior: attached behaviors and element behaviors. Attached behaviors were introduced in Microsoft® Internet Explorer 5.0 and can be attached to any element in the HTML document using cascading style sheets (CSS) to add to the functionality of that element. Element behaviors were introduced in Internet Explorer 5.5, and take the concept further with the ability to implement your own custom elements for use in an HTML Document. For more information, see DHTML Behaviors.

The behaviors we'll look at in this article are all attached behaviors, so they will work in Internet Explorer 5.0 or later, and are implemented as HTML components, often referred to as HTC files. Because they are implemented as HTC files, they can be deployed on a server alongside the HTML files that use them, without any installation on the client machine. We will look at three behaviors: a highlighter, a sort function, and a column drag behavior. All three are written as HTML Component (HTC) files and therefore require no additional installation. They simply need to be placed on the server along with the HTML files. The files are published here, so you can take a close look at how they work (in any text editor), and modify them if you wish to change or add new functionality.

Note   These behaviors will work in Microsoft Internet Explorer for Windows version 5.0 or later. Because they are attached behaviors, when viewed in other browsers, users will see the original table displayed as it was authored, without the added dynamic functionality.

Highlighter

The first behavior we'll look at is the highlighter.

View the code.

View the sample.

First, run the qualhl.htm file and you'll see a standard table of data. Now mouse over some of the rows of data; the rows highlight, visually aligning the data on one row. Now click on the row; the clicked row remains highlighted in a different color.

Utilizing this behavior is simple. Here's the relevant code from the HTML file:

<TABLE style="behavior:url(tablehl.htc);" slcolor='#FFFFCC' hlcolor='#BEC5DE' >

The table tag includes a style that attaches the behavior by pointing to the tablehl.htc file, which adds the highlighting functionality. The behavior takes note of two attributes: the hlcolor, which defines the color of the mouseover highlighting, and the slcolor, which defines the color of the row selected by the mouse click. There is also an event that fires on the table called onrowselect when the mouse is clicked on a particular row. You can handle the event in your own script on the page if you wish.

I won't go into the details of how the behavior itself works, but if you take a look at the .htc file in any text editor, you can see that it changes the background color of the rows of the table appropriately through the use of runtimeStyle, and exposes the properties at the top of the file.

Sorter

The sorter behavior does something a little more interesting, as it allows sorting to take place on the head of the table, based on the column contents.

View the code.

View the sample.

By running the qualsort.htm, you can see that with this behavior attached to the table, clicking any column head in the table results in the content sorting accordingly. Attaching this behavior to the table is equally simple:

<TABLE style="behavior:url(sort.htc);" >

It does require that the table be well formed using THEAD to define the column head, and TBODY to contain the rest of the table data.

The behavior itself enacts a simple sort algorithm, but uses the DHTML Object Model to adjust the content of the HTML table to the appropriate order when a head is clicked. We also make use of some small image files to indicate at the top of the column the sort key and the direction of the sort.

This ability to sort data in tables is helpful in making sense of complex sets of statistics.

Drag

The third behavior I want to show here for tables is a little more fun.

View the code.

View the sample.

If you open qualdrag.htm, you will find that you can drag any of the heads to another column, thus rearranging the table.

Once again, attaching this behavior to a standard table that uses a THEAD and a TBODY is easy:

<TABLE style="behavior:url(sort.htc);" >

The behavior exposes a dragcolor attribute, so the color of the target can be specified.

Since an HTML table is laid out in row order, and not in column order, the manipulations of the content of the table are a little more complex in this behavior than with the sort functionality.

Together

Because these behaviors have been written as separate components, they can be combined on the same table by using the following syntax:

<TABLE style="behavior:url(dragdrop.htc) url(tablehl.htc) url(sort.htc);" >

View the sample.

This CSS syntax allows complimentary behaviors to be used on the same tag without separating out different elements. Further, if you are always going to use these behaviors together, we can combine their functionality into one single .htc file.

View the code.

View the sample.

If you open Qual.htm, you will find all three behaviors attached to the table.

Make Your Own Modifications

These behaviors, which came from an IE team demonstration, show the power of DHTML and attached behaviors, and are a great example of how you can add functionality to an ordinary HTML page and still have it display fine in older browsers. You are free to make use of these behaviors in your own pages, and I encourage you to make your own modifications as well. If you do make any interesting modifications, let me know at DHTMLDud@Microsoft.com. (Please understand, though, that I can't guarantee a response to every submission).

 


DHTML Dude

David Massy occasionally wears sun glasses and pretends to be a dude, but when the dark glasses are removed, he works as a technical evangelist on Windows and Internet Explorer technologies, which means he talks to customers of Microsoft about how they might best use the technologies. Before becoming a technical evangelist, Dave worked on the Internet Explorer team as a program manager. Since Dave is originally from England, he is valiantly struggling to educate his American colleagues on how to pronounce tomato correctly.

posted @ 2006-05-30 17:54 edsonjava 阅读(250) | 评论 (0)编辑 收藏
仅列出标题
共7页: 上一页 1 2 3 4 5 6 7 下一页