sysklogd 系统日志记录

概述

日志对于系统的重要性不言而喻,比如对于故障诊断和入侵检测,没有日志几乎寸步难行。Linux系统当中最流行的日志记录器是sysklogd

Sysklogd 日志记录器由两个守护进程(klogd syslogd)和一个配置文件(syslog.conf)组成。klogd 不使用配置文件,它负责截获内核消息,它既可以独立使用也可以作为 syslogd 的客户端运行。syslogd 默认使用 /etc/syslog.conf 作为配置文件,它负责截获应用程序消息,还可以截获 klogd 向其转发的内核消息。支持 internet/unix domain sockets 的特性使得这两个工具可以用于记录本地和远程的日志。

重要信息

  • syslogd 守护进程默认情况下并不从 syslog/udp 端口接受任何消息,除非在命令行上使用了"-r"选项。此外,你还应当仔细看看"-l"和"-s"命令行选项。
  • syslogd 守护进程默认情况下并不转发任何来自远程主机的消息,这是为了避免可能导致的日志无限循环。"-h"选项可以开启转发功能。
  • syslogd 会剥除来自同一个域范围内的主机中的每条消息中的本地域(local domain)信息。如果你使用了日志分析程序,请将这一特性牢记在心。
  • syslogd 不会更改任何文件的属性,所以由它创建的文件将是全局可读的。如果你不想这样(比如"auth.*"被进行了记录),你必须手动事先创建这些文件并设置相应的权限。
  • 如果某些程序发送了大量的日志消息并且导致硬盘非常忙碌,你可以考虑在每一行后面关闭fsync()特性。不过这样可能会导致系统崩溃以后丢失一些日志消息。
  • 如果你使用 init 来直接启动 klogd 或 syslogd ,那么需要在命令行上使用"-n"选项。
  • 如果 System.map 文件存在并且在 klogd 命令行上使用了"-k"的话,那么它可以解码 EIP 地址。这个特性对于诊断系统崩溃非常有用,但是你必须确保 System.map 文件正确无误。
  • 这两个守护进程都会尝试在收到退出信号时删除他们的 .pid 文件,不过如果系统崩溃或者进程被"kill -9"结束,那么可能就会来不及清理。这样,下次启动时就有可能会获得与以前残留的 .pid 文件中的进程号相同的PID,从而导致无法启动(进程号冲突)。解决这个问题的最佳方案是系统的启动脚本(rc.*)自身能够在系统启动的最初就对这些 .pid 文件进行清理(通常是清空 /var/run 目录)。
  • 大文件支持(可以写入大于 2 GB 的日志)并不是 syslogd 的功能,而是 glibc 的功能(使用不同的内核API进行调用)。要启用大文件支持,你必须将 Makefile 中的相应注释取消(两个含有"-D_FILE_OFFSET_BITS"的行中的一个)。

内核的控制台日志等级

内核的控制台日志等级控制哪些内核消息会在控制台上显示。有两种途径可以修改这个等级,不过建议的途径是通过 sysctl 来控制,通常这个设置位于 /etc/sysctl.conf 中。比如:

  kernel/printk = 4 4 1 7

安装注意事项

  1. 仔细阅读 README 和 man page 会减少你不少痛苦。目前所有文档都已经放在man page中了。
  2. 按照你的需求修改 Makefile 然后再进行编译。如果你没有认真对待第一步,那么可能会编译出不合格的二进制程序。
  3. FSSTND(Linux文件系统标准)要求二进制文件和其配置文件必须位于不同的目录。这个包默认情况下遵守FSSTND的约定。你可以通过修改 Makefile 文件和源代码来修改配置文件的位置。
  4. 建议让这两个守护进程都以root身份运行,如果你想了解更多安全方面的问题,请阅读 man page 。

下面是 Makefile 文件开头的一部分节选,这部分是在安装是可能需要改动的:

CC= gcc
SKFLAGS= $(RPM_OPT_FLAGS) -O3 -DSYSV -fomit-frame-pointer -Wall -fno-strength-reduce
# 启用大文件支持,根据你的系统是32位还是64位进行选择
# -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
# -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE
# $(shell getconf LFS_SKFLAGS)
LDFLAGS= -s

# 指定 install 程序的位置
INSTALL = /usr/bin/install

# 安装目录
BINDIR = $(prefix)/usr/sbin
MANDIR = $(prefix)/usr/share/man

# 有bug报告说在一个纯 ELF 系统上需要明确指定连接到 libresolv.a 库。
# 如果你在连接 syslogd 时失败,可以试一试取消下面的注释。
# LIBS = /usr/lib/libresolv.a

# 如果你在 ALPHA 平台上连接失败,可以试一试取消下面的注释。
# LIBS = ${LIBS} -linux

# 取消下面的注释可以让 klogd 实现启动延迟,这在 klogd 和 syslogd 并行启动或启动顺序靠的非常近的时候很有用。
# KLOGD_START_DELAY = -DKLOGD_DELAY=5

# 下面的定义表示文件位置遵守FSSTND标准。
FSSTND = -DFSSTND

# 下面的定义指定了 man page 的宿主和权限。
MAN_USER = root
MAN_GROUP = root
MAN_PERMS = 644

# 下面的定义指定了 syslogd 守护进程的 .pid 文件名,
# 源代码(paths.h)中默认的文件名是"syslog.pid",但很多人认为应当叫"syslogd.pid"。
# 你可以在这里指定你喜欢的名字。
SYSLOGD_PIDNAME = -DSYSLOGD_PIDNAME=\"syslogd.pid\"

syslog.conf

syslog.conf 是 syslogd 进程的配置文件,将在程序启动时读取,默认位置是 /etc/syslog.conf 。它指定了一系列日志记录规则。规则的格式如下:

facility.level    action

这个配置文件中的空白行和以"#"开头的行将被忽略。"facility.level"部分也被称为选择符(seletor)。 seletor 和 action 之间使用一个或多个空白分隔。

选择符(seletor)

选择符由 facility 和 level 两部分组成,之间用一个句点(.)连接。这两部分将在后面 syslogd 小节中详细描述。下面提到的名字和 /usr/include/syslog.h 中的 LOG_-values 相一致。

facility 指定了产生日志的子系统,可以是下面的关键字之一:

auth		由 pam_pwdb 报告的认证活动。
authpriv	包括私有信息(如用户名)在内的认证活动
cron		与 cron 和 at 有关的信息。
daemon		与 inetd 守护进程有关的信息。
ftp		与 FTP 有关的信息
kern		内核信息,首先通过 klogd 传递。
lpr		与打印服务有关的信息。
mail		与电子邮件有关的信息
mark		syslog 内部功能用于生成时间戳
news		来自新闻服务器的信息
syslog		由 syslog 生成的信息
user		由用户程序生成的信息
uucp		由 uucp 生成的信息
local0 ~ local7	由自定义程序使用,例如使用 local5 做为 ssh 功能
*		通配符代表除了 mark 以外的所有功能

在大多数情况下,任何程序都可以通过任何 facility 发送日志消息,但是一般都遵守约定俗成的规则。比如,只有内核才能使用"kern" facility 。

level 指定了消息的优先级,可以是下面的关键字之一(降序排列,严重性越来越低):

emerg	系统不可用
alert	需要立即被修改的条件
crit	阻止某些工具或子系统功能实现的错误条件
err	阻止工具或某些子系统部分功能实现的错误条件
warning	预警信息
notice	具有重要性的普通条件
info	提供信息的消息
debug	不包含函数条件或问题的其他信息
none	没有优先级,通常用于排错
*	除了none之外的所有级别

facility 部分可以是用逗号(,)分隔的多个子系统,而多个 seletor 之间也可以通过分号(;)组合在一起。需要注意的是,多个组合在一起的选择符,后面的会覆盖前面的,这样就允许从模式中排除一些优先级。

默认将对指定级别以及更严重级别的消息进行操作,但是可以通过下面2个操作符进行修改。

等于操作符(=)表示仅对这个级别的消息进行操作,不等操作符(!)表示忽略这个级别以及更严重级别的消息。这两个操作符可以同时使用,不过"!"必须出现在"="的前面。

动作(action)

这个字段定义了对符合条件的消息进行何种操作,可以选择下列操作之一:

普通文件
将消息记录到这个文件中,必须使用绝对路径。如果在文件名之前加上减号(-),则表示不将日志信息同步刷新到磁盘上(使用写入缓存),这样可以提高日志写入性能,但是增加了系统崩溃后丢失日志的风险。
命名管道
在绝对路径表示的FIFO文件(使用mkfifo命令创建)前加上管道符号(|)即可。通常用于调试。比如:|/usr/adm/debug
终端或者控制台
比如:/dev/tty1 或 /dev/console
远程主机
syslogd 能够将消息发送到远程主机或从远程主机接收消息,不过默认并不转发接收到的消息。要将消息发送到远程主机,可以在主机名前加一个"@"即可。
逗号分隔的用户名列表
critical 级别的消息除了记录到日志之外,通常还转发到root用户。
所有当前登录的用户
如果写上一个星号(*)则表示向当前所有登录的用户显示这条消息。

实例

下面的例子来自于实践,希望能够对上面的内容做一个很好的示范以帮助理解。

              # 将所有 crit 级别的消息(排除所有内核消息)记录在 critical 文件中
              #
              *.=crit;kern.none            /var/adm/critical

              # 首先记录所有内核消息到 kernel 文件,
              # crit 级别以上的消息转发到远程同时在本地控制台也显示
              # 最后将info(包含)~err(不含)范围的内核消息记录到kernel-info文件(err和更高的级别被忽略)
              #
              kern.*                       /var/adm/kernel
              kern.crit                    @finlandia
              kern.crit                    /dev/console
              kern.info;kern.!err          /var/adm/kernel-info

              # 将恰好等于mail.info的消息显示在第12个终端(tcpd默认使用mail.info)
              #
              mail.=info                   /dev/tty12

              # 将除mail.info之外的所有mail子系统消息记录到mail文件
              #
              mail.*;mail.!=info           /var/adm/mail

              # 将所有mail.info和news.info消息记录到info文件
              #
              mail,news.=info              /var/adm/info

              # 记录所有info和notice级别的消息,来自mail子系统的除外
              #
              *.=info;*.=notice;mail.none  /var/log/messages

              # 记录所有info级别的消息,来自mail和news子系统的除外
              #
              *.=info;mail,news.none       /var/log/messages

              # 向所有登录用户通知emerg级别的消息
              #
              *.=emerg                     *

              # 将所有alert以及更高级别的消息转发到root,joey用户的终端上(如果他们已经登录)
              #
              *.alert                      root,joey

              # 将所有子系统的所有消息都发送到远程名为"finlandia"的主机
              *.*                          @finlandia

syslogd

syslogd 默认通过 /dev/log 这个 unix domain socket 来接收应用程序发送过来的消息,这个位置是由系统的基本C库决定的。

这个程序的命令行参数如下:

syslogd  [ -a socket ] [ -f config-file ] [ -h ] [ -l hostlist ] [ -m interval ]
           [ -n ] [ -p socket ] [ -r ] [ -s domainlist ] [ -v ]

参数说明:

-a socket
指定额外需要监听的 socket ,最多指定19个,可以通过修改 syslogd.c 文件中的 MAXFUNIX 宏修改这个默认值。如果你将某些进程在chroot环境下运行,那么这个选项就很有用了。
-f config-file
指定配置文件的位置,默认是 /etc/syslog.conf 。
-h
默认情况下 syslogd 并不转发它接收到的远程主机消息。指定这个选项后,进程将会把它接收到的远程主机消息转发到另一个指定的远程主机。
-l hostlist
指定一个分号(:)分隔的主机名列表,只记录这些主机的 hostname 而不是全限定域名。
-m interval
syslogd 默认每隔20分钟产生一个时间戳标记(-- MARK --)。这个选项用于修改这个默认值。设为零将关闭这个特性。
-n
避免自动作为后台进程运行。如果由 init 来直接启动和控制的话这个选项就必须使用。
-p socket
你可以指定一个 unix domain socket 来代替默认的 /dev/log [这个位置是由libc决定的]
-r
从 internet domain socket 上接收远程消息,也就是监听从514端口上进来的UDP包。 默认不接受任何远程消息。
-s domainlist
指定一个分号(:)分隔的域名列表,这些域名在记录前都会被剥除。只能指定完整的域名。比如"-s north.de"并不会剥除"satu.infodrom.north.de"的尾巴,你必须这样写才行:
-s north.de:infodrom.north.de
-v
打印版本信息后退出。

信号

在运行时,syslogd 会将自己的进程号保存在 /var/run/syslogd.pid 文件中。所以可以使用下面的命令向运行中的进程发送信号:

 kill -信号 `cat /var/run/syslogd.pid`
HUP
使得 syslogd 进程重新初始化。所有打开的文件都会被关闭,然后重新读取配置文件,重新开始记录。
TERM
安全退出
CHLD
如果当前正在向所有登录的用户发送消息,那么等待这些子进程结束。

安全问题

流氓程序可以通过向 syslogd 进程发送大量日志信息来淹没日志文件或者耗尽磁盘空间。下面是一些建议:

  1. 通过防火墙来限制仅允许某些特定的主机访问 514/UDP socket
  2. 将日志文件放在独立的分区上,这样即使磁盘满了也不会有很大的影响。
  3. ext2文件系统可以保留一定的空间仅给root用户使用。这要求将 syslogd 以非root身份运行。
  4. 禁止监听 inet domain sockets 将会减少不少风险。

相关文件

/etc/syslog.conf
syslogd的配置文件
/dev/log
默认将从这个 Unix domain socket 读取本地 syslog 消息
/var/run/syslogd.pid
包含 syslogd 进程号的文件

klogd

klogd 是一个专门截获并记录 Linux 内核消息的守护进程。其命令行语法如下:

klogd  [ -f file ] [ -iI ] [ -n ] [ -o ] [ -p ] [ -s ] [ -k file ] [ -v ] [ -x ] [ -2 ]

命令行参数说明:

-f file
将日志直接记录到指定的file中,而不是转发到 syslogd 进程。
-i
-I
要求当前正在运行的 klogd 守护进程重新装载内核符号表。
-i 用于让守护进程重新装载内核模块符号。
-I 用于让守护进程重新装载静态内核符号和内核模块符号。
-n
禁止自动后台运行,在 klogd 由 init 启动并直接被 init 控制的情况下必须使用此开关。
-o
klogd 在读取并记录所有内核消息缓冲区中的消息之后立即退出(不作为守护进程)。
-p
只要 klogd 检测到内核消息流中包含了一个 Oops 字符串,那么就重新加载内核符号表。
-s
可以通过两个途径获取内核消息: /proc 文件系统和 sys_syslog 系统调用接口。虽然两者本质上完全等价,但 klogd 会优先使用 /proc/kmsg 文件。这个开关则强制 klogd 使用系统调用获取内核消息。
-k file
将指定的 file 作为内核符号表文件,也就是System.map文件的位置。
-v
打印版本信息后退出。
-x
忽略 EIP 转换信息,这样就不需要读取 System.map 文件。
-2
当展开符号时打印两行,一行将地址转换为符号,一行是原始文本。这样就允许一些外部程序(比如ksymoops)在原始数据上做一些处理。

消息转发

如果 klogd 将内核消息转发给 syslogd 进程,那么它可以分拣出某些特定的消息。原始内核消息的格式如下:

    <[0-7]>Something said by the kernel.

尖括号中的数字表示内核消息的优先级,这些数字的定义位于 kernel.h 文件中。当 klogd 收到内核消息之后,将会读取这个数字,并在将此消息转发给 syslogd 时按照这个数字分配适当的优先级。

如果使用 -f 将内核消息直接记录到特定的文件中,那么这条消息将保持原样。

内核地址解析

klogd 会尝试将内核地址解析为对应的符号,如果你想得到原始的地址信息,那么可以使用"-2"开关。如果没有使用"-k"选项,那么将会依次尝试下面的路径:

       /boot/System.map
       /System.map
       /usr/src/linux/System.map

因为内核模块动态加载所以地址并不固定,这时就要使用"-i"/"-I"通知 klogd 内核模块的变化。这两个开关都将导致当前正在运行的 klogd 守护进程重新加载内核符号表。应当在每一次加载或者卸载内核模块后立即运行下列命令:

       klogd -i

-p 开关也可以用于更新内核符号表。它会让 klogd 在检测到保护性错误的时候重新加载内核符号表。使用这个开关需要小心,因为操作系统在出现保护性错误(protection fault)的时候已经变得不稳定了,而 klogd 必须执行系统调用才能重新装载内核符号表,所以这样做可能会导致更糟糕的结果。

控制台日志等级

内核默认的控制台日志等级是"7"(debug),也就是等级数字小于等于6的消息(优先级更高)都会显示在控制台上。这些不同等级所代表的意思位 于 kernel.h 文件内,这个包内的 syslog.h 中也有一份拷贝。可以使用 sysctl 来指定控制台日志等级,这通常是在 /etc/sysctl.conf 文件中设置的,比如下面这一行:

              kernel.printk = 4 4 1 7

就是把内核的控制台日志等级设为了"4"。

信号处理

klogd 可以响应8种信号: SIGHUP, SIGINT, SIGKILL, SIGTERM, SIGTSTP, SIGUSR1, SIGUSR2, SIGCONT 。SIGINT, SIGKILL, SIGTERM, SIGHUP 信号会让进程优雅的正常退出。SIGTSTP 信号会让进程停止记录日志并进入休眠状态;SIGCONT 信号会让处于休眠状态的进程重新开始记录日志。组合使用 SIGSTOP 和 SIGCONT 可以在不退出进程的情况下切换日志消息的来源。比如需要卸载 /proc 文件系统的时候,可以使用下面的命令:

            # kill -TSTP pid
            # umount /proc
            # kill -CONT pid

SIGUSR1 和 SIGUSR2 用于加载/重新加载内核符号表。SIGUSR1 表示重新加载内核模块的符号信息;SIGUSR2 表示同时重新加载模块和静态内核的符号信息。如果 System.map 文件位置正确,那么 SIGUSR1 信号将非常有用。特别是在内核模块改变的时候。

相关文件

/proc/kmsg
klogd 默认首选的获取内核消息的来源
/var/run/klogd.pid
保存 klogd 的 PID 的文件
/boot/System.map, /System.map, /usr/src/linux/System.map
默认搜索的内核符号表位置

来源: http://lamp.linux.gov.cn/Linux/sysklogd.html
作者: 金步国

Linux 启动流程

Linux 系统主要启动步骤:

    0. 加载BIOS(Basic Input Output System, 基本输入输出系统), 并获取第一个启动设备的代号

    1. 读取第一个启动设备的MBR 信息,启动 Boot Manager
        Linux 通常使用功能强大,配置灵活的 Grub或Lilo 作为 Boot Manager。

    2. 加载系统内核, 并尝试驱动所有硬件设备

    3. 核心启动init 进程
        init 进程是 Linux 的根进程,所有的系统进程都是它的子进程。

    4. init 进程读取 /etc/inittab 文件中的信息,并进入预设的运行级别,
        按顺序运行该运行级别对应文件夹下的脚本。脚本通常以start 参数启动,并指向一个系统中的程序。
        通常情况下, /etc/rcS.d/ 目录下的启动脚本首先被执行,然后是/etc/rcN.d/ 目录。例如您设定的运行级别为3,那么它对应的启动0目录为 /etc/rc3.d/ 。

    5. 根据 /etc/rcS.d/ 文件夹中对应的脚本启动 Xwindow 服务器 xorg
            Xwindow 为 Linux 下的图形用户界面系统。

    6. 启动登录管理器,等待用户登录
            Ubuntu 系统默认使用 GDM 作为登录管理器,您在登录管理器界面中
            输入用户名和密码后,便可以登录系统。

ps:      ubuntu系统目前已经没有/etc/inittab配置文件,而是采用upstart来启动或者停止服务,引入了事件的概念。
            init程序读取的文件是/etc/event.d

            在每一个/etc/rcX.d[X from 0 to 6]中,S开头的服务表示开机时执行,K开头的服务表示关机时停止
            所有服务启动或停止的脚本都放在/etc/init.d
           "the scripts in /etc/rcX.d are executed each time the system enters the runlevel X, and the scripts are all symbolic links where targets are locates in /etc/init.d/

            可以在/etc/rc.local中新增你想开机就启动的动作。

作业管理

作业管理(job control)是在bash环境下使用的。
管理作业时,其实每个作业都是当前bash的子程序,也就是说,彼此之间是有关联的,我们无法以作业管理的方式由tty1的环境去管理tty2的bash。

要进行bash的作业管理,必须要注意到的限制有:

  • 程序必须是shell的子程序
  • 程序不能等待terminal/shell的输入

1. 直接将命令放在后台执行的"&"

前台(foreground): 用户可以控制的作业
后台(background): 在内存中可以自行运行的作业,用户无法进行直接控制,除非以fg/bg等命令将该作业调用出来

语法: command &

2. 将当前作业放到后台"暂停"  [Ctrl]+z

范例:
#当前正在使用vi, 却临时需要返回bash
vi ~/.bashrc
按下[Ctrl]+z
[1]+ Stopped

3. 观察当前后台作业状态 jobs

jobs -l
-l 表示除了列出作业号之外,同时列出PID

4. 将后台作业拿到前台处理 fg

fg job-number

5. 将作业置于后台运行

bg job-number

6. 删除进程 kill

-l : 列出当前kill能够使用的signal
-1: 重新读取一次参数的设置文件(类似reload)  [SIGHUP]
-2: 等同于[Ctrl]+c   [SIGINT]
-9: 强制删除 [SIGKILL]
-15: 以正常的程序方式终止一项进程,区别与-9   [SIGTERM]

参考: 《鸟哥的Linux私房菜》

例行性命令: at / crontab

仅进行一次的工作任务分配: at

首先需要有负责任务分配的服务,就是atd
启动该服务或守护程序的命令是:
/etc/init.d/atd restart

其次考虑到安全性并非所有人都可以进行at工作任务分配,我们可以利用/etc/at.allow或者/etc/at.deny这两个文件来进行限制
/etc/at.allow: 只有该文件中的用户才能使用
/etc/at.deny: 只有不在该文件中的用户才能使用
一般只需要/etc/at.deny文件存在即可

语法:
at TIME
TIME可以有多种格式:
HH:MM
HH:MM YYYY-MM-DD
HH:MM[am|pm] [MONTH] [DAY]
HH:MM[am|pm] + number [minutes | hours | days | weeks ]

范例:
#再过五分钟后关机
at now + 5 minutes
at> /bin/sync
at> /bin/sync
at> /sbin/shutdown -h now
at> EOF(按[Ctrl] + d)
job x at 2008-12-25 10:38

查询当前主机有多少at工作任务分配的命令: atq
删除某个工作任务分配的命令atrm job-number

 

循环执行的例行性命令: crontab

语法:
crontab [-l | -e | -r]
-e: 编辑crontab的工作内容
-l: 查看crontab的工作内容
-r: 删除所有crontab的工作内容

范例:
#每天12:00发送邮件给simplyzhao用户
crontab -e
#此时进入vi编辑状态,每项工作占一行
0  12  *  *  *  mail simplyzhao -s "12:00 theme" < /home/simplyzhao/.bashrc
#分 时 日 月 周 命令

时间参数的含义
分钟       小时       日期        月份        周
0-59      0-23        1-31       1-12        0-7
*: 任何时间都接收
, : 分隔时段,例如每天3:00与6:00表示为: 0 3,6 * * * command
- : 表示范围,例如8点到12点之间每小时的20分做一项工作: 20 8-12 * * * command
n/: 每隔n单位时间,例如每隔5五分进行: */5 * * * * command

系统级设置
直接编辑/etc/crontab文件

通常,cron服务的最低检查限制是"分钟",所以cron会每分钟去读取一次/etc/crontab或者/var/spool/cron中的数据
另外系统已经存在一些定期执行的文件,例如cron.daily, cron.hourly等等,也可以直接将符合条件的工作直接放在这些目录中

ubuntu bash环境设置

第一步  系统级设置

读取/etc/profile文件,再根据/etc/profile文件的内容去读取其他附件的设置文件,例如/etc/profile.d/*.sh等


第二步  个人设置

根据不同的用户,到家目录去读取~/.bash_profile或~/.bash_login或~/.profile设置文件
其中:
这三个文件通常只要一个即可,不过存在顺序上的差异:bash启动时,会先去读取~/.bash_profile,找不到时就去读取~/.bash_login,再找不到时则读取~/.profile

根据不同的用户,到家目录去读取~/.bashrc文件


所以登陆bash后,最终读取的设置文件是~/.bashrc,通常可以将个人的一些常用的alias或者PATH等环境变量或者自定义变量都写到这个文件。


ps: 可能需要注意区分login shell 与 non-login shell

A login shell is one whose first character of argument zero is a -, or one started with the --login option.

An interactive shell is one started without non-option arguments and without the -c option whose standard input and error are both connected to the terminal , or one started with the -i option.

Login Shell: 登录的时候,你输入帐号和密码进入了,出现了shell提示符,这个过程就是登录外壳;
Interactive Shell:接下来你得到了一个像root@host />这样的提示符,你输入什么,它就解释出什么,这就是交互式外壳;
Non Interactive Shell:你可能需要学习写一个bash script,用外部shell执行:bash  script.sh,它(bash)从第一条命令执行到最后一条然后退出,不与你进行任何交互,它就是非交互式外壳

详见:

man 1 bash 之 INVOCATION

" a non-login shell, which does not read /etc/profile or ~/.bash_profile files, but rather reads the ~/.bashrc instead."

 

例子:

新建用户 lfs
useradd -s /bin/bash - lfs -m -k /dev/null lfs

在用户lfs的根目录中新建.bashrc文件,输入:
LFS=/mnt/lfs

以root身份使用命令su lfs(非登录shell)
echo $LFS
/mnt/lfs

以root身份使用命令su - lfs (登录shell)
echo $LFS

常用压缩/解压缩命令

.tar
解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName

.gz
解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName
zcat
读取压缩文件数据内容的命令
zcat FileName.gz
.tar.gz 和 .tgz
解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName
查看:tar ztvf FileName.tar.gz

.bz2
解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName
bzcat
读取压缩文件数据内容的命令
bzcat FileName.bz2
.tar.bz2
解压:tar jxvf FileName.tar.bz2
压缩:tar jcvf FileName.tar.bz2 DirName
查看:tar jtvf FileName.tar.bz2

.zip
解压:unzip FileName.zip
压缩:zip FileName.zip DirName

.rar
解压:rar x FileName.rar
压缩:rar a FileName.rar DirName

rar请到:http://www.rarsoft.com/download.htm 下载!
解压后请将rar_static拷贝到/usr/bin目录(其他由$PATH环境变量指定的目录也可以):
[root@www2 tmp]# cp rar_static /usr/bin/rar

截图工具: scrot

无论是撰写技术教程,还是展示桌面或应用,恐怕scrot都是必不可少的ubuntu屏幕截图工具。scrot 是liunx屏幕抓图工具中的皎皎佼佼者,它小巧而不失为强大,精练而不缺少灵活。
scrot 主要用在命令行下,它使用 imlib2 库来抓取并保存图像。在 Ubuntu 中,可以使用 sudo apt-get install scrot 命令来安装 scrot。scrot 的使用格式为:

scrot [options] [file]


一般用法
就一般而言,使用 scrot 可以抓取整个桌面、某个指定的窗口、以及鼠标拖曳选择的矩形区域。

  1. 抓取桌面:scrot desktop.png,该命令将当前的整个桌面抓取下来,并保存为 desktop.png 文件。可以在当前的目录中找到此图像文件。
  2. 抓取窗口:scrot -bs window.png,选项 b 使 scrot 在抓取窗口时一同将外边框抓取下来,而 s 选项则让用户选择所要抓取的是何窗口。
  3. 抓取区域:scrot -s rectangle.png,在执行此命令后,使用鼠标拖曳的矩形区域将被 scrot 抓取下来。

高级使用
对于普通的抓取使用 scrot 的基础便足以应付了。但在某些特殊情况之下,使用 scrot 抓取图像需要讲究一些技巧。

  1. 延时抓取:scrot -cd 10 menu.png,此命令中的 d 选项用于延时抓取图像,其后的 10 代表延时 10 秒;前面的选项 c 显示倒计时。在抓取菜单或是命令提示时,该技巧将充分展示其魔力。
  2. 生成缩图:scrot -t 50% thumb.png,这个命令在抓取图像的同时生成该图像的缩略图。选项 t 将打开此功能,其后的 50% 为原图的缩放百分比。
  3. 更改品质:scrot -q 70 quality.jpg,此命令中的 q 选项用于更改所抓图像的品质,其数值介于 1-100 之间,默认为 75。数值越大,意味着图像品质越高;同时,图像的压缩率也就越低,占用空间越大。 png 格式是无损压缩, 不管你的压缩等级是多少,图像品质都是完全一样的 (高压缩等级仅仅是增加点压缩时间,类似 gzip -9 ),
    所以尽可能用 scrot -q 1 。-q 1 到 -q 100他们的图像品质完全一样,但是体积却差太多了,所以再建议大家使用此格式。
  4. 操作抓图:scrot action.png -e 'mv $f ~/images/',该命令将抓取的图像移动到 ~/images/ 目录。显然,操作图像的功能由 e 选项开启,其中的 $f 代表原图的路径/文件名。

如果要想用的更舒服,就要再稍微设置一下,毕竟每次截图都去shell中敲命令很不爽,我们选用最常用的参数-s -b,并且添加到菜单栏中去。

首先使用Alacarte Menu Editor把scrot添加到菜单中,比如添加到Graphics组,设置command为scrot -s -b即可,如图:
设置更方便的用scrot截图

然后把这个菜单项拖动到菜单栏上就可以啦,现在想截取窗口图片,就点一下菜单栏上的图标,再点一下窗口标题就可以了,想截取任意屏幕范围,就点一下菜单栏上的图标,再在屏幕上拉框就ok了。

来源:
http://www.simpleseo.cn/computer/screenshot-tool-scrot-ubuntu
http://www.fwolf.com/blog/post/215

系统引导管理器GRUB 初学者指南

作者:北南南北
来自:LinuxSir.Org
摘要: GRUB是多系统引导管理器,简单的说既能引导Linux,同时也能引导Windows;从LinuxSir.Org 讨论区近四年的观察来看,大多初学者并不能在短时间内掌握GRUB的用法,为了解决初学者在最短时间内掌握GRUB,重写GRUB入门文档还是有必要的;

本文重点介绍了GRUB的menu.lst的写法,另外通过GRUB命令行引导系统也做了详述;这些无论是对Windows版本的WINGRUB还是Linux版本的GRUB都是适用的;

一、什么是多重操作系统引导管理器,什么是GRUB;

1、什么是多重操作系统引导管理器及工作原理;

系统启动引导管理器,是在计算机启动后运行的第一个程序,他是用来负责加载、传输控制到操作系统的内核,一旦把内核挂载,系统引导管理器的任务就算完成退出,系统引导的其它部份,比如系统的初始化及启动过程则完全由内核来控制完成;

Briefly, boot loader is the first software program that runs when a computer starts. It is responsible for loading and transferring control to the operating system kernel software (such as the Hurd or the Linux). The kernel, in turn, initializes the rest of the operating system (e.g. GNU).

在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 仍然是我们最常用的多重操作系统引导管理器;


2、什么是GRUB;为什么我要选择GRUB;


1)什么是GRUB;

GNU GRUB 是一个多重操作系统启动管理器。GNU GRUB 是由GRUB(GRand Unified Bootloader) 派生而来。GRUB 最初由Erich Stefan Boleyn 设计和应用;

GNU GRUB is a Multiboot boot loader. It was derived from GRUB, GRand Unified Bootloader, which was originally designed and implemented by Erich Stefan Boleyn.


2)“GRUB太不好用”──对GRUB的认识的误区;

GRUB真的不好用吗?不是的,通过LinuxSir.Org 社区近四年来的运行,我发现了大多新手弟兄还是不太了解GRUB;当然这也有中文Linux社区的责任,虽然也有GRUB的中文译本,初学Linux的弟兄可能有点看不懂;

我们欣喜的看到LinuxSir.Org 社区的好多弟兄都曾经或正在写GRUB实践文档,也有的弟兄也总结了GRUB的一些基础知识,比如 probing兄弟的 《GRUB 学习笔记》;由于每个人的写文档时风格不同,可能同一份文档不同的人来写就有不同的风格;所以今天也抖胆也一篇入门级的教程,由于北南不会写高级教程,所以还得请高手弟兄指教,先谢过;


3)为什么要选择GRUB;

基于在X86架构的CPU而开发操作系统,系统引导管理器不仅仅有GRUB ,而且也有LILO,但对于多重系统引导管理器,你只能选择其一而用;不能两个同时使用;

目前这两个多重系统引导管理器是大家最常用的,也是主流Linux发行版而采用的;有的弟兄喜欢GRUB,比如我个人,有的弟兄喜欢LILO ,比如etony兄(谁是etony,请参见 http://debian.linuxsir.org );

主流发行版 Fedora、Redhat、Centos等基于RPM包的系统,在最新版本中都默认GRUB引导;Slackware 目前仍采用LILO;而Debian发行版目前最新的版本也是采用GRUB;

从目前看来,GRUB有逐渐取代LILO之势,GRUB 2.0正在开发之中;所以我们有理由用GRUB,我也有理由写GRUB使用教程;


二、GRUB软件包版本选择和安装;


1、GRUB的版本选择,Linux版本的GRUB及Windows版本的GRUB的说明;

GRUB不但有Linux版本,也有Windows版本;现我们一一介绍;

如前面所说,目前在在Unix类的操作系统中,大多是都有GRUB;GRUB几乎能引导所有X86架构的操作系统;功能之强,使用简单是GRUB最大的卖点;由于Windows 操作系统的先入为主的优势,使得大家对Windows的NTLOADER了解的比较多,而对开源社区的GRUB显得有点寞生,由此而带来使用上的“心理恐惧”;究其初学者对GRUB“恐惧”的主要原因还是对GRUB没有太多的了解和深入;无论是WINGRUB还是Linux版本的GRUB,最方便的还是对GRUB命令行的操作;一谈到命令行(Command)的操作,可能初学者对此恐惧;其实没有什么难的,象北南这样低级的写手,还能操作得起来,您也应该能行;


2、GRUB的Windows版本WINGRUB;

请参考:《以WINGRUB 引导安装Fedora 4.0 为例,详述用WINGRUB来引导Linux的安装》


3、GRUB的Linux版本软件包的安装;

其实对于Linux的GRUB,几乎所有的Linux主流发行版都有打包,如果您安装了Linux,并且在开机后出现GRUB字样的,证明您已经安装了GRUB;而无需再次安装;Linux的GRUB软件包安装部份并不是本文的重点;

如果您的Linux系统没有安装GRUB,或者采用的是LILO,而您想用GRUB,可以用系统安装盘自带GRUB软件包来安装,或者到相关发行版本的软件仓库下载后安装;

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

请参考《Fedora / Redhat 软件包管理指南》

 

[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

 

如果您不能找到这两个命令,可能您的可执行程序的路径没有设置;

请参考:《设置可执行程序路径》,当然您可以用绝对路径;比如下面的;

 

[root@localhost ~]# /usr/sbin/grub
[root@localhost ~]# /usr/sbin/grub-install

 

如果您还是找不到GRUB软件包安装在哪了;您可以用下面的命令来解决和查找;

 

[root@localhost ~]# updatedb  注:这个要花很长时间;是索引slocate 的库,然后再通过locate来查找;
[root@localhost ~]# locate grub

 

比如找到的是有类似如下的;

[root@localhost ~]# locate grub
/sbin/grub-md5-crypt
/sbin/grub
/sbin/grub-install
/sbin/grub-terminfo

 

在一般情况下,在路径中带有bin或sbin中字样的,这些路径下都是可执行程序;sbin 是超级权限用户才能使用的管理命令;要使用这些命令一般的情况下得切换到root用户下才能使用;比如

 

[beinan@localhost ~]$ su -  注:切换到root用户,并且切换到其家目录;
Password:
[root@localhost ~]#/sbin/grub  注:用绝对路径来运行grub命令;

 


三、在Linux中,GRUB的配置中的安装和写入硬盘的MBR;


1、在Linux中,GRUB配置过程中的安装grub-install;

grub-install 命令有何用呢?其实就是把我们前面已经安装的软件包中的一些文件复制到 /boot/grub中;对于新安装GRUB软件包后,也是一个必经的过程;我们前面所说的GRUB软件包的安装;而现在我们说的是GRUB配置的过程中的安装;虽然在洋文中都是install ,但表达的意思是不一样的;

我们首先要运行 fdisk -l 来确认到底是硬盘的标识;

这个过程主要是确认硬盘的标识是哪个调备,到底是/dev/hda还是/dev/hdb 还是其它的;

 

[root@localhost ~]# fdisk -l

Disk /dev/hda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1         970     7791493+   7  HPFS/NTFS
/dev/hda2             971        9729    70356667+   5  Extended
/dev/hda5             971        2915    15623181    b  W95 FAT32
/dev/hda6            2916        4131     9767488+  83  Linux
/dev/hda7            4132        5590    11719386   83  Linux
/dev/hda8            5591        6806     9767488+  83  Linux
/dev/hda9            6807        9657    22900626   83  Linux
/dev/hda10           9658        9729      578308+  82  Linux swap / Solaris

 

如果通过fdisk -l 出现有/dev/hda字样的,我们就要用下面的命令来安装;

 

[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 script `grub-install'.

(fd0)   /dev/fd0
(hd0)   /dev/hda

 

如果是您fdisk -l 出现的有/dev/hdb呢,那就如下运行;

 

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

 

如果既有/dev/hda和/dev/hdb 就安装到/dev/hda中;

 

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

 

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

 

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

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

 

注解:具体是/dev/hda还是/dev/hdb,请以fdisk -l 为准;如果两个都有,就看您把/boot分区是放在第一块硬盘还是第二块硬盘上了,以实际情况为准;


2、设定GRUB的/boot分区并写入MBR;;

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

 

[root@localhost ~]# grub

 

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

接着看例子,我们要找到 /boot/grub/stage1的,在grub>后面输入;

 

grub> find  /boot/grub/stage1
(hd0,6) 
(fd0)   注:这个是软驱;现在很少用软驱了,如果您有这方面的需要,自己看GRUB的DOC吧;

 

注解:

(hd0,6) 这是/boot所在的分区;不要误解为是Linux 的/所在的分区,这是值得注意的;
(fd0) 注:这个是软驱;现在很少用软驱了,如果您有这方面的需要,自己看GRUB的DOC吧;

 

grub>root (hd0,6)    注:这是/boot所在的分区;
grub>setup (hd0)   注:把GRUB写到MBR上;

 

注解:

上面这步骤是根据 find /boot/stage1而来的,仔细看一下就明白了;现在我们一般安装很少会把/boot分区列为一个单独的分区;不过有的弟兄可能也喜欢这么做;所以还是有必要说一下为好;


四、GRUB的配置文件的menu.lst的写法;

对于GRUB来说,如果没有配置menu.lst,无论是Linux版本的GRUB,还是WINGRUB,都会有命令行可用,通过命令行是一样能把操作系统引导起来的;有些弟兄总以为menu.lst 配置错了, 或者在机器启动后出现grub>命令行模式就要重新安装系统,其实根本没有这个必要;只要学会GRUB的命令行的用法,根本没有必要重装系统;

menu.lst 位于/boot/grub目录中,也就是/boot/grub/menu.lst 文件;您可以用vi或您喜欢的编辑器来编辑他;如果您不会用vi,还是去学习一下吧;简单的用法怎么也得会,对不对?毕竟这个文档不是讲vi的用法的;

有的弟兄会说,我没有menu.lst怎么办?那就创建一个;用下面的命令;

 

[root@localhost ~]# touch  /boot/grub/menu.lst


然后我们再做一个/boot/grub/menu.lst 的链接 /boot/grub/grub.conf

[root@localhost ~]# cd /boot/grub
[root@localhost ~]# ln -s menu.lst grub.conf

 

现在我们来写GRUB的menu.lst了,因为/boot/grub/grub.conf是 /boot/grub/menu.lst的链接文件,改哪个都行。链接文件相当于Windows的快捷方式,这样可能能更好的理解;


1、menu.lst的写法之一;

首先我们看一下我的Fedora 4.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_FC4)
        root (hd0,6)
        kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/
        initrd /boot/initrd-2.6.11-1.1369_FC4.img
title WinXp
        rootnoverify (hd0,0)
        chainloader +1

 

注解:

default=0


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

timeout=5


注:表示在开机后,GRUB画面出现几秒后开始以默认启动;如果在启动时,移动上下键,则解除这一规则;
#splashimage=(hd0,6)/boot/grub/splash.xpm.gz 注:GRUB的背景画面,这个是可选项;我不喜欢GRUB的背景画面,所以加#号注掉,也可以删除;

hiddenmenu

 

注解:隐藏GRUB的启动菜单,这项也是可选的,也可以用#号注掉;

一般的情况下对Linux操作系统的启动,一般要包括四行;title 行;root行;kernel 行;initrd 行;


1)在menu.lst中 ,通过 root (hd[0-n],y)来指定/boot 所在的分区;

title XXXXX 注:title 后面加一个空格,title 是小写的,后面可以自己定义;比如FC4,自己定义一个名字就行;
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能启动起来最为重要东西;

有的弟兄会问,root (hd[0-n],y)是怎么来的?

请参考:《在Linux系统中存储设备的两种表示方法》

2)在menu.lst中,kernel 命令行的写法;

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

比如例子中是;

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


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

kernel /vmlinuz-2.6.11-1.1369_FC4 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/hda7              11G  9.2G  1.2G  90% /
/dev/shm              236M     0  236M   0% /dev/shm

 

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

[root@localhost ~]# ls /boot/vmlinuz*
/boot/vmlinuz-2.6.11-1.1369_FC4   注:看到内核vmlinuz所处的目录;

 

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

 

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



3)initrd 命令行的写法;

 

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

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

 

[root@localhost ~]# ls /boot/initrd*
/boot/initrd-2.6.11-1.1369_FC4.img

 

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

 

initrd  /initrd-2.6.11-1.1369_FC4.img

 

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

 

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

 


4)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/hda7              11G  9.2G  1.2G  90% /
/dev/shm              236M     0  236M   0% /dev/shm

 

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

[root@localhost ~]# more /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=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 root 1.6M 2005-06-03  /boot/vmlinuz-2.6.11-1.1369_FC4
[root@localhost ~]# ls -lh /boot/initrd*
-rw-r--r--  1 root root 1.1M 11月 26 22:30 /boot/initrd-2.6.11-1.1369_FC4.img

 


3]开始写menu.lst ;

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

 

default=0 
timeout=5
title FC4
        root (hd0,6)
        kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/
        initrd /boot/initrd-2.6.11-1.1369_FC4.img

 

也可以写成;

 

default=0 
timeout=5
title FC4
        root (hd0,6)
        kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7
        initrd /boot/initrd-2.6.11-1.1369_FC4.img

 

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

2、menu.lst的写法之二,精简型;

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


1)第一种情况:/boot和Linux的/根分区在同一个分区;

有前面的那么多的讲解,menu.lst写法之二就好理解多了;也得分两种情况,咱们先把/boot并不是独处一个分区,而是和Linux的根分区处于同一个分区;我们以 4)menu.lst第一种方法的写法总结 的实例为例子;

 

default=0 
timeout=5
title FC4x
        kernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7
        initrd (hd0,6)/boot/initrd-2.6.11-1.1369_FC4.img

 

注解:

title FC4x 注:自己为这个Linux 起个简单的名,以title开头,然后一个空格,后面就自己发挥吧,FC4或FC4x都行;

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

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

initrd 空格 (hd0,6)/boot/initrd-2.6.11-1.1369_FC4.img
initrd 这行可以这样理解 initrd (/boot所在的分区)/boot/内核文件名全称


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

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

[root@localhost ~]# df -lh
Filesystem            容量  已用 可用 已用% 挂载点
/dev/hda6              200M  120M  80M  60% /boot
/dev/hda7              11G  9.2G  1.2G  90% /

 

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

LABEL=/                 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2

 

所以我们应该写成如下的;

 

title FC4x
        kernel (hd0,5)/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/
        initrd (hd0,5)/initrd-2.6.11-1.1369_FC4.img

 

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

 

title FC4x
        kernel (hd0,5)/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7
        initrd (hd0,5)/initrd-2.6.11-1.1369_FC4.img

 


五、通过GRUB命令行来启动Linux操作系统;

GRUB的命令行才是王道,如果知道怎么用命令行来启动操作系统,那理解menu.lst的写法也不难;也就是说在开机的时候,不用GRUB的菜单,通过GRUB的命令也是一样能把操作系统引导起来。

因为menu.lst的内容就是GRUB的一个一个的指令集合;是不是Linux这玩意很神奇?

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

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

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

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


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

如果开机时,GRUB出现的是grub>,说明你没有/etc/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                                  color NORMAL [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_FC4.img System.map-2.6.11-1.1369
_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4 grubBAK memtest86+-1.55
.1 xen-syms xen.gz

grub> kernel /boot/vmlinuz-2.6.11-1.1369_FC4 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_FC4 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_FC4 ro root=/dev/hda7
   [Linux-bzImage, setup=0x1e00, size=0x18e473]

 

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

 

grub> kernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 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_FC4.img
   [Linux-initrd @ 0x2e1000, 0x10e685 bytes]

 

如果/boot是独立的一个分区,应该是如下样子的语法;比如下面的;

 

grub> initrd /initrd在这里tab 来补齐;
grub> initrd /initrd-2.6.11-1.1369_FC4.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=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 0x83

grub> kernel /boot/在这里按tab补齐,全列出/boot所有的文件;
Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4 
memtest86+-1.55.1 xen-syms xen.gz

grub> kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7  注:输入
   [Linux-bzImage, setup=0x1e00, size=0x18e473]

grub> initrd /boot/在这里按tab补齐
Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4 
memtest86+-1.55.1 xen-syms xen.gz

grub> initrd /boot/initrd-2.6.11-1.1369_FC4.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 - see 'man fstab-sync' for 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 0x83

grub> kernel /boot/在这里按tab补齐,全列出/boot所有的文件;
Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4 
memtest86+-1.55.1 xen-syms xen.gz

grub> kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/ 
   [Linux-bzImage, setup=0x1e00, size=0x18e473]

grub> initrd /boot/在这里按tab补齐
Possible files are: grub initrd-2.6.11-1.1369_FC4.img System.map-2.6.11-1.1369_FC4 config-2.6.11-1.1369_FC4 vmlinuz-2.6.11-1.1369_FC4 grubBAK
memtest86+-1.55.1 xen-syms xen.gz

grub> initrd /boot/initrd-2.6.11-1.1369_FC4.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_FC4 ro root=LABEL=/
grub>initrd (hd0,6)/boot/initrd-2.6.11-1.1369_FC4.img
grub>boot

 

 

grub>kernel (hd0,6)/boot/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7
grub>initrd (hd0,6)/boot/initrd-2.6.11-1.1369_FC4.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_FC4 ro root=LABEL=/
grub>initrd (hd0,5)/initrd-2.6.11-1.1369_FC4.img
grub>boot

 

 

grub>kernel (hd0,5)/vmlinuz-2.6.11-1.1369_FC4 ro root=/dev/hda7
grub>initrd (hd0,5)/initrd-2.6.11-1.1369_FC4.img
grub>boot



六、通过GRUB引导Windows操作系统;


1、通过编辑 menu.lst 来引导Windows 系统;

 

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

title WinXp
        rootnoverify (hd0,0)
        chainloader +1

 

如果您的机器有两块硬盘,而Windows 位于第二个硬盘的第一个分区,也就是(hd1,0)

您可以用grub的map来指令来操作把两块硬盘的序列对调,这样就不用在BIOS中设置了;在menu.lst中加如下的内容,比如下面的;

 

title WinXp
        map (hd0) (hd1)
        map (hd1) (hd0)
        rootnoverify (hd0,0)
        chainloader +1
  makeactive

 

如果Windows的分区不位于硬盘的第一个分区怎么办呢?比如在(hd0,2);

这个也好办吧,把rootnoverify 这行的(hd0,0)改为 (hd0,2)

 

title WinXp
        rootnoverify (hd0,2)
        chainloader +1
  makeactive

 

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

 

title WinXp
        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进入修复模式;

请参考:《Linux 系统的单用户模式、修复模式、跨控制台登录在系统修复中的运用》

首先:您根据前面所说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就OK了。前面已经谈过了;

写好后还要建一个grub.conf的链接,如下:

 

[root@localhost ~]# cd /boot/grub
[root@localhost grub]# ln -s menu.lst grub.conf

 


八、关于GRUB的未尽事宜;

GRUB有很多内容,比如对BSD的引导,还有一些其它指令的用法,我并没有在本文提到;主要我目前还未用到,如果您需要了解更多,请查看 《GNU GRUB 手册和FAQ》


九、关于本文;

本文前后写了三四天,中间发现并不能把Linux设备的两种表现形式说的清楚,于是被迫写了《在Linux系统中存储设备的两种表示方法》;由于没有BSD系统,所以没有写关于BSD的引导;如果正在用BSD的弟兄如果有时间不妨写一写;写的时候注意文档的结构,这样方便大家的阅读;

GRUB有很多内容,需要大家慢慢的学习和研究;有的弟兄抑制GRUB,说不如NTLOADER,其实这是错误的;如果您想学习和使用Linux就得学习和适应Linux的操作;习惯成自然,如果您抵制学习Linux,那可能您永远会说“Linux不如Windows”;


十、参考文档;

《GNU GRUB 手册和FAQ》


十一、相关文档;

《以WINGRUB 引导安装Fedora 4.0 为例,详述用WINGRUB来引导Linux的安装》
《系统引导管理器GRUB学习笔记》
《如何为GRUB系统引导管理器加上密码》
《在Linux系统中存储设备的两种表示方法》
《合理规划您的硬盘分区》
《系统引导过程及硬盘分区结构论述》
《Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍》
《实例解说 fdisk 使用方法》

服务管理软件:sysv-rc-conf

sysv-rc-conf简介
sysv-rc-conf是一个强大的服务管理程序,群众的意见是sysv-rc-conf比chkconfig好用。

背景知识
1、Ubuntu运行级别
Linux 系统任何时候都运行在一个指定的运行级上,并且不同的运行级的程序和服务都不同,所要完成的工作和要达到的目的都不同,系统可以在这些运行级之间进行切换,以完成不同的工作。

Ubuntu 的系统运行级别:
0        系统停机状态
1        单用户或系统维护状态
2~5    多用户状态
6        重新启动

查看当前运行级别,执行命令:
runlevel
( runlevel 显示上次的运行级别和当前的运行级别,“N”表示没有上次的运行级别。)

切换运行级别,执行命令:    
init [0123456Ss]
( 即在 init 命令后跟一个参数,此参数是要切换到的运行级的运行级代号,如:用 init 0 命令关机;用 init 6 命令重新启动。)


安装sysv-rc-conf
sudo apt-get install sysv-rc-conf

使用sysv-rc-conf
sudo sysv-rc-conf
操作界面十分简洁,你可以用鼠标点击,也可以用键盘方向键定位,用空格键选择,用Ctrl+N翻下一页,用Ctrl+P翻上一页,用Q退出。

常见的系统服务有:
acpi-support 高级电源管理支持
acpid acpi 守护程序.这两个用于电源管理,非常重要
alsa 声音子系统
alsa-utils
anacron cron 的子系统,将系统关闭期间的计划任务,在下一次系统运行时执行。
apmd acpi 的扩展
atd 类似于 cron 的任务调度系统。建议关闭
binfmt-support 核心支持其他二进制的文件格式。建议开启
bluez-utiles 蓝牙设备支持
bootlogd 启动日志。开启它
cron 任务调度系统,建议开启
cupsys 打印机子系统。
dbus 消息总线系统(message bus system)。非常重要
dns-clean 使用拨号连接时,清除 dns 信息。
evms 企业卷管理系统(Enterprise Volumn Management system)
fetchmail 邮件用户代理守护进程,用于收取邮件
gdm gnome 登录和桌面管理器。
gdomap
gpm 终端中的鼠标支持。
halt 别动它。
hdparm 调整硬盘的脚本,配置文件为 /etc/hdparm.conf。
hibernate 系统休眠
hotkey-setup 笔记本功能键支持。支持类型包括: HP, Acer, ASUS, Sony,Dell, 和 IBM。
hotplug and hotplug-net 即插即用支持,比较复杂,建议不要动它。
hplip HP 打印机和图形子系统
ifrename 网络接口重命名脚本。如果您有十块网卡,您应该开启它
inetd 在文件 /etc/inetd.conf 中,注释掉所有你不需要的服务。如果该文件不包含任何服务,那关闭它是很安全的。
klogd 重要。
linux-restricted-modules-common 受限模块支持。
/lib/linux-restricted-modules/ 文件夹中的模块为受限模块。例如某些驱动程序,如果您没有使用受限模块,就不需要开启它。
lvm 逻辑卷管理系统支持。
makedev 创建设备文件,非常重要。
mdamd 磁盘阵列
module-init-tools 从/etc/modules 加载扩展模块,建议开启。
networking 网络支持。按 /etc/network/interfaces 文件预设激活网络,非常重要。
ntpdate 时间同步服务,建议关闭。
pcmcia pcmcia 设备支持。
powernowd 移动 CPU 节能支持
ppp and ppp-dns 拨号连接
readahead 预加载库文件。
reboot 别动它。
resolvconf 自动配置 DNS
rmnologin 清除 nologin
rsync rsync 守护程序
sendsigs 在重启和关机期间发送信号
single 激活单用户模式
ssh ssh 守护程序。建议开启
stop-bootlogd 在 2,3,4,5 运行级别中停止 bootlogd 服务
sudo 检查 sudo 状态。重要
sysklogd 系统日志
udev & udev-mab 用户空间 dev 文件系统(userspace dev filesystem)。重要
umountfs 卸载文件系统
urandom 随机数生成器
usplash 开机画面支持
vbesave 显卡 BIOS 配置工具。保存显卡的状态
xorg-common 设置 X 服务 ICE socket。
adjtimex 调整核心时钟的工具
dirmngr 证书列表管理工具,和 gnupg 一起工作。
hwtools irqs 优化工具
libpam-devperm 系统崩溃之后,用于修理设备文件许可的守护程序。
lm-sensors 板载传感器支持
mdadm-raid 磁盘陈列管理器
screen-cleanup 清除开机屏幕的脚本
xinetd 管理其他守护进程的一个 inetd 超级守护程序