显示标签为“启动”的博文。显示所有博文
显示标签为“启动”的博文。显示所有博文

2009年12月27日星期日

Linux启动

# 转自:http://blog.chinaunix.net/u/23204/showart_199920.html
# 参考:Linux启动过程综述
, man init

(1) 从BIOS到内核

BIOS自检

计算机在接通电源之后首先由BIOS进行自检,即进行所谓的POST(Power On Self
Test), 然后依据BIOS内设置的引导顺序从硬盘、软盘或CDROM中读入“引导块”。 在 PC 中,引导 Linux 是从 BIOS 中的地址 0xFFFF0 处开始的。BIOS 的第一个步骤是加电自检(POST)。POST 的工作是对硬件进行检测。BIOS 的第二个步骤是进行本地设备的枚举和初始化。给定 BIOS 功能的不同用法之后,BIOS 由两部分组成:POST 代码和运行时服务。当 POST 完成之后,它被从内存中清理了出来,但是 BIOS 运行时服务依然保留在内存中,目标操作系统可以使用这些服务。

要引导一个操作系统,BIOS 运行时会按照 CMOS 的设置定义的顺序来搜索处于活动状态并且可以引导的设备。引导设备可以是软盘、CD-ROM、硬盘上的某个分区、网络上的某个设备,甚至是 USB 闪存。通常,Linux 都是从硬盘上引导的,其中主引导记录(MBR)中包含主引导加载程序。MBR 是一个 512 字节大小的扇区,位于磁盘上的第一个扇区中(0 道 0 柱面 1 扇区)。当 MBR 被加载到 RAM 中之后,BIOS 就会将控制权交给 MBR。

提取 MBR 的信息

要查看 MBR 的内容,请使用下面的命令:

# dd if=/dev/hda of=mbr.bin bs=512 count=1 # od -xa mbr.bin

这个 dd 命令需要以 root 用户的身份运行,它从 /dev/hda(第一个 IDE 盘) 上读取前 512 个字节的内容,并将其写入 mbr.bin 文件中。od 命令会以十六进制和 ASCII 码格式打印这个二进制文件的内容。
(2)启动GRUB/LILO

GRUB和LILO都是引导加载程序。最简单地 讲,引导加载程序(boot loader) 会引导操作系统。当机器引导它的操作系统时,BIOS 会读取引导介质上最前面的 512 字节(即人们所知的 主引导记录(master boot record,MBR))。在单一的 MBR 中只能存储一个操作系统的引导记录,所以当需要多个操作系统时就会出现问题。所以需要更灵活的引导加载程序。

GRUB 与 LILO 的比较

如本文开始处所述,所有引导加载程序都以类似的方式工作,满足共同的目的。不过,LILO 和 GRUB 之间有很多不同之处:

  • LILO 没有交互式命令界面,而 GRUB 拥有。
  • LILO 不支持网络引导,而 GRUB 支持。
  • LILO 将关于可以引导的操作系统位置的信息物理上存储在 MBR 中。如果修改了 LILO 配置文件,必须将 LILO 第一阶段引导加载程序重写到 MBR。相对于 GRUB,这是一个更为危险的选择,因为错误配置的 MBR 可能会让系统无法引导。使用 GRUB,如果配置文件配置错误,则只是默认转到 GRUB 命令行界面。

安全提示:

关于安全性,任何可以接触到引导磁盘/CD 的人,只需要使用没有设置安全性的 grub.conf 或 lilo.conf,就可以绕过本文中提及的所有安全措施。特别是使用 GRUB 时,因为能够引导到单用户模式,所以是一个严重的安全漏洞。解决此问题的一个简单方法是在机器的 BIOS 中禁止通过 CD 和软盘进行引导,并确保为 BIOS 设置了一个口令,使得其他人不能修改这些设置。
(3)加载内核

当内核映像被加载到内存之后,内核阶段就开始了。 内核映像并不是一个可执行的内核,而是一个压缩过的内核映像。通常它是一个 zImage(压缩映像,小于 512KB)或一个 bzImage(较大的压缩映像,大于 512KB),它是提前使用 zlib 进行压缩过的。在这个内核映像前面是一个例程,它实现少量硬件设置,并对内核映像中包含的内核进行解压,然后将其放入高端内存中,如果有初始 RAM 磁盘映像,就会将它移动到内存中,并标明以后使用。然后该例程会调用内核,并开始启动内核引导的过程。

GRUB 中的手工引导

在 GRUB 命令行中,我们可以使用 initrd 映像引导一个特定的内核,方法如下:

grub> kernel /bzImage-2.6.14.2
[Linux-bzImage, setup=0x1400, size=0x29672e]

grub> initrd /initrd-2.6.14.2.img
[Linux-initrd @ 0x5f13000, 0xcc199 bytes]

grub> boot

Uncompressing Linux... Ok, booting the kernel.
如果您不知道要引导的内核的名称,只需使用斜线(/)然后按下 Tab 键即可。GRUB 会显示内核和 initrd 映像列表。
(4)执行init进程

init进程是系统所有进程的起点,内核在完成核内引导以后,即在本线程(进程)空间内加载init程序,它的进程号是1。init进程是所有进程的发起 者和控制者。因为在任何基于Unix的系统(比如Linux)中,它都是第一个运行的进程,所以init进程的编号(Process ID,PID)永远是1。如果init出现了问题,系统的其余部分也就随之而垮掉了。

init进程有两个作用。第一个作用是扮演终结父进程的角色。因为init进程永远不会被终止,所以系统总是可以确信它的存在,并在必要的时候以它为参 照。如果某个进程在它衍生出来的全部子进程结束之前被终止,就会出现必须以init为参照的情况。此时那些失去了父进程的子进程就都会以init作为它们 的父进程。快速执行一下ps -af 命令,可以列出许多父进程ID(Parent Process ID,PPID)为1的进程来。

init的第二个角色是在进入某个特定的运行级别(Runlevel)时运行相应的程序,以此对各种运行级别进行管理。它的这个作用是由/etc/inittab文件定义的。
(5)通过/etc/inittab文件进行初始化

init的工作是根据/etc/inittab来执行相应的脚本进行系统初始化,如设置键盘、字体, 装载模块,设置网络,等等。

对于RedhatLinux来说,执行的顺序为:

  • /etc/rc.d/rc.sysinit # 由init执行的第一个脚本
    /etc/rc.d/rc.sysinit主要做在各个运行模式中相同的初始化工作,包括:
    设置初始的$PATH变量。
    配置网络。
    为虚拟内存启动交换。
    设置系统的主机名。
    检查root文件系统,以进行必要的修复。
    检查root文件系统的配额。
    为root文件系统打开用户和组的配额。
    以读/写的方式重新装载root文件系统。
    清除被装载的文件系统表/etc/mtab。
    把root文件系统输入到mtab。
    使系统为装入模块做准备。
    查找模块的相关文件。
    检查文件系统,以进行必要的修复。
    加载所有其他文件系统。
    清除几个/etc文件:/etc/mtab、/etc/fastboot和/etc/nologin。
    删除UUCP的lock文件。
    删除过时的子系统文件。
    删除过时的pid文件。
    设置系统时钟。
    打开交换。
    初始化串行端口。
    装入模块。
  • /etc/rc.d/rcX.d/[KS]

    首先终止“K”开头的服务,然后启动“S”开头的服务。

    对每一个运行级别来说,在/etc/rc.d子目录中都有一个对应的下级目录。这些运行级别的下级子目录的命名方法是rcX.d,其中的X就是代表运行级 别的数字。比如说,运行级别3的全部命令脚本程序都保存在/etc/rc.d/rc3.d子目录中。在各个运行级别的子目录中,都建立有到/etc /rc.d/init.d子目录中命令脚本程序的符号链接,但是,这些符号链接并不使用命令脚本程序在 /etc/rc.d/init.d子目录中原来的名字。如果命令脚本程序是用来启动一个服务的,其符号链接的名字就以字母S打头;如果命令脚本程序是用来 关闭一个服务的,其符号链接的名字就以字母K打头。许多情况下,这些命令脚本程序的执行顺序都很重要。如果没有先配置网络接口,就没有办法使用DNS服务 解析主机名!为了安排它们的执行顺序,在字母S或者 K的后面紧跟着一个两位数字,数值小的在数值大的前面执行。比如:/etc/rc.d/rc3.d/S50inet就会在 /etc/rc.d/rc3.d/S55named之前执行。存放在/etc/rc.d/init.d子目录中的、被符号链接上的命令脚本程序是真正的实 干家,是它们完成了启动或者停止各种服务的操作过程。当 /etc/rc.d/rc运行通过每个特定的运行级别子目录的时候,它会根据数字的顺序依次调用各个命令脚本程序执行。它先运行以字母K打头的命令脚本程 序,然后再运行以字母S打头的命令脚本程序。对以字母K打头的命令脚本程序来说,会传递Stop参数;类似地对以字母S打头的命令脚本程序来说,会传递 Start参数。
  • 执行/etc/ec.d/rc.local
    Redhat Linux中的运行模式2、3、5都把/etc/rc.d/rc.local做为初始化脚本中的最后一个,所以用户可以自己在这个文件中添加一些需要在其 他初始化工作之后,登录之前执行的命令。在维护Linux系统运转的日子里,肯定会遇到需要系统管理员对开机或者关机命令脚本进行修改的情况。如果所做的 修改只在引导开机的时候起作用,并且改动不大的话,可以考虑简单地编辑一下/etc/rc.d/rc.local脚本。这个命令脚本程序是在引导过程的最 后一步被执行的。
  • 执行 /bin/login 程式

    login 程序会提示使用者需输入账号及密码, 接着编码并确认密码的正确性, 若二者相合, 则为使用者进行初始化环境, 并将控制权交给 shell,即等待用户登录。
    多次为止Linux启动过程全部结束。

最后笔者使用图1解释全部过程。

图1 Linux启动流程

总结:与 Linux 本身非常类似,Linux 的启动引导过程也非常灵活,可以支持众多的处理器和硬件平台。LILO 引导加载程序对引导能力进行了扩充,但是它却缺少文件系统的感知能力。最新一代的引导加载程序,例如 GRUB将更加灵活。

2009年12月18日星期五

cat引起的一个奇怪的问题,bug?

今天,在gnome里面cat /var/run/utmp
就因为这个,gnome崩溃了,现象如下:
登录gnome的时候,只有桌面,没有任何菜单,和图标之类的东西,同时在主目录下面生成了一个文件:[.xsession-errors]内容如下:
/etc/gdm/Xsession: Beginning session setup...
Setting IM through im-switch for locale=zh_CN.
Start IM through /etc/X11/xinit/xinput.d/zh_CN linked to /etc/X11/xinit/xinput.d/scim.
Smart Common Input Method 1.4.7

Launching a SCIM process with x11...
Loading simple Config module ...
Creating backend ...
Loading x11 FrontEnd module ...
GTK Panel of SCIM 1.4.7

Starting SCIM as daemon ...
SCIM has been successfully launched.

** (seahorse-agent:8599): WARNING **: Wrong permissions for /tmp/orbit-bjn


** (gconf-sanity-check-2:8685): WARNING **: Wrong permissions for /tmp/orbit-bjn


** (x-session-manager:8599): WARNING **: Wrong permissions for /tmp/orbit-bjn

SESSION_MANAGER=local/ggjd:/tmp/.ICE-unix/8599

** (gnome-settings-daemon:8687): WARNING **: Wrong permissions for /tmp/orbit-bjn

Warning: Key not found in xfree86(jp106)+aliases(qwerty) keycodes
Symbols ignored
Warning: Key not found in xfree86(jp106)+aliases(qwerty) keycodes
Symbols ignored
Warning: No symbols defined for (keycode 92)
Warning: No symbols defined for (keycode 101)
Warning: No symbols defined for (keycode 114)
Warning: No symbols defined for (keycode 118)
Warning: No symbols defined for (keycode 119)
Warning: No symbols defined for (keycode 120)
Warning: No symbols defined for (keycode 121)
Warning: No symbols defined for (keycode 122)
Warning: No symbols defined for (keycode 123)
Warning: No symbols defined for (keycode 130)
Warning: No symbols defined for (keycode 132)
Warning: No symbols defined for (keycode 134)
Warning: No symbols defined for (keycode 135)
Warning: No symbols defined for (keycode 136)
Warning: No symbols defined for (keycode 137)
Warning: No symbols defined for (keycode 138)
Warning: No symbols defined for (keycode 139)
Warning: No symbols defined for (keycode 140)
Warning: No symbols defined for (keycode 141)
Warning: No symbols defined for (keycode 142)
Warning: No symbols defined for (keycode 143)
Warning: No symbols defined for (keycode 144)
Warning: No symbols defined for (keycode 145)
Warning: No symbols defined for (keycode 146)
Warning: No symbols defined for (keycode 147)
Warning: No symbols defined for (keycode 148)
Warning: No symbols defined for (keycode 149)
Warning: No symbols defined for (keycode 150)
Warning: No symbols defined for (keycode 151)
Warning: No symbols defined for (keycode 152)
Warning: No symbols defined for (keycode 153)
Warning: No symbols defined for (keycode 154)
Warning: No symbols defined for (keycode 155)
Warning: No symbols defined for (keycode 157)
Warning: No symbols defined for (keycode 158)
Warning: No symbols defined for (keycode 159)
Warning: No symbols defined for (keycode 160)
Warning: No symbols defined for (keycode 161)
Warning: No symbols defined for (keycode 162)
Warning: No symbols defined for (keycode 163)
Warning: No symbols defined for (keycode 164)
Warning: No symbols defined for (keycode 165)
Warning: No symbols defined for (keycode 166)
Warning: No symbols defined for (keycode 167)
Warning: No symbols defined for (keycode 168)
Warning: No symbols defined for (keycode 169)
Warning: No symbols defined for (keycode 170)
Warning: No symbols defined for (keycode 171)
Warning: No symbols defined for (keycode 172)
Warning: No symbols defined for (keycode 173)
Warning: No symbols defined for (keycode 174)
Warning: No symbols defined for (keycode 175)
Warning: No symbols defined for (keycode 176)
Warning: No symbols defined for (keycode 177)
Warning: No symbols defined for (keycode 178)
Warning: No symbols defined for (keycode 179)
Warning: No symbols defined for (keycode 180)
Warning: No symbols defined for (keycode 181)
Warning: No symbols defined for (keycode 182)
Warning: No symbols defined for (keycode 183)
Warning: No symbols defined for (keycode 184)
Warning: No symbols defined for (keycode 185)
Warning: No symbols defined for (keycode 186)
Warning: No symbols defined for (keycode 187)
Warning: No symbols defined for (keycode 188)
Warning: No symbols defined for (keycode 189)
Warning: No symbols defined for (keycode 190)
Warning: No symbols defined for (keycode 191)
Warning: No symbols defined for (keycode 192)
Warning: No symbols defined for (keycode 193)
Warning: No symbols defined for (keycode 194)
Warning: No symbols defined for (keycode 195)
Warning: No symbols defined for (keycode 196)
Warning: No symbols defined for (keycode 197)
Warning: No symbols defined for (keycode 198)
Warning: No symbols defined for (keycode 199)
Warning: No symbols defined for (keycode 200)
Warning: No symbols defined for (keycode 201)
Warning: No symbols defined for (keycode 202)
Warning: No symbols defined for (keycode 203)
Warning: No symbols defined for (keycode 204)
Warning: No symbols defined for (keycode 205)
Warning: No symbols defined for (keycode 206)
Warning: No symbols defined for (keycode 207)
Warning: No symbols defined for (keycode 212)
Warning: No symbols defined for (keycode 213)
Warning: No symbols defined for (keycode 218)
Warning: No symbols defined for (keycode 219)
Warning: No symbols defined for (keycode 220)
Warning: No symbols defined for (keycode 221)
Warning: No symbols defined for (keycode 222)
Warning: No symbols defined for (keycode 223)
Warning: No symbols defined for (keycode 224)
Warning: No symbols defined for (keycode 225)
Warning: No symbols defined for (keycode 226)
Warning: No symbols defined for (keycode 227)
Warning: No symbols defined for (keycode 228)
Warning: No symbols defined for (keycode 229)
Warning: No symbols defined for (keycode 230)
Warning: No symbols defined for (keycode 231)
Warning: No symbols defined for (keycode 232)
Warning: No symbols defined for (keycode 233)
Warning: No symbols defined for (keycode 234)
Warning: No symbols defined for (keycode 235)
Warning: No symbols defined for (keycode 236)
Warning: No symbols defined for (keycode 237)
Warning: No symbols defined for (keycode 238)
Warning: No symbols defined for (keycode 239)
Warning: No symbols defined for (keycode 240)
Warning: No symbols defined for (keycode 241)
Warning: No symbols defined for (keycode 242)
Warning: No symbols defined for (keycode 243)
Warning: No symbols defined for (keycode 244)
Warning: No symbols defined for (keycode 245)
Warning: No symbols defined for (keycode 246)
Warning: No symbols defined for (keycode 247)
Warning: No symbols defined for (keycode 248)
Warning: No symbols defined for (keycode 249)
Warning: No symbols defined for (keycode 250)
Warning: No symbols defined for (keycode 251)
Warning: No symbols defined for (keycode 252)
Warning: No symbols defined for (keycode 253)
Warning: No symbols defined for (keycode 254)
Warning: No symbols defined for (keycode 255)

** (gnome-screensaver:8707): WARNING **: Wrong permissions for /tmp/orbit-bjn


** (gconftool-2:8716): WARNING **: Wrong permissions for /tmp/orbit-bjn


** (gnome-settings-daemon:8687): WARNING **: Failed to open file '/etc/gnome/config/General.ad': 没有那个文件或目录

** (gnome-panel:8709): WARNING **: Wrong permissions for /tmp/orbit-bjn


** (nautilus:8712): WARNING **: Wrong permissions for /tmp/orbit-bjn


** (x-session-manager:8599): WARNING **: Host name lookup failure on localhost.

** (metacity:8708): WARNING **: Wrong permissions for /tmp/orbit-bjn

窗口管理器警告:无法读取保存的会话文件 /home/bjn/.metacity/sessions/default0.ms:Failed to open file '/home/bjn/.metacity/sessions/default0.ms': 没有那个文件或目录

** (bluetooth-applet:8726): WARNING **: Wrong permissions for /tmp/orbit-bjn


** (gconftool-2:8729): WARNING **: Wrong permissions for /tmp/orbit-bjn


** (update-notifier:8732): WARNING **: Wrong permissions for /tmp/orbit-bjn

Initializing gnome-mount extension
seahorse nautilus module initialized

** (gconftool-2:8733): WARNING **: Wrong permissions for /tmp/orbit-bjn


** (gnome-power-manager:8734): WARNING **: Wrong permissions for /tmp/orbit-bjn


** (gconftool-2:8738): WARNING **: Wrong permissions for /tmp/orbit-bjn


** (gconftool-2:8740): WARNING **: Wrong permissions for /tmp/orbit-bjn


** (gnome-volume-manager:8739): WARNING **: Wrong permissions for /tmp/orbit-bjn


** (nm-applet:8746): WARNING **: Wrong permissions for /tmp/orbit-bjn


(gnome-panel:8709): Gtk-WARNING **: gtk_widget_size_allocate(): attempt to allocate widget with width -13 and height 24

(qq:8786): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/engines/libclearlooks.so: 错误 ELF 类: ELFCLASS64

(qq:8786): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/engines/libclearlooks.so: 错误 ELF 类: ELFCLASS64

(qq:8786): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/engines/libclearlooks.so: 错误 ELF 类: ELFCLASS64

(qq:8786): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/engines/libclearlooks.so: 错误 ELF 类: ELFCLASS64

(qq:8786): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/engines/libclearlooks.so: 错误 ELF 类: ELFCLASS64

(qq:8786): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/engines/libclearlooks.so: 错误 ELF 类: ELFCLASS64

(qq:8786): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/engines/libclearlooks.so: 错误 ELF 类: ELFCLASS64

(qq:8786): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/engines/libclearlooks.so: 错误 ELF 类: ELFCLASS64

(qq:8786): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/engines/libclearlooks.so: 错误 ELF 类: ELFCLASS64

(qq:8786): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/engines/libclearlooks.so: 错误 ELF 类: ELFCLASS64

(qq:8786): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/engines/libclearlooks.so: 错误 ELF 类: ELFCLASS64

(qq:8786): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/engines/libclearlooks.so: 错误 ELF 类: ELFCLASS64

(qq:8786): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/engines/libclearlooks.so: 错误 ELF 类: ELFCLASS64

(qq:8786): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/engines/libclearlooks.so: 错误 ELF 类: ELFCLASS64

(qq:8786): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/engines/libclearlooks.so: 错误 ELF 类: ELFCLASS64

(qq:8786): Gtk-WARNING **: /usr/lib/gtk-2.0/2.10.0/engines/libclearlooks.so: 错误 ELF 类: ELFCLASS64

** (firefox-bin:8793): WARNING **: Wrong permissions for /tmp/orbit-bjn


** (firefox-bin:8793): WARNING **: Wrong permissions for /tmp/orbit-bjn

窗口管理器警告:Buggy client sent a _NET_ACTIVE_WINDOW message with a timestamp of 0 for 0x2e000cb (Iceweasel)
窗口管理器警告:meta_window_activate called by a pager with a 0 timestamp; the pager needs to be fixed.
LoadPlugin: failed to initialize shared library /usr/lib/iceweasel/plugins/nppdf.so [/usr/lib/iceweasel/plugins/nppdf.so: 错误 ELF 类: ELFCLASS32]
LoadPlugin: failed to initialize shared library /usr/lib/mozilla/plugins/nppdf.so [/usr/lib/mozilla/plugins/nppdf.so: 错误 ELF 类: ELFCLASS32]
LoadPlugin: failed to initialize shared library /opt/real/RealPlayer/mozilla/nphelix.so [/opt/real/RealPlayer/mozilla/nphelix.so: 错误 ELF 类: ELFCLASS32]
** Message: GetValue variable 1 (1)
** Message: GetValue variable 2 (2)
** Message: GetValue variable 1 (1)
** Message: GetValue variable 2 (2)
** Message: GetValue variable 1 (1)
** Message: GetValue variable 2 (2)
** Message: GetValue variable 1 (1)
** Message: GetValue variable 2 (2)
** Message: GetValue variable 1 (1)
** Message: GetValue variable 2 (2)

** (gnome-terminal:8856): WARNING **: Wrong permissions for /tmp/orbit-bjn

窗口管理器警告:last_user_time (27537568) is greater than comparison timestamp (1554746). This most likely represents a buggy client sending inaccurate timestamps in messages such as _NET_ACTIVE_WINDOW. Trying to work around...
窗口管理器警告:0x2e000cb (Blogger: J) appears to be one of the offending windows with a timestamp of 27537568. Working around...


------------------------------------------------------------------
上面最关键的内容是最面:
** (gnome-terminal:8856): WARNING **: Wrong permissions for /tmp/orbit-bjn
就是/tmp的权限问题,解决办法:
chmod 1777 -R /tmp
rm /tmp/.X0-lock