让ubuntu直接启动到文本模式(转帖2)

http://mushroom.phpower.net/index.php?action=show&id=117

Debian的init进程初始化工作原理(转)

 

init和inittab

=============

Linux下为什么会要有个init?用过windows 9.x的人应该知道有个批处理文件autoexec.bat,用过windows NT/2000系统的人应该在控制面板中见过system service工具,它们的目的是相同的。只是比较起来windows下的这些东西功能太弱(当然用法也更简单)。

init是Linux启动的最后一步,它帮助用户完成每次启动系统都必须完成的一些重复性任务,如加载文件系统、各类网络服务等等程序;它还有一个重要用途,让用户自定义系统运行环境,只启动需要的进程,关闭不用的进程,释放内存和处理器资源,让系统运行得更快更稳。

init 会按任务表执行我们下的命令,这个任务表就是/etc/inittab文件。我们可以为系统制定多个运行环境以满足不同任务的需要,在inittab中称之为运行等级(runlevel)。例如,计算机要用来完成一种联网编译任务(与其它系统共享CPU周期,合作编译软件),这样情况需占用大量CPU能力和内存,所以当计算机用作这种用途时,其他程序的运行要尽可能少。可设置一个运行等级(如:runlevel 4),把其它程序包括X Window全关闭,只启动联网编译进程;其他时段,你的计算机要与Windows系统共享文件,需要启动Samba,可以再定义一个运行等级(如: runlevel 2)。

现在当你要进行联网编译时可运行init 4,而不用手工去关闭每个暂不需要的进程;要与Windows系统共享文件可运行init 2。

Debian系统对某些运行等级进行了预先配置(而且是无法修改的)

runlevel 0:它的任务就是关闭所有程序,关机。如果计算机及内核支持APM,系统电源可自动切断。

runlevel 1:为单用户模式保留的。在这个运行等级下,除了一个root shell外,没有其它程序运行。除了root文件系统以只读方式安装外,不安装其它文件系统。该运行等级通常在恢复系统时用。

runlevel 6:与runlevel 0非常相似,只是它是重启系统而不是关闭系统。

runlevel 2、3、4、5:Debian系统对它们没有具体规定,通常可自由进行定制,它们都属于多用户模式。其中runlevel 3是Debian使用的默认运行等级。启动Debian系统时,用的就是这个运行等级。

下面是inittab文件的例子

# /etc/inittab: init(8) configuration.

# $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $

# The default runlevel.

id:2:initdefault:

# Boot-time system configuration/initialization script.

# This is run first except when booting in emergency (-b) mode.

si::sysinit:/etc/init.d/rcS

# What to do in single-user mode.

~~:S:wait:/sbin/sulogin

# /etc/init.d executes the S and K scripts upon change

# of runlevel.

#

# Runlevel 0 is halt.

# Runlevel 1 is single-user.

# Runlevels 2-5 are multi-user.

# Runlevel 6 is reboot.

l0:0:wait:/etc/init.d/rc 0

l1:1:wait:/etc/init.d/rc 1

l2:2:wait:/etc/init.d/rc 2

l3:3:wait:/etc/init.d/rc 3

l4:4:wait:/etc/init.d/rc 4

l5:5:wait:/etc/init.d/rc 5

l6:6:wait:/etc/init.d/rc 6

# Normally not reached, but fallthrough in case of emergency.

z6:6:respawn:/sbin/sulogin

# What to do when CTRL-ALT-DEL is pressed.

ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

# Action on special keypress (ALT-UpArrow).

#kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work."

# What to do when the power fails/returns.

pf::powerwait:/etc/init.d/powerfail start

pn::powerfailnow:/etc/init.d/powerfail now

po::powerokwait:/etc/init.d/powerfail stop

# /sbin/getty invocations for the runlevels.

#

# The "id" field MUST be the same as the last

# characters of the device (after "tty").

#

# Format:

# <id>:<runlevels>:<action>:<process>

#

# Note that on most Debian systems tty7 is used by the X Window System,

# so if you want to add more getty's go ahead but skip tty7 if you run X.

#

1:2345:respawn:/sbin/getty 38400 tty1

2:23:respawn:/sbin/getty 38400 tty2

3:23:respawn:/sbin/getty 38400 tty3

4:23:respawn:/sbin/getty 38400 tty4

5:23:respawn:/sbin/getty 38400 tty5

6:23:respawn:/sbin/getty 38400 tty6

# Example how to put a getty on a serial line (for a terminal)

#

#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100

#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100

# Example how to put a getty on a modem line.

#

#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3

该文件有一个基本类型的指令,它们指定命令行,命令行所采取的动作,在何种运行等级下激活命令。这引起命令行的格式大体如下:

id:runlevels:action:command

id是任意一个名称(具体是什么并不重要),runlevels是一个数字串(代表运行等级),action描述何时执行命令,command指定执行的实际命令。拿启动getty的命令行举例:

1:2345:respawn:/sbin/getty 38400 tty1

该命令告诉init,它应该在引导后以运行等级2-5运行命令/sbin/getty 38400 tty1。动作标记respawn表示命令在退出时重新运行(当用户在shell输入exit的时候)。

从方面的文件中可以看到,运行等级2和3有六个活动的gettys,而等级4和5只有一个。假设运行等级4下有三个shell运行在虚拟控制台。你在ID为2和3的命令行的运行等级字段添加了数字4,也就是说你将

2:23:respawn:/sbin/getty 38400 tty2

3:23:respawn:/sbin/getty 38400 tty3

替换成

2:234:respawn:/sbin/getty 38400 tty2

3:234:respawn:/sbin/getty 38400 tty3

然后重启或执行以下命令:

telinit q

对inittab进行修改。telinit q命令指示init重新加载它的配置。参阅telinit(8)。

/etc/inittab的其它行看起来比较复杂,我们先看看还有哪些动作标记:

·respawn:启动命令并监视命令的执行,当进程退出时,再次执行该命令(通常用于虚拟终端设备上的登录提示)。 ·wait:进入指定运行等级时,启动进程。init会停下来,直到执行完成。这个标记用于设置特定等级下软件的启动。

·once:进入指定的任一运行等级时,启动一次进程。

·boot:该命令在系统引导时运行。这种类型的指令忽略运行等级。

·bootwait:该命令在系统引导时运行,init等到它退出后才能继续做别的事。

·off:禁用所有运行等级下的某个命令。

·initdefault:这种类型的项指定在系统引导时进入哪个运行等级。

·powerwait:这类指令给出在电源不足时需要执行的命令。init直到进程完成后才继续工作。

·powerfail:与powerwait类似,但init不等待进程完成。

·powerworkwait:电源正常后执行。init暂停,直到进程结束。

·powerfailnow:当便携机电池或外部UPS电池电量不足时执行。

·ctrlaltdel:指定init在捕获ctrl+alt+del组合键时执行的命令。

·kbdrequest:把特殊动作映射到特定的按键。Debian中的是alt+UpArrow。

现在再看上面的文件是不是清楚了许多?

更强大的sysvinit

================

inittab 的主要功能是描述引导及正常操作时,应该在何种运行等级下启动什么程序,每个运行等级的具体项目完全可以通常/etc/inittab来定义,但 Debian有一个更健壮的方案sysvinit,它被认为是init最强大的应用程序之一。Debian组织inittab的方式是把运行等级的大部分定义从inittab中移出来,移到一个脚本层次中去。惟一直接从inittab启动的程序只有getty,它用于虚拟设备上启动登录提示符,保留它因为它们要求特殊处理,在inittab之外处理要困难得多。

inittab来启动所有软件当然是可能的,但将所有配置写在同一个文件既不方便查看也不方便维护,所以文件里会加上这许多行:

l0:0:wait:/etc/init.d/rc 0

l1:1:wait:/etc/init.d/rc 1

l2:2:wait:/etc/init.d/rc 2

l3:3:wait:/etc/init.d/rc 3

l4:4:wait:/etc/init.d/rc 4

l5:5:wait:/etc/init.d/rc 5

l6:6:wait:/etc/init.d/rc 6

这些行实际决定了系统在各个运行等级下的行为。它们如何做到的也许并不明显,但至少我们知道主要意思:首先每行都有个符号ID lx,lx表示runlevel x;其次,每行只在一个运行等级下激活,该运行等级对应着符号ID中的数字x。命令执行时,init停下来,直到进程结束。最后,每个命令行调用一个脚本 /etc/init.d/rc x,这里x代表当前运行等级的数字。显然各运行等级的具体任务在/etc/init.d/rc脚本中安排。

Debian init设置的核心在/etc/init.d目录。该目录包含了启动或停止重要软件的脚本,为了简化操作,规定每个脚本都使用相同的一套参数——start或stop。个别软件包维护者为用户着想,往这些脚本中加了其他功能,但init不会去调用它们。

举个例子,可调用:#/etc/init.d/apache start来启动Apache,调用:#/etc/init.d/apache stop来关闭它。

作为一个用户工具,这是非常有用的,它让用户轻松启动和关闭Debian所带的复杂程序,不过在考虑如何启动程序前,先检查/etc/init.d,看看是不是已经有脚本可以做这件事了。借助于这种机制,可以按自己的需求来调整运行等级,/etc/init.d/rc可以把系统引入所需的运行等级。 /etc/rcx.d是一组指向/etc/init.d的符号链接。进行运行等级时,rc在运行等级目录中按逻辑顺序处理每个脚本。首先前缀为K的每个文件都以参数stop(按字母和数字顺序)执行;其次,以S为前缀的每个脚本都以参数start(按字母和数字顺序)执行。

了解了工作原理,下面试着自己来构造一个运行等级。我们使用运行等级5和与之相关的rc目录/etc/rc5.d。首先,看看该目录下的内容:找出每个符号链接所做的工作;查看文件,判断它来自哪个文件。经过仔细查看,找出启动无用程序的S打头的脚本,把它们删掉,在/etc/init.d中找出需要运行但未包括在内的脚本,例如假设你想在运行等级5下启动Samba,执行命令:

ln -s /etc/init.d/samba /etc/rc5.d/S20samba

看到这里是不是对init有了新的了解,那么来测试一下学习成果:关闭Debian默认安装时加载的gdm/xdm/kdm进程,让Debian启动到命令行终端而不是X。

http://www.real-blog.com/linux-bsd-notes/49

以文字模式啟動 Ubuntu

January 31, 2006 @ 11:00 pm · Filed under Linux / BSD 筆記

如果想 Ubuntu 在每次啟動到 command prompt ,可以輸入以下指令:

$echo “false” | sudo tee /etc/X11/default-display-manager

當下次開機時,就會以指令模式啟動,如果想變回啟動 x window,可以輸入:

$echo “/usr/bin/gdm” | sudo tee /etc/X11/default-display-manager

P.S. 如果不是用 gdm 作為,以上指令需要根據你的環境作出更改,例如 kdm 或 xdm。

One thought on “让ubuntu直接启动到文本模式(转帖2)”

  1. 节自:http://wiki.ubuntu.org.cn/UbuntuManual/ch-tips.zh-cn.html

    8.1.4 “我不想直接启动到 X!”

        * 玩 edgy/dapper 很有趣,但在启动进程中执行不稳定的 xdm、gdm、kdm 和 wdm 会让你焦头烂额。 首先,在启动提示符后输入如下指令获得 root shell:

               boot: Linux vga=normal s

          这里的 Linux 是你要启动的内核的标记,“vga=normal”告诉 lilo 在普通 VGA 屏幕下运行,“s”(或“S”)是传给 init 的参数,告诉它进入单用户模式。在提示符后输入 root 密码。 有多种方法禁用 X 启动 daemons:

        * 运行 update-rc.d -f ?dm remove ; update-rc.d ?dm stop 99 1 2 3 4 5 6 .

        * 在所有 /etc/init.d/?dm 文件的最前面加上“exit 0”。

        * 把所有的 /etc/rc2.d/S99?dm 文件改名为 /etc/rc2.d/K99?dm。

        * 删除所有的 /etc/rc2.d/S99?dm 文件。

        *

          运行 :>/etc/X11/default-display-manager 其中,rc2.d 中的数字必须与 /etc/inittab 中指定的 runlevel 一致。而 ?dm 的意思是你要将同一个命令运行多次,每次将其替换成 xdm、gdm、kdm 和 wdm 中的一个。 在 Ubuntu 下只有第一种方法是“唯一正确的方法”。最后一种方法比较简单但只适用于 Ubuntu,而且还需要使用 dpkg-reconfigure 重新设置一次。其它方法都是通用的中 daemons 的方法。 你仍可在任何控制台 shell 中用 startx 命令启动 X。

    这是http://wiki.ubuntu.org.cn上的应用小技巧的相关摘录。整个小技巧目录如下:


    快速导航

    目录

       1. 第 8 章 - Ubuntu 小技巧

             1. 8.1 启动系统

                   1. 8.1.1 “我忘记了 root 密码!”(一)

                   2. 8.1.2 “我忘记了 root 密码!”(二)

                   3. 8.1.3 无法启动系统

                   4. 8.1.4 “我不想直接启动到 X!”

                   5. 8.1.5 其它用于启动提示符的技巧

                   6. 8.1.6 设置 GRUB 启动参数

             2. 8.2 活动记录

                   1. 8.2.1 记录shell活动

                   2. 8.2.2 记录X活动

             3. 8.3 拷贝及创建子目录

                   1. 8.3.1 拷贝整个子目录的基本命令

                   2. 8.3.2 cp

                   3. 8.3.3 tar

                   4. 8.3.4 pax

                   5. 8.3.5 cpio

                   6. 8.3.6 afio

             4. 8.4 差异备份与数据同步

                   1. 8.4.1 使用rdiff进行差异备份

                   2. 8.4.2 使用pdumpfs进行每日备份

                   3. 8.4.3 使用RCS进行定期差异备份

             5. 8.5 系统冻结恢复

                   1. 8.5.1 中止一个进程

                   2. 8.5.2 Alt-SysRq

             6. 8.6 记住这些可爱的小命令

                   1. 8.6.1 Pager

                   2. 8.6.2 释放内存

                   3. 8.6.3 设定时间(BIOS)

                   4. 8.6.4 设定时间(NTP)

                         1. 8.6.4.1 拥有永久Internet连接的系统设置时间

                         2. 8.6.4.2 偶尔进行Internet连接的系统设置时间

                   5. 8.6.5 如何禁用屏幕保护程序

                   6. 8.6.6 搜索系统管理数据库

                   7. 8.6.7 禁用声音(响铃)

                   8. 8.6.8 控制台上的错误信息

                   9. 8.6.9 正确设置控制台类型

                  10. 8.6.10 恢复控制台的健壮性

                  11. 8.6.11 将DOS下的文本文件转换为Unix类型

                  12. 8.6.12 使用 recode 转化文本文件

                  13. 8.6.13 正规表达式的置换

                  14. 8.6.14 使用脚本来编辑文件

                  15. 8.6.15 提取源文件修改部分合并到更新包

                  16. 8.6.16 分割大文件

                  17. 8.6.17 从文本格式的表格中抽取数据

                  18. 8.6.18 精巧的管道命令辅助脚本

                  19. 8.6.19 循环每一个文件的脚本片段

                  20. 8.6.20 短小的Perl脚本

                  21. 8.6.21 从网页上获取文本或邮件列表文档

                  22. 8.6.22 打印网页

                  23. 8.6.23 打印帮助页面

                  24. 8.6.24 合并两个 PostScript 或 PDF 文件

                  25. 8.6.25 命令耗时

                  26. 8.6.26 nice命令

                  27. 8.6.27 日程安排(cron,at)

                  28. 8.6.28 用screen来定制控制台

                         1. 8.6.28.1 远程访问方案

                         2. 8.6.28.2 典型的screen命令

                         3. 8.6.28.3 screen会话中的退格键和Ctrl-H

                         4. 8.6.28.4 X下与screen等价的程序

                  29. 8.6.29 网络测试基础

                  30. 8.6.30 从本地缓冲池中清空(flush)邮件

                  31. 8.6.31 删除本地缓冲池中的冻结邮件

                  32. 8.6.32 再分发 mbox 中的信件

                  33. 8.6.33 清空文件内容

                  34. 8.6.34 空文件

                  35. 8.6.35 chroot

                         1. 8.6.35.1 用 chroot 来运行不同版本的 Ubuntu

                         2. 8.6.35.2 设置chroot登录

                         3. 8.6.35.3 配置chroot下的X

                         4. 8.6.35.4 使用chroot来运行其它发行版

                         5. 8.6.35.5 使用chroot来编译软件包

                  36. 8.6.36 怎样检查硬链接

                  37. 8.6.37 mount硬盘上的镜像文件

                  38. 8.6.38 Samba

                  39. 8.6.39 外来文件系统的操作工具

             7. 8.7 需要注意的典型错误

                   1. 8.7.1 rm -rf .*

                   2. 8.7.2 rm /etc/passwd

Comments are closed.