第九章 Linux管理任务

    主要内容

          1.用户和组的管理

          2.软件包管理

          3.系统引导

          4.内核重编译与模块

          5.系统紧急修复 9.1 用户和组的管理 一、用户和组的概念 1.用户(user)的概念

    Linux是真正意义上的多用户操作系统,所以我们能在Linux系统中建若干用户(user)。Linux中的用户分为三种,一种是普通用户。比如一台Linux的机器有很多人使用,一般不应该让所有的人使用同一个用户登录,因为每个用户可能有不想让别人看到的隐私内容,例如,资料和信息,这时应该为每位使用者建立独立的用户名,让每个用户使用自己的用户名登录,这从计算机安全角度来说是符合操作规则的。

    另外,在Linux系统中还有一些用户是用来完成特定任务的,比如nobody和ftp等,比如一台Web服务器,别人连接上来访问网站,就是nobody用户。我们匿名访问ftp时,会用到用户ftp或anonymous。

    第三种用户就是系统管理员。在Linux操作系统中,系统管理员的用户名为root,它的权限是最高的,也被称为超级权限的拥有者。普通用户无法执行的操作,root用户都能完成,所以也被称之为超级管理用户。

    2.组(group)的概念

    组(group)就是具有相同特征的用户(user)的集合体。比如有时我们要让多个用户具有相同的权限,比如查看、修改某一文件或执行某个命令,这时我们需要组,我们把用户都定义到同一组中,通过修改文件或目录的权限,让组具有一定的操作权限,这样组下的用户对该文件或目录都具有相同的权限,这就是通过定义组和修改文件的权限来实现的。

    举例:我们为了让一些用户有权限查看某一文档,比如是一个时间表,而编写时间表的人要具有读写执行的权限,我们想让一些用户知道这个时间表的内容,而不让他们修改,所以我们可以把这些用户都划到一个组,然后来修改这个文件的权限,让组可读,这样组中的每个用户都是可读的。

    3.用户和组的关系

    用户和组的对应关系是:一对一、多对一、一对多或多对多。

    一对一:某个用户可以是某个组的唯一成员。

    多对一:多个用户可以是某个唯一的组的成员,不归属其他组。比如tux1和tux2两个用户只归属于tux1组。

    一对多:某个用户可以是多个组的成员。比如tux1可以是root组成员,也可以是tux2组成员,还可以是adm组成员。

    多对多:多个用户对应多个组,并且几个用户可以是归属相同的组。其实多对多的关系是前面三条的扩展。

    一个用户可以属于一个组,也可以属于多个组。但每一个用户都至少要属于一个组,这个组叫做该用户的主要组(Primary Group),简称主组。一个用户如果还属于其他的组,那么这些组构成该用户的组集合(Group Set)。一个用户的组集合可能为空,但主要组一定会有,并且其中只有一个组。

    对于判断用户访问权限来说,用户的主要组和组集合没有什么区别。它们的区别在于用户创建文件和目录时,被创建的文件和目录的所有者为创建者,因为一个文件只能属于一个组,故文件所在的组为创建者的主要组。 二、用户和组相关的配置文件和目录 1.与用户相关的配置文件

    与用户相关的系统配置文件主要有/etc/passwd和/etc/shadow,其中/etc/shadow是用户信息的加密文件,比如用户口令的加密保存等。/etc/passwd和/etc/shadow文件是互补的。我们可以通过对比两个文件来查看它们的关系。

    /etc/passwd是系统识别用户的一个文件,打个比方,/etc/passwd是一个花名册,系统所有的用户都在这里有登录记载。当我们以tux1这个帐号登录时,系统首先会查阅/etc/passwd文件,看是否有tux1这个帐号,然后确定tux1的UID,通过UID来确认用户和身份,如果存在则读取/etc/shadow影子文件中所对应的tux1的密码。如果密码核实无误则登录系统,读取用户的配置文件。该文件的权限一般为:

    -r—r—r—1 root root 1024 10月1609:49/etc/passwd

    在/etc/passwd中,每一行都表示的是一个用户的信息。一行有7个段位。每个段位用冒号“:”分隔,比如下面二行:

    tux1:x:500:500:Mr.Tux1:/home/tux1:/bin/bash

    tux2:x:501:501::/home/tux2:/bin/bash

    第一字段:用户名(也被称为登录名)。在上面的例子中,我们看到这两个用户的用户名分别是tux1和tux2。

    第二字段:口令。在例子中我们看到的是一个x,其实密码已被映射到/etc/shadow文件中。

    第三字段:UID。用户的数字ID。

    第四字段:GID。用户主要组的组ID。

    第五字段:用户名全称,这是可选的,可以不设置,在tux1这个用户中,用户的全称是Mr.tux1。而tux2这个用户没有设置全称。

    第六字段:用户的主目录所在位置。tux1这个用户是/home/tux1,而tux2这个用户是/home/tux2。

    第七字段:用户所用SHELL的类型,tux1和tux2都用的是bash。所以设置为/bin/bash。

    UID是用户的ID值,在系统中每个用户的UID的值是唯一的,更确切的说每个用户都要对应一个唯一的UID,系统管理员应该确保这一规则。系统用户的UID的值从0开始,是一个正整数,至于最大值可以在/etc/login.defs可以查到,一般Linux发行版约定为60000。在Linux中,root的UID是0,拥有系统最高权限。

    UID是确认用户权限的标识,用户登录系统所处的角色是通过UID来实现的,而非用户名。UID在系统中具有唯一性,作为系统管理员应该确保这一标准,UID的唯一性关系到系统的安全,应该值得我们关注!比如在/etc/passwd中把tux1的UID改为0后,设想会发生什么呢?tux1这个用户会被确认为root用户。tux1这个帐号可以进行所有root的操作。

    一般情况下,每个Linux的发行版都会预留一定的UID和GID给系统虚拟用户占用,虚拟用户一般是系统安装时就有的,是为了完成系统任务所必需的用户,但虚拟用户是不能登录系统的,比如ftp、nobody、adm、rpm、bin、shutdown等。

    在Fedora系统会把前499个UID和GID预留出来,我们添加新用户时的UID是从500开始的,GID也是从500开始,至于其他系统,有的系统可能会把前999的UID和GID预留出来。以各个系统中/etc/login.defs中的UID_MIN的最小值为准。Fedora系统login.defs的UID_MIN为500,而UID_MAX值为60000,也就是说我们通过adduser默认添加的用户的UID的值在500~60000之间。而Slackware通过adduser不指定UID来添加用户,默认UID是从1000开始。

    /etc/shadow文件是/etc/passwd的影子文件,这个文件并不由/etc/passwd而产生,这两个文件应该是对应互补的。shadow内容包括用户及被加密的密码以及其他/ etc/passwd不能包括的信息,比如用户的有效期限等。这个文件只有root权限可以读取和操作,权限如下:

    -r————1 root root 1.5K 10月1609:49/etc/shadow

    /etc/shadow的权限不能随便改为其他用户可读,这样做是危险的。如果您发现这个文件的权限变成了其他组或用户可读了,要进行检查,以防系统安全问题的发生。如果我们以普通用户查看这个文件时,应该什么也查看不到,提示是权限不够:

    /etc/shadow文件的内容包括9个段位,每个段位之间用冒号“:”分隔。例如:

    tux1img901img91VE.Mq2 Xfimg922c9Qi7EQ9JP8GKF8gH7PB1:13072:0:99999:7:::

    tux2img93img941img95IPDvUhXP 8R6J/VtPXvLyXxhLWPrnt/:13072:0:99999:7::13150:

    第一字段:用户名(也被称为登录名),在/etc/shadow中,用户名和/etc/passwd是相同的,这样就把passwd和shadow中用的用户记录联系在一起。这个字段是非空的。在本例中有两条记录,表示有两个用户tux1和tux2。

    第二字段:密码(已被加密),如果是有些用户在这段是x,表示这个用户不能登录到系统,也可以看作是虚拟用户。这个字段是非空的。

    第三字段:上次修改口令的时间。这个时间是从1970年1月1日算起到最近一次修改口令的时间间隔(天数),可以通过passwd来修改用户的密码,然后查看/etc/ shadow中此字段的变化。上面的例子能说明tux1和tux2这两个用户,是在同一天更改了用户密码,更改密码的时间距1970年1月1日为13072天。

    第四字段:两次修改口令间隔最少的天数,也就是说用户必须经过多少天才能修改其口令。如果设置为0,则禁用此功能。此项功能用处不是太大。默认值是通过/ etc/login.defs文件定义中获取,PASS_MIN_DAYS中有定义。上例中设置为0。

    第五字段:两次修改口令间隔最多的天数。这个能增强管理员管理用户口令的时效性,应该说增强了系统的安全性。如果是系统默认值,是在添加用户时从/etc/login.defs文件定义中获取,在PASS_MAX_DAYS中定义。在本例中都是99 999天。

    第六字段:提前多少天警告用户口令将过期。当用户登录系统后,系统登录程序提醒用户口令将要作废。如果是系统默认值,是在添加用户时从/etc/login.defs文件定义中获取,在PASS_WARN_AGE中定义。在本例中的值是7,表示在用户口令将过期的前7天警告用户更改过期口令。

    第七字段:在口令过期之后多少天禁用此用户。此字段表示用户口令作废多少天后,系统会禁用此用户,也就是说系统会不能再让此用户登录,也不会提示用户过期,是完全禁用。在本例中,两个用户的此字段都是空的,表示禁用这个功能。

    第八字段:用户过期日期。此字段指定了用户作废的天数(从1970年的1月1日开始的天数),如果这个字段的值为空,帐号永久可用。在例子中,我们看到tux1这个用户在此字段是空的,表示此用户永久可用。而tux2这个用户表示在距1970年1月1日后13 150天后过期,算起来也就是2006年1月1日过期。

    第九字段:保留字段,目前为空,以备将来Linux发展之用。

    2.与组相关的配置文件

    组(Group)配置文件主要有/etc/group和/etc/gshadow,其中/etc/gshadow是/ etc/group的加密信息文件。

    /etc/group文件是组的配置文件,内容包括用户和组,并且能显示出用户是归属哪个组或哪几个组,因为一个用户可以归属一个或多个不同的组。同一组的用户之间具有相似的特征。比如我们把某一用户加入到root组,那么这个用户就可以浏览root用户主目录的文件,如果root用户把某个文件的读写执行权限开放,root组的所有用户都可以修改此文件,如果是可执行的文件(比如脚本),root组的用户也是可以执行的。组的特性在系统管理中为系统管理员提供了极大的方便,但安全性也是值得关注的,如某个用户下有对系统管理有最重要的内容,最好让用户拥有独立的组,或者是把用户下的文件的权限设置为完全私有。另外root组一般不要轻易把普通用户加入进去。

    /etc/group的内容包括组名、组口令、GID及该组所包含的用户(user),每个组一条记录。格式如下:

    group_name:passwd:GID:user_list

    在/etc/group中的每条记录分四个字段:

    第一字段:组名称。

    第二字段:组密码。早期UNIX中,组是有密码的,但是现在的UNIX和Linux中,组已经没有密码了,但是出于兼容的考虑,这个字段仍然被保留下来。现在一般该字段为“x”,表示没有设置密码。

    第三字段:GID,即组的数字ID。

    第四字段:用户列表,每个用户之间用逗号“,”分割。本字段可以为空。如果字段为空表示用户主要组为GID的用户名,可以通过/etc/passwd查看。

    下面是/etc/group一个例子:

    root:x:0:root

    tux1:x:500:tux2

    tux2:x:501:

    第一行:组root,GID是0,该组包括root以及GID为0的其他用户。

    第二行:组tux1,GID是500,该组包括tux2用户及GID为500的用户。

    第三行:组tux2,GID是501,该组包括GID为501的用户。

    如果/etc/passwd对应的相关的记录为:

    root:x:0:0:root:/root:/bin/bash

    tux1:x:500:500:Mr.tux1:/home/tux1:/bin/bash

    tux2:x:501:501::/home/tux2:/bin/bash

    那么tux1组中包括的用户有tux1和tux2,tux2组中包括的用户有tux2。所以,如果要查看一个组所包含的用户,可以通过对比/etc/passwd和/etc/group来得到。

    GID和UID类似,是一个正整数或0,GID从0开始,GID为0的组为root组。系统会预留一些较靠前的GID给系统虚拟用户之用。每个系统预留的GID都有所不同,比如Fedora预留了500个,我们添加新组时,组是从500开始的。而Slackware是把前100个GID预留,新添加的组是从100开始。查看系统添加组默认的GID范围应该查看/etc/login.defs中的GID_MIN和GID_MAX值。

    /etc/gshadow是/etc/group的加密文件,比如组管理密码就是存放在这个文件。/ etc/gshadow和/etc/group是互补的两个文件。对于大型服务器,针对很多用户和组,定制一些关系结构比较复杂的权限模型,设置组密码是极有必要的。比如我们不想让一些非组成员永久拥有组的权限和特性,这时我们可以通过密码验证的方式来让某些用户临时拥有一些组特性,这时就要用到组密码。

    /etc/gshadow格式如下,每个组独占一行。

    groupname:password:admin,admin,…:member,member,…

    例如:

    tux1:!:tux1:tux2

    tux2:oUS/q7NH75RhQ::tux2

    第一字段:组名称,这个例子中,有两个组tux1用tux2。

    第二字段:组密码,这个段可以是空的或“!”,如果是空的或有“!”,表示没有密码。tux1组无密码。tux2组有已经加密的口令。

    第三字段:组管理员,这个字段也可为空,如果有多个组管理者,用逗号“,”分割。例如,tux1组的管理员为tux1。

    第四字段:组成员,如果有多个成员,用逗号“,”分割。另外还要对照一下/etc/ group和/etc/passwd查看是否还有其他用户。例如,tux1组所包含的成员是tux1和tux2。

    3.其他配置文件

    与用户和组相关的配置还有一些,常见的有/etc/login.defs和/etc/default/useradd等。下面简单介绍一下。

    /etc/login.defs文件是当创建用户时的一些规划,比如创建用户时,是否需要主目录,UID和GID的范围。用户的期限等等,这个文件是可以通过root来定义的。

    比如Fedora的/etc/logins.defs文件内容。

    REQUIRED

    #Directory where mailboxes reside,_or_name of file,relative to the

    #home directory.If you_do_define both,MAIL_DIR takes precedence.

    #QMAIL_DIR is for Qmail

    #QMAIL_DIR Maildir

    MAIL_DIR/var/spool/mail注:创建用户时,要在目录/var/spool/mail中创建一个用户mail文件。

    #MAIL_FILE.mail

    #Password aging controls:

    #PASS_MAX_DAYS Maximum number of days a password may be used.

    #PASS_MIN_DAYS Minimum number of days allowed between password changes.

    #PASS_MIN_LEN Minimum acceptable password length.

    #PASS_WARN_AGE Number of days warning given before a password expires.

    PASS_MAX_DAYS 99999注:用户的密码不过期最多的天数。

    PASS_MIN_DAYS0注:密码修改之间最小的天数。

    PASS_MIN_LEN 5注:密码最小长度。

    PASS_WARN_AGE 7注:口令过期前提前给出警告的天数。

    #Min/max values for automatic uid selection in useradd

    UID_MIN 500注:最小UID为500,也就是说添加用户时,UID是从500开始的。

    UID_MAX 60000注:最大UID为60000。

    #Min/max values for automatic gid selection in groupadd

    GID_MIN 500注:GID是从500开始。

    GID_MAX 60000

    #If defined,this command is run when removing a user.

    #It should remove any at/cron/print jobs etc.owned by

    #the user to be removed(passed as the first argument).

    #USERDEL_CMD/usr/sbin/userdel_local

    #If useradd should create home directories for users by default

    #On RH systems,we do.This option is ORed with them flag on

    #useradd command line.

    CREATE_HOME yes注:是否创用户主目录,要求创建。

    再说一下/etc/default/useradd文件,这是通过useradd添加用户时的规则文件。

    #useradd defaults file

    GROUP=100

    HOME=/home注:把用户的主目录建在/home中。

    INACTIVE=—1注:是否启用帐号过期停用权,—1表示不启用。

    EXPIRE=注:帐号终止日期,不设置表示不启用。

    SHELL=/bin/bash注:所用SHELL的类型。

    SKEL=/etc/skel注:默认添加用户的目录默认文件存放位置。也就是说,当我们用adduser添加用户时,用户主目录下的文件,都是从这个目录中复制过去的。

    4.相关目录

    /etc/skel目录一般是存放用户启动文件的目录,这个目录是由root权限控制,当我们添加用户时,这个目录下的文件自动复制到新添加的用户的主目录下。/etc/skel目录下的文件都是隐藏文件,也就是类似.file格式的。我们可通过修改、添加、删除/ etc/skel目录下的文件,来为用户提供一个统一、标准的、默认的用户环境。

    例如,用ls查看/etc/skel目录,显示如下:

    [root@localhost tux1]#ls-la/etc/skel/

    总用量92

    drwxr-xr-x 3 root root 4096 8月11 23:32.

    drwxr-xr-x 115 root root 12288 10月14 13:44..

    -rw-r—r—1 root root 24 5月1100:15.bash_logout

    -rw-r—r—1 root root 191 5月1100:15.bash_profile

    -rw-r—r—1 root root 124 5月1100:15.bashrc

    -rw-r—r—1 root root 5619 2005-03-08.canna

    -rw-r—r—1 root root 438 5月18 15:23.emacs

    -rw-r—r—1 root root 120 5月2305:18.gtkrc

    drwxr-xr-x 3 root root 4096 8月11 23:16.kde

    -rw-r—r—1 root root 658 2005-01-17.zshrc

    /etc/skel目录下的文件,一般是我们用useradd和adduser命令添加用户(user)时,系统自动复制到新添加用户(user)的主目录下。如果我们通过修改/etc/passwd来添加用户时,我们可以自己创建用户的主目录,然后把/etc/skel下的文件复制到用户的主目录下,然后要用chown来改变新用户主目录的属主。 三、用户和组相关的工具或命令 管理用户和组的方法可以使用命令行命令,也可以直接修改相关的配置文件。当然我们也不要忽略一些发行版独有用户管理工具,比如Fedora中有system-config-us-ers工具。这个工具比较简单,单击几下鼠标就能完成。在SuSE中可以使用Yast工具。下面主要介绍一下使用命令行命令来管理用户和组的方法。

    1.添加用户

    添加用户的命令有useradd和adduser,adduser是useradd的一个符号链接。这两个工具所达到的目的都是一样的,在Fedora发行版中,useradd和adduser用法是一样的。但在slackware发行版本中,adduser和useradd还是有所不同,表现为adduser是以人机交互的提问的方式来添加用户。

    使用useradd不加-D时,功能是增加用户。

    useradd[-u uid[-o]][-g group][-G group,…]

    [-d home][-s shell][-c comment][-m[-k template]

    [-f inactive][-e expire][-p passwd]name

    其中常用选项的含义为:

    -c comment新帐号password档的说明栏。

    -d home_dir新帐号的主目录。默认值为default_home内login名称。

    -e expire_date新帐号过期日期。日期的指定格式为MM/DD/YY。

    -f inactive_days新帐号过期几日后永久停用。当值为0时帐号则立刻被停用。而当值为—1时则关闭此功能,默认值为—1。

    -g initial_group新帐号的主要组。可以为组名称或组数字ID。组名须为现有存在的名称。组数字ID也须为现有存在的组。默认的组数字为1。

    -G group,[…]新帐号的组集合。每个组使用“,”分隔开来。组名同-g选项的限制。

    -m新帐号的用户目录如不存在则自动建立。如使用-k选项skeleton_dir内的文件将复制至用户目录下。然而在/etc/skel目录下的文件也会复制过去取代。任何在skel-eton_dir和/etc/skel的目录也相同会在用户目录下一一建立。-k同-m不建立目录以及不复制任何文件为默认值,但是在fedora中-m是隐含选项。

    -M不建立用户目录,即使/etc/login.defs系统档设定要建立用户目录。

    -n默认值组与用户名称会相同。此选项将取消此默认值。

    -r此参数是用来建立系统帐号。系统帐号的UID会比定义在系统配置上/etc/ login.defs.的UID_MIN来的小。注意useradd此用法所建立的帐号不会建立用户目录,也不会在乎记录在/etc/login.defs.的定义值。如果你想要有用户目录须额外指定-m参数来建立系统帐号。

    -s shell用户登入后使用的shell名称。默认为不填写,这样系统会帮你指定默认的shell。

    -u uid指定用户的ID值。除非用-o选项,否则必须为唯一的ID值。数字不可为负值。默认为以/etc/login.defs中的UID_MIN的值为准,0到UID_MIN的值之间,为系统保留的UID。

    useradd不加参数选项时,后面直接跟所添加的用户名时,系统读取添加用户配置文件/etc/login.defs和/etc/default/useradd文件,然后根据其中所定义的规则添加用户。并向/etc/passwd和/etc/group文件添加用户和组记录。当然相关的加密文件/etc/ shadow和/etc/gshadow也同步生成记录。同时发生的还有系统会自动在/etc/add/default中所约定的目录中建用户的主目录,并复制/etc/skel中的文件(包括隐藏文件)到新用户的主目录中。

    useradd加-D参数后,就是用来改变配置文件/etc/default/useradd的。语法为:

    useradd-D[-g group][-b base][-s shell][-f inactive][-e expire]

    当-D选项出现时,useradd可以显示现在的默认值,或是用设置新值的方式更新默认值。可用选项为:

    -b default_home注:定义用户所属目录的前一个目录。用户名称会附加在default_home后面用来建立新用户的目录。当然使用-d后则此选项无效。

    -e default_expire_date注:用户帐号过期日期。

    -f default_inactive注:帐号过期几日后停用。

    -g default_group注:新帐号起始组名或ID。组名须为现有存在的名称。组ID也须为现有存在的组。

    -s default_shell注:用户登入后使用的shell名称。往后新加入的帐号都将使用此shell。

    如不指定任何参数,useradd-D显示目前默认的值。通过查看/etc/default/useradd可以了解到,文件的内容应该和上面的输出是一样的。所以如果我们想改变useradd配置文件/etc/default/adduser的内容,也可以用编辑器直接操作。

    useradd命令很强大,使用时的选项也比较多,下面我们通过例子来学习它的使用方法。

    例一:不加任何参数,直接添加用户:

    useradd tux1

    在这个例子中,我们添加了tux1用户,我们在查看/home/目录时,会发现系统自建了一个tux1的目录。我们再来查看/etc/passwd文件有关tux1的记录,可以看到这个文件中多了一条记录:

    tux1:x:500:500::/home/tux1:/bin/bash

    从这条记录来看,以adduser工具添加tux1用户时,设置用户的UID和GID分别为500,并且把tux1的主目录设置在/home/tux1,所用的shell是bash。在/etc/ shadow、/etc/group和/etc/gshadow文件,也会增加与tux1有关的行。另外,tux1用户的增加与/etc/default/useradd和/etc/login.defs这两个配置文件的规则有关。在/ home/tux1目录下的文件,也是从/etc/skel目录中复制过来的。

    如果在fedora中,系统会自动增加一个新组叫做tux1,并指定用户tux1的主要组为组tux1,这种分配策略叫做私有组。如果在SuSE中,系统会自动指定用户tux1的主要组为一个默认的组users,这种分配策略叫做公共组。

    例二:添加一个用户tux1,指定tux1的主要组为staff,组集合为team1,team2:

    useradd–g staff–G team1,team2 tux1

    例三:把添加用户时的默认SHELL/bin/bash改为/bin/tcsh:

    useradd-D-s/bin/tcsh

    通过useradd-D或直接查看/etc/default/adduser文件,可以看到更新后的配置。

    除了useradd和adduser工具以外,我们还能通过修改用户配置文件/etc/passwd和/etc/group的办法来实现。

    2.修改用户密码

    passwd设置或修改用户密码。passwd作为普通用户和超级权限用户都可以运行,但作为普通用户只能更改自己的用户密码,但前提是没有被root用户锁定。如果root用户运行passwd,可以设置或修改任何用户的密码。

    如果新建用户后,要为新用户创建密码,则用passwd用户名,注意要以root用户的权限来创建。这时候不需要输入用户的旧口令。

    [root@localhost~]#passwd tux1注:更改或创建tux1用户的密码。

    Changing password for user tux1.

    New UNIX password:注:请输入新密码。

    Retype new UNIX password:注:再输入一次。

    passwd:all authentication tokens updated successfully.注:成功。

    普通用户如果想更改自己的密码,直接运行passwd即可。比如当前操作的用户是tux1。

    [tux1@localhost~img96passwd

    Changing password for user tux1.注:更改tux1用户的密码。

    (current)UNIX password:注:请输入当前密码。

    New UNIX password:注:请输入新密码。

    Retype new UNIX password:注:确认新密码。

    passwd:all authentication tokens updated successfully.注:更改成功。

    passwd几个比较重要的参数。

    -k,—keep-tokens keep non-expired authentication tokens注:保留即将过期的用户在期满后能仍能使用。

    -d,—delete delete the password for the named account(root only)注:删除用户密码,仅能以root权限操作。

    -l,—lock lock the named account(root only)注:锁住用户无权更改其密码,仅能通过root权限操作。

    -u,—unlock unlock the named account(root only)注:解除锁定。

    -f,—force force operation注:强制操作。仅root权限才能操作。

    -x,—maximum=DAYS maximum password lifetime(root only)注:两次密码修正的最大天数,后面接数字。仅能root权限操作。

    -n,—minimum=DAYS minimum password lifetime(root only)注:两次密码修改的最小天数,后面接数字,仅能root权限操作。

    -w,—warning=DAYS number of days warning users receives before注:在距多少天提醒用户修改密码。仅能root权限操作。

    -i,—inactive=DAYS number of days after password expiration when an注:在密码过期后多少天,用户被禁掉,仅能以root操作。

    -s,—status report password status on the named account(root only)注:查询用户的密码状态,仅能root用户操作。

    比如我们让某个用户不能修改密码,可以用-l参数来锁定:

    [root@localhost~]#passwd-l tux1注:锁定用户tux1不能更改密码。

    Locking password for user tux1.

    passwd:Success注:锁定成功。

    [tux1@localhost~]#su tux1注:通过su切换到tux1用户。

    [tux1@localhost~]$passwd注:tux1来更改密码。

    Changing password for user tux1.

    Changing password for tux1

    (current)UNIX password:注:输入tux1的当前密码。

    passwd:Authentication token manipulation error注:失败,不能更改密码。

    再来一例:

    [root@localhost~]#passwd-d tux1注:清除tux1用户密码。

    Removing password for user tux1.

    passwd:Success注:清除成功。

    [root@localhost~]#passwd-S tux1注:查询tux1用户密码状态。

    Empty password.注:空密码,也就是没有密码。

    注意:当我们清除一个用户的密码时,登录时就无需密码。这一点要加以注意。

    3.修改用户

    用户修改工具usermod。usermod不仅能改用户的shell类型,所归属的组,也能改用户密码的有效期,还能改登录名和用户的主目录等等。

    usermod[-u uid[-o]][-g group][-G group…]

    [-d主目录[-m]][-s shell][-c注释][-l新名称]

    [-f失效日][-e过期日][-p密码][-L|-U]用户名

    usermod和useradd的很多选项差不多。两者不同之处在于useradd是添加,usermod是修改。

    -c comment

    更新用户帐号password档中的注解栏,一般是使用chfn(1)来修改。

    -d home_dir

    更新用户新的登入目录。如果给定-m选项,用户旧目录会搬到新的目录去,如旧目录不存在则建个新的目录。

    -e expire_date加上用户帐号过期日期。日期格式为MM/DD/YY.

    -f inactive_days帐号过期几日后永久停用。当值为0时帐号则立刻被停用。而当值为-1时则关闭此功能。默认值为-1。

    -g initial_group用户的主要组。组名须已存在。组ID必须参照既有的组。组ID默认值为1。

    -G group,[…]用户的组集合。每个组使用“,”区格开来。组名同-g选项的限制。如果用户现在的组不在此列,则将用户由该组中移除。

    -l login_name变更用户login时的名称为login_name。其他不变。特别是,用户目录名应该也会跟着更换成新的登入名。

    -s shell指定新登入shell。如此栏留白,系统将选用系统默认shell。

    -u uid用户ID值。除非用-o选项,否则必须为唯一的ID值。数字不可为负值。默认为最小不得小于/etc/login.defs中定义的UID_MIN值。0到UID_MIN值之间是传统上保留给系统帐号使用。用户目录树下所有的文件目录其userID会自动改变。放在用户目录外的文件则要自行手动更动。

    usermod不允许你改变正在线上的用户帐号名称。当usermod用来改变userID,必须确认这名user没在电脑上执行任何程序。另外,usermod最好不要用它来改用户的密码,因为它在/etc/shadow中显示的是明口令。修改用户的口令最好用passwd。

    举例:

    [root@localhost~]#usermod-d/opt/Linuxfish-m-l fishLinux-U Linuxfish

    注:把Linuxfish用户名改为fishLinux,并且把其主目录转移到/opt/Linuxfish。

    [root@localhost~]#ls-la/opt/Linuxfish/注:查看用户fishLinux的主目录下的文件及属主。

    总用量48

    drwxr-xr-x 3 fishLinux Linuxfish 4096 11月5 16:46.

    drwxrwxrwx 29 root root 4096 11月5 16:48..

    -rw-r—r—1 fishLinux Linuxfish 24 11月5 16:46.bash_logout

    -rw-r—r—1 fishLinux Linuxfish 191 11月5 16:46.bash_profile

    -rw-r—r—1 fishLinux Linuxfish 124 11月5 16:46.bashrc

    -rw-r—r—1 fishLinux Linuxfish 5619 11月5 16:46.canna

    -rw-r—r—1 fishLinux Linuxfish 438 11月5 16:46.emacs

    -rw-r—r—1 fishLinux Linuxfish 120 11月5 16:46.gtkrc

    drwxr-xr-x 3 fishLinux Linuxfish 4096 11月5 16:46.kde

    -rw-r—r—1 fishLinux Linuxfish0 11月5 16:46 mydoc.txt

    -rw-r—r—1 fishLinux Linuxfish 658 11月5 16:46.zshrc

    [root@localhost~]#more/etc/passwd|grep fishLinux注:查看有关fishLinux的记录。

    fishLinux:x:512:512::/opt/Linuxfish:/bin/bash

    通过上面的例子,我们发现文件的组还没有变,如果您想改变为fishLinux组,如果想通过usermod来修改,就要先添加fishLinux组。然后用usermod-g来修改,也可以用chown-R fishLinux:fishLinux/opt/finshLinux来修改。

    另外一些修改用户信息的命令是chage、chfn和chage等。

    chage可以用来修改用户相关的日期信息,它的语法格式:

    chage[-l][-m最小天数][-M最大天数][-W警告][-I失效日][-E过期日][-d最后日]用户

    chfn这个工具主要是用来改用户的全名,办公室地址,电话之类的。用法如下:

    chfn[-f full-name][-o office][-p office-phone][-h home-phone][-u][-v][username]

    chsh改变用户的shell类型。

    chsh[-s shell][—list-shells][—help][—version][username]

    如果不允许某个用户登录时,可以把用户的shell改到/sbin/nologin。系统中一些虚拟用户大多是不能登录系统的,这对于系统安全来说极为重要。

    还有一个图形界面的修改工具userinfo。userinfo系统普通用户都能调用,但都是修改当前操作用户的。

    前面已经多次说过用户配置文件的重要性了,其实无论用什么命令改,都是改与用户相关的配置文件,所以也可以直接修改与用户相关的配置文件的规则。

    4.查询用户信息

    想查询用户的信息,除了直接查看用户和组配置文件的办法外,还可以使用id和finger,id和finger是两个各有侧重的工具,id工具更侧重用户、用户所归属的用户组、UID和GID的查看。而finger侧重用户资讯的查询,比如用户名(登录名)、电话、主目录、登录shell类型、真实姓名、空闲时间等等。

    id命令用法:

    id选项用户名

    比如:我想查询tux1和tux2用户的UID、GID以及归属用户组的情况:

    #id tux1

    uid=500(tux1)gid=500(tux1)groups=500(tux1)

    注:tux1的UID是500,默认用户组是tux1,默认用户组的GID是500,归属于tux1用户组。

    #id tux2

    uid=505(tux2)gid=502(tux2)groups=502(tux2),0(root),500(tux1)

    注:tux2的UID是505,默认用户组是tux2,默认用户组的GID是502,归属于tux2(GID为502)、root(GID为0),tux1(GID为500)。

    finger的用法:

    finger选项用户名1用户名2…

    在finger后面加上用户名,可以看到用户的详细信息,可以一次查看多个用户,用空格分开。例如,我们查询用户tux1的信息。

    #finger tux1

    Login:tux1注:用户名(也是登录名)Name:TUX 1(用户名全称)。

    Directory:/home/tux1注:主目录Shell:/bin/bash注:所用shell类型。

    On since Tue Oct 18 13∶53(CST)on tty2 10 minutes 55 seconds idle注:空闲时间。

    On since Tue Oct 18 13∶57(CST)on pts/0 from:0.0

    No mail.

    No Plan.

    使用who或w命令可以查看当前在线用户,如果finger不加任何参数和用户,也会显示出当前在线用户。例如,运行w命令的结果如下:

    14:02:42 up 1:03,3 users,load average:0.04,0.15,0.18

    USER TTY FROM LOGIN@IDLE JCPU PCPU WHAT

    tux2 tty1-13:39 22:510.01s0.01s-bash

    tux1 tty2-13:53 8:48 11.62s0.00s/bin/sh/usr/X1

    tux1 pts/0:0.0 13:570.00s0.14s 1.08s gnome-terminal

    使用whoami和who am i可以查看当前用户的身份。区别在于如果用户在登录后使用su命令切换过用户身份,那么whoami显示的是切换后的当前身份,而who am i永远显示该用户登录时使用的身份。另外,who am i显示的信息也要详细一点。

    用groups可以通过用户来查询所归属的组。比如查询tux1和tux2所归属的组:

    [root@localhost~]#groups tux1 tux2

    tux1:tux1

    tux2:tux2 root tux1

    注:这是通过groups同时查看了用户tux1和tux2所归属的组。

    5.删除用户

    删除用户的命令是userdel。userdel的语法格式:

    userdel[-r]名称

    userdel很简单,只有一个参数可选-r。如果加参数-r,表示在删除用户的同时,一并把用户的主目录及本地邮件存储的目录或文件也一同删除。比如我们现在有两个用户tux1和tux2,其主目录都位于/home目录中,现在我们来删除这两个用户。

    #userdel tux1注:删除用户tux1,但不删除其主目录及文件。

    #userdel-r tux2注:删除用户tux2,其主目录及文件一并删除。

    不要轻易用-r参数,因为这样会删除用户的同时删除用户所有的文件和目录。如果用户目录下有重要的文件,在删除前请备份。

    其实也有最简单的办法,但这种办法有点不安全,也就是直接在/etc/passwd中删除您想要删除用户的记录。但最好不要这样做,/etc/passwd是极为重要的文件,可能您一不小心会操作失误。

    6.其他与用户相关的命令

    pwcov同步用户从/etc/passwd到/etc/shadow。

    pwck校验用户配置文件/etc/passwd和/etc/shadow文件内容是否合法或完整。

    pwunconv是pwcov的逆向操作,是从/etc/shadow和/etc/passwd创建/etc/passwd,然后在删除/etc/shadow文件。

    su用户切换工具。格式为su[-][user]。如果省略user,则尝试切换为root身份。su中需要输入要切换到的用户的密码,如果输入正确,就会临时切换成新用户的身份工作,直到运行exit退回到原用户shell中。使用“-”可以在切换用户时同时切换工作环境变量。

    sudo通过另一个用户来执行命令(execute a command as another user),su是用来切换用户,然后通过切换到的用户来完成相应的任务,但sudo能后面直接执行命令,比如sudo不需要root密码就可以执行root赋予的只有root才能执行相应的命令,但得通过visudo来编辑/etc/sudoers来实现。visudo是编辑/etc/sudoers的命令。也可以不用这个命令,直接用vi来编辑/etc/sudoers的效果是一样的。sudoedit和sudo功能差不多。

    7.添加组

    添加语法的命令为groupadd,其格式为:

    groupadd[-g gid[-o]][-r][-f]group

    groupadd可指定组名称来建立新的组帐号,需要时可从系统中取得新组值。groupadd有下列选项可用。

    -g后接GID值,除非使用-o参数,不然该值必须是唯一,不可相同,数值不可为负,预设值以/etc/login.defs为准。

    -r此参数是用来建立系统帐号的GID,会比定义在系统档文件上/etc/login.defs的GID_MIN来的小。注意useradd此用法所建立的帐号不会建立使用者目录,也不会记录在/etc/login.defs.的定义值。如果你想要有使用者目录须额外指定-m参数来建立系统帐号,它会自动帮你选定一个小于的GID_MIN的值,不需要再加上-g参数。

    -f强制增加。新增一个已经存在的组帐号,系统会出现错误提示然后结束groupadd。如果是这样的情况,不会新增这个组,使用-f强制增加组。也可同时加上-g选项,当你加上一个GID,此时GID就不用是唯一值,可不加-o参数。

    例如:添加GID为500的组team1。

    #groupadd-g500 team1

    8.删除组

    groupdel是用来删除组的。语法格式:groupdel组。例如:groupdel team1,就是删除组team1。

    9.其他与组相关的命令

    修改组信息:groupmod。

    显示用户所属的组:groups。

    检查组配置文件的合法性:grpck。

    同步组信息:grpconv。通过/etc/group和/etc/gshadow的文件内容来同步或创建/etc/gshadow,如果/etc/gshadow不存在则创建。

    grpunconv。通过/etc/group和/etc/gshadow文件内容来同步或创建/etc/group,然后删除gshadow文件。

    设置或修改组管理员:gpasswd。 9.2 软件包管理 在Windows中,安装和删除软件是一件很方便的事情,一般通过控制面板中的“添加/删除软件”就可以做到了,但是,在Linux里,这就不是件轻松的事儿。在传统的UNIX中,安装和删除软件往往需要通过命令来完成。在Linux中,安装和删除软件也分为源码包软件、RPM包软件和DEB包软件等几种情况,在国内使用DEB的人较少,下面针对源码包和RPM包软件分别讨论一下。 一、源码包软件的安装与管理 1.什么是源码包

    顾名思义,源码包就是源代码的可见的软件包,基于Linux和BSD系统的软件最常见。在国内源代码可见的软件几乎绝迹。大多开源软件都是国外出品。在国内较为出名的开源软件有fcitx、lumaqq及scim等。

    但软件的源代码可见并不等于软件是开源的,我们还要以软件的许可为准。比如有些软件是源码可见的,但它约定用户只能按它约定的内容来修改,比如vbb论坛程序。所以一个软件是否是开源软件,得具备两个条件。一是源代码可见。二是要有宽松的许可证书,比如GPL证书等。

    在GNU Linux或BSD社区中,开发人员在放出软件的二进制软件包的同时,也会为我们提供源代码软件包。

    2.源代码有何用

    一个软件如果有源码,是任何人都能看到它是怎么开发而来的,就像一个瓶子,比如瓶子制作的模具是什么,需要什么材料,具体的用途以及瓶子的详细说明书等等。软件的开放源码就是类似,开发者在给我们软件的同时,也会告诉我们软件是怎么开发出来的。只要我们的水平足够的高,所有的代码都在那里,我们就可以修改和定制软件,以适合我们的需要。如果Windows开放源代码,并以GPL发布,一样是有人能造出来N多的Windows发行版。遗憾的是Windows并不是开源系统。所以软件的源代码的用处无非是以下两点。

    (1)软件根据用户的需要加以定制。

    (2)二次开发。注:要根据软件的许可证书约定为准,开发者许可二次开发才行。

    3.怎样安装以源码包打包的软件

    源代码一般以file.tar.gz,file.tar.bz2或file.src.rpm打包。file.tar.gz和file.tar.bz2格式的解包命令如下。

    [root@localhost tux1]#tar jxvf file.tar.bz2

    [root@localhost tux1]#tar zxvf file.tar.gz

    编译安装源码包的步骤:

    (1)解开软件包查看帮助文档

    我们解开一个包后,进入解压包,一般都能发现README(或readme)、IN-STALL(或install)或doc(或DOC)目录。看名字就知道个差不多。

    比如我们下载一个比较新的fcitx的软件包,比如是fcitx-3.2-050827.tar.bz2。我们在解开这个软件包时会发现如下的文件。

    [root@localhost fcitx]#tar jxvf fcitx-3.2-050827.tar.bz2

    [root@localhost fcitx]#cd fcitx

    [root@localhost fcitx]#ls

    aclocal.m4 config.guess configure debian INSTALL Makefile.in src xpm

    AUTHORS config.h.in configure.in depcomp install-sh missing THANKS

    autogen.sh config.rpath COPYING doc lib mkinstalldirs TODO

    ChangeLog config.sub data fcitx.spec.in Makefile.am README tools

    所以我们就可以看fcitx的INSTALL和doc目录的安装文档了,里面都告诉我们如何安装。

    有时安装文档也会在开发者的主页上有详细的说明,及常见问题的处理等。比如LumaQQ。

    (2)编译安装软件的条件

    首先我们在Linux系统中至少得把开发工具安装上,比如gcc、perl、python、glibc、gtk、make、automake等开发工具或基础包。还要安装一些相应的开发包,一般是文件名包括dev的,比如kernel-devel。还有一些开发库,比如以lib开头的。如果您在编译软件时,有时提示缺少什么东西之类的,大多数是这些开发工具和开发库等。从光盘中找出安装就是了。有时光盘没有提供,请用google搜索相应的软件包,有时可能也会用到源码包编译安装所依赖的包。

    有时本来系统中已经安装了所依赖的包,但系统提示找不到应该怎么办?这时需要我们设置一下PKG_CONFIG_PATH的环境变量就行了。

    #export PKG_CONFIG_PATH=/usr/lib/pkgconfig

    #export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

    然后我们再来运行编译的./configure;make;make install尝试着来吧。

    以Java开发工具开发的程序,要用到jre或者jdk。jdk已经包括jre了,所以如果我们只是要求有一个Java程序运行的环境,只需要安装jdk就行了。安装好jdk,配置一下Java的环境变量就可以用了。如果是图形界面的程序,点点鼠标就OK了。

    用perl开发的程序,是需要perl环境的,所以必须得把perl的包安装上,python也同理。

    (3)编译安装软件的方法

    大多以tar.gz和tar.bz2打包的软件,是通过./configure;make;make install来安装的。有的软件是直接make;make install。

    我们可以通过./configure—help来查看配置软件的功能。大多软件是提供./configure配置软件的功能的。少数的也没有,如果没有的就不用./configure,直接make;make install就行了。

    ./configure比较重要的一个参数是—prefix,用—prefix参数,我们可以指定软件安装目录。当我们不需要这个软件时,直接删除软件的目录就行了。

    比如我们可以指定fcitx安装到/opt/fcitx目录中。

    [root@localhost fcitx]#./configure—prefix=/opt/fcitx

    如果我们不需要fcitx时,可以直接删除/opt/fcitx目录。

    所以我们举这个例子中,fcitx如果定制安装到/opt/fcitx目录中,完整的安装方法应该是:

    [root@localhost fcitx]#tar jxvf fcitx-3.2-050827.tar.bz2

    [root@localhost fcitx]#cd fcitx

    [root@localhost fcitx]#./configure—prefix=/opt/fcitx

    [root@localhost fcitx]#make

    [root@localhost fcitx]#make install

    调用fcitx,应该是

    [tux1@localhost~]#/opt/fcitx/bin/fcitx

    如果您想要让fcitx只要执行fcitx,就能调用,请配置环境变量,或者在/usr/bin中做一个fcitx的链接。

    [root@localhost tux1]#ln-s/opt/fcitx/bin/fcitx/usr/bin/fcitx

    一般的情况下都有说,但大多软件没有提供源码包的卸载方法。我们可以找到软件的安装点删除。主要看你把它安装在哪了。

    所以您的PATH可以设置成这样的。

    export PATH=“.:/bin:/usr/bin:/usr/local/bin:/usr/sbin:/usr/X11R6/ bin:/sbin:/opt/fcitx/bin”

    当然这只是举个例子,fcitx可以进入桌面自动运行的。

    再举一个例子,比如我想安装mlterm。并指定安装目录为/opt/mlterm。http:// mlterm.sourceforge.net

    #./configure—prefix=/opt/mlterm

    #make

    #make install

    把源码包安装的软件都指定安装在/opt目录中,这样就知道软件安装在哪里了。也方便卸载。

    4.安装其他类型软件

    (1)基于perl和python的程序的安装

    一般情况下,用#perl file.pl安装。比如VMware的Linux版本的安装。

    [root@localhost vmware-distrib]#perl vmware-install.pl

    基于python开发,也得用python file.py来安装。

    一般软件包都有README和INSTALL或者DOC文档,看文档安装。

    (2)有些安装程序是脚本型的调用

    要用#sh文件名,其中的sh可以是系统中的一种shell,如bash等。

    比如NVdia驱动的安装就是这样的。

    [tux1@localhost~]#sh NFORCE-Linux-x86-1.0-0306-pkg1.run

    当然也能通过chmod 755 NFORCE-Linux-x86-1.0-0306-pkg1.run,然后./ NFORCE-Linux-x86-1.0-0306-pkg1.run来安装。

    也有一些是以file.bin文件来安装的。

    [tux1@localhost~]#chmod 755 file.bin

    [tux1@localhost~]#./file.bin 二、RPM软件包管理介绍 RPM开始是Red Hat Package Manager的缩写,本意是Red Hat软件包管理器,顾名思义是Red Hat贡献出来的软件包管理器。在Fedora、Red Hat、Mandriva、SuSE、YellowDog等主流发行版本,以及在这些版本基础上二次开发出来的发行版都采用RPM,正是由于RPM被广泛的使用,为了不给大家一个错觉,好像RPM只能用在Red Hat中,现在RPM已经修改为RPM Package Manager的缩写,又是一个递归定义。

    RPM包里面都包含什么?里面包含可执行的二进制程序,这个程序和Windows的软件包中的.exe文件类似是可执行的。RPM包中还包括程序运行时所需要的文件,这也和Windows的软件包类似,Windows程序的运行,除了.exe文件以外,也有其他的文件。

    一个RPM包中的应用程序,有时除了自身所带的附加文件保证其正常以外,还需要其他特定版本文件,这就是软件包的依赖关系。依赖关系并不是Linux特有的,Windows操作系统中也是同样存在的。比如我们在Windows系统中运行3D游戏,在安装的时候,它可能会提示,要安装Direct 9。Linux和Windows原理是差不多的。

    1.RPM包管理的用途

    (1)可以安装、删除、升级和管理软件。当然也支持在线安装和升级软件。

    (2)通过RPM包管理能知道软件包包含哪些文件,也能知道系统中的某个文件属于哪个软件包。

    (3)可以查询系统中的软件包是否安装及其版本。

    (4)作为开发者可以把自己的程序打包为RPM包发布。

    (5)软件包签名GPG和MD5的导入、验证和签名发布。

    (6)依赖性的检查,查看是否有软件包由于不兼容而扰乱了系统。

    2.RPM的使用权限

    RPM软件的安装、删除、更新只有root权限才能使用。对于查询功能任何用户都可以操作。如果普通用户拥有安装目录的权限,也可以进行安装。 三、RPM的简单用法 我们除了软件包管理器以外,还能通过rpm命令来安装。是不是所有的软件包都能通过rpm命令来安装呢?不是的,以.rpm后缀结尾的文件才行。有时我们在一些网站上找到file.rpm,都要用rpm来安装。

    1.初始化rpm数据库

    通过rpm命令查询一个rpm包是否安装了,也是要用rpm数据库来完成的。所以我们要经常用下面的两个命令来初始化rpm数据库。

    [root@localhost tux1]#rpm—initdb

    [root@localhost tux1]#rpm—rebuilddb注:这个要花好长时间。

    注:这两个参数是极为有用,有时rpm系统出了问题,不能安装和查询,大多是这里出了问题。

    2.RPM软件包管理的查询功能

    命令格式

    rpm{-q|—query}[select-options][query-options]

    RPM强大的查询功能是极为重要的功能之一。举几个常用的例子,更为详细的具体的,请参考man rpm。

    1)对系统中已安装软件的查询。

    a)查询系统已安装的软件。

    语法:rpm-q软件名

    举例:

    [root@localhost tux1]#rpm-q gaim

    gaim-1.3.0-1.fc9

    -q就是—query,中文意思是“问”,此命令表示的是,是不是系统安装了gaim。如果已安装会有信息输出。如果没有安装,会输出gaim没有安装的信息。

    查看系统中所有已经安装的包,要加-a参数。

    [root@localhost RPMS]#rpm-qa

    如果分页查看,再加一个管道|和more命令。

    [root@localhost RPMS]#rpm-qa|more

    在所有已经安装的软件包中查找某个软件,比如说gaim。可以用grep抽取出来。

    [root@localhost RPMS]#rpm-qa|grep gaim

    上面这条的功能和rpm-q gaim输出的结果是一样的。

    b)查询一个已经安装的文件属于哪个软件包。

    语法rpm-qf文件名

    注:文件名所在的绝对路径要指出

    举例:

    [root@localhost RPMS]#rpm-qf/usr/lib/libacl.la

    libacl-devel-2.2.23-8

    c)查询已安装软件包都安装到何处。

    语法:rpm-ql软件名或rpm rpmquery-ql软件名

    举例:

    [root@localhost RPMS]#rpm-ql lynx

    [root@localhost RPMS]#rpmquery-ql lynx

    d)查询一个已安装软件包的信息。

    语法格式:rpm-qi软件名

    举例:

    [root@localhost RPMS]#rpm-qi lynx

    e)查看一下已安装软件的配置文件。

    语法格式:rpm-qc软件名

    举例:

    [root@localhost RPMS]#rpm-qc lynx

    f)查看一个已经安装软件的文档安装位置。

    语法格式:rpm-qd软件名

    举例:

    [root@localhost RPMS]#rpm-qd lynx

    g)查看一下已安装软件所依赖的软件包及文件。

    语法格式:rpm-qR软件名

    举例:

    [root@localhost tux1]#rpm-qR rpm-python

    查询已安装软件的总结:对于一个软件包已经安装,我们可以把一系列的参数组合起来用。比如rpm-qil。

    举例:

    [root@localhost RPMS]#rpm-qil lynx

    2)对于未安装的软件包的查看。

    查看的前提是您有一个.rpm的文件,也就是说对既有软件file.rpm的查看。

    a)查看一个软件包的用途、版本等信息。

    语法:rpm-qpi file.rpm

    举例:

    [root@localhost RPMS]#rpm-qpi lynx-2.8.5-23.i386.rpm

    b)查看一件软件包所包含的文件。

    语法:rpm-qpl file.rpm

    举例:

    [root@localhost RPMS]#rpm-qpl lynx-2.8.5-23.i386.rpm

    c)查看软件包的文档所在的位置。

    语法:rpm-qpd file.rpm

    举例:

    [root@localhost RPMS]#rpm-qpd lynx-2.8.5-23.i386.rpm

    d)查看一个软件包的配置文件。

    语法:rpm-qpc file.rpm

    举例:

    [root@localhost RPMS]#rpm-qpc lynx-2.8.5-23.i386.rpm

    e)查看一个软件包的依赖关系

    语法:rpm-qpR file.rpm

    举例:

    [root@localhost archives]#rpm-qpR yumex_0.42-3.0.fc9_noarch.rpm

    /bin/bash

    /usr/bin/python

    config(yumex)=0.42-3.0.fc9

    pygtk2

    pygtk2-libglade

    rpmlib(CompressedFileNames)<=3.0.4-1

    rpmlib(PayloadFilesHavePrefix)<=4.0-1

    usermode

    yum>=2.3.2

    3.软件包的安装、升级、删除

    1)安装和升级一个rpm包。

    [root@localhost tux1]#rpm-ivh file.rpm注:这个是用来安装一个新的rpm包。

    [root@localhost tux1]#rpm-Uvh file.rpm注:这是用来升级一个rpm包。

    如果有依赖关系的,请解决依赖关系,其实软件包管理器能很好的解决依赖关系,请看前面的软件包管理器的介绍。如果您在软件包管理器中也找不到依赖关系的包。那只能通过编译它所依赖的包来解决依赖关系,或者强制安装。

    语法结构:

    [root@localhost tux1]#rpm-ivh file.rpm—nodeps—force

    [root@localhost tux1]#rpm-Uvh file.rpm—nodeps—force

    更多的参数,请查看man rpm

    举例应用:

    [root@localhost RPMS]#rpm-ivh lynx-2.8.5-23.i386.rpm

    Preparing…###########################################[100%]

    1:lynx###########################################[100%]

    [root@localhost RPMS]#rpm-ivh—replacepkgs lynx-2.8.5-23.i386.rpm

    Preparing…###########################################[100%]

    1:lynx###########################################[100%]

    注:—replacepkgs参数是将已安装的软件再安装一次。有时没有太大的必要。

    测试安装参数—test,用来检查依赖关系。并不是真正的安装。

    [root@localhost RPMS]#rpm-ivh—test gaim-1.3.0-1.fc9.i386.rpm

    Preparing…###########################################[100%]

    由新版本降级为旧版本,要加—oldpackage参数。

    [root@localhost RPMS]#rpm-qa gaim

    gaim-1.5.0-1.fc9

    [root@localhost RPMS]#rpm-Uvh—oldpackage gaim-1.3.0-1.fc9.i386.rpm

    Preparing…###########################################[100%]

    1:gaim###########################################[100%]

    [root@localhost RPMS]#rpm-qa gaim

    gaim-1.3.0-1.fc9

    为软件包指定安装目录:要加-relocate参数。下面的举例是把gaim-1.3.0-1.fc9.i386.rpm指定安装在/opt/gaim目录中。

    [root@localhost RPMS]#rpm-ivh—relocate/=/opt/gaim gaim-1.3.0-1.fc9.i386.rpm

    Preparing…###########################################[100%]

    1:gaim###########################################[100%]

    [root@localhost RPMS]#ls/opt/

    gaim

    为软件包指定安装目录:要加-relocate参数。下面的举例是把lynx-2.8.5-23.i386.rpm指定安装在/opt/lynx目录中。

    [root@localhost RPMS]#rpm-ivh—relocate/=/opt/lynx—badreloc lynx-2.8.5-23.i386.rpm

    Preparing…###########################################[100%]

    1:lynx###########################################[100%]

    我们安装在指定目录中的程序如何调用呢?一般执进程序,都放在安装目录的bin或者sbin目录中。看下面的例子。如果有错误输出,就做相应的链接,用ln-s。

    [root@localhost RPMS]#/opt/lynx/usr/bin/lynx

    Configuration file/etc/lynx.cfg is not available.

    [root@localhost RPMS]#ln-s/opt/lynx/etc/lynx.cfg/etc/lynx.cfg

    [root@localhost RPMS]#/opt/lynx/usr/bin/lynx www.tux2.org

    2)删除一个rpm包。

    首先您要学会查询rpm包。请看前面的说明。

    [root@localhost tux1]#rpm-e软件包名

    举例:我想移除lynx包,完整的操作应该是:

    [root@localhost RPMS]#rpm-e lynx

    如果有依赖关系,您也可以用—nodeps忽略依赖的检查来删除。但尽可能不要这么做,最好用软件包管理器systerm-config-packages来删除或者添加软件。

    [root@localhost tux1]#rpm-e lynx—nodeps

    4.导入签名

    [root@localhost RPMS]#rpm—import签名文件

    举例:

    [root@localhost fc90]#rpm—import RPM-GPG-KEY

    [root@localhost fc90]#rpm—import RPM-GPG-KEY-fedora

    关于RPM的签名功能,详情请参见man rpm。

    5.RPM管理包管理器支持网络安装和查询

    比如我们想通过Fedora Core 9.0的一个镜像查询、安装软件包。地址:

    http://mirrors.kernel.org/fedora/core/4/i386/os/Fedora/RPMS/举例:

    命令格式:

    rpm参数rpm包文件的http或者ftp的地址

    #rpm-qpi

    http://mirrors.kernel.org/fedora/core/4/i386/os/Fedora/RPMS/gaim-1.3.0-1.fc9.i386.rpm

    #rpm-ivh

    http://mirrors.kernel.org/fedora/core/4/i386/os/Fedora/RPMS/gaim-1.3.0-1.fc9.i386.rpm

    6.对已安装软件包查询的一点补充

    [root@localhost RPMS]#updatedb

    [root@localhost RPMS]#locate软件名或文件名

    通过updatedb,我们可以用locate来查询一些软件安装到哪里了。系统初次安装时要执行updatedb,每隔一段时间也要执行一次。以保持已安装软件库最新。updat-edb是slocate软件包所有。如果您没有这个命令,就得安装slocate。

    举例:

    [root@localhost RPMS]#locate gaim

    7.从rpm软件包抽取文件

    命令格式:rpm2cpio file.rpm|cpio-div

    举例:

    [root@localhost RPMS]#rpm2cpio gaim-1.3.0-1.fc9.i386.rpm|cpio-div

    抽取出来的文件就在当前操作目录中的usr和etc中。

    其实这样抽到文件不如指定安装目录来安装软件来的方便。也一样可以抽出文件。

    为软件包指定安装目录:要加-relocate参数。下面的举例是把gaim-1.3.0-1.fc9.i386.rpm指定安装在/opt/gaim目录中。

    [root@localhost RPMS]#rpm-ivh—relocate/=/opt/gaim gaim-1.3.0-1.fc9.i386.rpm

    Preparing…###########################################[100%]

    1:gaim###########################################[100%]

    [root@localhost RPMS]#ls/opt/

    gaim

    这样也能一目了然。gaim的所有文件都是安装在/opt/gaim中,我们只是把gaim目录备份一下,然后卸掉gaim。这样其实也算提取文件的一点用法。

    8.RPM的配置文件

    RPM包管理的配置文件是rpmrc,我们可以在自己的系统中找到。比如Fedora Core 9.0中的rpmrc文件位于usr/lib/rpmr/rpmrc和/usr/lib/rpm/redhat/rpmrc下。

    [root@localhost RPMS]#locate rpmrc

    /usr/lib/rpm/rpmrc

    /usr/lib/rpm/redhat/rpmrc

    我们可以通过rpm—showrc查看。 9.3 系统引导 一、多重操作系统引导装载程序 系统启动引导装载程序,是在计算机启动后运行的第一个程序,它是用来负责加载、传输控制到操作系统的内核,一旦把内核加载,系统引导装载程序的任务就算完成退出,系统引导的其他部分,比如系统的初始化及启动过程则完全由内核来控制完成。

    在X86架构的机器中,Linux、BSD或其他UNIX类的操作系统中GRUB、LILO是大家最为常用的,应该说是主流。

    Windows也有类似的工具NTLOADER。比如我们在机器中安装了Windows 98后,我们再安装一个Windows XP,在机器启动的会有一个菜单让我们选择进入是进入Windows 98还是进入Windows XP。NTLOADER就是一个多系统启动引导装载程序,NTLOADER同样也能引导Linux,只是极为麻烦罢了。

    在Powerpc架构的机器中,如果安装了Linux的Powerpc版本,大多是用yaboot多重引导装载程序,比如Apple机目前用的是IBM Powerpc处理器,所以在如果想在Apple机上,安装Macos和Linux Powerpc版本,大多是用yaboot来引导多个操作系统。

    因为目前X86架构的机器仍是主流,所以目前GRUB和LILO仍然是我们最常用的多重操作系统引导装载程序。 二、GRUB介绍 GNU GRUB是一个多重操作系统启动管理器。GNU GRUB是由GRUB(GRand Unified Bootloader)派生而来的。GRUB最初由Erich Stefan Boleyn设计和应用。基于在X86架构的CPU而开发操作系统,系统引导装载程序不仅仅有GRUB,而且也有LILO,但对于多重系统引导装载程序,你只能选择其一而用。不能两个同时使用。目前这两个多重系统引导装载程序是大家最常用的,也是主流Linux发行版而采用的。主流发行版Fedora、Red Hat、Centos等基于RPM包的系统,在最新版本中都默认GRUB引导。Slackware目前仍采用LILO。而Debian发行版目前最新的版本也是采用GRUB。从目前看来,GRUB有逐渐取代LILO之势,GRUB 2.0正在开发之中。所以我们有理由用GRUB。 三、安装GRUB 1、安装GRUB软件

    对于Linux的GRUB,几乎所有的Linux主流发行版都有打包,如果您安装了Linux,并且在开机后出现GRUB字样的,证明您已经安装了GRUB。而无需再次安装。如果您的Linux系统没有安装GRUB,或者采用的是LILO,而您想用GRUB,可以用系统安装盘自带GRUB的软件包来安装,或者到相关发行版本的软件仓库下载后安装。

    GRUB的Linux版本目前在各大发行版中都有打包。比如Fedora/Red Hat/Centos/Mandrive/Mandriva/SuSE等以RPM包管理机制的系统,可以通过如下的命令来安装。

    [root@localhost~]#rpm-ivh grub*.rpm

    如果是Slackware,您可以用如下的办法来安装。

    [root@localhost~]#installpkg grub*.tgz

    其他的发行版本请用其自己特色的软件包管理工具来安装。

    当然您也可以通过源码包,在任何Linux的发行版上安装。

    [root@localhost~]#tar zxvf grub*.tar.gz

    [root@localhost~]#cd grub-xxx

    [root@localhost~]#./configure;make;make install

    确认您是否成功安装了GRUB,您可以测试是否有如下两个命令:

    [root@localhost~]#grub

    [root@localhost~]#grub-install

    2.在GRUB配置过程中的安装

    GRUB配置过程中使用grub-install安装。grub-install是把我们前面已经安装的软件包中的一些文件复制到/boot/grub中。对于新安装GRUB软件包后,也是一个必经的过程。我们前面所说的是GRUB软件包的安装,而现在我们说的是GRUB配置的过程中的安装。虽然在英文中都是install,但表达的意思是不一样的。

    如果硬盘为/dev/hda,可以使用下面的命令来安装GRUB。如果不能确定硬盘的名字,可以使用fdisk-l来确认。

    [root@localhost~]#grub-install/dev/hda

    Installation finished.No error reported.

    This is the contents of the device map/boot/grub/device.map.

    Check if this is correct or not.If any of the lines is incorrect,

    fix it and re-run the scriptimg97grub-installimg98.

    (fd0)/dev/fd0

    (hd0)/dev/hda

    值得注意的是如果您有一个/boot分区,应该用如下的办法来安装。

    [root@localhost~]#grub-install—root-directory=/boot/dev/hda

    3.设定GRUB的/boot分区并写入MBR

    在Linux中,GRUB软件包的安装,及在配置过程中安装grub到/boot中还是不够的,还要把GRUB写入MBR才行。有时我们重新安装了Windows,Windows会把MBR重写,这样GRUB就消失了。如果您出现这样的情况,就要进行这个过程。

    以root身份运行grub,会出现grub>提示符,这是grub命令行模式,如果能在开机中出现提示符,没有引导不起来的系统,除非您的系统破坏得极为严重。如果仅仅是GRUB被破坏了,GRUB命令行是能让操作系统引导起来的。

    首先,要找到/boot/grub/stage1,在grub>后面输入:

    grub>find/boot/grub/stage1

    (hd0,6)

    注意,(hd0,6)是/boot所在的分区。不要误解为是Linux的/所在的分区,这是值得注意的。

    grub>root(hd0,6)注:这是/boot所在的分区。

    grub>setup(hd0)注:把GRUB写到MBR上。 四、硬盘及分区的两种表示方法 上面的例子中出现了类似root(hd0,6)的表示方法。在正式了解如何配置GRUB之前,我们先要了解硬盘及分区的表示方法。在Linux中的表示方法前面已经有介绍,但是在GRUB中,表示的方法略有不同,下面要专门讨论一下。

    1.对于IDE接口的硬盘的两种表示方法

    IDE接口中的整块硬盘在Linux系统中表示为/dev/hd[a-z],比如/dev/hda,/dev/hdb…以此类推,有时/dev/hdc可能表示的是CDROM。另一种表示方法是hd[0-n],其中n是一个正整数,比如hd0,hd1,hd2…hdn。

    如果机器中只有一块硬盘,无论我们通过fdisk-l列出的是/dev/hda还是/dev/ hdb,都是hd0;如果机器中存在两个或两个以上的硬盘,第一个硬盘/dev/hda,另一种方法表示为hd0,第二个硬盘/dev/hdb,另一种表法是hd1。

    大家可能对hd0,hd1这种表示方法并不陌生,现在新的机器,在BIOS中,在启动盘设置那块,硬盘是有hd0,hd1之类的,这就是硬盘表示方法的一种。

    2.IDE接口硬盘分区的两种表示方法

    硬盘的分区也有两种表示方法,一种是/dev/hd[a-z]X,这个a-z表示a、b、c…z,X是一个从1开始的正整数。比如/dev/hda1,/dev/hda2…/dev/hda6,/dev/hda7…值得注意的是/dev/hd[a-z]X,如果X的值是1~4,表示硬盘的主分区(包含扩展分区)。逻辑分区是从5开始的,比如/dev/hda5肯定是逻辑分区了。用fdisk-l就能列出一个硬盘的分区表。

    硬盘分区的第二种表示方法(hd[0-n],y)。我们前面已经说过了整块硬盘也有两种表示方法,一种方法是/dev/hd[a-z]的,另一种方法是hd[0-n]。y的值是/dev/hd[a-z]X中的X-1。

    例如,系统中只有一块硬盘,在Linux中,这块硬盘的名字为/dev/hda,它的第1个主分区叫做/dev/hda1,第1个逻辑分区叫做/dev/hda5,对应的第二种表示方法中的名字是(hd0,0)和(hd0,4)。

    3.关于SATA和SCSI接口的硬盘的两种表示方法

    理解方法和IDE接口的硬盘相同,只是把hd换成sd。如果您的机器中比如有一个硬盘是/dev/hda,也有一个硬盘是/dev/sda,那/dev/sda的硬盘应该是sd0。具体每个分区用(sd[0-n],y)的表示方法和IDE接口中的算法相同,比如/dev/sda1就是(sd0,0)。

    4.usb及1394接口的存储设备和软驱设备

    usb存储设备目前在内核中有两种驱动方法,一种是模拟SCSI硬盘,通过fdisk-l出现的是/dev/sd[0-n]。如果是模拟SCSI设备的方法来驱动,那usb存储设备在Linux的另一种表示方法和前面所说的SCSI和SATA相同。

    但目前新版本的内核中,想抛弃模拟SCSI,我们通过fdisk列出系统存在的存储设置时会出现/dev/uba类似设备名的。但目前这个驱动并不成熟,比如大数据量表现不稳定。其实USB接口的存储设备,在Linux表现还是比较差。

    1394接口存储设备,在Linux中也是模拟SCSI,我们通过fdisk-l后,出现的也是/dev/sd[0-n],另一种表示方法(sd[a-z],y)的理解请参照前面所说的。1394接口的存储设备在Linux表现极好。

    软驱在Linux中,是/dev/fd0设备,这是一般情况,另一种表示为fd0。

    5.关于存储设备的不同的表示方法的应用

    /dev/hd[a-z]表示方法主要应用:

    (1)用于mount加载文件系统(分区)之用。

    (2)用于GRUB中指定Linux的根分区的位置。

    在GRUB系统引导装载程序,用命令行启动一个操作系统时,要通过指定Linux根/所在的硬盘分区/dev/hd[a-z]X。比如root=/dev/hda7。

    hd[0-n]表示方法的应用:

    这种一般是应用在GRUB的/boot所位于的硬盘分区的指定上。在GRUB的命令行和GRUB的配置文件menu.lst中都要应用到。

    比如我们要把GRUB写到硬盘的MBR上,在GRUB的命令行模式中要通过root(hd[0-n],y)来指定。这里的root(hd[0-n],y),在GRUB中就是/boot所位于的分区。不要搞错了,有时/boot和Linux的根/并不是处于同一个分区的,就看您安装Linux时怎么安装的了。而我们前面所说的root=/dev/hd[a-z]X来指定的是Linux根/所位于的分区。虽然有时/boot和/同处一个分区,但两种表示方法在GRUB中各有用途。 五、GRUB的配置文件 对于GRUB来说,如果没有配置menu.lst,无论是Linux版本的GRUB,还是WINGRUB,都会有命令行可用,通过命令行是一样能把操作系统引导起来的。有些用户总以为menu.lst配置错了,或者在机器启动后出现grub>命令行模式就要重新安装系统,其实根本没有这个必要。只要学会GRUB的命令行的用法,根本没有必要重装系统。menu.lst位于/boot/grub目录中。

    1.menu.lst的内容

    以下以Fedora 9.0中的/boot/grub/menu.lst为例,看一下里面的内容。

    default=0

    timeout=5

    splashimage=(hd0,6)/boot/grub/splash.xpm.gz

    hiddenmenu

    title Fedora Core(2.6.11-1.1369_FC9)

      root(hd0,6)

      kernel/boot/vmlinuz-2.6.11-1.1369_FC9 ro root=LABEL=/

      initrd/boot/initrd-2.6.11-1.1369_FC9.img

    title Windows

      rootnoverify(hd0,0)

      chainloader+1

    说明:

    default=0:默认启动哪个系统,从0开始。每个操作系统的启动的定义都从title开始的,第一个title在GRUB的启动菜单上显示为0,第二个启动为1,以此类推。

    timeout=5:表示在开机后,GRUB画面出现几秒后开始以默认启动。如果在启动时,移动上下键,则解除这一规则。

    splashimage=(hd0,6)/boot/grub/splash.xpm.gz:GRUB的背景画面,这个是可选项,可以用#号注释掉。

    hiddenmenu:隐藏GRUB的启动菜单,这项也是可选的。

    一般的情况下对Linux操作系统的启动,一般要包括四行:title行、root行、ker-nel行、initrd行。

    title XXXXX:title后面加一个空格,title是小写的,后面可以自己定义。比如FC9,自己定义一个名字就行。

    root(hd[0-n],y),在本例中,我们看到的是root(hd0,6),root(hd[0-n],y)表示的是/boot所在的分区。有时我们安装Linux的时候,大多是不设置/boot的,这时/ boot和/在同一个分区。这个root(hd[0-n],y)很重要,因为/boot目录中虽然有grub目录,最为重要的是还有kernel和initrd文件,这是Linux能启动起来最为重要的东西。

    kernel一行,是指定内核及Linux的/分区所在位置。

    比如例子中是:

    kernel/boot/vmlinuz-2.6.11-1.1369_FC9 ro root=LABEL=/

    在这里以kernel起始,指定Linux的内核的文件所处的绝对路径。因为内核是处在/boot目录中的,如果/boot是独立的一个分区,则需要把boot省略。如果/boot是独立的分区,这行要写成:

    kernel/vmlinuz-2.6.11-1.1369_FC9 ro root=LABEL=/

    因为/boot所处的分区已经在title下一行root(hd[0-n],y)中指定了,所以就无须再指明内核处在哪个分区了。另外Linux系统的硬盘分区的加载配置文件在/etc/fstab,原理是通过mount/dev/hd[a-z]X/boot来进行的。您可以对照着来理解。

    ro表示只读。root=LABEL=/来表示Linux的根所处的分区。LABEL=/这是硬盘分区格式化为相应文件系统后所加的标签。如果您不了解什么是标签,也可以直接以/dev/hd[a-z]X或者/dev/sd[a-z]X来表示。就看您的Linux的根分区是哪个分区了。比如我的是在/dev/hda7,那这里就可以写成root=/dev/hda7。

    如果查看系统运行所加载的分区,请用df-lh来查看,就能明白/boot是不是独立的分区,或者查看/etc/fstab也能知道。

    [root@localhost~]#df-lh

    Filesystem容量已用可用已用%加载点

    /dev/hda711G 9.2G 1.2G 90%/

    /dev/shm236M 0 236M 0% /dev/shm

    在这个例子中,我们可以发现/boot并没有出现。只有/dev/hda7,这表示/boot并不是独立的一个分区。所有的东西都包含在/中。于是我们在/boot中查看内核版本。

    [root@localhost~]#ls/boot/vmlinuz*

    /boot/vmlinuz-2.6.11-1.1369_FC9注:看到内核vmlinuz所处的目录。

    于是我们就可以这样kernel这行了。

    kernel/boot/vmlinuz-2.6.11-1.1369_FC9 ro root=/dev/hda7

    initrd命令行的写法:

    如果是独立一个分区,initrd一行要把/boot中省略。如果/boot不是处于一个分区,而是和Linux的/分区处于同一分区,不应该省略。

    比如我们在前面用的例子。现在拿到这里,我们应该首先查看/boot中的initrd的文件名到底是什么。

    [root@localhost~]#ls/boot/initrd*

    /boot/initrd-2.6.11-1.1369_FC9.img

    如果是通过df-lh或查看/etc/fstab也行,得知/boot是独立的分区。这时initrd应该写成:

    initrd/initrd-2.6.11-1.1369_FC9.img

    如果/boot不是独处一个分区,而是和/同处在一个分区,则要写成:

    initrd/boot/initrd-2.6.11-1.1369_FC9.img

    2.写menu.lst过程的小结

    (1)用fdisk-l、df-lh、more/etc/fstab来确认分区情况。

    我们用fdisk-l、df-lh、more/etc/fstab来确认/boot所在的分区,及Linux的根分区所在位置。

    比如我们确认/boot和Linux的/分区同处一个分区。

    [root@localhost~]#df-lh

    Filesystem容量已用可用已用%加载点

    /dev/hda711G 9.2G 1.2G 90%/

    /dev/shm236M0 236M0%/dev/shm

    然后我们/etc/fstab中,查看/所在的分区或分区标签是什么。

    [root@localhost~]#more/etc/fstab

    #This file is edited by fstab-sync-seeimg99man fstab-syncimg100for details

    LABEL=//ext3 defaults 1 1

    /dev/devpts/dev/pts devpts gid=5,mode=620 0 0

    /dev/shm/dev/shm tmpfs defaults 0 0

    /dev/proc/proc proc defaults 0 0

    /dev/sys/sys sysfs defaults 0 0

    LABEL=SWAP-hda1 swap swap defaults 0 0

    /dev/hdc/media/cdrecorder auto pamconsole,exec,noauto,managed 0 0

    经过上面的df-lh和more/etc/fstab的对照中得知,/boot并不是独立一个分区,而是和/在同一个分区。这个Linux系统安装在/dev/hda7上,文件系统(此分区)的标签为LABEL=/,/boot也是处于/dev/hda7,/dev/hda7也可以说是root(hd0,6)。

    (2)查看内核vmlinuz的和initrd文件名的全称。

    [root@localhost~]#ls-lh/boot/vmlinuz*

    -rw-r—r—1 root root1.6M 2005-06-03/boot/vmlinuz-2.6.11-1.1369_FC9

    [root@localhost~]#ls-lh/boot/initrd*

    -rw-r—r—1 root root1.1M 11月26 22:30/boot/initrd-2.6.11-1.1369_FC9.img

    (3)开始写menu.lst。

    我们根据上面所提到的,可以写成如下的样子:

    default=0

    timeout=5

    title FC9

      root(hd0,6)

      kernel/boot/vmlinuz-2.6.11-1.1369_FC9 ro root=LABEL=/

      initrd/boot/initrd-2.6.11-1.1369_FC9.img

    也可以写成:

    default=0

    timeout=5

    title FC9

      root(hd0,6)

      kernel/boot/vmlinuz-2.6.11-1.1369_FC9 ro root=/dev/hda7

      initrd/boot/initrd-2.6.11-1.1369_FC9.img

    上面两个不同之处在于一指定Linux的根/所在的分区时,一个是用了文件系统的标签,另一个没有用标签。

    3.menu.lst的精简型写法

    本写法主要是把指定/boot所位于的分区直接写入kernel指令行。这样就省略了通过root(hd[0-n],y)来指定/boot所位于的分区。

    第一种情况:/boot和Linux的/分区在同一个分区。

    default=0

    timeout=5

    title FC9

      kernel(hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC9 ro root=/dev/hda7

      initrd(hd0,6)/boot/initrd-2.6.11-1.1369_FC9.img

    kernel这行这样理解kernel(boot所在的分区)/boot/内核文件件全称ro root=Linux根所位于的分区或标签

    initrd这行可以这样理解initrd(/boot所在的分区)/boot/内核文件名全称

    第二种情况:/boot独立一个分区,和Linux的根分区不是同一个分区。

    比如我们查看到df-lh得到的是

    [root@localhost~]#df-lh

    Filesystem容量已用可用已用%加载点

    /dev/hda6200M 120M 80M 60% /boot

    /dev/hda711G 9.2G 1.2G 90% /

    我们再进一步查看/etc/fstab得知

    LABEL=//ext3 defaults 1 1

    LABEL=/boot/boot ext3 defaults 1 2

    所以我们应该写成如下:

    title FC9

      kernel(hd0,5)/vmlinuz-2.6.11-1.1369_FC9 ro root=LABEL=/

      initrd(hd0,5)/initrd-2.6.11-1.1369_FC9.img

    因为Linux的根分区是/dev/hda7,通过/etc/fstab和df-h的内容得知标签为LA-BEL=/的分区就是/dev/hda7,所以有:

    title FC9

      kernel(hd0,5)/vmlinuz-2.6.11-1.1369_FC9 ro root=/dev/hda7

      initrd(hd0,5)/initrd-2.6.11-1.1369_FC9.img 六、通过GRUB的命令行引导Linux 在开机的时候,不用GRUB的菜单,通过GRUB的命令也是一样能把操作系统引导起来。因为menu.lst的内容就是GRUB的一个一个的指令集合。

    1.为什么需要学习GRUB的命令行

    当我们把GRUB的menu.lst写错的时候,或者丢掉了menu.lst的时,比如在开机的时候,GRUB会出现grub>类似的命令提示符,这时需要我们用命令行启动系统。这时可以不用定义GRUB的菜单,直接用命令行来启动系统。

    2.用命令行来引导Linux操作系统的步骤

    通过命令行来引导操作系统的流程,也没有什么难的。无非是把指令手工输入到grub>提示符的后面。在这个过程中,tab键的命令补齐功能就显得很重要了。如果您不知道有哪些命令,可以输入help。

    (1)进入GRUB的命令行模式grub>。

    如果开机时,GRUB出现的是grub>,说明您没有/boot/grub/menu.lst,您需要自己写一个GRUB的菜单,让我们来选择进入哪个系统。如果有GRUB的菜单,您可以按Ctrl+C组合键进入GRUB的命令行模式,会出现grub>提示符:

    grub>

    (2)获取帮助GRUB的help。

    只要您在grub>提示符的后面输入help就能得到GRUB所有的命令提示。

    grub>help

    blocklist FILE boot

    cat FILE chainloader[—force]FILE

    clear colorNORMAL[HIGHLIGHT]

    configfile FILE device DRIVE DEVICE

    displayapm displaymem

    find FILENAME geometry DRIVE[CYLINDER HEAD SECTOR[

    halt[—no-apm]help[—all][PATTERN…]

    hide PARTITION initrd FILE[ARG…]

    kernel[—no-mem-option][—type=TYPE]makeactive

    map TO_DRIVE FROM_DRIVE md5crypt

    module FILE[ARG…]modulenounzip FILE[ARG…]

    pager[FLAG]partnew PART TYPE START LEN

    parttype PART TYPE quit

    reboot root[DEVICE[HDBIAS]]

    rootnoverify[DEVICE[HDBIAS]]serial[—unit=UNIT][—port=PORT][—

    setkey[TO_KEY FROM_KEY]setup[—prefix=DIR][—stage2=STAGE2_

    terminal[—dumb][—no-echo][—no-ed terminfo[—name=NAME—cursor-address

    testvbe MODE unhide PARTITION

    uppermem KBYTES vbeprobe[MODE]

    如果需要得到某个指令的帮助,就在help后面空一格,然后输入指令,比如:

    grub>help kernel

    (3)cat的用法。

    cat指令是用来查看文件内容的,有时我们不知道Linux的/boot分区,以及/分区所在的位置,要查看/etc/fstab的内容来得知,这时,我们就要用到cat(hd[0-n],y)/ etc/fstab来获得这些内容。注意要学会用tab键命令补齐的功能。

    grub>cat(按tab键会出来hd0或hd1之类的。)

    grub>cat(hd0,注:输入hd0,然后再按tab键。会出来分区之类的。)

    grub>cat(hd0,6)

     Possible partitions are:

      Partition num:0,Filesystem type unknown,partition type 0x7

      Partition num:4,Filesystem type is fat,partition type 0xb

      Partition num:5,Filesystem type is reiserfs,partition type 0x83

      Partition num:6,Filesystem type is ext2fs,partition type 0x83

      Partition num:7,Filesystem type unknown,partition type 0x83

      Partition num:8,Filesystem type is reiserfs,partition type 0x83

      Partition num:9,Filesystem type unknown,partition type 0x82

    grub>cat(hd0,6)/etc/fstab注:比如我想查看一下(hd0,6)/etc/fstab的内容就这样输入。

    LABEL=//ext3 defaults 1 1

    /dev/devpts/dev/pts devpts gid=5,mode=620 0 0

    /dev/shm/dev/shm tmpfs defaults 0 0

    /dev/proc/proc proc defaults 0 0

    /dev/sys/sys sysfs defaults 0 0

    LABEL=SWAP-hda1 swap swap defaults 0 0

    /dev/hdc/media/cdrecorder auto pamconsole,exec,noauto,

    managed 0 0

    如果不知道Linux安装在了哪个分区,可以根据文件系统来判断,一个一个的尝试。只要能cat出/etc/fstab就能为以后引导带来方便。

    查看/etc/fstab中的内容,主要是Linux的/分区及/boot是否是独立的分区。如果没有/boot类似的行,证明/boot和Linux的/处于同一个硬盘分区。比如上面的例子中LABEL=/这行是极为重要的。说明Linux系统就安在标签为LABEL=/的分区中。

    如果您的Linux系统/boot和/没有位于同一个分区,可能cat(hd[a-n],y)查到的是类似下面的。

    LABEL=//ext3 defaults 1 1

    LABEL=/boot/boot ext3 defaults 1 2

    (4)root(hd[0-n],y)指令来指定/boot所在的分区。

    其实这个root(hd[0,n],y)是可以省略的,如果省略了,我们要在kerenl命令中指定。我们前面已经说过(hd[0-n],y)硬盘分区的表示方法的用途。主要是用来指定/boot所在的分区。

    比如我们确认/boot和(hd0,6),所以就可以这样来输入root(hd0,6)grub>root(hd0,6)

    如果发现不对,可以重新设置。

    (5)kernel指令,用来指定Linux的内核,及/所在的分区。

    kernel这个指令可能初学者有点怕,不知道内核在哪个分区,及内核文件名的全称是什么。不要忘记tab键的命令补齐的应用。

    如果我们已经通过root(hd[0-n],y)指定了/boot所在的分区,语法有两个。

    如果/boot和Linux的/位于同一个分区,应该是下面的一种格式:

    kernel/boot/vmlinuz在这里按tab键来补齐,就看到内核全称了ro root=/dev/ hd[a-z]X

    如果/boot有自己独立的分区,应该是:

    kernel/vmlinuz在这里按tab键来补齐,就看到内核全称了ro root=/dev/hd[a-z]X

    在这里root=/dev/hd[a-z]X是Linux的/根所位于的分区,如果不知道是哪个分区,就用tab出来的计算,一个一个的尝试。或用cat(hd[0-n],y)/etc/fstab中得到Linux的/所在的分区或分区的标签。

    grub>kernel/boot/在这里按tab键。这样就列出/boot中的文件了。

    Possible files are:grub initrd-2.6.11-1.1369_FC9.img System.map-2.6.11-1.1369

    _FC9config-2.6.11-1.1369_FC9vmlinuz-2.6.11-1.1369_FC9grubBAK memtest86+—1.55

    .1 xen-syms xen.gz

    grub>kernel/boot/vmlinuz-2.6.11-1.1369_FC9 ro root=LABEL=/

    [Linux-bzImage,setup=0x1e00,size=0x18e473]

    注解:root=LABEL=/是Linux的/所在的分区的文件系统的标签。如果您知道Linux的/在哪个具体的分区,用root=/dev/hd[a-z]X来指定也行。比如下面的一行也是可以的。

    grub>kernel/boot/vmlinuz-2.6.11-1.1369_FC9 ro root=/dev/hda7

    也可以把/boot所在的分区的指定root(hd[0-n],y)这行省掉,直接在kernel中指定/boot所在的分区。所以就有下面的语法:

    如果是/boot和Linux的根同处一个分区。

    kernel(hd[0-n],y)/boot/vmlinuz ro root=/dev/hd[a-z]X比如:

    grub>kernel

    如果是/boot和Linux所在的根不在一个分区。则是:kernel(hd[0-n],y)/vmlinuz ro root=/dev/hd[a-z]X grub>kernel(hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC9 ro root=/dev/hda7

    [Linux-bzImage,setup=0x1e00,size=0x18e473]

    或下面的输入,以cat出/etc/fstab内容为准。

    grub>kernel(hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC9 ro root=LABEL=/

    [Linux-bzImage,setup=0x1e00,size=0x18e473]

    (6)initrd命令行来指定initrd文件。grub>initrd/boot/initrd在这里按tab键来补齐。grub>initrd/boot/initrd-2.6.11-1.1369_FC9.img

    [Linux-initrd@0x2e1000,0x10e685 bytes]

    如果/boot是独立的一个分区,应该是如下样子的语法。比如下面的:grub>initrd/initrd在这里按tab键来补齐。grub>initrd/initrd-2.6.11-1.1369_FC9.img

    [Linux-initrd@0x2e1000,0x10e685 bytes]

    (7)boot引导系统。

    grub>boot

    前面的几个步骤都弄好,就进入引导,尝试一下就知道了。

    (8)引导Linux系统实例全程回放。

    实例:/boot和Linux的/处于同一个硬盘分区。

    grub>cat(hd0,6)/etc/fstab

    #This file is edited by fstab-sync-see man fstab-sync for details

    LABEL=//ext3 defaults 1 1

    /dev/devpts/dev/pts devpts gid=5,mode=62000

    /dev/shm/dev/shm tmpfs defaults00

    /dev/proc/proc proc defaults00

    /dev/sys/sys sysfs defaults00

    LABEL=SWAP-hda1 swap swap defaults00

    /dev/hdc/media/cdrecorder auto pamconsole,exec,noauto,managed00

    grub>root(hd0,6)

    Filesystem type is ext2fs,partition type0x83

    grub>kernel/boot/在这里按tab键补齐,全列出/boot所有的文件。

    Possible files are:grub initrd-2.6.11-1.1369_FC9.img System.map-2.6.11-1.1369_FC9 config-2.6.11-1.1369_FC9 vmlinuz-2.6.11-1.1369_FC9

    memtest86+-1.55.1 xen-syms xen.gz

    grub>kernel/boot/vmlinuz-2.6.11-1.1369_FC9 ro root=/dev/hda7注:输入

    [Linux-bzImage,setup=0x1e00,size=0x18e473]

    grub>initrd/boot/在这里按tab键补齐

    Possible files are:grub initrd-2.6.11-1.1369_FC9.img System.map-2.6.11-1.1369_FC9 config-2.6.11-1.1369_FC9 vmlinuz-2.6.11-1.1369_FC9

    memtest86+-1.55.1 xen-syms xen.gz

    grub>initrd/boot/initrd-2.6.11-1.1369_FC9.img注:输入intrd文件名的全名。

    [Linux-initrd@0x2e1000,0x10e685 bytes]grub>boot

    我们指定Linux的根时,可以用cat出来的fstab的内容中Linux的/分区文件系统标签来替代。也就是kernel那行中root=/dev/hd[a-z]X。

    grub>cat(hd0,6)/etc/fstab

    #This file is edited by fstab-sync-seeimg101man fstab-syncimg102for details

    LABEL=//ext3 defaults 1 1

    /dev/devpts/dev/pts devpts gid=5,mode=620 0 0

    /dev/shm/dev/shm tmpfs defaults 0 0

    /dev/proc/proc proc defaults 0 0

    /dev/sys/sys sysfs defaults 0 0

    LABEL=SWAP-hda1 swap swap defaults 0 0

    /dev/hdc/media/cdrecorder auto pamconsole,exec,noauto,managed 0 0

    grub>root(hd0,6)

    Filesystem type is ext2fs,partition type 0x83img103img104

    grub>kernel/boot/在这里按tab键补齐,全列出/boot所有的文件。

    Possible files are:grub initrd-2.6.11-1.1369_FC9.img System.map-2.6.11-1.1369_FC9 config-2.6.11-1.1369_FC9 vmlinuz-2.6.11-1.1369_FC9

    memtest86+-1.55.1 xen-syms xen.gz

    grub>kernel/boot/vmlinuz-2.6.11-1.1369_FC9 ro root=LABEL=/

    [Linux-bzImage,setup=0x1e00,size=0x18e473]

    grub>initrd/boot/在这里按tab键补齐。

    Possible files are:grub initrd-2.6.11-1.1369_FC9.img System.map-2.6.11-1.1369_FC9 config-2.6.11-1.1369_FC9 vmlinuz-2.6.11-1.1369_FC9 grubBAK

    memtest86+-1.55.1 xen-syms xen.gz

    grub>initrd/boot/initrd-2.6.11-1.1369_FC9.img注:输入intrd文件名的全名。

    [Linux-initrd@0x2e1000,0x10e685 bytes]grub>boot

    如果/boot和Linux的根分区不在同一个分区,要把kernel和initrd指令中的/ boot去掉,也就是/vmlinuzMMMMMM或/initrdNNNN。

    也可以不用root(hd[0-n]来指定/boot所在分区,要在kernel和initrd中指定。比如Linux的/根所位于的分区和/boot所位于的分区都是(hd0,6),并且我们cat出来的/etc/fstab是Linux的/根分区的文件系统的标签为LABEL=/,引导操作系统的例子如下。

    grub>kernel(hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC9 ro root=LABEL=/

    grub>initrd(hd0,6)/boot/initrd-2.6.11-1.1369_FC9.img

    grub>boot

    grub>kernel(hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC9 ro root=/dev/hda7

    grub>initrd(hd0,6)/boot/initrd-2.6.11-1.1369_FC9.img

    grub>boot

    如果/boot位于/dev/hda6,也就是(hd0,5),Linux的根/位于分区/dev/hda7,并且我们cat出来的/etc/fstab中/分区的标签为LABEL=/。下面的两种方法都可以引导:

    grub>kernel(hd0,5)/vmlinuz-2.6.11-1.1369_FC9 ro root=LABEL=/

    grub>initrd(hd0,5)/initrd-2.6.11-1.1369_FC9.img

    grub>boot

    grub>kernel(hd0,5)/vmlinuz-2.6.11-1.1369_FC9 ro root=/dev/hda7

    grub>initrd(hd0,5)/initrd-2.6.11-1.1369_FC9.img

    grub>boot 七、通过GRUB引导Windows 1.通过编辑menu.lst来引导Windows系统

    如果您的Windows所处于的分区在(hd0,0),可以在menu.lst加如下的一段就能引导起来了。

    title Windows

      rootnoverify(hd0,0)

      chainloader+1

    如果您的机器有两块硬盘,而Windows位于第二个硬盘的第一个分区,也就是(hd1,0),您可以用grub的map来指令来操作把两块硬盘的序列对调,这样就不用在BIOS中设置了。在menu.lst中加如下的内容,比如下面的:

    title Windows

      map(hd0)(hd1)

      map(hd1)(hd0)

      rootnoverify(hd0,0)

      chainloader+1

    makeactive

    如果Windows的分区不位于硬盘的第一个分区,比如在(hd0,2),就要把rootnoverify这行的(hd0,0)改为(hd0,2):

    title Windows

      rootnoverify(hd0,2)

      chainloader+1

    makeactive

    如果Windows在第二个硬盘的某个分区,比如说是位于(hd1,2),则要用到map指令。

    title Windows

      map(hd0)(hd1)

      map(hd1)(hd0)

      rootnoverify(hd1,2)

      chainloader+1

    makeactive

    如果有多个Windows系统,怎么才能引导出来呢?应该用hide和unhide指令操作。比如我们安装了两个Windows,一个是位于(hd0,0)的Windows 98,另一个是位于(hd0,1)的WindowsXP。这时我们就要用到hide指令了。

    title Win98

      unhide(hd0,0)

      hide(hd0,1)

      rootnoverify(hd0,0)

      chainloader+1

    makeactive

    title WinXP

      unhide(hd0,1)

      hide(hd0,0)

      rootnoverify(hd0,1)

      chainloader+1

    makeactive

    2.通过GRUB指令来引导Windows

    其实我们会写menu.lst了,在menu.lst中的除了title外,都是一条条指令。如果我们启动Windows,只是输入指令就行了。

    比如Windows的分区在(hd0,0),我们在开机后,按Ctrl+C组合键,进入GRUB的命令模式。就可以用下面的:

    grub>rootnoverify(hd0,0)

    grub>chainloader+1

    grub>boot 八、GRUB丢失或损坏的应对策略 如果GRUB是Linux版本才会出这样的问题,WINGRUB可以不写在MBR上,所以不会出现这样的问题。WINGRUB用起来比较简单。menu.lst和命令行的用法和Linux版本的GRUB是一样的。

    1.由于重新安装Windows或其他未知原因而导致GRUB的丢失

    您可以通过系统安装盘、livecd进入修复模式。

    首先,您根据前面所说grub-install来安装GRUB到/boot所在的分区,要仔细看文档,/boot是不是处于一个独立的分区是重要的,执行的命令也不同。

    其次,要执行grub,然后通过root(hd[0-n],y)来指定/boot所位于的分区,然后接着执行setup(hd0),这样就写入MBR了,比如下面的例子:

    grub>root(hd0,6)

    grub>setup(hd0)

    grub>quit

    重新引导就会再次出现MBR的菜单或命令行的提示符了。

    2.如果出现GRUB提示符,而不出现GRUB的菜单,如何引导系统

    存在的问题可能是/boot/grub/menu.lst丢失,要自己写一个才行。您可以用命令行来启动系统,进入系统后写menu.lst就行了。另外,写好后还要建一个grub.conf的链接,如下:

    [root@localhost~]#cd/boot/grub

    [root@localhost grub]#ln-s menu.lst grub. conf 9.4 内核重编译与模块 一、为什么要编译内核 标准发行版中的内核可能不能满足需求,比如硬件不被内核支持。标准发行版中所支持的硬件驱动很多,造成内核过大,但我们并不需要。有时我们为了实现某些功能,比如对iptables的防火墙有些需要内核支持。还有实现一些硬件的支持等,这时我们需要重编内核。

    还有,Linux开发核心人员会定期在网上发布内核新版本,我们可能要升级到新内核版本来体验或开发。当然,还有些人是因为好玩而重编译内核。

    编译内核的步骤:

    1.安装内核源代码;

    2.创建配置文件.config;

    3.删除旧的临时文件;

    4.检查相关包依赖信息;

    5.创建内核镜像文件;

    6.创建并安装模块;

    7.配置lilo或grub;

    8.重新启动计算机。 二、内核源码版本的选择 如果发行版本提供内核源码,最好还是用发行版本提供的。比如Fedora 9.0提供了很多版本的内核源码。我们安装好后,它自带的配置文件大多能满足我们的需要,对于新手来说,根据自带的内核的配置文件.config,我们也能学到一点如何配置内核。也没有什么难的,熟能生巧罢了。当然,如果从kernel.org下载最新稳定版本的内核也是可以的。 三、内核源码安装或解压 对于Fedora Core 9.0来说,内核源码是放在/usr/src/kernels目录中。如果通过在线升级内核,也是放在这个目录中。如果您的系统中的/usr/src/kernels/中没有内容,说明您没有安装内核的源码包kernel-devel软件包。

    如果您用Fedora Core 9.0,建议您在保留老内核的基础上,在线下载或者从kernel.org下载最新版本的内核kerenl-devel和对应版本的kernel,有时可能新的kerenl已经解决了您所面临的问题,这时就没有必要编译内核了。

    如果您是通过在线安装的内核源码包,比如通过apt+synaptic或者yum安装的,内核源码会被放到/usr/src/kernel下的目录中,您要进入相对应的目录进行编译。

    如果您是下载kernel和kernel-devel的rpm包,可以通过rpm来安装。

    [root@localhost tux1]#rpm-ivh kernel*.rpm

    如果您是从kernel.org下载的类似Linux-2.6.13.tar.bz2或者Linux-2.6.13.tar.gz的,您要把下载下来的文件移到/usr/src目录中解压。然后进入解压的目录中进行配置和编译。

    [root@localhost tux1]#mv Linux-2.6.13.tar.bz2/usr/src

    [root@localhost tux1]#cd/usr/src/

    [root@localhost src]#tar jxvf Linux-2.6.12.3.tar.bz2

    提示:本文以Linux-2.6.12.3为例,其实通过发行版的升级版的kernel-devel和从kernel.org下载下来的差不多,大同小异。不同的是通过在线升级的rpm格式的内核源码包,有配置文件.config可以参考。安装到的目的地是/usr/src/kernel。 四、内核的配置 1.进入目录执行make mrproper,对于从kernel.org下载而来的tar.bz格式的源码包:

    [root@localhost src]#cd Linux-2.6.12.3/

    [root@localhost Linux-2.6.12.3]#make mrproper

    [root@localhost Linux-2.6.12.3]#make menuconfig

    对于Fedora Core 9.0,如果您是通过在线安装的kernel和kernel-devel新版本的包,比如是2.6.12-1.1398_FC9-i686,你可以直进入/usr/src/kernel/相应的目录中直接执行make menuconfig。利用发行版本提供的.config来配置,这样方便点。这也是为什么要用发行版本提供的内核源码升级包的原因。

    2.简要的配置内核。

    内核配置有两种方法,一种是直接置入内核(标记为*)。另一种是编成模块(标记为M)。两种方法各有优点。直接编入内核的,比如设备的启动,不再需要加载模块的这一过程了。而编译成模块,则需要加载设备的内核支持的模块。但直接把所有的东西都编入内核也是不可行的,内核体积会变大,系统负载也会过重。我们编内核时最好把极为重要的编入内核。其他的如果您不明白的,最好用默认。

    (1)执行make menuconfig后,移动键盘上下左右键,按Enter键进入一个目录。把指针移动到Exit就退出当前目录到上级目录。

    (2)针对自己机器存在的问题进行修改,比如大内存的支持。

    选择自己机器的CPU。

    移动键盘到Processor type and features—->,然后按Enter键进入。

    找到Processor family(Pentium-Pro)—->按Enter键进入。

    进入后我们发现有好多CPU的型号可选。一般的情况下要根据/proc/cpuinfo的信息来选,比如我们的是Celeron(P4)一代的,应该选如下的,当然默认的486也是可以正常运行的,既然我们重编一次内核,就得选中对应型号的,也许性能有所提高呢。

    Processor family(Pentium-4/Celeron(P4-based)/Pentium-4 M/Xeon)

    对大内存支持。如果内存是1G或者1G以上,但小于4G的,就要选4G支持。如果超过4G的,要选64G的支持。

    High Memory Support(4GB)—->

    (X)4GB

    ( )64GB

    还有比如声卡等硬件,需要我们一步一步地查看。如果有不明之处,就要按shift+?组合键来查看说明。一般的情况下,2.6.x的内核会根据机器的情况自动配出一个文件,只需要我们来查看一下,把重要的地方改改就行了。

    再举个例子:比如现在所用的声卡是intel ac97的,首先要知道自己的声卡的芯片组,我们要通过lspci-v来查看。

    [root@localhost tux1]#lspci-v

    只查看声卡的,应该用如下的方法:

    [root@localhost tux1]#lspci-v|grep audio

    00:1f.5 Multimedia audio controller:Intel Corp.82801DB(ICH4)ACimg10597 Audio Controller(rev03)

    通过上面的输出,我们知道这台机器用的是intel AC97声卡。所以我们要特别注意AC97的配置。

    找到Device Drivers—->Sound—->

    <M>Sound card support声卡的支持,这个是一定要选中的吧。

    <M>Advanced Linux Sound Architecture对声卡支持的ALSA驱动的支持。

    下面有OSS驱动,只是一部分。如果想用更全的OSS的驱动,可以去买。其他的就看如下的选吧。

    <M>Sequencer support

    <M>Sequencer dummy client

    <M>OSS Mixer API

    <M>OSS PCM(digital audio)API[*]OSS Sequencer API

    <M>RTC Timer support[*]Verbose printk

    []Debug

    大多是默认的就好,如果您不知道是做什么用的,或者怎么用。

    再往下:

    Generic devices—->进入里面

    <M>Dummy(/dev/null)soundcard

    <M>Virtual MIDI soundcard

    <M>MOTU MidiTimePiece AV multiportMIDI

    <M>UART16550 serial MIDI driver

    <M>Generic MPU-401 UART driver

    ISA devices—->如果您用ISA声卡就在这里面选。

    PCI devices—->如果您用PCI声卡,就在这里面选,集成声卡也在这里。

    USB devices—->这是USB声卡内核支持选项。我有一个这样的声卡,但没有试过。

    PCMCIA devices—->这是PCMCIA声卡的选项,我还没有看过这样的声卡呢。如果您有,就在这里面动动手吧。

    因为我用的是Intel集成的声卡,所以要在PCI中选择,我们在其中可以看到有两个与INTEL有关。

    <M>Intel/SiS/nVidia/AMD/ALi AC97 Controller这个才是Intel AC97声卡的。

    < >Intel/SiS/nVidia/AMD MC97 Modem(EXPERIMENTAL)这个是机器集成的INTEL猫的蜂鸣器的。

    因为我发现如果把猫的蜂鸣器的驱动也选上,可能造成两个冲突。所以只能选上面的那个。

    我们再回到Open Sound System—->中看看,与我用的声卡是不是有关的?

    <M>Open Sound System(DEPRECATED)

    <M>Intel ICH(i8xx)audio support

    <M>OSS sound modules

    <M>Loopback MIDI device support

    <M>Microsoft Sound System support

    我们也可以看到Open Sound System中也有好多的声卡驱动,大家根据前面的lspci-v来选择吧。

    (3)对于操作系统所采用的文件系统的支持要编入内核,最好不要编成模块。

    比如我的Fedora core 9.0所采用的文件系统用的是ext3,所以我要把它直接编入内核。好处是不受模块丢失或者损坏而不能启动系统。而有时您把系统所采用的文件系统编译成模块,出现VFS错误,也有这方面的事,可能是您没有把ext3加入到相应的加载模块的配置文件中,所以我们为了减少麻烦,把风险降到最低,还是要直接置入内核的好。

    File systems—->

    <*>Ext3 journalling file system support

    [*]Ext3 extended attributes

    [*]Ext3 POSIX Access Control Lists

    [*]Ext3 Security Labels

    如果您还有其他的硬盘分区要读取,比如是reiserfs、ext2、fat、fat32、ntfs等可以编成模块来支持。

    再举一例:如果您的操作系统用的是reiserfs的文件系统,当然就要把reiserfs直接编入内核,其他的可以编成模块来支持了。

    (4)对于硬盘及RAID的支持,要直接编入内核。

    比如ATA、SATA、SCSI及RAID的支持直接内核支持。有时编完内核后,启动时不能识别硬盘和RAID,大多事情出在这里。Slackware中在这方面有的是模块支持,我们可以把它由模块M改成内核*来支持。如果您不明白,就按默认进行。SATA的硬盘的支持除了选中SATA的支持、IDE设备的支持以外,还要选中SCSI的支持。

    (5)对于没有的设备,可以在内核中不选。

    比如我没有ISDN设备,所以就把ISDN去掉。

    ISDN subsystem—->

    <>Linux telephony support

    如果您没有1394的设备,当然也可以把1394的支持去掉,等等。

    如果您有USB的设备,要把USB方面好好看看。比如大家常用的移动硬盘、USB猫,还有扫描仪等。

    配置好后先要保存

    Save Configuration to an Alternate File

    出来一个

    Enter a filename to which this configuration,should be saved as an alternate. Leave blank to abort.

    .config

    按回车键就行了,这样就保存住了。

    然后退出Exit,这时也会出现保存。

    如果你想把.config保存起来,可以再复制一份到安全一点的目录,以备后用。 五、编译内核 [root@localhost Linux-2.6.12.3]#make

    [root@localhost Linux-2.6.12.3]#make modules_install

    这样就编译好了,并把模块也安装在了/lib/modules目录中了,请看:

    [root@localhost Linux-2.6.12.3]#ls/lib/modules/

    2.6.11-1.1369_FC9 2.6.12.3 六、安装内核及配置grub或lilo 1.复制bzImage等相关文件,并创建initrd文件

    [root@localhost Linux-2.6.12.3]#cp arch/i386/boot/bzImage/boot/vmlinuz-2.6.12.3

    [root@localhost Linux-2.6.12.3]#cp System.map/boot/System.map-2.6.12.3

    [root@localhost Linux-2.6.12.3]#cd/boot

    [root@localhost Linux-2.6.12.3]#/sbin/mkinitrd initrd-2.6.12.3.img 2.6.12.3

    我们把编译出来的bzImage,拷入到/boot目录,拷贝成vmlinuz-2.6.12.3。

    并且用mkinitrd来创建imitrd-×××.img文件,其中×××为内核的版本号,是通过查看/lib/modules版本来对应的,我们编译出来的是2.6.12.3,所以就运行上面的命令创建,创建出来的是initrd-2.6.12.3.img。不创建这个文件,有时是启动不起来的,比如提示VFS错误等。

    2.查看系统引导装载程序grub或者lilo的配置文件

    如果想要新内核能让系统引导装载程序在grub和lilo的菜单上能看得到,必须改grub.conf或者lilo.conf,但我们必须保留老内核的在grub和lilo的启动菜单,毕竟新内核不能百分之百的成功。

    FC9系统引导装载程序是GRUB,所以我们谈谈GRUB的设置。

    查看/etc/grub.conf。

    比如我的grub.conf的内容是这样的。

    #grub.conf generated by anaconda

    #Note that you do not have to rerun grub after making changes to this file

    #NOTICE:You do not have a/boot partition.This means that

    #all kernel and initrd paths are relative to/,eg.

    #root(hd0,7)

    #kernel/boot/vmlinuz-version ro root=/dev/hda8

    #initrd/boot/initrd-version.img

    #boot=/dev/hda

    default=0

    timeout=5

    #splashimage=(hd0,7)/boot/grub/splash.xpm.gz

    #hiddenmenu

    title Fedora Core(2.6.11-1.1369_FC9)

      root(hd0,7)

      kernel/boot/vmlinuz-2.6.11-1.1369_FC9 ro root=LABEL=/rhgb quiet

      initrd/boot/initrd-2.6.11-1.1369_FC9.img

    title Windows

      rootnoverify(hd0,0)

      chainloader+1

    要把老内核的启动保留下来,以防不测,只加入新的内核的启动。所以加上这样一段。

    title Fedora Core(2.6.12.3)

    root(hd0,7)

    kernel/boot/vmlinuz-2.6.12.3 ro root=LABEL=/rhgb quiet

    initrd/boot/initrd-2.6.12.3.img

    再来看一下改过后的配置文件。

    #grub.conf generated by anaconda

    #Note that you do not have to rerun grub after making changes to this file

    #NOTICE:You do not have a/boot partition.This means that

    #all kernel and initrd paths are relative to/,eg.

    #root(hd0,7)

    #kernel/boot/vmlinuz-version ro root=/dev/hda8

    #initrd/boot/initrd-version.img

    #boot=/dev/hda

    default=0

    timeout=5

    #splashimage=(hd0,7)/boot/grub/splash.xpm.gz

    #hiddenmenu

    title Fedora Core(2.6.12.3)

      root(hd0,7)

      kernel/boot/vmlinuz-2.6.12.3 ro root=LABEL=/rhgb quiet

      initrd/boot/initrd-2.6.12.3.img

    title Fedora Core(2.6.11-1.1369_FC9)

      root(hd0,7)

      kernel/boot/vmlinuz-2.6.11-1.1369_FC9 ro root=LABEL=/rhgb quiet

      initrd/boot/initrd-2.6.11-1.1369_FC9.img

    title Windows

      rootnoverify(hd0,0)

      chainloader+1

    然后重新启动机器,如果出现VFS错误,可能就是创建img文件的那个地方出了错误。

    注意:如果重新启用内核后,原来安装的显示卡驱动,比如NVIDIA和ATI的驱动还要重新安装。

    管理内核模块的相关命令

    (1)lsmod列出已加载的内核模块。

    lsmod是列出目前系统中已加载的模块的名称及大小等。另外我们还可以查看/ proc/modules,我们一样可以知道系统已经加载的模块。

    [root@localhost tux1]#lsmod

    (2)modinfo查看模块信息。

    modinfo可以查看模块的信息,通过查看模块信息来判定这个模块的用途。

    [root@localhost tux1]#moinfo模块名

    举例:

    [root@localhost tux1]#modinfo ne2k-pci

    filename:/lib/modules/2.6.11-1.1369_FC9/kernel/drivers/net/ne2k-pci.ko

    author:Donald Becker/Paul Gortmaker

    description:PCI NE2000 clone driver

    license:GPL

    parmtype:debug:int

    parmtype:options:array of int

    parmtype:full_duplex:array of int

    parm:debug:debug level(1-2)

    parm:options:Bit 5:full duplex

    parm:full_duplex:full duplex setting(s)(1)

    vermagic:2.6.11-1.1369_FC9 686 REGPARM 4KSTACKS gcc-9.0

    depends:8390

    alias:pci:v000010ECd00008029svsdbcsci*

    alias:pci:v00001050d00000940svsdbcsci*

    alias:pci:v000011F6d00001401svsdbcsci*

    alias:pci:v00008E2Ed00003000svsdbcsci*

    alias:pci:v00004A14d00005000svsdbcsci*

    alias:pci:v00001106d00000926svsdbcsci*

    alias:pci:v000010BDd00000E34svsdbcsci*

    alias:pci:v00001050d00005A5Asvsdbcsci*

    alias:pci:v000012C3d00000058svsdbcsci*

    alias:pci:v000012C3d00005598svsdbcsci*

    alias:pci:v00008C4Ad00001980svsdbcsci*

    srcversion:6ACE95F441CD26DF9DC31C2

    上面的例子是我们查看ne2k-pci这个模块的信息,通过查看,我们知道ne2k-pci模块是8029网卡(PCI NE2000 clone driver)的驱动。模块是位于/lib/modules/2.6.11-1.1369_FC9/kernel/drivers/net/中ne2k-pci.ko。

    我们现在常用的网卡也有8139的,8139网卡所用的驱动是8139too,用modinfo检查一下。

    [root@localhost tux1]#modinfo 8139too

    我们再查查vfat和ntfs的模块信息。

    [root@localhost tux1]#modinfo vfat

    [root@localhost tux1]#modinfo ntfs

    自己尝试一下。

    注意:模块名是不能带有后缀的,我们通过modprobe-l所看到的模块,都是带有.ko或.o后缀。

    3.modprobe加载新模块以及新模块相依赖的模块

    modprobe常用的功能就是加载模块,在加载某个内核模块的同时,这个模块所依赖的模块也被同时加载。当然modprobe也有列出内核所有模块,还有移除模块的功能。下面我们举个例子说一说我们常用的功能和参数。

    modprobe[-v][-V][-C config-file][-n][-i][-q][-o<modname>]<modname>[parameters…]

    modprobe-r[-n][-i][-v]<modulename>…

    modprobe-l-t<dirname>[-a<modulename>…]

    上面是modprobe的用法,具体更为详细的帮助,我们可以查看man modprobe。

    [root@localhost tux1]#modprobe-c

    modprobe-c可以查看modules的配置文件,比如模块的别名是什么等。

    [root@localhost tux1]#modprobe-l

    modprobe-l是列出内核中所有的模块,包括已加载和未加载的。通过modprobe-l,我们能查看到我们所需要的模块,然后根据我们的需要来加载。其实modprobe-l读取的模块列表就位于/lib/modules/uname-r目录中。其中uname-r是内核的版本。

    [root@localhost tux1]#uname-r

    2.6.11-1.1369_FC9

    [root@localhost tux1]#ls/lib/modules/2.6.11-1.1369_FC9/

    通过上面的命令,自己试试看:

    [root@localhost tux1]#modprobe模块名注:加载一个模块。

    举例:

    [root@localhost tux1]#modprobe ne2k-pci注:加载ne2k-pci模块。

    [root@localhost tux1]#modprobe vfat注:加载vfat模块。

    [root@localhost tux1]#modprobe ntfs注:加载ntfs模块。

    [root@localhost tux1]#lsmod注:列出已加载模块,我们会看到ne2k-pci,vfat,ntfs的模块。

    注意:模块名是不能带有后缀的,我们通过modprobe-l所看到的模块,都是带有.ko或.o后缀。

    [root@localhost tux1]#modprobe-r模块名注:移除已加载的模块,和rmmod功能相同。

    注意:模块名是不能带有后缀的,我们通过modprobe-l所看到的模块,都是带有.ko或.o后缀。

    [root@localhost tux1]#modprobe-r模块名

    举例:

    [root@localhost tux1]#modprobe-r ne2k-pci

    就说这么多吧,更为详细的还是用man modprobe来查看和尝试。

    4.rmmod移除已加载模块

    命令格式:

    rmmod模块名

    注意:模块名是不能带有后缀的,我们通过modprobe-l所看到的模块,都是带有.ko或.o后缀。

    举例:

    [root@localhost tux1]#rmmod vfat注:移除已加载的模块vfat

    5.depmod创建模块依赖关系的列表

    这个模块管理工具是创建模块依赖关系的列表,有几个参数我们注意一下就行了,目前的Linux发行版所用的内核是2.6x版本,是自动解决依赖关系,所以这个命令知道就行了。模块之前也有依赖关系,比如我们想驱动USB移动硬盘,目前有两种驱动,一种是udev,在内核中有,但目前不太稳定。另一种办法是用usb-storage驱动,而usb-storage依赖的模块是scsi模块,所以我们要用usb-storage的模块,也得把scsi编译安装。

    再举个例子:sata的硬盘,在Linux中的设备表示的是/dev/sd*,比如/dev/ sda,/dev/sdb等。系统要驱动sata硬盘,则需要把sata在内核中选中,或编译成模块,或内置于内核之中,在此同时,还需要在内核中选中ide,scsi的支持等。

    depmod工具的英文原意:depmod—program to generate modules.dep and map files。可译为创建modules.dep文件和映射文件。

    [root@localhost tux1]#depmod-a注:为所有列在/etc/modprobe.conf或/etc/ modules.conf中的所有模块创建依赖关系,并且写入到modules.dep文件。

    [root@localhost tux1]#depmod-e注:列出已加载但不可用的模块。

    [root@localhost tux1]#depmod-n注:列出所有模块的依赖关系,但仅仅是输出出来(Write the dependency file on stdout only)。

    注:modules.dep位于/lib/modules/内核版本目录

    比如Fedora Core 9.0中,系统默认的内核:

    [root@localhost tux1]#ls/lib/modules/2.6.11-1.1369_FC9/modules.dep

    /lib/modules/2.6.11-1.1369_FC9/modules.dep

    6.insmod加载模块

    insmod这个工具,和modprobe有点类似,但功能上没有modprobe强,modprobe在加载模块不用指定模块文件的路径,也不用带文件的后缀.o或.ko。而insmod需要的是模块所在目录的绝对路径,并且一定要带有模块文件名后缀的(modulefile.o或modulesfile.ko)。

    对于这个工具,我们只是介绍一下,并不推荐使用。因为模块有依赖关系,对于新手来说,可能不知道这个模块和哪个模块依赖。

    举例:

    [root@localhost tux1]#insmod/lib/modules/2.6.11-1.1369_FC9/kernel/drivers/net/tg3.ko

    我们要到/lib/modules/内核版本uname-r的命令输出/kernel/drivers中找相对应的模块才行,要有绝对路径,而且必需要用到文件名的全称,不能把文件名的后缀省略。

    与内核模块加载相关的配置文件。

    1.模块的配置文件modules.conf或modprobe.conf

    内核模块的开机自动加载模块一般是位于一个配置文件,一般的Linux发行版本都有/etc/modules.conf或/etc/modprobe.conf。比如Fedora Core 9.0内核模块开机自动加载文件是/etc/modprobe.conf。在这个文件中,一般是写入模块的加载命令或模块的别名的定义等。比如我们在modules.conf中可能会发现类似的一行:

    alias eth0 8139too

    而8029的网卡应该是

    alias eth0 ne2k-pci

    这样系统启动的时候,首先为modprobe 8139too,然后再为8139too指定别名为eth0,我们在登录的时候,用ifconfig就会查看到网卡的IP等情况,当然您得为网卡设置IP才行。

    一般的情况下,modproe.conf或modules.conf的内容是我们用相应的硬件配置工具而生成的。如果您的硬件驱动是没有被内核支持,您自己到硬件的厂商下载而来的驱动,一般的情况下都有安装和帮助文件。他们的驱动在配置时,他会写入硬件的支持到modules.conf或modprobe.conf文件中。

    再比如我们的声卡在modules.conf或modprobe.conf中也有相应的内容,这是由alsaconf配置工具生成的,明白了吧。同理网卡在modprobe.conf或modules.conf中的内容也是由网卡的配置工具而来的。

    有些硬件是以内核模块的方式驱动的,模块一旦加载上就能用,也没有什么配置工具,比如vfat和ntfs的支持。如果是硬件驱动不以模块的方式支持,而是直接编入内核,也不会用在modprobe.conf或modules.conf中加入什么内容。

    如果您有些模块不能开机加载,您想让一些模块加机自动加载,就可以把modprobe模块直接写入配置文件。

    2.内核模块其他配置文件

    内核模块的其他配置文件还是需要了解的,比如/lib/modules/内核版本目录下的几个文件。了解一下就行。比如:

    [root@localhost tux1]#uname-r

    2.6.11-1.1369_FC9

    [root@localhost tux1]#ls/lib/modules/2.6.11-1.1369_FC9/

    build misc modules.ccwmap modules.ieee1394map modules.isapnpmap modules.symbols source

    kernel modules.alias modules.dep modules.inputmap modules.pcimap modules.usbmap

    硬件驱动是必须由内核支持的,无论是我们自己安装驱动,还是内核自带的驱动都是如此。硬件驱动如果是以内核模块支持的,驱动目录位于:/lib/modules/内核版本/kernel/目录或/lib/modules/内核版本/kernel/drivers目录中。

    [root@localhost tux1]#uname-r

    2.6.11-1.1369_FC9

    [root@localhost tux1]#ls/lib/modules/2.6.11-1.1369_FC9/kernel

    arch crypto drivers fs lib net sound

    注:只有驱动在内核中以模块的方法支持,驱动才位于/lib/modules/相应的目录。如果是直接置入内核的,不会出现在/lib/modules驱动相关的目录。

    自己编译驱动的办法。

    如果是硬件厂商或者开源社区提供的驱动(没有集成在内核源码中的),编译驱动过程一般是./configure;make;make install,有时程序不提供./configure,我们可以make或make install,或者执行make;make install。如果不能make install,则需要我们自己复制.o或者.ko文件到/lib/modules/内核版本/kernel/目录或/lib/modules/内核版本/kernel/drivers目录中相应的驱动目录。

    这个还是自己尝试吧,说也说不清楚,遇到问题后就知道怎么弄了。具体的还是以驱动的REAME和INSTALL为准。

    现在大多驱动都是在编译安装时,自动复制.o或.ko文件到内核模块目录,大多不用我们自己动手复制过去。如果您尝试编译安装声卡驱动alsa-drivers就会明白我所说的意思。

    如果是我们通过重编内核来解决驱动问题,可以查看/usr/src/目录中的内核源码目录中的Documentation的REAME。所有的帮助文件都在那里。 9.5 系统紧急修复 如果一台Linux机器无法正常启动,或root口令丢失,就需要进行系统的紧急修复。 一、单用户模式 单用户模式要求我们输入root用户的密码,否则您无法登录单用户模式。如果您丢失了root用户的密码,并不能用单用户模式来重设您的root密码。另外单用户模式还有一个前提是您的grub或者lilo是能正常工作的。并且您知道您的系统问题发生在哪里,当以单用户模式登录时,您能打开文件系统的写操作,然后进行您想要进行的系统修复。

    要以单用户登录,如果使用grub系统引导装载程序,在grub启动后,移动键盘到Linux的启动项。按E键。然后再移动键盘到类似下面的一行,也就是kernel的那行:

    kernel/boot/vmlinuz-2.6.11-1.1369_FC9 ro root=LABEL=/1 rhgb quiet

    把光标移动到这行后,再按一下E键,进入编辑状态。在行尾敲一个空格,然后输入Linux single,也就是类似如下的:

    kernel/boot/vmlinuz-2.6.11-1.1369_FC9 ro root=LABEL=/1 rhgb quiet Linux single

    结束编辑,按回车键返回。接着按一下B键启动系统。

    如果使用lilo引导装载程序单用户模式,则在boot:处输入:

    Linux single

    当进入单用户模式运行后,系统提示我们输入root密码。输入正确后会进入系统。您可以用df-h来查看文件系统加载位置等,也可以用fdisk-l来查看分区等。但单用户进入系统后,可能系统是只读的。对文件系统的写操作,要运行下面的命令:

    #mount-o remount,rw/ 二、Linux rescue修复模式 Linux的修复模式就是Linux rescue。修复模式并不需要系统密码,当进入修复模式后,系统会提示我们要加载哪个分区上的文件系统,我们根据自己的系统情况来选择就是了。登录完成后,系统也会提示所在分区的文件系统会被加载到哪个目录。如果您不知道加载在哪里,请通过df-h来查看。

    修复模式需要安装盘的第一张或独立的修复盘。比如Fedora就有专门的修复盘。其实修复盘在一定意义上来说类似livecd,是不需要安装到硬盘也能运行系统。然后通过mount来加载文件系统。其实当我们执行Linux rescue时,像Fedora这类的系统,会有一些提示,比如提示要mount哪个分区,我们选择一下就行了。

    执行修复模式时,需要以下几个步骤。

    (1)在BIOS中,设置首个启动驱动器为CDROM。

    (2)找出系统安装盘的第一张。放入CDROM。当光盘运行时,会提示安装的界面。

    在boot:后面输入Linux rescue,然后按回车键。

    boot:Linux rescue

    进入修复模式,我们可以进行系统的紧急修复,比如加载usb盘进行数据备份、修改系统中的配置文件、重新设置root密码等。 三、livecd光盘或第三方Linux系统 Linux的livecd版本无需安装的Linux系统,在光盘上就可以运行的Linux系统。livecd大多是用来修复之用,livecd集成了常用的系统操作工具。第三方Linux系统是指你的机器上安装一个以上的Linux系统,如果其中一个发生问题,我们就可以用另一个来修复。

    livecd和第三方Linux系统来修复已经被破坏的Linux,常用的工具有mount和chroot等等。如果您只是简单的更改存在问题的系统文件,用mount就足够了。chroot工具可以改变/,进而进入另一个系统,这个工具的确有用。

    livecd就是在光盘上运行的Linux,您可以找一个livecd的发行版本刻录一下就能用了,使用简单方便。下载地址:http://www.frozentech.com/content/livecd.php。常用的有SLAX,Knoppix,Damn Small Linux,Ubuntu…大体都差不多,下载一个小的备用也行。

    通过livecd Linux或其他Linux来修复已经破坏的Linux步骤如下:

    (1)mount加载文件系统。

    注:执行mount及chroot时,要以root权限运行,以下同。

    比如存在问题的系统位于/dev/hda5,如果您不知道哪个分区是Linux的,您可以通过fdsik-l来查看。

    [root@localhost~]#fdisk-l注:查看分区情况。

    [root@localhost~]#pwd注:确定当前工作目录。

    /root注:当前工作目录为/root。

    [root@localhost~]#mkdir systmp注:在当前工作目录下创建一个临时目录。

    [root@localhost~]#mount/dev/hda5 systmp/注:加载hda5到tmpsys目录中。

    [root@localhost~]#df-h注:查看是否已经加载。

    Filesystem容量已用可用已用%加载点

    /dev/hda811G 9.8G 581M 95%/

    /dev/shm236M 0 236M 0% /dev/shm

    /dev/hda57.9G 5.9G 2.0G 76% /root/systmp注:看好了,是加载到了/root/ systmp目录中。

    既然把/dev/hda5分区的文件系统已经加载了,我们就能对已经加载的文件系统进行写操作。如果是简单的备份和文件修改,是完全能行的。

    注意:在写操作的过程中,要倍加小心,在操作某个文件的时候,要先备份。当出现不能mount的情况,可能是您的当前所用的内核不支持相应的文件系统。如果系统要求指定文件系统的时候,请看如下的例子。

    mount-t文件系统类型磁盘分区加载目的目录

    对于Linux的文件系统类型主要有:reiserfs,ext3,ext2。比如hda5是reiserfs的,可以用下面的命令来加载。

    [root@localhost~]#mount-t reiserfs/dev/hda5 systmp/

    (2)chroot到已经加载的文件系统。

    chroot这个工具很有用,很多Linux都支持chroot切换到另一个文件系统中,然后进行一系列系统包的安装和系统配置。这并不是说任何文件系统都能chroot切入,首先这个文件系统中得具备系统运行的一定的工具和环境,比如/bin和/sbin目录是拥有等。

    比如我的机器中有两个Linux系统,一个运行正常,另一个有点问题(比如是root密码忘记了),我想通过正常的系统来修复另一个。首先我们进行的是mount,也就是前面所说的,然后下一步就是chroot,通过chroot切换到要修复的文件系统中。

    比如存在问题的系统位于/dev/hda5

    [root@localhost~]#fdisk-l

    [root@localhost~]#pwd

    /root

    [root@localhost~]#mkdir systmp

    [root@localhost~]#mount/dev/hda5 systmp/

    [root@localhost~]#df-h

    Filesystem容量已用可用已用%加载点

    /dev/hda811G 9.8G 581M 95%/

    /dev/shm236M 0 236M 0% /dev/shm

    /dev/hda57.9G 5.9G 2.0G 76% /root/systmp

    [root@localhost~]#chroot systmp注:chroot到hda5分区的系统中。

    bash-3.00#注:已经登录。

    bash-3.00#df-lh注:查看文件系统加载情况。

    Filesystem容量已用可用已用%加载点

    /dev/hda57.9G 5.9G 2.0G 76%/

    proc7.9G 5.9G 2.0G 76% /proc

    sysfs7.9G 5.9G 2.0G 76% /sys

    上面我们就通过chroot命令完成了通过一个系统到另一个系统的跨控制台登录。Livecd如果要完成此任务,也是通过这样过程完成的。我们既然已经登录到有问题的系统了,可以进行相应的修复工作,比如对root密码的恢复,软件包的安装,相应文件的修改……

    有些发行版的安装盘类似livecd,比如slackware的安装盘的第一张,当它启动到让你输入用户名和密码进行安装时,我们不必输入什么,或者直接输入root,就能进入cdrom虚拟环境了。这时我们就用前面所说mount加载文件系统,然后chroot加载的文件系统。 四、如果X不能启动了,如何才能登录机器 把开机登录由图形登录改为文本模式登录,然后修复。

    以单用户模式登录,找到/etc/inittab文件,找到如下一行。

    id:5:initdefault:

    把这里的5改为3,也就是改成如下的代码:

    id:3:initdefault:

    用户、组、包管理、引导、内核重编译、模块、系统修复

    1.在Linux中用户和组的关系是什么?

    2.Linux中如何安装新软件?

    3.grub有什么功能?如何配置?

    4.为什么要进行内核重编译?

    5.把驱动程序编译进内核和编成独立的模块有什么区别?