Linux 核心(三)

本文围绕Linux系统展开,详细介绍了引导和关机过程。引导分两阶段,不同平台有差异,内核装入后会进行初始化并启动init进程。关机需用shutdown命令,避免数据丢失。还阐述了重新引导、紧急引导软盘、init进程、运行级别等相关概念及配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux 核心(三)
 
 www.ibmtc.pku.edu.cn/crs/kernel/kernel.htm
 
 (此文作者允许此文用于学术目的.)
 
 第十六章
 
 引 导 和 关 机
 
 这一部分前几章的内容主要集中在 Linux 内核上,同时也简要阐述了与各内核组件相关的系统工具和系统调用,这部分后面几章的内容主要讲述尚未在前几章中论及的、与系统管理有关的内容。
 
 本章解释 Linux 系统的引导和关机过程。不同系统平台的引导过程略微有些不同,本章以 Intel 平台为主讲述 Linux 系统的引导过程。由于 Linux 使用缓冲区高速缓存技术,而且是一个多用户系统,因此,关机时必须遵循正确的过程,否则会造成数据丢失和文件系统的破坏。
 
 和系统的引导、关机过程相关的概念还有单用户模式、运行级别等。对这些概念的正确理解是配置和维护系统的必要条件。
 
 16.1 Linux 的引导过程
 
 一般而言,操作系统的引导过程分两个步骤。首先,计算机硬件经过开机自检(POST)之后,从软盘或硬盘的固定位置装载一小段代码,这段代码一般称为“引导装载器”。然后,由引导装载器负责装入并运行操作系统。引导装载器非常小,一般只有几百个字节,而操作系统庞大而复杂。利用上述两阶段的引导过程,可将计算机中的固化软件保持得足够小,同时也便于实现对不同操作系统的引导。
 
 不同计算机平台引导过程的区别主要在于第一阶段的引导过程。对 PC 机上的 Linux 系统而言,计算机(即 BIOS)负责从软盘或硬盘的第一个扇区(即引导扇区)中读取引导装载器,然后,由引导装载器从磁盘或其他位置装入操作系统。
 
 对典型的 PC 机 BIOS 而言,可配置为从软盘或从硬盘引导。从软盘引导时,BIOS 读取并运行引导扇区中的代码。引导扇区中的代码读取软盘前几百个块(依赖于实际的内核大小),然后将这些代码放置在预先定义好的内存位置。利用软盘引导 Linux 时,没有文件系统,内核处于连续的扇区中,这样安排可简化引导过程。但是,如果利用 LILO(LInux LOader)也可从包含文件系统的软盘上引导 Linux。
 
 从硬盘引导时,由于硬盘是可分区的,因此引导过程比软盘复杂一些。BIOS 首先读取并运行硬盘主引导记录中的代码,这些代码首先检验主引导记录中的分区表,寻找到活动分区(即标志为可引导分区的分区),然后读取并运行活动分区之引导扇区中的代码。活动分区引导扇区的作用和软盘引导扇区的作用一样:从分区中读取内核映象并启动内核。和软盘引导不同的是,内核映象保存在硬盘分区文件系统中,而不象软盘那样保存在后续的连续扇区中,因此,硬盘引导扇区中的代码还需要定位内核映象在文件系统中的位置,然后装载内核并启动内核。通常,最常见的方法是利用 LILO 完成这一阶段的引导。LILO 可配置为装载启动不同的内核映象,甚至可以启动不同的操作系统,也可以通过 LILO 指定内核命令行参数。有关 LILO 的内容,可参见有关的 HOWTO 文档。
 
 从软盘引导和从硬盘引导各有优点,但常见的引导方式是从硬盘引导。但在多重引导系统中(多个操作系统),从硬盘引导可能带来一些麻烦,因此,通常的做法是,首先从软盘引导,等系统稳定之后,再安装 LILO 从硬盘上引导。
 
 Linux 内核装入之后,Linux 内核进行硬件和设备驱动程序的初始化,然后运行 init。init 是 Linux 内核启动的第一个用户级进程,其进程标识号始终为 1,该进程在系统引导和关机过程中扮演重要角色。在本章后面的小节中,将详细介绍 init 进程。Linux 内核进行的初始化工作可大体描述如下:
 
 Linux 内核一般是压缩保存的,因此,它首先要进行自身的解压缩。内核映象前面的一些代码完成解压缩。 
 
 如果系统中安装有可支持特殊文本模式的、且 Linux 可识别的 SVGA 卡,Linux 会提示用户选择适当的文本显示模式。但是,如果在内核的编译过程中预先设置了文本模式,则不会提示选择显示模式。该显示模式也可通过 LILO 或 rdev 设置。 
 
 内核接下来检测其他的硬件设备,例如硬盘、软盘和网卡等,并对相应的设备驱动程序进行配置。这时,内核会输出一些硬件信息,类似下面的输出: 
 
 LILO boot:
 
 Loading linux.
 
 Memory: sized by int13 088h
 
 Console: 16 point font, 400 scans
 
 Console: colour VGA+ 80x25, 1 virtual console (max 63)
 
 pcibios_init : BIOS32 Service Directory structure at 0x000f7510
 
 pcibios_init : BIOS32 Service Directory entry at 0xfd7d2
 
 pcibios_init : PCI BIOS revision 2.10 entry at 0xfd9e6
 
 Probing PCI hardware.
 
 Calibrating delay loop.. ok - 231.83 BogoMIPS
 
 Memory: 30760k/32704k available (748k kernel code, 384k reserved, 812k data)
 
 Swansea University Computer Society NET3.035 for Linux 2.0
 
 NET3: UNIX domain sockets 0.13 for Linux NET3.035.
 
 Swansea University Computer Society TCP/IP for NET3.034
 
 IP Protocols: IGMP, ICMP, UDP, TCP
 
 Linux IP multicast router 0.07.
 
 VFS: Diskquotas version dquot_5.6.0 initialized
 
 Checking 386/387 coupling... Ok, fpu using exception 16 error reporting.
 
 Checking ‘hlt‘ instruction... Ok.
 
 Linux version 2.0.36 (root@porky.Red Hat.com) (gcc version 2.7.2.3) #1 Tue Oct 13 22:17:11 EDT 1998
 
 Starting kswapd v 1.4.2.2 
 
 Serial driver version 4.13 with no serial options enabled
 
 tty00 at 0x03f8 (irq = 4) is a 16550A
 
 Real Time Clock Driver v1.09
 
 Ramdisk driver initialized : 16 ramdisks of 4096K size
 
 ide: i82371 PIIX (Triton) on PCI bus 0 function 57
 
 ide0: BM-DMA at 0xfcd0-0xfcd7
 
 ide1: BM-DMA at 0xfcd8-0xfcdf
 
 hda: HITACHI_DK237A-32, 3102MB w/512kB Cache, CHS=788/128/63, UDMA
 
 hdc: CD-224E, ATAPI CDROM drive
 
 ide0 at 0x1f0-0x1f7,0x3f6 on irq 14
 
 ide1 at 0x170-0x177,0x376 on irq 15
 
 Floppy drive(s): fd0 is 1.44M
 
 FDC 0 is a post-1991 82077
 
 md driver 0.36.3 MAX_MD_DEV=4, MAX_REAL=8
 
 scsi : 0 hosts.
 
 scsi : detected total.
 
 Partition check:
 
 hda: hda1 hda2 < hda5 > hda3 hda4
 
 接下来,内核挂装 root 文件系统。root 文件系统的位置可在编译内核时指定,也可通过 LILO 或 rdev 指定。文件系统的类型可自动检测。如果由于某些原因挂装失败,则内核启动失败,最终会终止系统。root 文件系统一般挂装为只读文件系统。 
 
 此后,内核启动 init 进程(位于 /sbin/init)。init 进程的启动工作在后面的小节中详细讲述。一般而言,它要启动一些重要的后台守护进程。 
 
 然后,init 切换到多用户模式,并为每个虚拟控制台和串行线路启动一个 getty 进程,getty 进程管理用户从虚拟控制台和串行终端上的登录。根据不同的配置,init 也可以启动其他进程。 
 
 至此,系统的引导过程结束。 
 
 16.2 关机
 
 对 Linux 系统来说,必须始终以正确的方式关机。因为 Linux 利用了缓冲区高速缓存,写入磁盘的数据并不立刻写入物理磁盘中,因此,直接断电会导致数据的丢失或文件系统的破坏。
 
 对多任务系统来说,可能有许多后台进程处于运行状态,只有利用正确的关机操作才能保证所有的后台进程能够保存自己的数据。
 
 在 Linux 系统中,可利用 shutdown 命令关机。根据不同的应用环境,shutdown 可有不同的使用方法,但通常有两种使用方法:
 
 如果使用某 Linux 系统的用户只有一个,则通常的过程如下:退出所有正在运行进程;注销所有的虚拟终端;在某虚拟终端上以 root 身份登录;保证处于 root 文件系统,然后运行命令 shutdown –h now,这时,系统立即进入关机过程。 
 
 如果系统中现有许多用户,则应当使用 shutdown –h +time message 命令。该命令可通知所有的用户将在 time 指定的时间内关机,提醒用户退出所有程序,并保存数据。time 是以分钟计的时间,message 是显示在每个终端以及 xterm 上的警告信息。该警告信息可在关机前自动重复。 
 
 当实际的关机过程开始后,所有的文件系统(除 root 文件系统外)均被卸挂,所有的用户进程被强行杀掉,守护进程被关闭。之后,init 打印信息表明可以关闭电源了,这时才是真正关闭电源的时候。
 
 也有无法正常关机的情况发生,如果内核处于应急状态而终止 CPU,这时就不得不关闭电源,然后再重新启动计算机。但是,如果由于其他原因导致无法正常关机,而内核和守护进程仍然处于运行状态,这时,应当等待足够的时间(十几分钟)让 update 守护进程刷新缓冲区缓存之后,再关闭电源。
 
 16.3 重新引导
 
 Linux 系统的重新引导有两种办法,一种是先关机,然后再打开电源,重新引导;另外一种是利用 shutdown 命令的 –r 选项。
 
 在大多数 Linux 系统中,DOS 中常见的 CTRL+ALT+DEL 热启按键可运行 shutdown –r now 命令,从而可以重新引导系统。但是,该按键的动作是可以配置的,可以将系统配置为按 CTRL+ALT+DEL 键时不运行 shutdown –r now 命令,也可以限定按上述组合键时运行重新引导命令的用户。
 
 16.4 紧急引导软盘
 
 在错误安装 LILO 等情况下,Linux 系统可能无法从硬盘引导,这时就必须利用其他途径引导。通常在 PC 机中,可从软盘引导系统并解决问题。为此,必须具备紧急引导软盘。
 
 大多数 Linux 的商业发行版本可以在安装过程中建立紧急引导软盘。但是,这些软盘中常常只包含系统内核,而用来解决问题的程序可能不在该软盘中。因此,有时需要建立定制引导软盘,同时也需要经常更新自己的紧急引导软盘。
 
 16.5 init
 
 init 是内核启动的第一个用户级进程,它在 Linux 系统中扮演着重要的角色。尽管 init 对系统至关重要,但绝大多数情况下不需要用户过多关心它的配置及运行。通常而言,只有在需要建立串行终端,设置拨入和拨出调制解调器,或者改变默认运行级别时才需要配置 init。
 
 内核结束自身的引导过程之后(装入内存,初始化硬件和设备驱动程序之后),启动用户级进程 init。通常来说,内核首先寻找 /sbin/init。如果内核无法找到 init,则试图寻找 /bin/sh,在无法找到 sh 的情况下,系统的引导过程失败。
 
 init 启动之后,首先完成如下任务:
 
 检查文件系统; 
 
 清除 /tmp; 
 
 启动各种服务; 
 
 为每个终端和虚拟控制台启动一个 getty。getty 负责用户的登录,第十七章将详细介绍登录和注销过程。 
 
 在上述任务完成之后,即说明系统的引导过程结束。
 
 每当某个终端或虚拟控制台上的用户注销之后,init 进程为该终端或虚拟控制台重新启动一个 getty,以便能够让其他用户登录。另外,init 进程还负责管理系统中的“孤儿”进程。如果某个进程创建子进程之后,在子进程终止之前终止,则子进程成为孤儿进程。init 进程负责“收养”该进程,即孤儿进程会立即成为 init 进程的子进程。这种处理有重要的技术原因,一方面是为了易于处理进程表和进程树。
 
 init 进程的变种较多,大多数 Linux 的发行版本采用 sysvinit(由 Miquel van Smoorenburg)编写,由于基于 System V 的设计而得名。UNIX 的 BSD 版本有不同的 init。主要区别在于是否具有运行级别:System V 有运行级别,而 BSD 没有运行级别。但这种区别并不是本质的区别。本章所描述的 init 基于 sysvinit。
 
 16.6 启动 getty:/etc/inittab 文件
 
 在 init 启动时,它读取 /etc/initab 配置文件。在系统的正常运行过程中,如果为 init 进程发送 SIGNHUP 信号(以 root 用户身份运行 kill –HUP 1),则 init 进程会重新读取 /etc/inittab 文件,从而在不经重新引导系统的情况下,即可以让 init 的配置文件生效。
 
 /etc/inittab 文件中的每一行由四个字段组成,各字段之间由分号分隔:
 
 id:runlevels:action:process
 
 上述各字段的含义在表 16-1 中描述。另外,/etc/inittab 文件中可包含空行,以“#”开头的行作为注释行。
 
 表 16-1 /etc/inittab 文件中各字段的含义
 
 id
 
 该字段作为 inittab 文件中各行的标识符。对定义 getty 的各行来说,该标识符指定 getty 运行的终端(即设备文件名称中 /dev/tty 之后的字符)。对其他行来说,除了具有长度限制之外,没有特殊要求,但是,和数据库表的主键类似,该字段应具有唯一值。
 
  
 
 runlevels
 
 该字段指定运行级别,各运行级别由单个的数字表示,可表示多个运行级别,但不能包含任何分隔符。运行级别将在下节中描述。
 
  
 
 action
 
 该字段指定该行的动作,例如,respawn 指下一字段指定的命令退出后,需要重新运行该命令,而 once 则表示下一字段的命令只运行一次。
 
  
 
 process
 
 该字段指定要运行的命令。
 
  
 
 如果要在第一个虚拟控制台上启动 getty,并在所有通常的多用户运行级别(2 ~ 5)上运行,则应如下定义:
 
 1:2345:respawn:/sbin/getty 9600 tty1
 
 第一个字段取值为 1,表明该行用来定义 /dev/tty1;第二个字段表明该行应用于多个运行级别 2、3、4 和5;第三个字段表明当 getty 退出之后,需要再次运行(从而可让用户登录、注销之后再次登录);最后一个字段说明在第一个虚拟终端上运行 getty 的命令。
 
 如果要为某个系统添加终端或拨入调制解调器线路,则需要在 /etc/inittab 中添加相应行,每一行可定义一个终端或一条拨入线路。具体信息可参见手册页:init(8)、inittab(5) 和 getty(8)。
 
 16.7 运行级别
 
 运行级别指 init 以及整个系统的一个运行状态,它定义了系统所提供的服务。运行级别由数字表示,各数字所代表的运行级别及其含义由表 16-2 给出。
 
 表 16-2 运行级别
 
 0
 
 终止系统。
 
  
 
 1
 
 单用户模式(为特殊管理任务所用)。
 
  
 
 2~5
 
 通常的操作(用户定义)。
 
  
 
 6
 
 重新引导。
 
  
 
 由用户定义的运行级别(2~5)可由系统管理员自行决定。有些管理员利用运行级别定义可运行的子系统,例如,是否运行 X,是否可操作网络等。但通常不需要修改默认的运行级别。不同的 Linux 发行版本对运行级别 2~5 的定义可能不同。例如,Red Hat Linux 5.x 定义运行级别 5 为进入 X Window,从而以 xdm 取代字符的虚拟终端并以图形方式登录。
 
 如下所示,是 /etc/inittab 中定义运行级别的某行:
 
 12:2:wait:/etc/init.d/rc 2
 
 上述行的第二个字段定义该行应用于运行级别 2。第三字段中的 wait 表明对后面定义的命令,init 只运行一次,并且进入该运行级别之后,init 要等待该命令结束。
 
 第四个字段中的命令实际指定了建立某个运行级别的硬性工作,它要启动尚未启动的服务,终止不应当在新的运行级别中运行的服务等。
 
 当 init 启动时,它要在 /etc/inittab 中寻找指定默认运行级别的行:
 
 id:3:initdefault:
 
 根据默认的运行级别,init 将在正常启动之后运行包含该默认运行级别的所有行。
 
 利用 telinit 或 init 命令,可切换到其他的运行级别,例如:
 
 telinit 1
 
 将进入运行级别 1,也即单用户模式。
 
 通过为内核指定 single 或 emergency 等命令行参数,可请求 init 在启动时进入非默认的运行级别,从而选择单用户模式。单用户模式将在 16.10 小节中详细描述。
 
 16.8 /etc/inittab 文件的特殊设置
 
 /etc/inittab 具有一些特殊的设置,可让 init 响应某些特殊情况。这些特殊设置由第三个字段的特殊关键词指定。表 16-3 给出了一些特殊关键词。
 
 表 16-3 /etc/initab 中的特殊设置关键词
 
 powerwait
 
 允许在电源失效的情况下,由 init 关闭系统。这一关键词假定使用了不间断电源 (UPS),并且监视 UPS 的软件通知 init 电源已关闭。
 
  
 
 ctrlaltdel
 
 当用户在控制台键盘上按 CTRL+ALT+DEL 键时,允许 init 重新引导系统。但系统管理员可将系统配置为忽略该按键组合。 
 
 sysinit
 
 系统引导之后要运行的命令。该命令通常清除 /tmp 目录。
 
  
 
 有关 /etc/inittab 文件特殊设置关键词的详细信息,可参见手册页 inittab(5)。
 
 16.9 单用户模式
 
 单用户模式,即运行级别 1,是最重要的运行级别,在这一级别,只有系统管理员可以使用计算机,并且只有非常少的系统服务处于运行状态。对于一些系统管理任务来说,单用户模式是不可缺少的,例如,如果要在 /usr 分区上运行 fsck,则需要卸挂该文件系统。除非将所有的系统服务杀掉,否则无法卸挂该文件系统。
 
 利用 telinit 可请求处于运行状态的系统进入单用户模式。在引导时,通过为内核提供 single 或 emergency 命令行参数,也可进入单用户模式。
 
 引导时,如果自动的 fsck 失败,init 运行的引导脚本将自动进入单用户模式。在这种情况下,通过进入单用户模式,可避免使用坏的文件系统。
 
 出于安全性考虑,正确配置的系统会在进入单用户模式之前询问 root 用户的密码
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值