Arch boot process (简体中文)

From ArchWiki
Revision as of 17:56, 11 December 2011 by Strcat (Talk | contribs) (codeline -> ic)

Jump to: navigation, search

This template has only maintenance purposes. For linking to local translations please use interlanguage links, see Help:i18n#Interlanguage links.


Local languages: Català – Dansk – English – Español – Esperanto – Hrvatski – Indonesia – Italiano – Lietuviškai – Magyar – Nederlands – Norsk Bokmål – Polski – Português – Slovenský – Česky – Ελληνικά – Български – Русский – Српски – Українська – עברית – العربية – ไทย – 日本語 – 正體中文 – 简体中文 – 한국어


External languages (all articles in these languages should be moved to the external wiki): Deutsch – Français – Română – Suomi – Svenska – Tiếng Việt – Türkçe – فارسی

This article is intended to give a chronological overview of the Arch boot process and the system files and processes involved, providing links to relevant wiki articles where necessary. Arch famously follows the BSD init convention as opposed to the more common SysV. What this means is that there is little distinction between runlevels, since the system by default is configured to use the same modules and run the same processes on all runlevels. The advantage is that users have a simple way to configure the startup process (see rc.conf); the disadvantage is that some fine-grained configuration options that SysV offers are lost. See Adding Runlevels for a way to hack some SysV-like capabilities into Arch. See Wikipedia:init for more on the distinctions between SysV and BSD style.

init进程之前

系统开机并且执行完加电自检后,BIOS会根据自身设置选择最佳的启动媒介,把控制权传递给该媒介的主引导记录(Master Boot Record)部分。在GNU/Linux系统中,MBR里通常是像GRUBLILO这样的引导器(bootloader)。引导器通常会给用户一个菜单或者命令行之类的机制,供用户选择和设置。例如双系统的设置。一旦你选择启动Arch时,引导器就会载入Template:Filename 目录下的内核镜像(比如Template:Filename),并解压缩。

内核是一个操作系统的核心。他作用于非常底层的硬件和控制硬件的程序之间的部分(又称之为内核空间)。由于CPU在某个时刻只能执行一个任务,为了更为高效的使用CPU,内核使用称之为调度器的玩意。他通过一定的优先级算法,来将CPU按照时间动态的分配给各个人物。给我们的感觉就像所有程序都在使用CPU一样。

在内核载入后,会去处理initramfs(初始化RAM文件系统)。initramfs不一定是必须的,仅限于根文件系统所需的内核模块(比如IDE驱动)没有被编译到内核中时才需要(参考FHS)。换句话说他只需要包含内核中没有,并且访问根文件系统所必须的模块。比如IDE、SCSI、SATA(如果从USB设备中启动的话,肯定还有USB/FW模块)这类驱动驱动。在initramfs载入了必要的模块后,他就会将控制权交回给内核,继续引导过程。因此,initrd无须包含其他的模块都包含,其他模块可以在随后的引导中会通过udev载入。

然后内核就会去找init程序,通常就是根文件系统下的Template:Filename文件。init的实现依赖于GNU C基础库glibc。Libraries are collections of frequently used program routines and are readily identifiable through their filename extension of Template:Filename. They are essential for basic system functionality. 这部分启动过程又称之为early userspace.

init: The Arch boot scripts

Arch主要的启动过程是由init完成的,他通过克隆出其他的进程(以及这些进程克隆出的进程),使系统进入一个可用的状态。正如前文中提到的,Arch使用的是一种BSD风格的引导脚本。具体来说,init程序会首先读取Template:Filename这个配置文件,Template:Filename通常像这样:

Template:File

根据这个文件的第一个未被注释掉的行克制,系统默认的启动级别为3(启动器(bootloader)通常可以给内核传递系统的运行级别,如果没有传递,系统运行级别就采用这里的默认值),当内核调用init时:

  • 首先,运行主初始化脚本Template:Filename,这是个Bash脚本。
  • 如果系统处于单用户模式(运行级别为1或者S),系统就会接着运行Template:Filename脚本。否者,如果系统处于2~5之间的运行级别,系统就会接着运行Template:Filename脚本。
  • 最后运行的脚本是Template:Filename,这个脚本默认什么都没有。

Template:Filename

Template:Filename是一个很大的启动脚本。他通过一系列的初始化人物,完成所有的硬件配置。当你看到屏幕打印出下面这些行时,代表他开始运行了:

Arch Linux
http://www.archlinux.org
Copyright 2002-2007 Judd Vinet
Copyright 2007-2010 Aaron Griffin
Distributed under the GNU General Public License (GPL)

我们可以来看看这个脚本的任务列表:

  • 导入Template:Filename文件
  • 导入Template:Filename文件
  • 显示欢迎信息
  • 挂在各种各样的虚拟文件系统(proc、sysfs之类的)
  • 创建dummy设备的设备文件
  • 启动minilogd日志服务
  • dmesg输出内核启动信息
  • 配置硬件时钟
  • 清空设备热拔插Template:Filename文件
  • 启动udev服务并检查udev事件
  • 启动回环(loopback)接口
  • 根据rc.conf文件中的MODULES数组变量载入内核模块
  • 配置RAID和加密文件系统映射
  • 根据/etc/fstab的配置,运行fsck检查相应分区的完整性
  • 挂载本地文件系统和交换分区,(由于网络未加载,网络设备不会挂载)
  • 激活交换分区
  • 根据Template:Filename中的配置,设置主机名、locale、系统时钟
  • 移除leftover/temporary文件中的临时变量和文件,比如Template:Filename
  • 配置本地化、终端、键盘映射
  • 设置终端字体
  • 输出dmesg中输出的信息到Template:Filename

Template:Filename是一个脚本。他本身并不包含任何的配置信息,而是通过导入rc.conf来读取配置信息。就连他内部使用的很多实现彩色输出(比如右对齐的busy、done字符串)的函数,也是定义在Template:Filename中。通常情况下不需要编辑这个文件。当然如果为了通过减少某些不必要的步骤加速启动,也可以试试这么干。

Template:Filename

单用户(Single)模式通常在无法正常启动时使用,他会直接以root用户启动。除了最基本的syslog-ng和udev外,不会启动任何服务。单用户模式在修复系统时,需要避免远程用户操作导致数据丢失时很有用。单用户模式下可以直接在提示符后输入'exit'进入到多用户模式。

Template:Filename

Template:Filename通常在多用户模式(运行级别为2~5)下执行。通常情况,从Template:Filename切换到Template:Filename时,用户不太能感觉到。因为两者使用的函数类似,导致输出的提示信息也差不多。这个脚本主要执行以下任务:

Template:Filename

Template:Filename是多用户启动脚本下的本地化(个性化)脚本,默认是空的。通常情况下可以将一些需要在启动过程最后执行的命令放在这个脚本里。 Most common system configuration tasks (like loading modules, changing the console font, or setting up devices) usually have a dedicated place where they belong. To avoid confusion, ensure that whatever one intends to add to Template:Filename is not already residing in Template:Filename, or any other existing configuration location instead.

在修改这个文件时切记,该脚本(及其内部的所有命令)在模块载入和守护进程之后以root用户的权限运行。并且不管是否启动图形环境X都会执行。下面是一个在该脚本中调整ALSA声音设置例子

Template:File

另外一个Template:Filename的用途,就是实现一些特殊的修改。

init: 登录

默认情况下,Arch启动过程完成后,agetty程序就会启动,并提示用户输入用户名。在输入用户名后agetty调用login,提示用户输入登录密码。

最后,再成功登录后login会启动用户的默认会话终端(shell)。默认终端和环境变量在Template:Filename下定义。还有一些别的配置在Template:Filename目录下的文件中定义。用户也可以在自己的家目录下通过Template:Filename这类的文件重新定义。如果两部分的定义冲突,那么将会优先采用主目录下的定义。

mingetty提供了一些选项,可以实现自动登录的功能。rungetty也提供了一些用户登陆时自动运行程序的功能。

大多数用户可能希望启动图形界面,这个时候可以安装一个KDM、GDM之类的显示管理器(参考显示管理器)。 当然你如果觉得不需要或者不喜欢用显示挂你器,也可以直接启动图形界面

参考

扩展资源