使用stat命令在shell中读取文件状态(修改时间,大小,权限模式,磁盘占用)

通常我们通过ls 命令显示文件信息,查看目录信息时,再加上参数 -d 。这没有错,看总觉得不方便,尤其是不能显示文件修改时间,访问时间什么的,时间一列显示有时并不方便阅读。这种情况下,你需要的是stat命令,尤其适合查阅单个文件信息。

尤其是,在编写shell脚本时,stat绝对比从ls里面截取方便得多,而且更高的自由度!

stat命令简单示例

列表出文件的一系列摘要信息:

[root@localhost ~]# stat install.log
  File: "install.log"
  Size: 7730            Blocks: 16         IO Block: 4096   普通文件
Device: fd00h/64768d    Inode: 1048578     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-10-20 10:21:05.473712000 +0800
Modify: 2015-10-20 10:23:50.061712001 +0800
Change: 2015-10-20 10:23:56.028712002 +0800
[root@localhost ~]#

很自然,它不包含任何文件内容,事实上该命令读不出文件内容,它也不会去读。

查看指定目录的stat

[root@localhost ~]# stat .
  File: "."
  Size: 4096            Blocks: 8          IO Block: 4096   目录
Device: fd00h/64768d    Inode: 1048577     Links: 5
Access: (0550/dr-xr-x---)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-10-27 13:35:30.473108443 +0800
Modify: 2015-10-21 18:54:30.420109149 +0800
Change: 2015-10-21 18:54:30.420109149 +0800
[root@localhost ~]#

玩点高级一点的

上次访问时间:

[root@localhost ~]# stat -c %x install.log
2015-10-20 10:21:05.473712000 +0800

文件大小

[root@localhost ~]# stat -c %s install.log
7730

同时并格式化输出多个参数

$ stat --printf="%n %X %s" plan.jpg
plan.jpg 1445912536 197196

更多使用方法,参考联机帮助或手册

联机帮助:

[root@localhost ~]# stat --help
用法:stat [选项]... 文件...
Display file or file system status.

-L, --dereference     follow links
-Z, --context         print the SELinux security context
-f, --file-system     display file system status instead of file status
-c --format=格式      使用指定输出格式代替默认值,每用一次指定格式换一新行
--printf=格式     类似 --format,但是会解释反斜杠转义符,不使用换行作
输出结尾。如果您仍希望使用换行,可以在格式中
加入"\n"
-t, --terse           使用简洁格式输出
--help            显示此帮助信息并退出
--version         显示版本信息并退出

有效的文件格式序列(不使用 --file-system):

%a    八进制权限
%A   用可读性较好的方式输出权限
%b   计算已分配块数(参见%B)
%B   以字节为单位输出%b 所报告的每个块的大小
%C   SELinux 安全环境字符串
%d    十进制设备编号
%D    十六进制设备编号
%f    十六进制原始模式
%F    文件类型
%g    文件的属组ID
%G    文件的属组组名
%h    硬链接数量
%i    Inode 编号
%n    文件名
%N    如果对象是一个符号链接,显示引用到的其它文件名
%o    I/O 块大小
%s    总计大小,以字节为单位
%t    十六进制主设备类型
%T    十六进制子设备类型
%u    文件的属主ID
%U    文件的属主用户名
%x    上次访问时间
%X    从UNIX 元年起计的上次访问时间
%y    上次修改时间
%Y    从UNIX 元年起计的上次修改时间
%z    上次更改时间
%Z    从UNIX 元年起计的上次更改时间

有效的文件系统格式序列:

%a    非超级用户可用的剩余块数
%b    文件系统的总数据块数
%c    文件系统中文件节点总数
%d    文件系统中空闲文件节点数
%f    文件系统中空闲块数
%C    SELinux 安全环境字符串
%i    十六进制文件系统ID
%I    允许的文件名最大长度
%n    文件名
%s    块大小(用于快速传输)
%S    基本块大小(用于块计数)
%t    十六进制类型描述
%T    可读性较好的类型描述

注意:您的shell 内含自己的stat 程序版本,它会覆盖这里所提及的相应
版本。请查阅您的shell 文档获知它所支持的选项。

请向bug-coreutils@gnu.org 报告stat 的错误
GNU coreutils 项目主页:<http://www.gnu.org/software/coreutils/>
GNU 软件一般性帮助:<http://www.gnu.org/gethelp/>
请向<http://translationproject.org/team/zh_CN.html> 报告stat 的翻译错误
要获取完整文档,请运行:info coreutils 'stat invocation'

linux下使用tar差异化备份目录

tar命令的参数 -g, 后面跟一个文件路径,就可在该文件里记录下差异化日志记录,每次备份时带上该参数及文件路径,即是差异备份。还原时,也应该带上这个参数,否则,每次差异备份时删除的文件将不会自动删除。

tar命令的参数 --exclude=,后面跟一个文件路径(支持通配符),指备份时忽略指定的文件(包括目录),如有多个忽略文件,那就加多次该参数,每次指定一个忽略目录。

tar命令的-p参数,指打包时保留文件权限

需要还原文件时,就按备份的次序依次执行-x解包时,记得要带上-g参数,别忘了后面的差异化日志记录文件,这样每次备份时删除的文件也会自动在还原的目标目录里删除;当然你想保留所有文件时另说。

 

linux下通过acl配置灵活目录文件权限(可用于ftp,web服务器的用户权限控制)

linux 本身的ugo rwx的权限,对于精确的权限控制很是力不从心的,acl是一个好东西,有了它可以很完美且优雅的控制目录权限。acl的基础知识,这里不再详述,有兴趣可以参看此文(通过实践学习linux ACL基本用法/Linux ACL 体验)

一个很可能遇到的实际问题:

linux下的web站点,该站点开启ftp上传下载;web与ftp以不同的用户运行,分别是web, ftp.

该目录 ./html 结构大致如下

(shell当前目录为/var/www/html, 下同)

$ls
drwxr-xr-x 2 root root 4.0K May  7 07:51 admin
drwxr-xr-x 2 root root 4.0K May  7 07:51 image
drwxr-xr-x 2 root root 4.0K May  7 07:51 lib
drwxrwxrwx 2 root root 4.0K May  7 07:51 upload
-rw-r--r-- 1 root root    0 May  7 07:52 index.php
-rw-r--r-- 1 root root    0 May  7 07:52 config.inc.php

为了web的安全其见,其中

upload目录为web后台上传文件的目录,权限为777;其它文件(目录)权限755(这里使用555也是可以的)

这样web是安全了,但问题也来了

ftp用户就没有写入权限了,将无法通过ftp修改web程序。

如果能实现以下这样的功能就好了:

web用户还是以上权限,不多赋权;但ftp用户可以对这里的所有目录、子目录(及其中文件)都有完全的权限

这种情况下,就要派acl上场了。

对于web用户的权限,保持不变。而针对ftp用户设置几条acl规则:

setfacl -R -m u:ftp:rwx .

大意是,对当前目录 . 递归设置acl规则 u:ftp:rwx ,
u:ftp:rwx这条规则是针对指定用户设定的(u);该用户名为ftp; 权限规则是rwx

翻译成人类语言就是说:给当前目录及其子目录、文件设置acl规则,让用户ftp拥有完全权限。

太简单了,这样就完成搞定了!

差不多了,不过这里还有一个问题,对于以后新建的目录里,ftp用户可能并没有rwx权限,这是为什么呢?因为对于新建目录,它并没有相应的acl规则,而是沿用022的默认umask, 结果就是新文件的755权限。

这里就要用默认acl来实现,简单说来,就是让新建的目录,都自动继承一个默认的acl规则,让ftp用户拥有rwx权限。

setfacl -R -d --set u:ftp:rwx .

还是一条设置acl的命令(setacl); -R 是递归执行,这很简单。重点在 -d --set u:ftp:rwx 上。 -d,指后面是一条default acl规则,规则是  --set u:ftp:rwx, 对当前目录 . 设置规则

用人类的语言讲,就是让所有新建目录都对ftp用户设置rwx的默认权限。

就这样,设置完了。相当简单吧?

回过头来,再看看上面对upload目录设置777的权限,似乎也不并不怎么完美,是不是也可能通过acl规则让web用户拥有rwx的权限?当然可以,其实更好,因为这里的文件是web用户自己创建的,里面的文件所有者应该是web用户,777权限似乎高了点;而且如果这是从其它服务器上迁移过来的站点的话,这些文件的所有者可能还会比较乱。

另外,默认acl,只对以后的新建目录有效,而对已有文件,它并不改变其acl,所以,要同时使用上面所述的两个命令,对已有文件(setfacl -R -m u:ftp:rwx .)和以后的新建目录(setfacl -R -d --set u:ftp:rwx .)设置acl.

上面的acl是针对一个用户web设定的,还可以对一个用户组来设置 g:group_name:rwx , 这样对多用户协作状态下会比较有用。

bash shell下按文件夹快速合并文件

要求:很N个文件夹,每个文件夹下都是N个文本文件,要把每个文件夹下文件合并成一个文件。

如果windows下,除非使用第三方工具,否则这是个无法想像的工作。更不要说使用文本编辑工具打开、然后手工拼合了。在linux下,简单的使用命令,那是一件相当优雅的事情:如下

$ for f in `ls`; do cd $f; cat `ls` >../${f}.txt ;cd .. ; done

(注:行首的美元符$是bash命令提示符)

这条命令执行完,就把每个文件夹下的文件合并起来,文件名就是 文件夹的名字+.txt

 

[转]Linux下使用sed编辑器详解

sed 编辑器是 Linux 系统管理员的工具包中最有用的资产之一,

因此,有必要彻底地了解其应用

Linux 操作系统最大的一个好处是它带有各种各样的实用工具。存在如此之多不同的实用工具,几乎不可能知道并了解所有这些工具。可以简化关键情况下操作的一个实用 工具是 sed。它是任何管理员的工具包中最强大的工具之一,并且可以证明它自己在关键情况下非常有价值。

sed 实用工具是一个“编辑器”,但它与其它大多数编辑器不同。除了不面向屏幕之外,它还是非交互式的。这意味着您必须将要对数据执行的命令插入到命令行或要处 理的脚本中。当显示它时,请忘记您在使用 Microsoft Word 或其它大多数编辑器时拥有的交互式编辑文件功能。sed 在一个文件(或文件集)中非交互式、并且不加询问地接收一系列的命令并执行它们。因而,它流经文本就如同水流经溪流一样,因而 sed 恰当地代表了流编辑器。它可以用来将所有出现的 "Mr. Smyth" 修改为 "Mr. Smith",或将 "tiger cub" 修改为 "wolf cub"。流编辑器非常适合于执行重复的编辑,这种重复编辑如果由人工完成将花费大量的时间。其参数可能和一次性使用一个简单的操作所需的参数一样有限, 或者和一个具有成千上万行要进行编辑修改的脚本文件一样复杂。sed 是 Linux 和 UNIX 工具箱中最有用的工具之一,且使用的参数非常少。

sed 的工作方式

sed 实用工具按顺序逐行将文件读入到内存中。然后,它执行为该行指定的所有操作,并在完成请求的修改之后将该行放回到内存中,以将其转储至终端。完成了这一行 上的所有操作之后,它读取文件的下一行,然后重复该过程直到它完成该文件。如同前面所提到的,默认输出是将每一行的内容输出到屏幕上。在这里,开始涉及到 两个重要的因素—首先,输出可以被重定向到另一文件中,以保存变化;第二,源文件(默认地)保持不被修改。sed 默认读取整个文件并对其中的每一行进行修改。不过,可以按需要将操作限制在指定的行上。

该实用工具的语法为:

sed [options] '{command}' [filename]

在这篇文章中,我们将浏览最常用的命令和选项,并演示它们如何工作,以及它们适于在何处使用。

替换命令

sed 实用工具以及其它任何类似的编辑器的最常用的命令之一是用一个值替换另一个值。用来实现这一目的的操作的命令部分语法是:

's/{old value}/{new value}/'

因而,下面演示了如何非常简单地将 "tiger" 修改为 "wolf":

$ echo The tiger cubs will meet on Tuesday after school | sed

's/tiger/wolf/'

The wolf cubs will meet on Tuesday after school

$

注意如果输入是源自之前的命令输出,则不需要指定文件名—同样的原则也适用于 awk、sort 和其它大多数 Linux\\UNIX 命令行实用工具程序。

多次修改

如果需要对同一文件或行作多次修改,可以有三种方法来实现它。第一种是使用 "-e" 选项,它通知程序使用了多条编辑命令。例如:

$ echo The tiger cubs will meet on Tuesday after school | sed -e '

s/tiger/wolf/' -e 's/after/before/'

The wolf cubs will meet on Tuesday before school

$

这是实现它的非常复杂的方法,因此 "-e" 选项不常被大范围使用。更好的方法是用分号来分隔命令:

$ echo The tiger cubs will meet on Tuesday after school | sed '

s/tiger/wolf/; s/after/before/'

The wolf cubs will meet on Tuesday before school

$

注意分号必须是紧跟斜线之后的下一个字符。如果两者之间有一个空格,操作将不能成功完成,并返回一条错误消息。这两种方法都很好,但许多管理员 更喜欢另一种方法。要注意的一个关键问题是,两个撇号 (' ') 之间的全部内容都被解释为 sed 命令。直到您输入了第二个撇号,读入这些命令的 shell 程序才会认为您完成了输入。这意味着可以在多行上输入命令—同时 Linux 将提示符从 PS1 变为一个延续提示符(通常为 ">")—直到输入了第二个撇号。一旦输入了第二个撇号,并且按下了 Enter 键,则处理就进行并产生相同的结果,如下所示:

$ echo The tiger cubs will meet on Tuesday after school | sed '

> s/tiger/wolf/

> s/after/before/'

The wolf cubs will meet on Tuesday before school

$

全局修改

让我们开始一次看似简单的编辑。假定在要修改的消息中出现了多次要修改的项目。默认方式下,结果可能和预期的有所不同,如下所示:

$ echo The tiger cubs will meet this Tuesday at the same time

as the meeting last Tuesday | sed 's/Tuesday/Thursday/'

The tiger cubs will meet this Thursday at the same time

as the meeting last Tuesday

$

与将出现的每个 "Tuesday" 修改为 "Thursday" 相反,sed 编辑器在找到一个要修改的项目并作了修改之后继续处理下一行,而不读整行。sed 命令功能大体上类似于替换命令,这意味着它们都处理每一行中出现的第一个选定序列。为了替换出现的每一个项目,在同一行中出现多个要替换的项目的情况下, 您必须指定在全局进行该操作:

$ echo The tiger cubs will meet this Tuesday at the same time

as the meeting last Tuesday | sed 's/Tuesday/Thursday/g'

The tiger cubs will meet this Thursday at the same time

as the meeting last Thursday

$

请记住不管您要查找的序列是否仅包含一个字符或词组,这种对全局化的要求都是必需的。

sed 还可以用来修改记录字段分隔符。例如,以下命令将把所有的 tab 修改为空格:

sed 's// /g'

其中,第一组斜线之间的项目是一个 tab,而第二组斜线之间的项目是一个空格。作为一条通用的规则,sed 可以用来将任意的可打印字符修改为任意其它的可打印字符。如果您想将不可打印字符修改为可打印字符—例如,铃铛修改为单词 "bell"—sed 不是适于完成这项工作的工具(但 tr 是)。

有时,您不想修改在一个文件中出现的所有指定项目。有时,您只想在满足某些条件时才作修改—例如,在与其它一些数据匹配之后才作修改。为了说明这一点,请考虑以下文本文件:

$ cat sample_one

one 1

two 1

three 1

one 1

two 1

two 1

three 1

$

假定希望用 "2" 来替换 "1",但仅在单词 "two" 之后才作替换,而不是每一行的所有位置。通过指定在给出替换命令之前必须存在一次匹配,可以实现这一点:

$ sed '/two/ s/1/2/' sample_one

one 1

two 2

three 1

one 1

two 2

two 2

three 1

$

现在,使其更加准确:

$ sed '

> /two/ s/1/2/

> /three/ s/1/3/' sample_one

one 1

two 2

three 3

one 1

two 2

two 2

three 3

$

请再次记住唯一改变了的是显示。如果您查看源文件,您将发现它始终保持不变。您必须将输出保存至另一个文件,以实现永久保存。值得重复的是,不 对源文件作修改实际是祸中有福—它让您能够对文件进行试验而不会造成任何实际的损害,直到让正确命令以您预期和希望的方式进行工作。

以下命令将修改后的输出保存至一个新的文件:

$ sed '

> /two/ s/1/2/

> /three/ s/1/3/' sample_one > sample_two

该输出文件将所有修改合并在其中,并且这些修改通常将在屏幕上显示。现在可以用 head、cat 或任意其它类似的实用工具来进行查看。

脚本文件

sed 工具允许您创建一个脚本文件,其中包含从该文件而不是在命令行进行处理的命令,并且 sed 工具通过 "-f" 选项来引用。通过创建一个脚本文件,您能够一次又一次地重复运行相同的操作,并指定比每次希望从命令行进行处理的操作详细得多的操作。

考虑以下脚本文件:

$ cat sedlist

/two/ s/1/2/

/three/ s/1/3/

$

现在可以在数据文件上使用脚本文件,获得和我们之前看到的相同的结果:

$ sed -f sedlist sample_one

one 1

two 2

three 3

one 1

two 2

two 2

three 3

$

注意当调用 "-f" 选项时,在源文件内或命令行中不使用撇号。脚本文件,也称为源文件,对于想重复多次的操作和从命令行运行可能出错的复杂命令很有价值。编辑源文件并修改一个字符比在命令行中重新输入一条多行的项目要容易得多。

  限制行

编辑器默认查看输入到流编辑器中的每一行,且默认在输入到流编辑器中的每一行上进行编辑。这可以通过在发出命令之前指定约束条件来进行修改。例如,只在此示例文件的输出的第 5 和第 6 行中用 "2" 来替换 "1",命令将为:

$ sed '5,6 s/1/2/' sample_one

one 1

two 1

three 1

one 1

two 2

two 2

three 1

$

在这种情况下,因为要修改的行是专门指定的,所以不需要替换命令。因此,您可以灵活地根据匹配准则(可以是行号或一种匹配模式)来选择要修改哪些行(从根本上限制修改)。

禁止显示

sed 默认将来自源文件的每一行显示到屏幕上(或重定向到一个文件中),而无论该行是否受到编辑操作的影响,"-n" 参数覆盖了这一操作。"-n" 覆盖了所有的显示,并且不显示任何一行,而无论它们是否被编辑操作修改。例如:

$ sed -n -f sedlist sample_one

$

$ sed -n -f sedlist sample_one > sample_two

$ cat sample_two

$

在第一个示例中,屏幕上不显示任何东西。在第二个示例中,不修改任何东西,因此不将任何东西写到新的文件中—它最后是空的。这不是否定了编辑的 全部目的吗?为什么这是有用的?它是有用的仅因为 "-n" 选项能够被一条显示命令 (-p) 覆盖。为了说明这一点,假定现在像下面这样对脚本文件进行了修改:

$ cat sedlist

/two/ s/1/2/p

/three/ s/1/3/p

$

然后下面是运行它的结果:

$ sed -n -f sedlist sample_one

two 2

three 3

two 2

two 2

three 3

$

保持不变的行全部不被显示。只有受到编辑操作影响的行被显示了。在这种方式下,可以仅取出这些行,进行修改,然后把它们放到一个单独的文件中:

$ sed -n -f sedlist sample_one > sample_two

$

$ cat sample_two

two 2

three 3

two 2

two 2

three 3

$

利用它的另一种方法是只显示一定数量的行。例如,只显示 2-6 行,同时不做其它的编辑修改:

$ sed -n '2,6p' sample_one

two 1

three 1

one 1

two 1

two 1

$

其它所有的行被忽略,只有 2-6 行作为输出显示。这是一项出色的功能,其它任何工具都不能容易地实现。Head 将显示一个文件的顶部,而 tail 将显示一个文件的底部,但 sed 允许从任意位置取出想要的任意内容。

删除行

用一个值替换另一个值远非流编辑器可以执行的唯一功能。它还具有许多的潜在功能,在我看来第二种最常用的功能是删除。删除与替换的工作方式相同,只是它删除指定的行(如果您想要删除一个单词而不是一行,不要考虑删除,而应考虑用空的内容来替换它—s/cat//)。

该命令的语法是:

'{what to find} d'

从 sample_one 文件中删除包含 "two" 的所有行:

$ sed '/two/ d' sample_one

one 1

three 1

one 1

three 1

$

*****************************************************************************

本文由正泰linux http://linux-down.kmip.net 搜集,整理,如需转载,请注明出处!

本站有大量的linux电子教程,软件,技术文档,欢迎大家访问!站长阿泰qq:253222170

******************************************************************************

从显示屏中删除前三行,而不管它们的内容是什么:

$ sed '1,3 d' sample_one

one 1

two 1

two 1

three 1

$

只显示剩下的行,前三行不在显示屏中出现。对于流编辑器,一般当它们涉及到全局表达式时,特别是应用于删除操作时,有几点要记住:

  上三角号 (^) 表示一行的开始,因此,如果 "two" 是该行的头三个字符,则

sed '/^two/ d' sample_one

将只删除该行。

美元符号 ($) 代表文件的结尾,或一行的结尾,因此,如果 "two" 是该行的最后三个字符,则

sed '/two$/ d' sample_one

将只删除该行。

将这两者结合在一起的结果:

sed '/^$/ d' {filename}

删除文件中的所有空白行。例如,以下命令将 "1" 替换为 "2",以及将 "1" 替换为 "3",并删除文件中所有尾随的空行:

$ sed '/two/ s/1/2/; /three/ s/1/3/; /^$/ d' sample_one

one 1

two 1

three 1

one 1

two 2

two 2

three 1

$

其通常的用途是删除一个标题。以下命令将删除文件中所有的行,从第一行直到第一个空行:

sed '1,/^$/ d' {filename}

添加和插入文本

可以结合使用 sed 和 "a" 选项将文本添加到一个文件的末尾。实现方法如下:

$ sed '$a\\

> This is where we stop\\

> the test' sample_one

one 1

two 1

three 1

one 1

two 1

two 1

three 1

This is where we stop

the test

$

在该命令中,美元符号 ($) 表示文本将被添加到文件的末尾。反斜线 (\\) 是必需的,它表示将插入一个回车符。如果它们被遗漏了,则将导致一个错误,显示该命令是错乱的;在任何要输入回车的地方您必须使用反斜线。

要将这些行添加到第 4 和第 5 个位置而不是末尾,则命令变为:

$ sed '3a\\

> This is where we stop\\

> the test' sample_one

one 1

two 1

three 1

This is where we stop

the test

one 1

two 1

two 1

three 1

$

这将文本添加到第 3 行之后。和几乎所有的编辑器一样,您可以选择插入而不是添加(如果您希望这样的话)。这两者的区别是添加跟在指定的行之后,而插入从指定的行开始。当用插入来代替添加时,只需用 "i" 来代替 "a",如下所示:

$ sed '3i\\

> This is where we stop\\

> the test' sample_one

one 1

two 1

This is where we stop

the test

three 1

one 1

two 1

two 1

three 1

$

新的文本出现在输出的中间位置,而处理通常在指定的操作执行以后继续进行。

读写文件

重定向输出的功能已经演示过了,但需要指出的是,在编辑命令运行期间可以同步地读入和写出文件。例如,执行替换,并将 1-3 行写到名称为 sample_three 的文件中:

$ sed '

> /two/ s/1/2/

> /three/ s/1/3/

> 1,3 w sample_three' sample_one

one 1

two 2

three 3

one 1

two 2

two 2

three 3

$

$ cat sample_three

one 1

two 2

three 3

$

由于为 w (write) 命令指定了 "1,3",所以只有指定的行被写到了新文件中。无论被写的是哪些行,所有的行都在默认输出中显示。

修改命令

除了替换项目之外,还可以将行从一个值修改为另一个值。要记住的是,替换是对字符逐个进行,而修改功能与删除类似,它影响整行:

$ sed '/two/ c\\

> We are no longer using two' sample_one

one 1

We are no longer using two

three 1

one 1

We are no longer using two

We are no longer using two

three 1

$

修改命令与替换的工作方式很相似,但在范围上要更大些—将一个项目完全替换为另一个项目,而无论字符内容或上下文。夸张一点讲,当使用替换时, 只有字符 "1" 被字符 "2" 替换,而当使用修改时,原来的整行将被修改。在两种情况下,要寻找的匹配条件都仅为 "two"。

修改全部但……

对于大多数 sed 命令,详细说明各种功能要进行何种修改。利用感叹号,可以在除指定位置之外的任何地方执行修改—与默认的操作完全相反。

例如,要删除包含单词 "two" 的所有行,操作为:

$ sed '/two/ d' sample_one

one 1

three 1

one 1

three 1

$

而要删除除包含单词 "two" 的行之外的所有行,则语法变为:

$ sed '/two/ !d' sample_one

two 1

two 1

two 1

$

如果您有一个文件包含一系列项目,并且想对文件中的每个项目执行一个操作,那么首先对那些项目进行一次智能扫描并考虑将要做什么是很重要的。为了使事情变得更简单,您可以将 sed 与任意迭代例程(for、while、until)结合来实现这一目的。

比如说,假定您有一个名为 "animals" 的文件,其中包含以下项目:

pig

horse

elephant

cow

dog

cat

您希望运行以下例程:

#mcd.ksh

for I in $*

do

echo Old McDonald had a $I

echo E-I, E-I-O

done

结果将为,每一行都显示在 "Old McDonald has a" 的末尾。虽然对于这些项目的大部分这是正确的,但对于 "elephant" 项目,它有语法错误,因为结果应当为 "an elephant" 而不是 "a elephant"。利用 sed,您可以在来自 shell 文件的输出中检查这种语法错误,并通过首先创建一个命令文件来即时地更正它们:

#sublist

/ a a/ s/ a / an /

/ a e/ s/ a / an /

/a i/ s / a / an /

/a o/ s/ a / an /

/a u/ s/ a / an /

然后执行以下过程:

$ sh mcd.ksh 'cat animals' | sed -f sublist

现在,在运行了 mcd 脚本之后,sed 将在输出中搜索单个字母 a (空格,"a",空格)之后紧跟了一个元音的任意位置。如果这种位置存在,它将把该序列修改为空格,"an",空格。这样就使问题更正后才显示在屏幕上, 并确保各处的编辑人员在晚上可以更容易地入睡。结果是:

Old McDonald had a pig

E-I, E-I-O

Old McDonald had a horse

E-I, E-I-O

Old McDonald had an elephant

E-I, E-I-O

Old McDonald had a cow

E-I, E-I-O

Old McDonald had a dog

E-I, E-I-O

Old McDonald had a cat

E-I, E-I-O

提前退出

sed 默认读取整个文件,并只在到达末尾时才停止。不过,您可以使用退出命令提前停止处理。只能指定一条退出命令,而处理将一直持续直到满足调用退出命令的条件。

例如,仅在文件的前五行上执行替换,然后退出:

$ sed '

> /two/ s/1/2/

> /three/ s/1/3/

> 5q' sample_one

one 1

two 2

three 3

one 1

two 2

$

在退出命令之前的项目可以是一个行号(如上所示),或者一条查找/匹配命令:

$ sed '

> /two/ s/1/2/

> /three/ s/1/3/

> /three/q' sample_one

one 1

two 2

three 3

$

您还可以使用退出命令来查看超过一定标准数目的行,并增加比 head 中的功能更强的功能。例如,head 命令允许您指定您想要查看一个文件的前多少行—默认数为 10,但可以使用从 1 到 99 的任意一个数字。如果您想查看一个文件的前 110 行,您用 head 不能实现这一目的,但用 sed 可以:

sed 110q filename
  处理问题

当使用 sed 时,要记住的重要事项是它的工作方式。它的工作方式是:读入一行,在该行上执行它已知要执行的所有任务,然后继续处理下一行。每一行都受给定的每一个编辑命令的影响。

如果您的操作顺序没有十分彻底地考虑清楚,那么这可能会很麻烦。例如,假定您需要将所有的 "two" 项目修改为 "three",然后将所有的 "three" 修改为 "four":

$ sed '

> /two/ s/two/three/

> /three/ s/three/four/' sample_one

one 1

four 1

four 1

one 1

four 1

four 1

four 1

$

最初读取的 "two" 被修改为 "three"。然后它满足为下一次编辑建立的准则,从而变为 "four"。最终的结果不是想要的结果—现在除了 "four" 没有别的项目了,而本来应该有 "three" 和 "four"。

当执行这种操作时,您必须非常用心地注意指定操作的方式,并按某种顺序来安排它们,使得操作之间不会互相影响。例如:

$ sed '

> /three/ s/three/four/

> /two/ s/two/three/' sample_one

one 1

three 1

four 1

one 1

three 1

three 1

four 1

$

这非常有效,因为 "three" 值在 "two" 变成 "three" 之前得到修改。

标签和注释

可以在 sed 脚本文件中放置标签,这样一旦文件变得庞大,可以更容易地说明正在发生的事情。存在各种各样与这些标签相关的命令,它们包括:

接下来的步骤

访问并收藏 Linux 技术中心

阅读 Dale Dougherty 和 Arnold Robbins 的著作 sed & awk, 2nd Edition (O'Reilly & Associates 出版社)。

: 冒号表示一个标签名称。例如:

:HERE

以冒号开始的标签可以由 "b" 和 "t" 命令处理。

b {label} 充当 "goto" 语句的作用,将处理发送至前面有一个冒号的标签。例如,

b HERE

将处理发送给行

:HERE

如果紧跟 b 之后没有指定任何标签,则处理转至脚本文件的末尾。

t {label} 只要自上次输入行或执行一次 "t" 命令以来进行了替换操作,就转至该标签。和 "b" 一样,如果没有给定标签名,则处理转至脚本文件的末尾。

# 符号作为一行的第一个字符将使整行被当作注释处理。注释行与标签不同,不能使用 b 或 t 命令来转到注释行上。

进一步的研究

sed 实用工具是 Linux 管理员拥有的最强大和灵活的工具之一。虽然本文覆盖了许多基础知识,但对于这一具有丰富功能的工具仅是蜻蜓点水。关于更多信息,最好的来源之一是 Dale Dougherty 和 Arnold Robbins 的著作 sed & awk,现在从 O'Reilly & Associates 出版社推出了其第二版(参加“接下来的步骤”)。该出版社还推出了一本可以随身携带的袖珍参考。

from http://www.linuxidc.com/Linux/2007-09/7688.htm

centos 6 linux下禁用触摸板(通过命令行实现)

禁用触摸板

synclient TouchpadOff=1

启用触摸板

synclient TouchpadOff=0

synclient 可以设置很多参数,查看如下

[feng@fsc ~]$ synclient -l
Parameter settings:
LeftEdge                = 1781
RightEdge               = 5579
TopEdge                 = 1646
BottomEdge              = 4582
FingerLow               = 24
FingerHigh              = 29
FingerPress             = 255
MaxTapTime              = 180
MaxTapMove              = 245
MaxDoubleTapTime        = 180
SingleTapTimeout        = 180
ClickTime               = 100
FastTaps                = 0
EmulateMidButtonTime    = 75
EmulateTwoFingerMinZ    = 280
EmulateTwoFingerMinW    = 6
VertScrollDelta         = 111
HorizScrollDelta        = 111
VertEdgeScroll          = 0
HorizEdgeScroll         = 0
CornerCoasting          = 0
VertTwoFingerScroll     = 1
HorizTwoFingerScroll    = 1
MinSpeed                = 0.4
MaxSpeed                = 0.7
AccelFactor             = 0.00896057
TrackstickSpeed         = 40
EdgeMotionMinZ          = 29
EdgeMotionMaxZ          = 159
EdgeMotionMinSpeed      = 1
EdgeMotionMaxSpeed      = 446
EdgeMotionUseAlways     = 0
UpDownScrolling         = 1
LeftRightScrolling      = 1
UpDownScrollRepeat      = 1
LeftRightScrollRepeat   = 1
ScrollButtonRepeat      = 100
TouchpadOff             = 0
GuestMouseOff           = 0
LockedDrags             = 0
LockedDragTimeout       = 5000
RTCornerButton          = 0
RBCornerButton          = 0
LTCornerButton          = 0
LBCornerButton          = 0
TapButton1              = 1
TapButton2              = 3
TapButton3              = 2
ClickFinger1            = 1
ClickFinger2            = 1
ClickFinger3            = 1
CircularScrolling       = 0
CircScrollDelta         = 0.1
CircScrollTrigger       = 0
CircularPad             = 0
PalmDetect              = 0
PalmMinWidth            = 9
PalmMinZ                = 199
CoastingSpeed           = 0
PressureMotionMinZ      = 29
PressureMotionMaxZ      = 159
PressureMotionMinFactor = 1
PressureMotionMaxFactor = 1
GrabEventDevice         = 1
TapAndDragGesture       = 1
AreaLeftEdge            = 0
AreaRightEdge           = 0
AreaTopEdge             = 0
AreaBottomEdge          = 0

方法参考于 http://forum.ubuntu.org.cn/viewtopic.php?t=240353

Linux From Scratch(LFS)编译耗费时间SBU

许多人都想知道编译和安装一个软件包预计需要多长时间。因为 Linux From Scratch 可以在多种不同的系统上创建,准确估计所需的时间是不可能的。2006年最快的系统上编译安装最大的软件包(Glibc)大约需要 20 分钟,但在很慢的系统上可能耗费长达三天时间。我们不提供准确时间,代之以标准编译时间单位(SBU)来度量。

SBU 度量具体说明如下,LFS中第一个编译的软件包是静态编译的 Binutils 。编译这个软件包所花费的时间就作为标准编译时间单位(SBU)。所有其它软件的编译时间都用这个时间来衡量。

例如,对于一个编译时间为 4.5 SBU 的软件包,这意味着如果一个系统静态编译安装 Binutils 需要花费 10 分钟,那么编译这个软件包将大约需要 45 分钟。幸运的是,大多数软件包编译安装所需的时间都比 Binutils 所需的时间要短。

SBU 并不十分精确,因为它依赖于许多因素,包括宿主系统 GCC 的版本。另外,在基于对称多处理器(SMP)的机器上,SBU 更加不准确。我们提供 SBU,仅仅是给出安装一个软件包所需时间的大概估计,在某些情况下实际花费的时间与预估计的时间之间可能有数十分钟的差异。

要查看在一些特定机器上的实际编译安装时间,我们推荐您查看 LinuxFromScratch SBU 的主页 http://www.linuxfromscratch.org/~bdubbs/

The LinuxFromScratch SBU Home Page

Chapter 5 Chapter 6
Name SBU
Average
SBU
Std Dev
Name SBU
Average
SBU
Std Dev
bunutils-pass-1 1.0 0.0 MAKEDEV 0.0 0.1
gcc-pass-1 5.6 5.3 kernel-headers 0.0 0.3
kernel-headers 0.1 0.5 man-pages 0.0 0.1
glibc 5.4 9.4 glibc 3.7 6.2
tcl 0.2 0.6 gcc 6.0 13.2
expect 0.1 0.2 coreutils 0.2 0.6
dejagnu 0.0 0.2 zlib 0.0 0.1
gcc-pass-2 3.9 6.3 lfs-utils 0.0 0.2
bunutils-pass-2 0.6 0.7 findutils 0.0 0.1
gawk 0.1 0.2 gawk 0.0 0.1
coreutils 0.4 0.5 ncurses 0.2 0.3
bzip2 0.0 0.1 vim 0.1 0.6
gzip 0.1 0.2 m4 0.0 0.1
diffutils 0.1 0.5 bison 0.1 0.3
findutils 0.1 0.2 less 0.0 0.1
make 0.1 0.4 groff 0.1 0.2
grep 0.1 0.4 sed 0.0 0.1
sed 0.1 0.5 flex 0.0 0.1
gettext 0.5 0.9 gettext 0.6 1.7
ncurses 0.3 0.4 net-tools 0.0 0.1
patch 0.0 0.2 inetutils 0.1 0.2
tar 0.1 0.3 perl 0.6 1.6
texinfo 0.1 0.2 texinfo 0.0 0.1
bash 0.2 0.3 autoconf 0.4 1.5
util-linux 0.0 0.3 automake 0.8 3.1
perl 0.4 0.6 bash 0.1 0.4
file 0.0 0.1
Chapter 8 libtool 0.2 0.8
kernel 0.3 1.1 bzip2 0.0 0.1
diffutils 0.0 0.1
ed 0.0 0.1
kbd 0.0 0.1
e2fsprogs 0.1 0.2
grep 0.0 0.1
grub 0.0 0.1
gzip 0.0 0.0
man 0.0 0.1
make 0.0 0.1
modutils 0.0 0.1
patch 0.0 0.1
procinfo 0.0 0.1
procps 0.0 0.1
psmisc 0.0 0.1
shadow 0.1 0.2
sysklogd 0.0 0.1
sysvinit 0.0 0.1
tar 0.1 0.5
util-linux 0.1 0.1
gcc-2.95.3 0.1 0.6
lfs-bootscripts 0.0 0.1

 

来源于网上资料汇总,主要参考以下

http://lamp.linux.gov.cn/Linux/LFS-6.2/chapter04/aboutsbus.html

http://www.linuxfromscratch.org/~bdubbs/

LFS-6.2中文文档 http://lamp.linux.gov.cn/Linux/LFS-6.2/index.html

Linux开机程序之研讨

我们所要讨论的
主题 , 就是 Linux 从开机的一瞬间到 login 为止 , 到底发生了什麽事情 ?

想必各位都知道 , 在刚开机时 , 由於 80x86 的特性 , CS ( Code Segment )
这个暂存器中全部都放著 1 , 而 IP ( Instruction Pointer ) 这个暂存器
中全部都放著 0 , 换句话说 , CS=FFFF 而 IP=0000 , 此时 , CPU 就依据
CS 及 IP 的值 , 到 FFFF0H 去执行那个地方所放的指令 . 这时候 , 由於
FFFF0H 已经到了高位址的顶端 , 所以 , FFFF0H 这个地方 , 总是会放一个
JMP 指令 , 跳到比较低的位址 . 接著 , ROM BIOS 就会作一些检查的动作
像记忆体 , 键盘 等...... 并在我们俗称的 UMB ( Upper Memory Block )
之中扫描 , 看看是否有合法的 ROM 存在 ( 比如 SCSI 卡上的 ROM ) .
假如有 , 就到里面去执行一些东西 , 执行完之後再继续刚才的行程 . 到了
最後 , 读取磁碟机上的第一个 sector . 在这里 , 我假设各位由硬碟启动
因此 , 就硬碟的构造而言 , 它的第一个 sector 称为 MBR ( Master Boot
Record ) . 因为一个 sector 是 512 bytes , 而 MBR 这 512 bytes 可分
为两个部份 , 第一个部份为 Pre-Boot 区 , 占了 446 bytes ; 第二部份
是 Partition Table , 占了 66 bytes . Pre-Boot 区的作用之一 , 就是
去看看那个 Partition 被标成 Active , 然後去读那个 Partition 的 Boot
区 .

在 Linux 的启动方面 , 一般人最常把 LILO 放在 MBR 或 Superblock
假如你把 LILO 放在 MBR , 那很明显的 , 当读取到 MBR 的时候 , LILO
就被执行 , 此时 , 你的萤幕上会出现  boot: 接著 , 就进行 Load Kernel
的动作 . 在另一方面来说 , 假如你把 LILO 安装在 Superblock , 通常你
还会有一个管理开机的程式 , 也许是住在 MBR ( 像 OSBS ) 或者是放在一
个单独的 Partition ( 像 OS/2 的 Boot Manager ) . 再由这个管理开机
的程式去读取 LILO , 进而做 Load Kernel 的动作 .

好了 , 到了目前为止 , 我们已经讲到 Load Kernel 的动作 . Kernel 被
load 到 memory 中之後 , 接著进行一连串 probe 周边的动作 , 像串联埠
并联埠 , 软碟 , 音效卡 , 硬碟 , 光碟机 等 ...... 接著 mount root
partition . 在这之後 , kernel 会起动 init 这个 process . init 这
个 process 的 PID 为 1 , 它是所有 process 的祖先 .

接下来呢 ? 系统就开始执行  /rc.d/rc.S  , 在这里 , 我们暂时打住 ,
先对大概的 initialization script 执行的顺序作一个浏览 , 请看下面
的流程 :

init[1]
rc.S   begin               <--- 目前我们已经讲到这里
rc.serial   begin
rc.serial   end
rc.S   end
init[1] enter runlevel 5
rc.M   begin
rc.inet1    begin
rc.inet1    end
rc.inet2    begin
rc.inet2    end
rc.font     begin
rc.font     end
rc.local    begin
rc.local    end
rc.M   end
login

上面的流程清楚的指出 , 在 rc.S 这个 shell script 中 , 会去执行 rc.serial
接著再执行 rc.M , rc.M 中又包含了 rc.inet1 , rc.inet2 , rc.font , rc.local
最後执行 login . 在下面的内容中 , 将为各位介绍这几个 shell script
从下面开始 , 凡是每一列之前有一个 # 的 , 为原来 shell script 中的注解
有两个 # 的 , 为笔者加上的注解 , 当然啦 , 没有任何 # 的为 shell script
的内容 , 而对命令或内容的解释 , 一律都写在命令或内容的前面 .
首先由 rc.S 开始 :

***************************** rc.S **********************************

#!/bin/sh
#
# /etc/rc
#
# These commands are executed at boot time by init(8).
# User customization should go in /etc/rc.local.

echo '======== rc.S is running !  System Initializing Now !!! ========'
PATH=/sbin:/usr/sbin:/bin:/usr/bin

## 打开所有 swap ! 下面 /sbin/swapon -a 的意思是 : 使得 /etc/fstab 中被记录
## 成 swap 的 device 全部启动 .

/sbin/swapon -a

## 喔 ! 下面这个指令 update 就很重要了 , 它负责每隔一段固定的时间 , 就将
## buffer 中的资料 , 利用 sync 写回磁碟机上 , 并将 superblock 做 update
## 的动作 . 使用 ps 这个指令看看有那些 process , 就可看到 update 还有一个
## bdflush , 这两个 process 都是必然要存在的 , 可不要随便砍掉 , 要不然 ,
## 万一系统 crash 了 , 那磁碟机里面的资料就不是最新的了 ......

/sbin/update &

## 利用 echo -n >> 制造一个档案 , 并用 rm -f 这个档案来测试 root partition
## 是不是 read-only 或者是可读写

READWRITE=no
if echo -n >> "Testing filesystem status"; then
rm -f "Testing filesystem status"
READWRITE=yes
fi

## 假如 root partition 是 read-only 就作 fsck 的动作 , 假如不是 read-only
## 而是 read-write 的话 , 就做下面 else 之後的动作

if [ ! $READWRITE = yes ]; then
## 利用 fsck 做检查及修复档案系统的工作 , 後面接的两个参数 -A , -a .
## -A 的意思是 : fsck 会依据 /etc/fstab 中的记录 , 去检查所有的档案
## 系统 ; 而 -a 就是 auto 的意思 , 当 fsck 有修复的动作时 , 它不会问
## 你问题 , 而直接修复 .

/sbin/fsck -A -a

## 假如 fsck 有 error , [ $? -gt 1 ] 括号里面的意思是 : 若上个命令的
## 传回值大於 1 , 而上个命令就是 fsck . 让我们看看 fsck 的传回值 :
##           0    - No errors
##           1    - File system errors corrected
##           2    - File system errors corrected, system should
##                  be rebooted if file system was mounted
##           4    - File system errors left uncorrected
##           8    - Operational error
##           16   - Usage or syntax error
##           128  - Shared library error
## 很明显的 , 若有任何错误产生的话 , 那 fsck 的传回值都大於 1 . 其实
## 就我的观点认为 , 应该写成 if [ $? -ge 1 ] 比较好 . 既然有错呢 , 系统
## 应该就要跳至单人模式 , 在单人模式中主要就是 /etc/rc.d/rc.K
## 中的两件事 : 关掉 swap 及 卸下所有的档案系统 , 而最後重新 login .
## 一般正常的情况下 ,  if 下面这一大段是不会执行的 , 而会跳至下面
## 标有 *************************  Normal 1  ************************* 处

if [ $? -gt 1 ] ; then
echo
echo
echo "**************************************"
echo "fsck returned error code - REBOOT NOW!"
echo "**************************************"
echo
echo
/bin/login
fi

## ******************************  Normal 1  **************************
## 当 fsck 检查没有错误之後 , 就把 root partition 重新 mount 上来
## 下面指令的参数有三个 , -w 代表mount 成可读写 , -n 代表把一个 file-
## system mount 上来 , 但不会把记录写到 /etc/mtab 中 , 在上次对 /etc/mtab
## 介绍时有提到 , 当我们使用 mount 这个指令把一个 filesystem mount 上来
## 的时候 , /etc/mtab 就会记录 ! 利用 -n 这个 option 可使得做 mount 的动
## 作 , 却不会记录 . -o 後面可以接许多的选项 , 在这里 , 我们给它的选项是
## remount . remount 的意思是 : 重新 mount 一个已经被 mount 的 filesystem
## 这个选项通常被用来改变该 filesystem 的读写旗号 ,尤其是把 filesystem
## 从 read-only 的状态 , 改变成 read-write 的状态 .

echo "Remounting root device with read-write enabled."
/sbin/mount -w -n -o remount /

## 在前面的情况中 , 都是 root partition 为 read-only 的状态下 , 所做的一些
## 工作 , 到了最後一个指令 /sbin/mount -w -n -o remount / , 才把 root
## partition mount 成 read-write . 各位有没有看到前面那行 :
## if [ ! $READWRITE = yes ]; then ..... 下面这个 else 就是与这个 if 对应
## 也就是说 , 前面那个 if 的区块中 , 所作的工作都是在 root partition 为
## read-only 的条件成立下所作的事 , 那很明显的 , 下面这个 else 就是 root
## partition 为 read-write 的条件下所作的工作 . 假如你的 root partition
## 为 read-writeable 的话 , 那麽系统就会显示下面的讯息 . cat << EOF 所作的
## 事 , 就是把 EOF 之前的讯息全部显示在萤幕上 :
## 我想 , 下面的讯息写得很明显了 , 它说 : 你的 root partition 被 mount 成
## read-write , 没有办法检查 , 要使检查的动作能够顺利的进行 , 你必须把
## root partition mount 成 read-only ! 那要怎麽做呢 ? 很容易 , 只要利用
## rdev -R /<your_kernel_name> 1  就可以了 .....
else
cat << EOF

*** Root partition has already been mounted read-write. Cannot check!
For filesystem checking to work properly, your system must initially mount
the root partition as read only. Please modify your kernel with 'rdev' so
that
it does this. If you're booting with LILO, type:
rdev -R /vmlinuz 1
(^^^^^^^^  ... or whatever your kernel name is.)

If you boot from a kernel on a floppy disk, put it in the drive and type:
rdev -R /dev/fd0 1

This will fix the problem *AND* eliminate this annoying message. :^)

EOF

## 下面这个指令没什麽好说的 , 就是暂停 10 秒钟 , 让 user 能够有充足的
## 时间看完上面的讯息

sleep 10
fi

## 删除 /etc/mtab  /etc/nologin  /etc/utmp

/bin/rm -f /etc/mtab* /etc/nologin /etc/utmp

## 制造 /etc/utmp , 这是一个很典型制造空档案的写法 . /dev/null 这个 node
## 蛮有趣的 , 在某一方面来说 , 它有点像是一个 " 黑洞 " . 怎麽说呢 ?
## 各位可以试试看下面的指令  ls >> /dev/null  , 当你使用这个指令之後会
## 发生什麽事呢 ? 什麽也没发生 , 而且 ls 的输出就好像被丢到黑洞里 , 无
## 影无踪了 . 那也许你会想 : 那这有什麽用 ? 我的回答是 : 的确没有什麽
## 很大的用处 , 但当你想抑制输出的讯息时 , 你就会用得到了 .

cat /dev/null >> /etc/utmp

## 依据 fstab ( filesystem table ) 中的描述 , 自动的挂上档案系统
## 但此时因为 TCP/IP 还没有设定 , 故不用 NFS

echo 'Mount Filesystem !!!'
/sbin/mount -avt nonfs

## 设定系统的时钟 . 下面这几行所做的事就是 : 看看 /sbin/clock 这个档案是
## 不是可执行的 , 假如可以执行 , 就把 CMOS 中的时间设定为系统的时间 .

if [ -x /sbin/clock ]; then
echo 'Set System Clock'
/sbin/clock -s
fi

## 下面的四行若没有 mark , 则每次开机 issue 及 motd 都会被改变 , 这应该
## 可算是 FAQ 级的问题了 ...... 因为我有自己设计的 issue 及 motd , 所以
## 下面的四行前面都有 # , 被当成注解 .
## 假如你要有自己的设定 , 下面一定都要 mark 起来

#echo > /etc/issue
#echo Welcome to Linux /bin/uname -a | /bin/cut -d\  -f3. >> /etc/issue
#echo >> /etc/issue
#echo "/bin/uname -a | /bin/cut -d\  -f1,3. (Posix)." > /etc/motd

## 接下来 , 将执行 rc.serial , 顾名思义 , rc.serial 是作串连埠设定的工作
## 在 rc.serial 中 , 内容虽然也是很简单 , 但并不像 rc.S 那样直接 . 换句话
## 说 , 读者至少要 " 稍微 " 懂一点 shell programming , 所以说呢 , 假如
## 还不会 shell programming 的读者呢 , 都应该赶快去找一本书来看一下 , 在
## 这篇文章的结尾 , 我会提出一些书单 , 各位可以去找找这几本书 ......

/bin/sh /etc/rc.d/rc.serial
echo '=================  rc.S is finish NOW !!!  ========================='

到了这里 , rc.S 的最後一步 , 是去执行 rc.serial . 大家可以看一看
/rc.d/rc.serial . 好像很长的样子 , 但实际上呢 , 各位必然发现到了 , 这个
shell script 大部份指令的前面都有一个 '#' 号 , 这代表著 , 这些指令完全
不会被执行 . 所以呢 , 真正有用的只不过寥寥十几行吧 ! 在另一方面来说 ,
假如你是用网路卡连上网路 , 那 rc.serial 对你并没有什麽大用处 .

****************************  rc.serial  ******************************

#!/bin/sh
#
# /etc/rc.serial
#       Initializes the serial ports on your system
#
#       Version 2.01

echo '======================= rc.serial is begin !!! ====================='
cd /dev

## 下面三行中的前两行是设定一些变数 , 由於在这个 shell script 中 , 须要
## 用到 /bin/setserial -b  这个指令 , 或是须要用到所有以 cua 开头的 node
## 的次数太多了 , 因此 , 把它们设定为一个变数 , 是一个不错的方法 . 尤其
## PORTS=`echo cua? cua??` 这是一个聪明的写法 , 那为什麽不写成 PORT=
## `echo cua*` 呢 ? 各位可以在 /dev 下分别使用这两个指令 , 观察输出到底
## 有什麽不同 ......

SETSERIAL="/bin/setserial -b"
PORTS=`echo cua? cua??`
echo -n "Configuring serial ports...."

## 下面这行 , 没有学过 shell programming 的人很可能会看不懂 , 不过没有
## 关系 , 这行中的 ${SETSERIAL} 会被换成 /bin/setserial -b , 而 ${PORTS}
## 会被换成 cua0 cua1 cua2 ....... cua31 , 所以整句翻译就是 :
## /bin/setserial -b -W cua0 cua1 cua2 cua3 cua4 cua5 cua6 ...... cua31
## 那这行指令到底在做什麽呢 ? 其实只是在做中断侦测的工作 .

${SETSERIAL} -W ${PORTS}

## 各位看到下面原来的注解了吧 . 当你有一些特殊的卡时 , 你可以把相对应部
## 份前面的 '#' 去掉 , 以便能做自动设定的工作 . 其实呢 , 这种情况实在
## 不多 , 大部份人的设备都差不了多少 , 说到关於串连埠 , 差异就更少了 .
#
# AUTOMATIC CONFIGURATION
#
# Uncomment the appropriate lines below to enable auto-configuration
# of a particular board.  Or comment them out to disable them....
#

## 好了 , 这下我们又多了一个变数 : AUTO_IRQ , 这在下面会用到 .

AUTO_IRQ=auto_irq

## 下面几行非常整齐 , 它们可以分别被换成 :
## /bin/setserial -b /dev/cua? auto_irq skip_test autoconfig
## setserial 说穿了也没什麽 , 这个指令可以让你对 serial port 做设定及回报
## 的动作 , 像 IRQ , I/O port 啦等等的事情 . 一般的情况下 , 大家的电脑中
## 通常只有 COM1-COM4 , 但假如你想增加新的 port , 那 setserial 就派上用
## 场了 .

# These are the standard COM1 through COM4 devices
#
# If you have an internal modeme with a Rockwell Chipset, add a "skip_test"
# to the /dev/cua3 line below.  (It's not added by default because it will
# screw up people with 8514 displays).
#
${SETSERIAL} /dev/cua0 ${AUTO_IRQ} skip_test autoconfig
${SETSERIAL} /dev/cua1 ${AUTO_IRQ} skip_test autoconfig
${SETSERIAL} /dev/cua2 ${AUTO_IRQ} skip_test autoconfig
${SETSERIAL} /dev/cua3 ${AUTO_IRQ} autoconfig

# These are for the first AST Fourport board (base address 0x1A0)
#
${SETSERIAL} /dev/cua4 ${AUTO_IRQ} autoconfig
${SETSERIAL} /dev/cua5 ${AUTO_IRQ} autoconfig
${SETSERIAL} /dev/cua6 ${AUTO_IRQ} autoconfig
${SETSERIAL} /dev/cua7 ${AUTO_IRQ} autoconfig

# These are for the second AST Fourport board (base address 0x2A0)
#
${SETSERIAL} /dev/cua8 ${AUTO_IRQ} autoconfig
${SETSERIAL} /dev/cua9 ${AUTO_IRQ} autoconfig
${SETSERIAL} /dev/cua10 ${AUTO_IRQ} autoconfig
${SETSERIAL} /dev/cua11 ${AUTO_IRQ} autoconfig

## 从这里以下 , 我省略了一大段 , 因为这一大段都是支援特殊的卡

# These are the 3rd and 4th ports on the Accent Async board.
#
#${SETSERIAL} /dev/cua12 ${AUTO_IRQ} autoconfig
#${SETSERIAL} /dev/cua13 ${AUTO_IRQ} autoconfig
#

.
.
.
.
.
.
.

## 好了 , 我们跳掉了一大段 , 直到这里 . 各位看到下面的注解了 .
## 假如你想用手动的方法指定 IRQ , I/O port , 及指定 chip 的型别
## 那你可以拿掉下面对应那行前面的 '#' 并作适当的修改 , 比如说
## 你用的是比较新的 16550 或 16550A , 而不是 16450 , 那你就可以
## 在下面用手动的方法指定 . 实际上 , 用 autoconfig 及 autoirq
## 的选项就可以了 , 没有必要用手动的方式 . 除非侦测不到 .

###############################################################
#
# MANUAL CONFIGURATION
#
# If you want to do manual configuration of one or more of your
# serial ports, uncomment and modify the relevant lines.
#
###############################################################

# These are the standard COM1 through COM4 devices
#
#${SETSERIAL} /dev/cua0 uart 16450 port 0x3F8 irq 4
#${SETSERIAL} /dev/cua1 uart 16450 port 0x2F8 irq 3
#${SETSERIAL} /dev/cua2 uart 16450 port 0x3E8 irq 4
#${SETSERIAL} /dev/cua3 uart 16450 port 0x2E8 irq 3

.
.
.
.
.
.
.
.

## Ok , 到此 , rc.S 及 rc.serial 已经结束 , 因为截稿时间的关系 , rc.M
## rc.inet1 , rc.inet2 , rc.font , rc.local 将在以後为各位介绍 .

echo "done."
${SETSERIAL} -bg ${PORTS}

echo ' ====================== rc.serial is complete !!! ==================='

* 关於 Shell Programming 的书单 :

Title: The Unix C Shell Field Guide
Authors: Gail Anderson and Paul Anderson
Publisher: Prentice Hall
Edition: 1986
ISBN: 0-13-937468-X

这本是 C-Shell 的 Bible , 想学 C-Shell 的人 , 可以去看这本书 .

Title: Unix Shell Programming
Authors: Stephen Kochan and Patrick Wood
Publisher: Hayden
Edition: 1990
ISBN: 0-672-48448-X

喔 ! 这本书以 Bourne Shell 为主 , 内容深入浅出 , 读者很容易就可以了解
这本书的内容 , 进而掌握 Bourne Shell 的精髓 . 此外 , 这本书也有提到
Korn Shell , 大体上来说 , 是一本值得看的好书 .

*如何连络作者 :

E-Mail Address : jhhsu@csie.nctu.edu.tw
u8217017@cc.nctu.edu.tw

Dormitory : 交通大学十舍 317R

..

Linux 开机程序之研讨
CCCA 资工86 许景华

---------------------------------------------------------------------------

在上次的介绍中 , 我们已经看完了 rc.S 及 rc.serial 这两个 shell script .
现在 , 我们将把剩下的 shell script 再作一个介绍 .
首先还是看看全部的流程 :

init[1]
rc.S   begin
rc.serial   begin
rc.serial   end
rc.S   end                  <-- 上一次我们说明到这里
init[1] enter runlevel 5
rc.M   begin
rc.inet1    begin
rc.inet1    end
rc.inet2    begin
rc.inet2    end
rc.font     begin
rc.font     end
rc.local    begin
rc.local    end
rc.M   end
login

这次主要的部份可分为两项 : 因为 init 将会去读取 inittab , 所以 inittab
将被列为第一部份的重点 , 而第二部份就是 rc.M , rc.font , rc.local
这几个 shell script 的说明 . ( rc.inet1 , rc.inet2 这两个关於网路的
shell script 将在以後单独说明 )
好了 , 我们先从 inittab 看起吧 ! 看看上面的流程 , 在第一行 : init[1]
也就是 init 这个 process 被启动之後 , 它会去读取 /etc/inittab 这个档案
以完成系统的启动 . 从这里 , 我们看到了 LINUX 的确融合了 SVR4 及 SunOS
的一些特性 , inittab 这个档案 , 在 SunOS 系统中是不存在的 , 但是它却是
SVR4 典型的档案 . init 这个 process 会依据 /etc/inittab 中所记载的内容
进入不同的 run-level 并启动不同的 process . 所以 inittab 的重要性
可见一斑 . 那什麽叫 run-level 呢 ? 所谓 run-level 就是系统中定义了许多
不同的 level , 而系统会随著 level 的不同而去启动不同的资源 .
现在就让我们来看一下 /etc/inittab 中的内容 :
在 /etc/inittab 这个档案中 , 每一列是一个进入点 , 假如我们仔细观察每一列
的话 , 那我们就会很容易的发现 , /etc/inittab 的每一列可以被 " : " 这个
字元分成好几个栏位 . 这几个栏位的格式如下 :

id:runlevels:action:process

而它们代表的意义分别如下 :

id : 由两个独特的字元所组成的辨示符号 , 在比较新的 UNIX 系统中 , 已不
受只能有两个字元的限制 .

runlevels : 指出下面一个栏位中的 action 以及 下下个栏位中的 process
会在那些 runlevel 中被执行 . 这一栏的合法值有 0,1,2...6
s 以及 S . 而在正常的启动程序之後 , Superuser 可以使用
telinit 这个指令来改变系统的 runlevel . 又因为在 LINUX 中
, runlevel 的预设值是 5 ( 等一下就会看到 ) 所以 , 只有
那些每一列中 runlevel 那栏有 5 这个值的 , 後面的 process
才会被启动 . 所以 , 我们就可以想像的到 : " 由於系统的
runlevel 不同 , 所起动的 process 也不尽相同 , 所以系统
起动的资源在每个不同的 runlevel 就会有差异存在 .

action : 这个栏位有一点复杂 , 在这个栏位中记录著 init 在启动相对应的
process 时 , 对 process 所采取的动作 , 而合法的动作有下面几项:

initdefault : 指出系统在启动时 , 预设进入的 run-level 值 ,
比如说 , 我们可以在 /etc/inittab 中找到下面这
一列 :  id:5:initdefault:
很明显的 , 系统将在启动时 , 进入 runlevel 为 5
的模式 . 当然 , 你可以把 5 改成 6 试试看 , 如
果你改成了 6 , 那将会执行 /etc/rc.d/rc.6 , 也
就是 run xdm . xdm 在以後有机会的话 , 将为各
位介绍 ......

sysinit : 在系统起动时 , 这个 process 会被执行 . 而所有 process
前的 action 中有 boot 及 bootwait 的 process , 必
须等到这些 action 为 sysinit 的 process 执行完之後
它们才能够执行 .

wait : 在起动一个 process 之後 , 若要再起动另一个 process , 则
必需等到这个 process 结束之後才能继续 .

respawn : 代表这个 process 即使在结束之後 , 也会重新被启动 ,
最典型的例子就是 getty ( 在 LINUX 中为 agetty ) .
看看下面的循环 :

--  getty --> login --> shell --> logout --
^                                          |
|------------------------------------------

即使在 getty 结束之後 , 它也会重新被启动 .

ctrlaltdel : 想必有人会以键盘上的 Ctrl , Alt , 及 Del 这三个
键来达到使系统 shutdown 的目的 , 现在我们果然在
/etc/inittab 中看到了这一列 :

ca::ctrlaltdel:/sbin/shutdown -t3 -rf now

所以说 , 当我们按下这三个键的时候 , init 会收到
SIGINT 这个 signal , 接著就执行 shutdown 的动作
不过 , 我们最好不要养成按 Ctrl-Alt-Del 来使系统
shutdown 的习惯 , 尤其在单人多工的作业系统 , 像
OS/2 , 甚至 Windows 95 , shutdown 几乎都是标准
的关机程序了 , 更何况是多人多工的 LINUX , 所以 ,
shutdown 这个指令是一定要熟悉的 .

除了上面的几个 action 之外 , 另外还有一些合法的 action , 但这
些 action 并不需要太注意 , 要用的时候再利用 man init 去查询就
可以了 .

process : 这一栏中可以是 shell script 或是可执行的程式 .

好了 , 当我们了解 /etc/inittab 中每一栏的意义之後 , 要看懂 /etc/inittab
就是一件轻松愉快的工作了 . 在 /etc/inittab 档中 , 我们可以看到下面这一段

c1:12345:respawn:/sbin/agetty 38400 tty1
c2:12345:respawn:/sbin/agetty 38400 tty2
c3:45:respawn:/sbin/agetty 38400 tty3
c4:45:respawn:/sbin/agetty 38400 tty4
c5:45:respawn:/sbin/agetty 38400 tty5
c6:456:respawn:/sbin/agetty 38400 tty6

简单来说 , 系统在起动之後会制造出六个虚拟的 console . 我想大家应该有试过
用 Ctrl-Alt + F1 - F6 可在这六个 console 之间切换 ; 若你使用 XWindows 时
想暂时回到 console 下时 , 可用 Ctrl-Alt + F1 - F6 这三个键来选择 , 若想
回到 XWindows 下时 , 只要以 Ctrl-Alt-F7 就可以回到 XWindows 下了 . 基本
上 , 对於 memory 比较少的人 , 可以不要开那麽多的虚拟 console , 那麽就可
以去掉上面的几列 . 还有 , 在前面我们也提过 , 可以把预设的 runlevel 从 5
改成 6 , 对於 beginner 来说 , 系统一启动完就直接进入 XWindows 也许是一个
不错的设定方法 ......

介绍完 /etc/inittab 之後 , 我们接著看 rc.M ! 由前面的流程当中 , 我们看到
rc.M 中又包含了四个 shell script , 其中 rc.inet1 及 rc.inet2 是有关於网路
的设定 ; rc.font 是作字型的设定 , 而 rc.local 中可以放一些想要起动的
daemon .

我们现在就来看看 rc.M , 依照往例 , 前面有两个 "#" 的为加上去的注解 .
只有一个 "#" 的为原来的注解 :

#!/bin/sh
#
# rc.M          This file is executed by init(8) when the system is being
#               initialized for one of the "multi user" run levels (i.e.
#               levels 1 through 6).  It usually does mounting of file
#               systems et al.
#
# Version:      @(#)/etc/rc.d/rc.M      2.02    02/26/93
#
# Author:       Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
#               Heavily modified by Patrick Volkerding <volkerdi@ftp.cdrom.com>
#

## 显示进入多人模式

echo "Going multiuser..."

## 下面一列的意思是 : 假如你在文字模式的 console 下 , 在15分钟内都没有动作
## 的话 , 萤幕就会自动暗下来 , 简单的说 , 就是 screen saver 的功能 .

/bin/setterm -blank 15

## 执行 crond 这个 daemon . 不用说 , crond 在系统中扮演了很重要的角色 ,
## 它负责每过一段时间後 , 就去看看 /var/spool/cron/crontabs 中有那些 file
## 要 run , 这些 file 往往有一个固定的时间 , 比如说 : 每个月的 1 号 , 每
## 天凌晨等 ...... 我们可以用平常的编辑器编好一个档案 , 里面的格式如下 :
##
##                    分 时 日 月 星期 命令
## 举例来说 ,         59 23 31 12  *   /etc/wall happy_new_year
## 在每年的 12 月 31 号晚上 11 点 59 分 会对每个系统上的 user 送出
## happy_new_year 中的内容
##
## 接著我们可以利用 crontab <档案名> 这个指令来把此档案放到
## /var/spool/cron/crontabs中□. 我们可以看看 /var/spool/cron/crontab 下
## 有一个 root 的档案 , 看看里面的内容 :
##
##   0,5,10,15,20,25,30,35,40,45,50,55 * * * *       /usr/lib/atrun
##
## 所以各位看到了 , 在前两期提到的 at 命令是五分钟才被 run 一次的
##
## 再举一个简单的例子好了 : 我们先用一般的文书编辑器造出一个名为 crontest
## 的档案 , 内容如下 :
##
##   5 * * * * ls -la ~/ >> ~/hehehaha
##
## 接著 , 我们键入下面的命令 :  crontab crontest
## 此时 , 从内容得知 , 每五分钟 crond 就会执行 ls -la , 把你 home directory
## 的内容加入 hehehaha 这个档案中 .
##
## 当然啦 ! 这个例子简直是毫无意义可言 :)  但是 , 大家既然知道了基本原理 ,
## 利用 crontab , at 这些指令 , 就可以简化一些系统管理的动作 , 同时在执行
## 一些工作时 , 也会比较有弹性 .

/usr/sbin/crond -l10 >>/var/adm/cron 2>&1

## 假如 /etc/HOSTNAME 不能读取的话 , 就把 darkstar.frop.org 当成 HOSTNAME
## 中的内容 . 老实说 , 下面这三列去掉也不打紧 ......

if [ ! -r /etc/HOSTNAME ]; then
echo "darkstar.frop.org" > /etc/HOSTNAME
fi

## 下面从 if 到 fi 夹起来的部份 , 主要就是在执行 rc.inet1 , rc.inet2 . 这
## 些都是网路设定的工作 , 尤其是 rc.inet2 , 启动了一大堆 daemon , 这部份
## 要牵扯到的东西太多了 . 像 subnet 与 netmask 等 ...... 类似这种观念 ,
## 都不是三言两语就可以玩完的 , 所以就留待以後再说 .

if [ -x /etc/rc.d/rc.inet1 ];
then
/bin/hostname `cat /etc/HOSTNAME | cut -f1 -d .`
/bin/sh /etc/rc.d/rc.inet1
/bin/sh /etc/rc.d/rc.inet2
else
/sbin/hostname_notcp `cat /etc/HOSTNAME | cut -f1 -d .`
/usr/sbin/syslogd
/usr/sbin/klogd
/usr/sbin/lpd
fi

## 在某些资源独占的情况下 , 一些应用程式往往会制造出 lock 档 . 假如这些
## lock 档在重新开机以後还是存在的话 , 那就很不好了 . 所以 , 下面就是在
## 作这些删除 lock 档的动作 , 并把一些输出的讯息丢到 /dev/null 去 .
## 在上一期的内容中 , 我们就有提到 /dev/null 了 , 也有提到抑制讯息输出的
## 方法 . 现在我们果然看到了一个实例 ......

/bin/rm -f /var/spool/locks/* /var/spool/uucp/LCK..* /tmp/.X*lock 1> /dev/null 2> /dev/null

## 假如你有玩 hunt 这个 game 的话 , 那在 /tmp 下会有一个 socket 型态的档案
## 我们要把它删除之後才能开始另一个 game ......

if [ -r /tmp/hunt -o -r /tmp/hunt.stats ]; then
echo "Removing your stale hunt sockets from /tmp..."
/bin/rm -f /tmp/hunt*
fi

## 设定 share library 的 link 及 cache . 这个指令只有 Superuser 才能使用
## 的 , 它也相当的重要 . 万一你的 /etc/ld.so.cache 很不幸的 corrupt 了 ,
## 那我们也可以利用这个指令来让它重新 link , 先删除 /etc/ld.so.cache ,
## 再以 ldconfig -v 重新制造就可以了 .

/sbin/ldconfig

## 起动 sendmail daemon , 并且让它 15 分钟就去看一看 spool , 处理收发信件

if [ -x /usr/sbin/sendmail ]; then
echo "Starting sendmail daemon (/usr/sbin/sendmail -bd -q 15m)..."
/usr/sbin/sendmail -bd -q 15m
fi

## 假如 /etc/rc.d/rc.font 是可读的话 , 就执行 rc.font 这个 shell script ,
## 而这个 shell script 主要是设定 text mode 下萤幕的字型

if [ -r /etc/rc.d/rc.font ]; then
/etc/rc.d/rc.font
fi

## 在系统管理中 , 我们常常把一些 local 的东西另外放在一个地方 , 这样才不
## 会与原来的东西混淆 . 同时 , 因为 local 的东西更新版本的速度总是也比较
## 快 , 在这种情况下 , 常常会变动的东西也可以放在 local 的区域中 , 这样
## 管理起来比较方便 . 也许各位也注意到了 : 为什麽会有 /usr/bin 及
## /usr/local/bin 之分 . 就个人认为 , 像自己 compile 出来的东西 , 假如
## 觉得还不错 , 就可以把它放在 /usr/local/bin , 因为它是新增的 , 所以我
## 把它放在 /usr/local/bin . 当然啦 , 这只是个人喜好罢了 , 你要放那里
## 都是可以的 , 只要找得到 , 易於使用及管理就好 .
## 同样的 , 若我们要起动一些新增的 daemon 或 shell script , 那放在
## 是不错的选择 .
## 下面一列就是去执行 rc.local 中的设定 , 通常是一些 daemon 或是 shell
## script

/etc/rc.d/rc.local

# All done.

到这里 , rc.M 已经结束了 , 我们来看看从 rc.M 之中执行的 rc.font 及

rc.local ......

下面是 rc.font 的内容 :

#!/bin/sh
#
# This selects your default screen font from among the ones in
# /usr/lib/kbd/consolefonts.
#

## 我想下面这一列的命令非常明显了 , 就是设定 console 中的字型 , 你可以
## 改成自己喜欢的字 . 或者你也可以利用 fontconfig 这个指令来改变 .

setfont /usr/lib/kbd/consolefonts/default8x16

看完了 rc.font 後 , 我们来看看 rc.local 的内容 . 我所要说的是 : rc.local

毕竟是自己设定的区域 , 所以每个人的可能都不一样 , 就我而言 , 因为我多 run

了一些 daemon , 所以与大家的可能不太相同 . 所以 , rc.local 作参考就可以了.

下面是我的 rc.local :

#! /bin/sh
# Put any local setup commands in here
# Running selection

## lpd 是控制印表机的 daemon , 要想在 LINUX 下用印表机 , 这个 daemon 必需
## 要被起动 , 此外还要修改 /etc/printcap . 详细的情况要去看 PRINT-HOWTO

echo -n "lpd"
/etc/lpd

## httpd 就是 WWW server 的 daemon . 想必大家都用过 Mosaic , Netscape 等
## 的浏览器 . 但假如我们想建立自己的 WWW server , httpd 必须要执行 .

echo -n " httpd"
/usr/local/etc/httpd/src/httpd

## 在 WWW 的时代还没来临以前 , gopher 可说是具有最方便的资料索引功能 , 即使
## 到了现在 , gopher 仍然占有一席之地 , 在这里 , 因为我有建立自己的 gopher
## server , 所以 gopherd 必需被起动 .

echo -n " gopherd"
/usr/local/sbin/gopherd -u nobody

## 下面这个指令是 mouse 在 console 下做 cut & paste

echo -n "Running selection..."
selection -t ms &
echo '                                                                  '

..

 

----------好像也是比较老的文章,值得参考;整理于网络,没有完整的文章--------------

thinkpad t420s安装无线网卡驱动手记

核心内容:

安装无线网卡驱动(新版本的linux内核里驱动一般是比较全的),并安装 linux-firmware,这个包好像不能从内核源码里安装。

-----------------------------

折腾了一周,就在刚刚5分钟前,终于成功的把无线网卡的驱动装好!

问题是这样的:

两个月前下血本买了台港版thinkpad t420s,安装了fedora 15,硬件支持倒算是比较完善,毕竟fedora是号称“自由. 友爱. 杰出. 前卫”的一个linux发行版。用了一段时间,gnome 3很炫,反应稍微有点迟钝,系统不是很稳定,死过几次,桌面完全停止响应,连ctrl+alt+fn都没反应,除了鼠标还可以在画面上正常移动。 于是准备换个发行版,考虑到一直学习redhat系列,时值centos 6正式发布,于是换用;期间也在考虑了debian。

centos6 的软件确实比较老旧,内核2.6.32,这个内核对OEM版ati显卡的旧笔记本的支持相当不好,花屏,连纯字符下都花屏。感觉升级内核有可能解决问题,但不想自己编译内核,怕白白浪费时间,直接使用fedora14的最新update内核,到国内的镜像站点上下载rpm包,安装,主要kernel-***的几个包,如kernel-2.6.35.13-92.fc14.i686.rpm, kernel-devel-2.6.35.13-92.fc14.i686.rpm等,安装后,重启机器,开机过程是的画面已经上正常分辨率了,开机后有线网卡正常工作,但无线网卡不行,ifconfig显示没有wlan0,那肯定还是驱动的问题了,于是换用fedora15的内核升级,还不行,横下心自己编译内核,照样不行。

另外一个分区里安装了debian6.0.2,情况与初始安装的centos6几乎完全一样,使用自己编译的内核,也一样。

于是查看dmesg的信息,里面有一行

rtlwifi: wireless switch is off

以为有问题,对照另一个分区的fedora15x64,好像也有这样的一行,大概问题不是出在这里。昨天夜里到几个论坛发帖子提问,oschina,csdn,chinaunix. 今天收到oschina里的一条回复,说是rtl8192网卡,驱动问题,要安装驱动。csdn里一天没人回;chinaunix最狠,发问的帖子都被獾狸猿删除了,感觉不可理解,或许是问题太低级了。

晚上回来继续研究,仔细看dmesg消息;强制移除rtl8192ce模块,再载入;Google;.....

突然看到一条消息

[   64.794644] rtl8192ce:rtl92c_download_fw():<0-0> Failed to request firmware!

Failed to request firmware,想起linux内核编译make help里有个make firmware_install的,于是安装,只是安装信息显示只有那么几行,好像没有安装多少东西,重启,结果是没有什么用。

联想到安装fedora内核时,有个firemware的软件包,似乎升级安装过,是否是它的问题,查看

[root@fsc rpm]# rpm -q linux-firmware
linux-firmware-20100806-4.fc14.noarch

应该是安装fedora14内核时下载安装了,但fedora15下的该包没有装,于是到中科大镜像上下载linux-firmware-20110601-1.fc15.noarch(以前都用163的源,前几天搞debian时,才发现没想到中科大的镜像电信访问速度也非常快,打开目录比163快N倍!)升级安装。点了一下面板上的网络图标,自然还是没有无线,明知没用还是随手点了一下。是否需要重启机器才能生效呢? 先不重启,重新加载模块试试。

[root@fsc rpm]# rmmod rtl8192ce
[root@fsc rpm]# modprobe rtl8192ce

满心激动的去点面板网络图标,不知道结果会怎么样。

结果是振奋人心的,无线网络出来了,看到了好几个接入点!抓张图留做记念