IBM的LPI复习资料之LPI101-Topic101:系统体系结构(1)Boot the system

来源:互联网 发布:java入门123 编辑:程序博客网 时间:2024/06/09 11:50

1 概述

本文将帮助你理解从BIOS到系统启动完成的启动序列,你将会知道:

  • *** 为启动加载器提供通用参数
  • *** 启动时为Linux内核提供选项参数
  • *** 检查日志文件里的启动事件

对于大多数系统来说很多启动过程都是类似的,但是与硬件有关的方面是针对特定的体系结构的。本文针对的是X86或X86_64体系结构,并且通过BIOS启动系统。现在出现了一种使用EFI和GPT启动的新系统,它在大于2TB的驱动器上特别流行。但目前这种新系统还不是LPI的要求,所以本文没有对其进行说明。


除非另外指出,本文中的实例都使用Fedora14(内核版本2.6.35)操作系统。如果读者使用不同的发行版,测试结果可能不同。

本文帮助读者备考LPI101中的101.2目标,这个目标的权重是3。 

1.1 先决条件

为了能从本文中最大受益,读者应该具有Linux的基本知识,并且有一个可以使用的Linux发行版来动手实验本文中提到的命令。由于程序的版本不同,其输出的格式也可能不同,所以读者的实验结果可能与本文中给出的不完全相同。需要特别指出的是,不同系统的BIOS设置可能存在很大不同,启动加载器的画面随Linux发行版的不同也完全不同。

读者也应该熟悉"Learn Linux 101: Hard disk layout"这篇文章。

2 启动顺序

在我们讲解像LILO,GRUB这样的启动加载器之前,先回顾一下一台PC是如何启动的。叫做BIOS的代码被存储在非易失内存中,如ROM,EEPROM或者是Flash。当PC开机或者重启时,这段代码被执行,主要作用是自检和探测启动磁盘。这个磁盘可能是传统的硬盘,固态盘,Usb设备,或者是移动媒体如CD或DVD。本文接下来会关注硬盘,其他存储设备的启动流程与硬盘类似。

在"Learning Linux 101: Hard disklayout"中,我们说过MBR中包含有分区表信息,所以在MBR中的可执行代码少于512个字节,少的可怜。每一个磁盘,甚至CD/DVD,固态盘,U盘,都会在其MBR中存储有可执行代码,即使这些代码仅仅能完成输出一条"Non-bootable disk in driveA:"这样的消息。BIOS加载的第一个扇区中的代码叫做first stage bootloader或者stage 1 boot loader.

MS DOS,PC DOS,Windows等操作系统使用标准的Mbr,标准MBR中的代码用来检查分区表,找出被标记为启动分区的分区,加载这个分区的第一个扇区,并且跳转到这个扇区的代码。这段代码也被称为分区启动记录。分区启动记录实际上是另一个stage 1 bootloader(MBR中代码第一个)。但是这个代码能够有足够的能力加载分区中的更多块,这组块中的代码被叫做stage 2 bootloader。 对于MS DOS或者PCDOS来说,stage2loader直接加载操作系统剩余的部分。这就是操作系统在运行之前的自举过程。


这对于只安装有一个操作系统的Pc来说非常合适。但是如果需要安装多个操作系统呢,比如OS/2,Windows XP, 还有另外3个Linux发行版?你需要使用特定的程序(如DOSFDISK)来改变分区表中的活动分区,然后重启。这太麻烦了!更糟糕的是,一个硬盘最多有4个主分区,标准的MBR中的分区表中只能有一个活动的主分区,不能从逻辑分区中启动。但是像我们上面说的,我们需要5个操作系统,每一个操作系统都需要一个单独的分区。我靠!

解决方法是使用一段特殊的代码来允许用户选择启动哪一个操作系统。例如:

  • *** Loadlin
这是一个DOS程序运行在DOS系统下,过去设置一个多启动系统非常繁杂并且不安全,那时候它非常流行。
  • *** OS/2 Boot loader
一个安装在专用分区上的小程序,这个分区被标记为活动分区,所以MBR会自动启动这个程序。此程序
提供菜单供用户选择要启动的操作系统。
*** 一个聪明的启动加载器
这是一个可以存在于一个操作系统分区的程序,这个程序可以被MBR直接调用,也可以通过活动分区的
第一个扇区中的代码调用。这样的程序有:
  • ------ BootMagic, Norton PartitionMagic的一部分
  • ------ Lilo, Linux 启动加载器
  • ------ Grub, GRand Unified Bootloader
  • ------ GRUB2, 一个新的启动加载器,在Linux发行版中出现。
显而易见,如果你可以把系统的控制权交给一段大于512字节的程序去完成他的任务,那么从逻辑分区启动或者从没有启动分区的设备启动都会变得不太困难了。上面给出的方法都能够完成这个任务,它们或者能够从任意分区加载启动器,或者它们本身就知道如何加载那些文件来开始启动流程。

2.1 链式加载

当一个启动管理器取得控制权,它就能够加载另一个启动管理器。这叫做链式加载。MBR中的加载器就经常要加载一个分区的第一扇区中的加载器。这在Linux启动加载器中启动Windows或DOS时经常发生。另外一个Linux系统中的加载器加载其他Linux系统的加载器时也会发生。例如,你可能需要通过LILO来加载另一个分区中GRUB加载器.                                                      

2.2 Linux启动加载器

从现在开始,我们会专注于LILO和GRUB这两个包含于大多数Linux发行版中的启动加载器。LILO已经存在很长时间了,GRUB比较新。原来的GRUB已经变成GRUB遗产,GRUB2在FSF下被开发。我们会简要讨论GRUB2和GRUB的区别以及如何让两者并存。在本文后面,我们将用GRUB代表GRUB遗产,除非上下文中专门指GRUB2。存在一个叫做ELILO的LILO新版本,它用来启动使用EFI而不是BIOS的系统。

Linux发行版的安装程序很可能会让你选择安装哪一个启动加载器.尽管一些发行版,如Fedora仅仅提供了GRUB,但是无论是GRUB还是LILO都能够在小于2T的硬盘上工作。硬盘技术突飞猛进,所以记得选择能够和你的硬盘配合工作的BIOS,启动加载器以及操作系统。如果不这样做,可能会丢失数据。同样,如果你向一个现存的系统中增加新的发行版,你需要确保使用最新的LILO或者GRUB。如果你想从LVM或者RAID中启动系统,你同样需要一个相当新的GRUB或者LILO。

stage2 loader允许你从多个操作系统中选择要加载哪个。但是LILO和GRUB存在重大的区别。当兄系统改变,如升级Linux内核或者其他改变时,LILO需要执行命令去重新设置,而Grub则可以通过配置文件来完成同样的工作。GRUB2同样需要一个存在于/etc的配置文件重新编译。

现在来总结一下PC的启动流程:
(1) 当开机时,BIOS执行自检;
(2) 当自检通过后,BIOS加载启动设备的MBR;
(3) 对于硬盘,MBR加载启动分区的第一个扇区,也被叫做stage1 boot loader,对于Linux 这就是Lilo或GRUB的一部分。
(4) stage1 加载 stage2 加载器。
(5) stage2 加载操作系统,对于Linux来说,这是内核也可能是初始化内存盘(initrd)。

为了影响系统的启动流程,你可以:

(1)选择启动设备。正常情况下你可能从一个硬盘启动,但是有时候你需要从一个软盘或者USB设备或者CD/DVD,或者网络启动。设置这样的可选启动设备需要通过BIOS来设置,这可能需要在启动的时候按下某些键来进入BIOS设置界面。设置和选择启动设备是与BIOS相关的,这不是LPI考试的要求,请参考机器文档。


图1 选择一个启动设备

(2) 你可以通过LILO或者GRUB来选择更多地启动配置,这将在后面讲解。
(3) 你可以使用GRUB或者LILO在加载内核的时候向内核传递参数来控制内核如何来启动系统。

3 LILO

Lilo的配置文件默认是/etc/lilo.conf。表1显示了一个系统,该系统当前在/dev/sda10上装有Slackware,在/dev/sda1上装有Windows,在/dev/sda12上装有Fedora 14。该表是通过/sbin/liloconfig命令产生的。
表1 Lilo配置实例
# LILO configuration file# generated by 'liloconfig'## Start LILO global sectionlba32 # Allow booting past 1024th cylinder with a recent BIOSboot = /dev/root#compact # faster, but won't work on all systems.# Boot BMP Image.# Bitmap in BMP format: 640x480x8bitmap = /boot/slack.bmp# Menu colors (foreground, background, shadow, highlighted# foreground, highlighted background, highlighted shadow):bmp-colors = 255,0,255,0,255,0# Location of the option table: location x, location y, number of# columns, lines per column (max 15), "spill" (this is how many# entries must be in the first column before the next begins to# be used. We don't specify it here, as there's just one column.bmp-table = 60,6,1,16# Timer location x, timer location y, foreground color,# background color, shadow color.bmp-timer = 65,27,0,255# Standard menu.# Or, you can comment out the bitmap menu above and# use a boot message with the standard menu:#message = /boot/boot_message.txt# Append any additional kernel parameters:append=" vt.default_utf8=0"prompttimeout = 300# Normal VGA consolevga = normal# VESA framebuffer console @ 1024x768x64k# vga=791# VESA framebuffer console @ 1024x768x32k# vga=790# VESA framebuffer console @ 1024x768x256# vga=773# VESA framebuffer console @ 800x600x64k# vga=788# VESA framebuffer console @ 800x600x32k# vga=787# VESA framebuffer console @ 800x600x256# vga=771# VESA framebuffer console @ 640x480x64k# vga=785# VESA framebuffer console @ 640x480x32k# vga=784# VESA framebuffer console @ 640x480x256# vga=769# ramdisk = 0 # paranoia setting# End LILO global section# Linux bootable partition config beginsimage = /boot/vmlinuzroot = /dev/sda10label = Slackware13read-only # Partitions should be mounted read-only for checking# Linux bootable partition config ends# Windows bootable partition config beginsother = /dev/sda1label = Windowstable = /dev/sda# Windows bootable partition config ends# Linux bootable partition config beginsimage = /boot/vmlinuzroot = /dev/sdb13label = Fedora14read-only # Partitions should be mounted read-only for checking# Linux bootable partition config ends


表1中的配置文件包含了bitmap参数,并且设置为/boot/slack.bmp。这是一个位图文件,它将显示出来代替传统的字符界面,如图2所示。默认的启动镜像,Slacware13被高亮显示,另外两个Windows和Fedora14在其下面显示。使用上下箭头按键选择一个启动镜像,此时按下回车键来启动选择的镜像。如果timeout参数不为0,那么系统将会等待一定的秒数(此例是30秒)后自动启动选择的系统。

图2 LILO图形界面




在上面的例子中,我们使用了一个位图来显示启动选择。传统的LILO启动命令行过去是一个简单的如下图所示的界面。你可以输入要启动的系统的名字然后按回车键启动,或者直接回车启动第一个系统。

图3 Lilo基本命令行提示符


如果不想使用图形界面,你可以注释掉bitmap和bmpxxx参数设置,然后把message参数取消注释,message参数指向一个包含显示信息的文本文件。命令行模式不再是简单的而是使用了curses库来显示你的选项。你可以像以前一样键入参数。在图4中,我们的消息文件包含了文本"Booting pinguino>>>",并且我们再次通过S参数进入单用户模式启动。

图4 curses界面的LILO


注意:你可能需要在启动过程中按住Shift键来看到这个界面,因为有的系统会配置为不显示这个提示符。

3.1 The Lilo命令

记住,无论何时你修改了/etc/lilo.conf文件,或者你安装了一个新内核,你必须运行lilo命令。lilo命令会重写MBR或者分区第一个扇区来反映这种变化,包括记录内核的绝对磁盘位置。如果你的配置文件包括多个分区的多个Linux系统,你必须先挂载这些分区,这样lilo才能定位系统镜像。

除了显示LILO配置文件,你也可以使用lilo的-q选项来显示LILO启动选项的信息。使用-v命令会显示更多的信息。如下表所示


表3 查看LILO配置

       root@echidna:~# lilo -q -C /etc/lilo-graphic.confSlackware13     *WindowsFedora14root@echidna:~# lilo -q -v -C /etc/lilo-text.confLILO version 22.8, Copyright (C) 1992-1998 Werner AlmesbergerDevelopment beyond version 21 Copyright (C) 1999-2006 John CoffmanReleased 19-Feb-2007 and compiled at 20:09:28 on Feb 14 2010Reading boot sector from /dev/rootInstalled:  Tue Sep  6 15:51:49 2011Global settings:  Delay before booting: 0.0 seconds  Command-line timeout: 30.0 seconds  No unattended booting  No PC/AT keyboard hardware presence check  Always enter boot prompt  Boot-time BIOS data saved  Boot-time BIOS data auto-suppress write bypassed  Large memory (>15M) is NOT used to load initial ramdisk  Non-RAID installation  Boot device will not be used for the Map file  Serial line access is disabled  Boot prompt message is 1083 bytes  No default boot command lineImages:  Slackware13     *    No password    Boot command-line won't be locked    No single-key activation    VGA mode: NORMAL    Kernel is loaded "high"    No initial RAM disk    No fallback    Options: "ro root=80a  vt.default_utf8=0"  Windows    No password    Boot command-line won't be locked    No single-key activation    No fallback    No options  Fedora14    No password    Boot command-line won't be locked    No single-key activation    VGA mode: NORMAL    Kernel is loaded "high"    No initial RAM disk    No fallback    Options: "ro root=81d  vt.default_utf8=0" with LILO

3.2 Lilo链式加载

你可能已经注意到Windows系统所在的分区是/dev/sda1,Slackware所在的分区是/dev/sda10, Fedora所在的分区是/dev/sda13。对于拥有很多启动分区的系统,我经常是为GRUB单独设置一个小的分区,这样这个GRUB就可以通过链式加载来加载其他系统的加载器(如GRUB2)。既然这个小分区运行的是GRUB,它自已也可以被链式加载。为了在LILO中增加一个入口来链式加载其他的分区(如那个只有GRUB的小分区),你可以像如下增加一个选项到配置文件中.

表4 lilo配置文件中增加链式加载GRUB选项

# Linux bootable partition config beginsother = /dev/sda2  label = GRUB# Linux bootable partition config ends

4 GRUB

GRUB配置文件默认是/boot/grub/grub.conf或者/boot/grub/menu.lst.如果这两个文件都存在,其中一个往往是另一个的符号链接。表5显示了上面系统的一个例子。注意我们已经把内核定义语句分成了多行以便于阅读。

表5 GRUB配置文件实例

# 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 (hd1,12)#          kernel /boot/vmlinuz-version ro root=/dev/sdb13#          initrd /boot/initrd-[generic-]version.img#boot=/dev/sdb13default=0timeout=5splashimage=(hd1,12)/boot/grub/splash.xpm.gzhiddenmenutitle Fedora (2.6.35.14-95.fc14.x86_64)        root (hd1,12)        kernel /boot/vmlinuz-2.6.35.14-95.fc14.x86_64 ro             root=UUID=5e22a2e0-5ac2-47d5-b98a-d5b25eff585a             rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM             LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16             KEYTABLE=us rhgb quiet        initrd /boot/initramfs-2.6.35.14-95.fc14.x86_64.imgtitle Fedora (2.6.35.13-92.fc14.x86_64)        root (hd1,12)        kernel /boot/vmlinuz-2.6.35.13-92.fc14.x86_64 ro             root=UUID=5e22a2e0-5ac2-47d5-b98a-d5b25eff585a             rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM             LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16             KEYTABLE=us rhgb quiet        initrd /boot/initramfs-2.6.35.13-92.fc14.x86_64.imgtitle Fedora (2.6.35.13-91.fc14.x86_64)        root (hd1,12)        kernel /boot/vmlinuz-2.6.35.13-91.fc14.x86_64 ro             root=UUID=5e22a2e0-5ac2-47d5-b98a-d5b25eff585a             rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM             LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16             KEYTABLE=us rhgb quiet        initrd /boot/initramfs-2.6.35.13-91.fc14.x86_64.imgtitle GRUB        rootnoverify (hd0,1)        chainloader +1title Slackware 13        rootnoverify (hd0,9)        chainloader +1title Windows        rootnoverify (hd0,0)        chainloader +1


GRUB提供了一个菜单接口。它还使用了md5来加密密码而LILO使用的是明文密码。最重要的是,GRUB的配置文件改变不需要重新设置GRUB。注意很多发行版会在升级内核的时候会自动更新GRUB的配置文件,但是打您自己手动安装一个新内核时或者创建一个初始化内存盘时,必须手动修改配置文件。

GRUB修改配置文件入口项目时也不需要加载分区。你将注意到root(hd0,9)和splashimage=(hd1,12)/boot/grub/splash.xpm.gz这样的配置项。GRUB把硬盘标记为hdn,其中n从0开始,同理,硬盘上的分区也是从0开始。注意: GRUB2已经改变了磁盘的命名规范,所以在GRUB和GRUB2之间切换时要小心。

所以,在这个系统中,(hd0,0)表示Windows所在的主分区/dev/sda1,(hd0,9)代表Slackware所在逻辑分区/dev/sda10。一个软驱通常使用(fd0)来表示。如果使用grub命令程序,需要使用这种命名规范。比如当安装GRUB到软盘,U盘或者MBR上时。

新版本的GRUB允许你使用标签或者UUID来指定root元素。详情查看 Learn Linux, 101: Control mounting and unmounting of filesystems,来学习UUID。

当你使用GRUB启动一个系统时,你总是会看到一个默认的选项,如图5所示。如果什么也不操作,这个默认的系统在配置的timeout秒数后启动。timeout参数的单位是秒,所以timeout=5表示5秒。

图5 GRUB的默认启动


如果此时按下任意键就会中断这个默认启动,你将会看到一个供用户选择的菜单,如图6所示。

图6 GRUB菜单


此时,就可以使用箭头按键来选择要启动的系统,然后回车键启动之。

4.1 个性化背景显示

如果你需要一个不同的背景,你只能使用一个14色的xpm文件,而且必须是经过gzip压缩过的。一副jpeg图片被转化为14色的xpm图片时可能会出现一定程度的失真,这需要你实验。你可以使用GIMP或者一些命令行程序来完成jpeg到xpm文件的转换。表6显示了这个转换步骤。

表6 制作GRUB背景图片的步骤

$ identify woodenbong.jpgwoodenbong.jpg JPEG 800x531 800x531+0+0 8-bit DirectClass 210KB 0.000u 0:00.000$ convert -resize "800x640" woodenbong.jpg woodenbong2.jpg$ convert -crop "640x480+40+0" +repage  woodenbong2.jpg  grub-in.jpg$ convert -colors 14 grub-in.jpg grub-menu.xpm$ gzip grub-menu.xpm

4.2 Grub的shell

不像LILO,GRUB提供了一个shell,用户可以在此shell中运行一些命令来完成命令的编辑,查找和加载配置文件,使用cat查看文件内容等。选择一个启动项目,按下e即可进行编辑,也可以按下c进入命令行模式,按下b则会启动选中的系统。

linux系统中存在一个grub命令,它会创建一个模拟的shell供用户测试GRUB配置和GRUB命令。在用户模式下有很多命令可以执行,但是你需要root特权用户来执行很多命令。表7显示了如何使用root启动grub,grub命令一般存在于/sbin或者/usr/sbin目录中。

表7 启动grub

# grub    GNU GRUB  version 0.97  (640K lower / 3072K upper memory) [ Minimal BASH-like line editing is supported.  For the first word, TAB   lists possible command completions.  Anywhere else TAB lists the possible   completions of a device/filename. ]grub>


在GRUBshell中,help命令会展示可用的命令列表。使用help 命令名 可以查找一条命令的说明。表8显示了可以使用的命令和rootnoverify命令的详情。

grub> helpblocklist FILE                         bootcat FILE                               chainloader [--force] FILEcolor NORMAL [HIGHLIGHT]               configfile FILEdevice DRIVE DEVICE                    displayapmdisplaymem                             find FILENAMEgeometry DRIVE [CYLINDER HEAD SECTOR [ halt [--no-apm]help [--all] [PATTERN ...]             hide PARTITIONinitrd FILE [ARG ...]                  kernel [--no-mem-option] [--type=TYPE]makeactive                             map TO_DRIVE FROM_DRIVEmd5crypt                               module FILE [ARG ...]modulenounzip FILE [ARG ...]           pager [FLAG]partnew PART TYPE START LEN            parttype PART TYPEquit                                   rebootroot [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-edterminfo [--name=NAME --cursor-address testvbe MODEunhide PARTITION                       uppermem KBYTESvbeprobe [MODE]grub> help rootnoverifyrootnoverify: rootnoverify [DEVICE [HDBIAS]]    Similar to `root', but don't attempt to mount the partition. This    is useful for when an OS is outside of the area of the disk that    GRUB can read, but setting the correct root device is still    desired. Note that the items mentioned in `root' which derived    from attempting the mount will NOT work correctly.grub>


作为实例,你可以使用find命令找到grub的配置文件。接下来,你可以加载(hd1,12)里的配置文件,如表9.

表9 查找并加载grub配置文件

grub> find /boot/grub/menu.lst (hd0,1) (hd0,5) (hd1,6) (hd1,8) (hd1,9) (hd1,10) (hd1,11) (hd1,12)grub> configfile (hd1,12)/boot/grub/menu.lstPress `ESC' to enter the menu... 24

当你加载配置文件时,你可能会看到一个类似于表10的菜单。记住这是通过grub shell完成的,它模拟真正的grub环境,但是不显示背景图片。这与真实情况已经非常相似了。

注意:如果你的菜单看起来不是这样,并且你的箭头按键显示为^[[A,那么你的grub命令可能不包括显示菜单必须要有的curses支持。在一些Fedora发行版里存在这个问题,这样使用grub来测试就受限制了。


表10 GRUB模拟菜单

GNU GRUB  version 0.97  (640K lower / 3072K upper memory) +-------------------------------------------------------------------------+ | Fedora (2.6.35.14-95.fc14.x86_64)                                       | | Fedora (2.6.35.13-92.fc14.x86_64)                                       | | Fedora (2.6.35.13-91.fc14.x86_64)                                       | | GRUB                                                                    | | Slackware 13                                                            | | Windows                                                                 | |                                                                         | |                                                                         | +-------------------------------------------------------------------------+      Use the ^ and v keys to select which entry is highlighted.      Press enter to boot the selected OS, 'e' to edit the      commands before booting, or 'c' for a command-line.


假设你选中了第三个入口,也就是Fedora (2.6.35.13-91.fc14.x86_64),并且按下e键去编辑它。你将会看到如表11所示。

表11 编辑一个入口

GNU GRUB  version 0.97  (640K lower / 3072K upper memory) +-------------------------------------------------------------------------+ | root (hd1,13)                                                           | | kernel /boot/vmlinuz-2.6.35.13-91.fc14.x86_64 ro root=UUID=5e22a2e0-5>  | | initrd /boot/initramfs-2.6.35.13-91.fc14.x86_64.img                     | |                                                                         | |                                                                         | +-------------------------------------------------------------------------+      Use the ^ and v keys to select which entry is highlighted.      Press 'b' to boot, 'e' to edit the selected command in the      boot sequence, 'c' for a command-line, 'o' to open a new line      after ('O' for before) the selected line, 'd' to remove the      selected line, or escape to go back to the main menu.


此时,使用箭头按键选择编辑的行,然后按下e去编辑。在这个例子中,我们假设你已经在/dev/sdb14上安装了fedora并且删除了一个/dev/sdb8分区。这将会使得Fedora所在的分区编号变为/dev/sdb13,或者hd1,12。移动光标把13改为12,按下回车键完成修改,或者按下ESC放弃修改。最后,如果你是在真实的环境中,那么按下b就会启动这个系统。

当启动进入GRUBshell后,就有足够的能力来显示文件系统中文件的内容,并且是作为root用户运行的,所以你真的需要设置GRUB密码来保护你的系统。记住,如果一个用户可以从一个移动介质中启动,那么这个用户就可以提供他自己的GRUB配置。参考GRUB手册的安全部分来查找GRUB安全和其他方面的信息。也可以通过info grub命令来查看这些信息。

5 内核参数

内核参数(有时称为启动参数)用来向内核提供它自身可能检测不到的硬件信息,或者覆盖掉探测到的信息。例如,你可能想要启动单用户模式来修复系统,或启动一个SMP系统的单CPU模式,或者指定另外的根文件系统。一些内核级别需要参数来开启大内存模式以支持大于一定数量RAM的系统。

有时候,你需要为启动过程增加参数。例如,你可能想进入单用户模式,此时你需要增加一个S参数。或者你可能需要指定启动一个先前工作的内核来检查为什么新编译的内核不能工作。按下Tab会看到启动系统的列表和原始的LILO命令提示符:此时,你可以键入启动系统的名字,或者按下Enter键来选择第一个系统。如果你需要增加参数,在系统名字后面键入它。 表12和图7显示了这些。

表12 Lilo中提供内核参数

Slackware 13     Windows        Fedora 14boot: Slackware13 S

图7 进入单用户模式



使用GRUB时,你可以键入另外的命令组(kernel和initrd), 或者更好的是,你可以编辑现有的命令组。例如,增加一个S参数使得启动后进入单用户模式。

当内核完成加载后,它通常会启动/sbin/init,这个程序在系统关闭之前会一直运行,它的进程号总是1,表13显示这种情况。

表13 查看1号进程init

[root@echidna ~]# ps --pid 1  PID TTY          TIME CMD    1 ?        00:00:00 init

init进程会使用脚本来启动其他的程序。这些脚本通常会在/etc/rc.d/init.d或者/etc/init.d目录中。脚本完成像设置系统主机名,检测 文件系统错误,挂载额外的文件系统,启动网络,启动打印服务等等。当这些脚本执行完毕,init会启动一个叫做getty的程序,这个程序会在控制台显示登录界面。图形登录界面是被图形显示管理器处理的,如GNOME使用的GDM。

如果你的系统加载一个内核,但是不能成功运行init,你可以试着指定另外一个初始化程序。例如,指定init=/bin/sh将会启动系统到一个shell并且拥有root特权,在这里就可以修复系统了。

你可以通过bootparam的帮助页查看更多可用的内核启动参数,或者查看/usr/src/linux/Documentation/ramdisk.txt文件,在一些系统上也许是/usr/src/linux-$(uname -r)/Documentation/kernel-parameters.txt文件。

毫无疑问,如果每次启动都需要同样的参数,你应该把这些参数写入配置文件中。注意如果使用LILO,配置文件修改后需要重新运行lilo命令。

6 启动事件

在Linux启动过程中,大量的消息被发送到控制台上,用来描述内核启动,系统的硬件信息,以及其他和内核相关的信息。除非启动过程中等待一些事情(如网络异常,文件系统检查),这些信息常常会一闪而过以至于来不及阅读。随着Linux Bootspalsh项目的来临,这些信息可能被一个图像背景所掩盖,或者被隐藏,或者被一个状态条替换。如果你的发行版支持隐藏模式,你可以通过F2键来切换是否显示启动信息。

如果能重新看到这些内核信息就好了。既然标准输出关联到一个进程,内核本身没有进程号,内核和模块的输出信息在内核层的缓存中。你可以使用dmesg命令来显示内核层缓冲,它将这些信息显示在标准输出上。当然,你也可以把这些输出重定向到文件以便于以后分析或者发送给内核开发者。表14显示了dmesg的输出。

表14 dmesg输出

[root@echidna ~]# dmesg | head -n 30[    0.000000] Initializing cgroup subsys cpuset[    0.000000] Initializing cgroup subsys cpu[    0.000000] Linux version 2.6.35.14-95.fc14.x86_64 (mockbuild@x86-07.phx2.fedoraproject.org) (gcc version 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC) ) #1 SMP Tue Aug 16 21:01:58 UTC 2011[    0.000000] Command line: ro root=UUID=5e22a2e0-5ac2-47d5-b98a-d5b25eff585a rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYTABLE=us rhgb quiet[    0.000000] BIOS-provided physical RAM map:[    0.000000]  BIOS-e820: 0000000000000000 - 000000000009dc00 (usable)[    0.000000]  BIOS-e820: 000000000009dc00 - 00000000000a0000 (reserved)[    0.000000]  BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved)[    0.000000]  BIOS-e820: 0000000000100000 - 00000000bf6b0000 (usable)[    0.000000]  BIOS-e820: 00000000bf6b0000 - 00000000bf6c8000 (ACPI data)[    0.000000]  BIOS-e820: 00000000bf6c8000 - 00000000bf6cb000 (ACPI NVS)[    0.000000]  BIOS-e820: 00000000bf6cb000 - 00000000c0000000 (reserved)[    0.000000]  BIOS-e820: 00000000e0000000 - 00000000f0000000 (reserved)[    0.000000]  BIOS-e820: 00000000fec00000 - 00000000fec10000 (reserved)[    0.000000]  BIOS-e820: 00000000fed1c000 - 00000000fed20000 (reserved)[    0.000000]  BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved)[    0.000000]  BIOS-e820: 00000000ff000000 - 0000000100000000 (reserved)[    0.000000]  BIOS-e820: 0000000100000000 - 0000000134000000 (usable)[    0.000000] NX (Execute Disable) protection: active[    0.000000] DMI present.[    0.000000] e820 update range: 0000000000000000 - 0000000000001000 (usable) ==> (reserved)[    0.000000] e820 remove range: 00000000000a0000 - 0000000000100000 (usable)[    0.000000] No AGP bridge found[    0.000000] last_pfn = 0x134000 max_arch_pfn = 0x400000000[    0.000000] MTRR default type: uncachable[    0.000000] MTRR fixed ranges enabled:[    0.000000]   00000-9FFFF write-back[    0.000000]   A0000-BFFFF uncachable[    0.000000]   C0000-C7FFF write-protect[    0.000000]   C8000-E3FFF uncachable

内核级缓冲也用来存储系统启动后的一些事件,这些包括一些程序失败和热插拔事件。表15显示了一些与USB插拔有关的信息。

表15 内核启动后的一些事件
                   [root@echidna ~]# dmesg | tail -n 19[70259.964953] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3[70259.964957] usb 1-4: Product: Storage Media[70259.964960] usb 1-4: Manufacturer: Sony[70259.964963] usb 1-4: SerialNumber: 0205093006441[70260.228187] Initializing USB Mass Storage driver...[70260.229608] scsi4 : usb-storage 1-4:1.0[70260.229749] usbcore: registered new interface driver usb-storage[70260.229752] USB Mass Storage support registered.[70261.232195] scsi 4:0:0:0: Direct-Access     Sony     Storage Media    0100 PQ: 0 ANSI: 0 CCS[70261.233159] sd 4:0:0:0: Attached scsi generic sg3 type 0[70261.237931] sd 4:0:0:0: [sdc] 1014784 512-byte logical blocks: (519 MB/495 MiB)[70261.238809] sd 4:0:0:0: [sdc] Write Protect is off[70261.238814] sd 4:0:0:0: [sdc] Mode Sense: 43 00 00 00[70261.238818] sd 4:0:0:0: [sdc] Assuming drive cache: write through[70261.243554] sd 4:0:0:0: [sdc] Assuming drive cache: write through[70261.243566]  sdc:[70261.317555] sd 4:0:0:0: [sdc] Assuming drive cache: write through[70261.317561] sd 4:0:0:0: [sdc] Attached SCSI removable disk[70261.616396] SELinux: initialized (dev sdc, type vfat), uses genfs_contexts

一旦你的系统启动到了/sbin/init,内核仍然在内核级缓冲中记录信息,像你刚才看到的那样。但是使用syslog守护进程记录的信息一般位于/var/log/messages中。与内核级缓冲相比,每一个syslog行都有一个事件戳.这个文件会在系统重启后持续保存。这个文件是查找初始化脚本阶段产生错误的首选。

大多数守护程序的名字已字母d结尾。表16显示了如何看到重启后最新的守护程序状态信息。

[root@echidna ~]# grep "^Sep.*d\:" /var/log/messages|tail -n 14Sep  7 18:21:08 echidna acpid: waiting for events: event logging is offSep  7 18:21:12 echidna abrtd: Registered Analyzer plugin 'Kerneloops'Sep  7 18:21:12 echidna abrtd: Registered Analyzer plugin 'Python'Sep  7 18:21:12 echidna abrtd: Registered Reporter plugin 'Logger'Sep  7 18:21:13 echidna abrtd: Registered Analyzer plugin 'CCpp'Sep  7 18:21:13 echidna abrtd: Registered Action plugin 'KerneloopsScanner'Sep  7 18:21:13 echidna abrtd: Registered Reporter plugin 'Bugzilla'Sep  7 18:21:13 echidna abrtd: Registered Reporter plugin 'KerneloopsReporter'Sep  7 18:21:13 echidna abrtd: Checking for unsaved crashes (dirs to check:5)Sep  7 18:21:13 echidna abrtd: Registered Database plugin 'SQLite3'Sep  7 18:21:13 echidna abrtd: Done checking for unsaved crashesSep  7 18:21:13 echidna abrtd: Init complete, entering main loopSep  7 18:21:26 echidna auditd[2032]: Started dispatcher: /sbin/audispd pid: 2034Sep  7 18:21:26 echidna audispd: audispd initialized with q_depth=120 and 1 active plugins

你也可以在/var/log目录下查找其他系统程序的日志。例如,你可以看到你的X Windows系统的启动日志。


附 原创内容

关于GRUB的安装,做了一张图,算是个总结。

原创粉丝点击