当前位置: 首页 > 编程日记 > 正文

学习 Linux,101: 引导系统

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

系列文章: http://www.ibm.com/developerworks/cn/views/linux/libraryview.jsp?search_by=%E5%AD%A6%E4%B9%A0+linux+101

从 BIOS 到运行 Linux 系统

引导顺序

在我们深入了解启动加载程序(比如 LILO 和 GRUB)之前,先来重温一下 PC 是如何启动或引导 的。名为 BIOS(表示 Basic Input Output Service)的代码存 储在 ROM、EEPROM 或闪存等非易变 (non-volatile) 内存中。当启动或重启 PC 时,会执行该代码,并执行开机自检 (Power-On Self Test, POST) 来检查机器。它还会确定可用移动存储设备或固定存储设备中的引导驱动器,然后从该驱动器上的 Master Boot Record (MBR) 加载第一扇区。引导驱动器可以是传统硬盘驱动器、固态驱动器、USB 记忆棒 (stick) 或驱动器、或者带有可移动媒介(比如磁盘、CD 或 DVD)的驱动器。本文主要关注硬盘驱动器,但其他类型的存储设备的引导进程均与硬盘驱动器相似。

正如文章 “学习 Linux,101:硬盘布局” 所描述的,因为 MBR 还包含分区表,所以 MBR 中的可执行代码小于 512 字节,这个代码量不算大。注意,每个磁盘(即使是软盘、CD、DVD 或者 USB 记忆棒之类的固态设备) 的 MBR 中均包含一个可执行代码,即使这个代码只能用于显示一条消息,比如 "Non-bootable disk in drive A:(驱动器 A 中没有可引导磁盘:)"。这个由 BIOS 从第一扇区加载的代码称为第一阶段启动加载程序阶段 1 启动加载程序

MS DOS、PC DOS 和 Windows® 操作系统所使用的标准硬盘驱动器 MBR 会检查分区表,以查找主分区上标记为 active 的引导驱动器,加载该分区的第一扇区,然后将控制权交给已加载的代码。这个新代码也称为分区引导记录。分区引导记录实际上是阶段 1 的另一个启动加载程序,但它只能从分区加载一组块。该新组块中的代码称为阶段 2 启动加载程序。MS-DOS 和 PC-DOS 使用的阶段 2 加载程序直接继续加载操作系统其余部分。以上就是操作系统启动并运行的引导进程。

这个引导进程对于单操作系统很适用。但是,如果您想要使用多个操作系统,比如 OS/2、Windows XP 和 3 个不同的 Linux 发行版,那么会出现什么样的情况呢?您可以 使用一个程序(比如 DOS FDISK 程序)来更改活动分区并重新启动,但这种方法比较笨拙。此外,一个磁盘只能拥有 4 个主分区,而标准 MBR 只能拥有一个主分区;系统不能从逻辑分区引导。但我们假设的示例提到了 5 种操作系统,每个系统都需要一个分区。

该问题的解决方案是使用一些特殊代码,允许用户选择引导哪个操作系统。此类程序包括:

Loadlin
一个 DOS 可执行程序,可以在一个正在运行的 DOS 系统中调用以引导一个 Linux 分区。如果多引导系统的设置过程很复杂、风险很大时,这个代码就很有用。
OS/2 Boot Manager
这个程序安装在一个专用小分区上,分区被标记为 active,标准 MBR 引导进程启动 OS/2 Boot Manager,之后会显示一个菜单用于选择要引导的操作系统。
智能启动加载程序
该程序可以驻留在操作系统的分区上,并可以通过一个活动分区的分区引导记录调用,也可以通过主引导记录调用。此类程序包括:
  • BootMagic(Norton PartitionMagic 的一个组件)
  • LILO (LInux LOader)
  • GRUB (GRand Unified Boot loader)(现在称为 GRUB Legacy)
  • GRUB2(一个新型启动加载程序,经常出现在一些常见的发行版中)

很明显,如果能够将系统控制权交给某个包含 512 字节以上代码的程序来完成其任务,那么支持从逻辑分区引导或从位于引导驱动器之外的分区引导应该不太难。上述解决方案都支持这些可能性,这是因为它们都能 从任意分区加载引导记录,或者是因为它们都对启动引导过程需要加载哪个或哪些文件有所理解。

链式加载

当一个引导管理器获得控制权时,它能做的一件事就是加载另一个引导管理器。这种现象称为链式加载 (chain loading), 通常发生在位于主引导记录 (MBR) 中的引导管理器加载一个分区引导记录中的启动加载程序的时候。当一个 Linux 启动加载程序被请求引导一个 Windows 或 DOS 分区时,或者当一个系统的 Linux 启动加载程序被请求加载另一个系统的启动加载程序时,几乎总是需要进行链式加载。例如,您可能需要使用一个分区中的 LILO 链式加载另一个分区中的 GRUB,以便访问该分区中的 GRUB 菜单。

Linux 启动加载程序

接下来我们要关注的是 LILO 和 GRUB,因为它们是大多数 Linux 发行版包含的启动加载程序。LILO 的历史长一些,而 GRUB 比较新。原始 GRUB 现在已成为 GRUB Legacy,GRUB2 正处于开发中,它是由 Free Software Foundation 赞助(请参见 参考资料 了解相关的详细信息)。我们将简要讨论 GRUB2,阐述 GRUB 和 GRUB2 之间的主要区别,以及二者如何能够共存。对于本文余下部分,我们假设 GRUB 是指 GRUB Legacy,除非上下文明确表示为 GRUB2。LILO 也有一个新版本,称为 ELILO(其设计意图是用于引导使用 Intel 而非使用 BIOS 的 Extensible Firmware Interface (EFI)。请参见 参考资料 了解关于 GRUB2 和 ELILO 的其他相关信息。

您的发行版的安装过程可能支持选择设置哪个启动加载程序。GRUB 和 LILO 都支持大多数小于 2TB 的现代磁盘,但有些发行版(最著名的是 Fedora)不再包含 LILO。别忘了,磁盘技术已经飞速发展,因此您应该总是确保所选的启动加载程序、Linux 发行版(或其他操作系统)以及您的系统 BIOS 适用于您的新磁盘。否则,就有可能导致数据丢失。同样,向现有系统添加新发行版时,可能需要确保您的 MBR 中拥有最新的 LILO 或 GRUB。如果您打算从 LVM 或 RAID 磁盘引导,也需要拥有比较新的 GRUB 或 LILO 版本。

LILO 和 GRUB 中使用的阶段 2 加载程序允许从几个操作系统或版本中选择其中之一。但是,LILO 和 GRUB 差别很大:只要升级内核或对系统进行其他更改,就需要使用一条命令重新创建 LILO 引导设置;而 GRUB 支持通过一个可编辑配置文本文件来完成这个任务。GRUB2 也需要从一个通常存储在 /etc 中的配置文件进行一个重构。

下面小结 PCs 的引导过程:

  1. 当 PC 启动时,BIOS (Basic Input Output Service) 会执行一个自检。
  2. 当机器通过自检时,BIOS 会加载 Master Boot Record(或 MBR,通常位于引导驱动器的第一个 512 字节扇区)。引动驱动器通常是系统上的第一个硬盘驱动器,但也可以是一个磁盘、CD 或 USB 密匙。
  3. 对于硬盘驱动器,MBR 加载一个阶段 1 启动加载程序,该程序通常是 Linux 系统上的 LILO 或 GRUB 阶段 1 启动加载程序。这是另一个 512 字节单扇区记录。
  4. 阶段 1 启动加载程序通常加载一个记录序列,该序列通常称为阶段 2 启动加载程序(有时称为阶段 1.5 加载程序)。
  5. 阶段 2 加载程序加载操作系统。对于 Linux,这是内核,也可能是初始 RAM 磁盘 (initrd)。

您的系统应该能够安装两个流行启动加载程序的其中一个:LILO (LInux LOader) 或 GRUB (GRand Unified Boot loader)。您应该能够使用所选的启动加载程序按前面描述的方式执行引导。如果您想回顾启动加载程序安装或基本引导过程,请参阅配套文章 “学习 Linux,101:引导程序”。

可以采用以下方法影响您的系统引导过程:

  1. 更改引导设备。您可能通常从硬盘驱动器引导,但有时可能需要从软盘、USB 内存密匙、CD 或 DVD,或者网络引导。要设置这类引导设备,您需要适当配置 BIOS;在引导过程中可能还需要一个特殊键击,以便显示一些选项。我的一个系统上的选项如 图 1 所示。设置引导设备和选择在启动时引导设备的方法特定于您的系统及其 BIOS。这也超出了这个 LPI 目标的要求,您可以参考您的系统文档。

    图 1. 选择引导设备
    Startup Device Menu 屏幕截图,显示多个引导设备选项,突出显示 USB key - Sony Storage Media 选项

  2. 可以与启动加载程序交互,选择引导哪个配置。本文稍后将介绍如何针对 LILO 和 GRUB 完成这个任务。
  3. 您可以使用 GRUB 或 LILO 来将参数传递到内核,控制内核被启动加载程序加载后启动系统的方式。

GRUB

GRUB 配置文件默认为 /boot/grub/grub.conf 或 /boot/grub/menu.lst。如果二者同时存在,那么一个通常是另一个的符号链接。清单 5 展示了上面用于 LILO 的系统的一个示例。注意,为了便于阅读,我们已将三个内核定义语句分割为多个行。


清单 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/sdb13
default=0
timeout=5
splashimage=(hd1,12)/boot/grub/splash.xpm.gz
hiddenmenu
title 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 quietinitrd /boot/initramfs-2.6.35.14-95.fc14.x86_64.img
title 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 quietinitrd /boot/initramfs-2.6.35.13-92.fc14.x86_64.img
title 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 quietinitrd /boot/initramfs-2.6.35.13-91.fc14.x86_64.img
title GRUBrootnoverify (hd0,1)chainloader +1
title Slackware 13rootnoverify (hd0,9)chainloader +1
title Windowsrootnoverify (hd0,0)chainloader +1

GRUB 提供一个菜单界面。它还使用一个通过 MD5 算法加密的密码,而不是 LILO 的纯文本密码。而且,也许最重要的是,对 GRUB 配置文件进行的更改不需要在 MBR 中安装 GRUB。注意,许多发行版均能在更新到一个新的内核级别时自动更新 GRUB(或 LILO)配置文件,但是,如果您安装一个新内核或创建一个新的初始 RAM 磁盘,那么可能需要编辑配置文件。

要为分区配置一个启动条目,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)。如果使用这些参数从一个 bash shell 调用 GRUB,例如,在软盘、USB 密匙或您的 MBR 上安装 GRUB 时,别忘了使用引号将参数引起来。

新版 GRUB 允许使用一个标签 或一个 UUID 来指定 root 元素。要详细了解标签和 UUIDs,请参阅配套文章 学习 Linux,101:控制文件系统的安装和卸载 中的 “标签、UUID 和链接” 小节。

使用 GRUB 引导系统时,经常会看到一个默认选项,如 图 5 所示。如果您不做任何操作,会在配置超时后启动这个选项。这里的超时值单位为秒,因此清单 5 中的 timeout=5 表示一个 5 秒的超时。


图 5. 引导 GRUB 到一个默认选项
使用 GRUB 进行引导的屏幕截图,展示在配置超时后启动的默认选项

如果您按任意键中断默认启动,将会看到一个类似于 图 6 的选项菜单。


图 6. GRUB 菜单选项
展示引导一个选中的操作系统的 GRUB 菜单选项的屏幕截图

GRUB 菜单显示时,可以使用光标移动键在列表中上下移动,选择一个引导映像。

自定义背景

如果您想对 GRUB 使用不同的启动图像,那么您只能使用 14 色 X Window pixmap (.xpm) 文件,而且文件必须被 gzip 压缩。您钟爱的 JPEG 图像将会减少到 14 色时看起来可能有些不同,因此您需要试验试验,看看效果。可以使用诸如 GIMP 的图形程序将图像减少到 14 色,这时应该使用 Image->Mode->Indexed... 菜单动作并将 Maximum number of colors 字段设置为 14。也可以使用命令行工具,比如 ImageMagick。清单 6 显示将一个 800x531 原始图像减小到需要的 640x480 像素的一种方法:首先将其缩小到 640 像素高,然后裁剪部分图像,减小画布以匹配图像。然后,我们将颜色数量减少到 14,将图像格式从 .jpg 转换为 .xpm。最后我们 gzip 压缩图像。


清单 6. 构建一个自定义 GRUB 启动图像
$ identify woodenbong.jpg
woodenbong.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

GRUB shell

与 LILO 不同,GRUB 的表现形式是一个小 shell。它包含几个命令,允许执行类似操作:在命令执行之前编辑命令、查找并加载配置文件、或者使用 cat 命令显示文件。在菜单中的条目上按 e 键将编辑条目,按 c 键切换到 GRUB 命令行,按 b 键引导系统,按 p 键输入密码,按 Esc 键返回菜单或上一步。还有一个 grub 命令,用于创建一个模拟 shell,可以在其中测试 GRUB 配置或您的 GRUB 命令技能。普通用户模式提供一些基本组件,但许多命令都需要根权限。清单 7 展示如何作为根用户启动 grub shell。这个 grub 命令通常位于 /sbin 或 /usr/sbin 中。


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

在 GRUB shell 中,help 命令提供一列表的命令。help commandname 提供 commandname 命令帮助。清单 8 显示了可用命令和 rootnoverify 命令帮助。


清单 8. 使用 GRUB shell
grub> help blocklist FILE                         boot
cat FILE                               chainloader [--force] FILE
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]grub> help rootnoverify rootnoverify: rootnoverify [DEVICE [HDBIAS]]Similar to `root', but don't attempt to mount the partition. Thisis useful for when an OS is outside of the area of the disk thatGRUB can read, but setting the correct root device is stilldesired. Note that the items mentioned in `root' which derivedfrom attempting the mount will NOT work correctly.grub>

作为一个实践示例,您可以继续前面的示例,使用 GRUB 的 find 命令查找配置文件。下面,您可以从 (hd1,12)(即 /dev/sdb13) 加载配置文件,如 清单 9 所示。


清单 9. 使用 GRUB 查找并加载 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.lst Press `ESC' to enter the menu... 24

加载配置文件时,可能会看到一个类似于 清单 10 的菜单。记住,这已在 GRUB shell 下完成了,该 shell 模拟真实的 GRUB 环境,不显示启动图像。但是,这非常类似于真正使用 GRUB 启动系统时启动图像上叠加的图像。

注意:如果您的菜单看起来不是这样,而且您的方向键回显为 ^[[A 这样的符号,那么您的 grub 命令版本可能不包含正确的菜单显示所需的 curses 支持。据说,这个问题影响了一些最新 Fedora 发布。在这种情况下,使用 grub shell 进行测试会受到限制。


清单 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 thecommands before booting, or 'c' for a command-line.

假设您突出显示了第三个条目 Fedora (2.6.35.13-91.fc14.x86_64),然后按 e 编辑该条目。您将看到类似于 清单 11 的内容。


清单 11. 编辑一个 GRUB 配置条目
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 theboot sequence, 'c' for a command-line, 'o' to open a new lineafter ('O' for before) the selected line, 'd' to remove theselected line, or escape to go back to the main menu.

同样,可以使用方向键选择要编辑的行,然后按 e 键编辑它。在本例中,我们假设您在 /dev/sdb14 上安装了 Fedora,然后删除一个较低的分区,比如 /dev/sdb8。这将把 Fedoro 分区下放到 GRUB 标记中的 /dev/sdb13(或 hd1,12)。使用光标键移过 '(hd1,13)' 中的 '3',然后返回去删除 '3',插入 '2' 代替。完成后,按 Enter 键接受更改,或者按 Esc 键取消更改。最后,如果您的确在引导系统,而不是运行 GRUB shell,按 b 键引导系统。

启动到一个 GRUB shell 时,它有足够的能力显示您的文件系统上的文件,它好像作为根用户运行,因此您确实需要使用 GRUB 密码保护您的系统。但是,请记住,如果用户能够从可移动介质启动,就能提供他或她自己的 GRUB 配置。请参阅 GRUB 手册的安全性部分(参见 参考资料),了解关于 GRUB 安全性和其他方面的更多信息。您也可以通过使用 info grub 命令在您的系统上查看它。

回页首

内核参数

内核参数(有时称为启动参数)为内核提供其可能无法独自确定的硬件参数信息,其目的是覆盖内核以其他方式可能检测到的值,或者避免检测到不适当的值。例 如,您可能想启动到单用户模式来修复系统,以单核模式启动一个 SMP 系统,或者指定一个替代根文件系统。有些内核级别可能需要一个参数来启用 RAM 大于一定量的系统上的大内存支持。

有时需要向引导进程添加参数。例如,您可能想以 \single-user 模式启动系统,这时,您需要添加 S 参数。或者,您可能需要指定一个此前工作的内核,以便能够查明您新构建的自定义内核无法工作的原因。按 Tab 键查看要引导的映像列表和原始简略 LILO 文本提示 boot:。此时,您可以键入映像名称,或者按 Enter 选择第一个条目。如果需要添加参数,可以在映像名称后面键入参数。清单 12 和 图 7 显示执行下面的操作将看到的画面:按 Tab 键,键入 Slackware13 选择 Slackware 13 映像,添加参数 S 以单用户模式启动,然后按 Enter 键启动引导进程。


清单 12. 使用 LILO 指定启动参数
Slackware 13     Windows        Fedora 14
boot: Slackware13 S


图 7. 将 Slackware 引导到单用户模式
屏幕截图展示以单用户模式启动的 Slackware 引导进程

使用 GRUB,您可以键入另一组内核命令和 initrd 语句;或者,最好使用前面介绍的编辑功能编辑一个现有条目。例如,添加参数 S 启动到单用户模式。

init 进程

内核加载完成后,通常会启动 /sbin/init。这个程序在系统关闭之前将一直运行。它总是被分配进程 ID 1,如 清单 13 所示。


清单 13. init 进程
[root@echidna ~]# ps --pid 1   PID TTY          TIME CMD1 ?        00:00:00 init

init 程序通过运行一系列脚本引导系统的其余部分。这些脚本通常位于 /etc/rc.d/init.d 或 /etc/init.d 中,它们执行一些服务,比如设置系统的主机名、检查文件系统错误、装载其他文件系统、启用网络、启动打印服务,等等。这些脚本执行完后,init 启动一个名为 getty 的程序,在控制台上显示登录提示。图形登录屏幕通过一个图形显示管理器处理,比如 GDM for Gnome。

如果您的系统能够加载内核,但无法成功运行 init,您可以通过指定一个替代初始化程序来尝试修复。例如,指定 init=/bin/sh 将把您的系统引导到一个拥有根权限的 shell 提示,您可以在那里修复系统。

要详细了解可用的启动参数,可以参阅 bootparam 的手册页,也可以浏览 /usr/src/linux/Documentation/ramdisk.txt,这个文件在有些系统上也称为 /usr/src/linux-$(uname -r)/Documentation/kernel-parameters.txt。

显然,如果您每次引导时都必须应用同一组额外参数,那么应该将它们添加到配置文件中。如果使用 LILO,别忘了重新运行 lilo

回页首

引导事件

在 Linux 引导进程中,大量消息将被发送到控制台,描述正在引导的内核、系统硬件、以及其他内核相关事项。这些消息通常一闪而过,您可能来不及阅读它们,除非引导进 程因等待处理而出现延迟,比如无法访问某个时间服务器,或者必须检查一个文件系统。随着 Linux Bootsplash 项目(参见 参考资料)的出现,这些消息可能会重叠在一个图形背景上,或者被一个简单的状态栏隐藏或替换。如果您的发行版支持隐藏模式,那么您通常可以通过按一个键(比如 F2)切换为显示引导消息。

dmesg

如果能够返回并查看内核消息,那么应该感觉不错。由于标准输出与进程相关,而内核没有进程标识符,因此系统会将内核(或模块)输出消息保存到内核环缓冲区 中。可以使用 dmesg 命令显示内核环缓冲区,会在标准输出上显示这些消息。当然,您可以将这个输出重定向到一个文件以便将来分析,或者将其转发给一个内核开发人员进行调试。清单 14 展示了一些您可能会看到的输出。


清单 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.fedoraprojec
t.org) (gcc version 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC) ) #1 SMP Tue Aug 16 21:01:58 U
TC 2011
[    0.000000] Command line: ro root=UUID=5e22a2e0-5ac2-47d5-b98a-d5b25eff585a rd_NO_LUKSrd_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) ==> (reserv
ed)
[    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

/var/log/messages

您的系统启动到运行 /sbin/init 的时点后,如您所见,内核仍然在内核环缓冲区中记录事件,但进程使用 syslog 守护进程来记录消息,日志文件通常位于 /var/log/messages 中。与内核环缓冲区不同,每个 syslog 行都有一个时间戳,日志文件在系统能够重启之间持久化。如果引导进程中的 init 脚本阶段出现错误,那么您应该首先检查这个文件。

大多数守护进程的名称都以字母 'd' 结尾。清单 16 展示如何在重启后查看最后几条守护进程状态消息。


清单 16. 来自 /var/log/messages 的守护进程消息
[root@echidna ~]# grep "^Sep.*d\:" /var/log/messages|tail -n 14 Sep  7 18:21:08 echidna acpid: waiting for events: event logging is off
Sep  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 crashes
Sep  7 18:21:13 echidna abrtd: Init complete, entering main loop
Sep  7 18:21:26 echidna auditd[2032]: Started dispatcher: /sbin/audispd pid: 2034
Sep  7 18:21:26 echidna audispd: audispd initialized with q_depth=120 and 1 active plugins

您还能在 /var/log 中找到更多其他系统程序的日志。例如,您能看到您的 X Window 系统的启动日志。

我们对通过引导进程引导 Linux 系统的介绍就到此结束了。

转载于:https://my.oschina.net/yisenn/blog/35257

相关文章:

用Enter键取代tab键

1. this.TextBox1.Attributes.Add("OnKeyPress","<script>if keycode13 keycode9; return false;</script>");2. <input typetext οnkeydοwn"if (event.keyCode 13) event.keyCode 9;">

程序员:我受够了!不想再在小厂里干Java了!

你是否熟悉这样的情形&#xff1a;每天10点到公司&#xff0c;打开电脑&#xff1a;10个小时的增删改查&#xff0c;搬砖写代码的一天就这样开始了。刚毕业时候的你踌躇满志&#xff0c;按照自己的原定计划&#xff0c;这时候应该混到了阿里P6。可现在在小厂苦苦挣扎&#xff0…

iOS中UISearchBar(搜索框)使用总结

2019独角兽企业重金招聘Python工程师标准>>> iOS中UISearchBar(搜索框)使用总结 初始化&#xff1a;UISearchBar继承于UIView&#xff0c;我们可以像创建View那样创建searchBar UISearchBar * bar [[UISearchBar alloc]initWithFrame:CGRectMake(20, 100, 250, 40)…

Linux常用性能检测命令

一、uptime Uptime命令的显示结果包括服务器已经运行了多长时间&#xff0c;有多少登陆用户和对服务器性能的总体评估&#xff08;load average&#xff09;。load average值分别记录了上个1分钟&#xff0c;5分钟和15分钟间隔的负载情况&#xff0c;load average不是一个百…

怎样把DataGrid存放在ViewState中的无用数据卡掉

作者&#xff1a;无间道的博客http://www.cnblogs.com/wangsaokui/articles/10031.html 怎样把 DataGrid 存放在 ViewState 中的无用数据(有时候确实如此)卡掉&#xff0c;大家知道&#xff0c;一般而言DataGrid在ViewState中会存放表格中的所有数据&#xff0c;这样会导致View…

深度学习先驱 Yann LeCun 被骂到封推!AI 偏见真该甩锅数据集?

整理 | 夕颜出品 | CSDN&#xff08;ID:CSDNnews&#xff09;最近&#xff0c;人工智能领域又发生了一次热热闹闹的争论&#xff0c;随后演变成一场偏离轨道的争吵&#xff0c;目前以 Yann 道歉封推暂告一段落......争论来龙去脉这次争论的主角是图灵奖得主、人工智能标杆性人物…

JS加强学习-DOM学习01

JavaScript由三个部分组成&#xff1a;ECMAScript、DOM、BOM。前面已经学习了ECMAScript中的基础内容&#xff0c;现在可以开始学习DOM部分了&#xff0c;在DOM中更多的是实际效果的展现。 1. DOM定义 DOM&#xff1a;document object model 文档对象模型 它是将整个页面文档封…

android 游戏引擎libgdx demo cuboc分析

开始学习android游戏开发也有一段时间了,挑选libgdx这个游戏引擎来进行学习和开发。Libgdx是一款支持2D与3D游戏开发的游戏类库,并且它是夸平台的。例如你可以在windos下开发&#xff0c;同样的代码也可以运行在android上。 刚开始学习这个游戏引擎可能会感觉无从下手&#…

倒计时1天 | 张钹院士领衔,AI开发者大会20大论坛全攻略!

2020年7月3—4日&#xff0c;由 CSDN 主办的第三届 AI 开发者大会&#xff08;AI ProCon 2020&#xff09;&#xff08;大会官网&#xff1a;https://aiprocon.csdn.net/&#xff09;将以线上直播的形式与大家相见。本次大会历时2天&#xff0c;一次性设立6大主题、20大精彩分论…

在页面中导入文件

1. <% Response.WriteFile ("Yourfile.inc") %> 2. Server.Execute("Yourfile.inc")

How Tomcat works — 四、tomcat启动(3)

上一节说到StandardService负责启动其子组件&#xff1a;container和connector&#xff0c;不过注意&#xff0c;是有先后顺序的&#xff0c;先启动container&#xff0c;再启动connector&#xff0c;这一节先来看看container。 目录 Pipeline和VavleStandardEngine类和Standar…

DataList分页

<% Page Language"C#" %> <% Import Namespace"System.Data" %> <% Import Namespace"System.Data.OleDb" %> <Script Language"C#" Runat"Server"> /* Create By 飞刀 http://www.aspcn.com 20…

【中文】Joomla1.7扩展介绍之Googlemaps Plugin

Googlemaps Plugin 插件分类&#xff1a;Maps 支持版本&#xff1a;1.5 /1.6 /1.7 关注程度&#xff1a;【最流行的】 所属类型&#xff1a;插件、多语种 可以在 Joomla 1.5.x (native), 1.6.x and 1.7.x. 的内容条目、模块或者组件中显示一个&#xff08;或多个&#xff09;…

一文读懂:GoogleNet的Inception从v1到v4的演变

来源 | 机器学习炼丹术GoogleNet和VGG是ImageNet挑战赛中的第一名和第二名。共同特点就是两个网络的层次都更深了。但是&#xff1a;VGG继承了LeNet和AlexNet的一些框架结构而GoogleNet则做了更大胆的尝试&#xff0c;虽然深度有22层&#xff0c;但是参数却是Alexnet的1/12.而V…

几何画板画一个五边形内部的方法

五边形属于多边形里面比较简单的&#xff0c;就是在四边形的基础上增加一条边而已&#xff0c;五边形在平面几何学上指所有由五条边围衬成及有五个角的多边形。完美五边形和正五边形都是五边形的一种特殊类型。几何画板作为专业绘图工具&#xff0c;可以轻松就画出五边形&#…

GDAL Data Model(转)

即描述一个GDAL data store能够包含的信息的类型。 Dataset 一个dataset &#xff08;即一个GDALDataset 对象&#xff09;是一组相关的raster bands和一些属于它们的公共信息的集合。尤其是dataset有一个适用于它所有bands的关于raster size的概念&#xff0c;它是用pixels 和…

实战:人脸识别实战项目(源码共享)

首先我想问个问题&#xff1a;现在什么工程师最值钱&#xff1f;毫无疑问&#xff0c;我想超 90% 的都会说&#xff1a;人工智能工程师。也难怪&#xff0c;随着近几年人工智能的发展&#xff0c;已经逐渐渗透到了各个领域&#xff0c;比如&#xff1a;医疗、教育、机械自动化、…

Calendar如何只显示“一、二、三...日”,不显示“星期”

秋水无恨 asp.net Calendar DayNameFormat Globalization DayNames http://www.csdn.net/develop/Read_Article.asp?id15715 Calendar的DayNameFormat&#xff0c;如FirstLetter &#xff0c;FirstTwoLetters &#xff0c;Full &#xff0c;Short 但是争对英文而言的&#xf…

gulp插件之browser-sync安装报错

2019独角兽企业重金招聘Python工程师标准>>> 最近做前端开发&#xff0c;一直用gulp来写一些自动化脚本。之前用的npm的镜像为edunpm&#xff0c;很简单&#xff0c;因为这个镜像非常的快。 但是不知道为什么browser-sync插件总是下载不成功。。。 后来用nrm切换到t…

TensorFlow、PyTorch之后,“国产”AI框架还有没有机会?

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;众所周知&#xff0c;在机器学习框架领域&#xff0c;PyTorch、TensorFlow已分别成为目前学界和业界使用最广泛的两大实力玩家&#xff0c;而紧随其后的Keras、MXNet等框架也由于其自身的独特性受到开发者的喜爱。 202…

结构成员访问的三种方法

结构成员访问的三种方法 #include "stdio.h"#include "string.h"#include <stdlib.h>main (){struct student{int num;char * name;int score;}stu;struct student *p&stu;stu.num1;(*p).name"tom";p->score78;printf("%d\n&q…

数据库字段命名及设计规范

1.设计原则 1) 标准化和规范化数据的标准化有助于消除数据库中的数据冗余。标准化有好几种形式&#xff0c;但 Third Normal Form&#xff08;3NF&#xff09;通常被认为在性能、扩展性和数据完整性方面达到了最好平衡。简单来说&#xff0c;遵守3NF 标准的数据库的表设计原则是…

更改管理GPO的域控制器

1.GPO先被存储到扮演PDC模拟器操作主机角色的域控制器&#xff0c;然后再由它将其复制到其他域控制器&#xff0c;域成员计算机再通过域控制器来应用GPO.2.可通过DC选项与组策略两种方式来将管理GPO的域控制器从PDC模拟器操作主机更改为其他域控制器。转载于:https://blog.51ct…

怎样使元素可编辑

作者&#xff1a;http://lucky.myrice.comE-mail:amxh21cn.com 在IE5.5中&#xff0c;可以设定元素的编辑属性。语法如下&#xff1a; object.contentEditable [ sEditable]; 其中的sEditable为下列三个之一&#xff1a; ◇inherit ◇false ◇true <script lang…

知乎多场景内容匹配方案荣获CSDN AI优秀案例奖

7月3日&#xff0c;由CSDN主办的2020 AI开发者大会拉开帷幕&#xff0c;以直播形式进行吸引了上万名技术从业者参与。大会颁发了2020 AI企业及技术应用系列奖项&#xff0c;其中知乎凭借“多场景内容匹配方案”荣获“AI优秀案例奖”。 过去一年&#xff0c;人工智能技术研发和…

批量创建用户和设置密码

(1) 首先创建用户名文件和密码文件 # touch user_name passwd active:/srv # cat passwd win00:123456 win01:123456 active:/srv # cat user_name win00:x:520:520::/home/win00:/bin/bash win01:x:521:521::/home/win01:/bin/bash (2) 然后执行命令导入用户名和密码 a…

Eclipse 小插件

http://www.junginger.biz/eclipse/

肝了三天,万字长文教你玩转 tcpdump,从此抓包不用愁

图源 | 视觉中国来源|Python编程时光&#xff08;ID: Cool-Python&#xff09;今天要给大家介绍的一个 Unix 下的一个 网络数据采集分析工具 -- Tcpdump&#xff0c;也就是我们常说的抓包工具。与它功能类似的工具有 wireshark &#xff0c;不同的是&#xff0c;wireshark 有图…

【中文】Joomla1.7扩展介绍之Fabrik (强大的表单处理能力)

Fabrik 插件分类&#xff1a; Contacts & Feedback > Forms 支持版本&#xff1a;1.5 /1.7 关注程度&#xff1a;【最流行的】 所属类型&#xff1a;组件、模块、插件、多语言 Fabrik 2.1.1 is a security fix, please update immediately Fabrik 2.1.1是一个安全…

CPU的序列号

可以取CPU的序列号。 string cpuInfo "";//cpu序列号 ManagementClass cimobject new ManagementClass("Win32_Processor"); ManagementObjectCollection moc cimobject.GetInstances(); foreach(ManagementObject mo in moc) { cpuInfo mo.Properties…