Linux系统启动过程【Linux系统学习】

本文详细介绍了Linux系统从加电自检后的启动过程,包括GRUB/LILO引导加载程序、内核加载、init进程执行、系统初始化及运行级别管理。重点讨论了GRUB和LILO的配置方法,以及在不同运行级别下的脚本执行顺序,如/etc/rc.d/rc.sysinit和/etc/rc.d/rc.local。最后,解释了如何通过配置文件控制启动行为。

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

                                                      Linux系统启动过程


Linux从加电自检后就要从硬盘上开始引导操作系统。


1.引导加载程序GRUB/LILO。

当机器引导操作系统时,首先读取硬盘主引导记录(MBR)中的信息,找到主引导加载程序,加载操作系统即可。在单一的MBR中只能存储一个操作系统的引导记录,因此同时安装多个操作系统时就必须要使用引导加载程序。Linux中的引导加载程序有两个,分别是GRUB和LILO,通过他们的引导,操作系统可以顺利地启动。

GRUB相对LILO而言有更多的优势,如支持网络引导、交互命令界面等。且GRUB不需要像LILO一样将引导操作系统位置的信息存储在MBR中,因而可以避免由于错误配置MBR导致系统无法引导的故障。现在的Linux系统一般都倾向于GRUB引导。


2.加载内核。

内核映射不是一个可执行的内核,而是一个经过压缩的内核映像。通常它是一个zImage或bzImage文件,将其加载到内存之后,内核就开始执行了。


3.执行init进程。

init进程作为系统的第一个进程,是所有进程的发起者和控制者。Init的进程ID(PID)为1。它完成系统的初始化工作并维护系统的各种运行级别,包括系统的初始化、系统结束、单用户运行模式和多用户运行模式。由于Init进程是系统所有进程的起点,内核在完成核内引导后就开始加载Init程序。

init进程有两个作用:第一个作用是终结父进程。因为init进程绝对不会被终止,所以系统总是使用Init并以它未参照。如果某个进程在它衍生出来的全部子进程就都会以init作为父进程;第二个作用是子啊进入某个特定的运行级别(Run level)时运行相应的程序,以此对各种运行级别进行管理。它的这个作用是由/etc/inittab定义的。


4.通过/etc/inittab文件进行初始化。

init的工作是根据/etc/inittab来执行相应的脚本,进行系统初始化。下面以redhat为例进行说明。

(1)执行/etc/rc.d/rc.sysinit

这是由init执行的第一个脚本,其主要功能是完成各个不同运行级别中相同部分的初始化工作,包括设置的$PATH变量、配置网络等。

(2)执行/etc/rc.d/rcX.d下的脚本

在系统目录/etc/rc.d/init.d下有许多服务器脚本程序,一般称为服务(service),在系统初始化启动会选择性地执行这些脚本程序的一部分。在/etc/rc.d下有7个名为rcx.d的目录,对应系统的7个运行级别,这里的x是不同运行级别数,实际中使用相应运行级别的数字代替,如运行级别3,则执行的是/etc/rc.d/rc3.d/下的脚本。

这些脚本实际上都是一些连接文件,而不是真正的rc启动脚本,存放在/etc/rc.d/init.d子目录中的、被符号连接上的命令脚本程序才是真正的程序,是它们完成了启动或者停止各种服务的操作过程。

这个脚本程序的连接文件命名规则为“K+xx+服务名”或“S+xx服务名”的形式,其中xx是一个两位数字,K(Kill)表示结束,S(Start)表示启动。

通常这些命令脚本程序的执行顺序很重要,基本规则是先终止K开头的服务,然后启动S开头的服务,再根据字母S或K后面这个两位数字的大小来决定执行顺序,数值小比数值大的先执行。以字母K开头的命令脚本程序会传递Stop参数,以字母S开头的命令脚本程序会传递Start参数,同时也能接受如Restart、Staus等参数。

root用户可以用init x命令改变当前运行级别,如可以将init0作为关机指令、inti 6用作重启系统的指令。

(3)执行/etc/rc.d/rc.local

redhat中的运行模式2、3、4、5都会将/etc/rc.d/rc.local作为最后一个运行的初始化脚本,所以用户可以在这个文件中添加脚本指令,以实现在系统开机后,自动运行某个程序或者执行某项常规操作的功能。如要在系统开机启动后自动执行pptpd服务,则可以在/etc/rc.d/rc.local中增加一行启动pptptd的指令。

(4)执行/bin/login

login程序检验用户的输入账号和密码,若获得通过,则为使用者进行初始化环境,并将控制权交给shell,即等待用户登录,启动过程完成。


5.GRUB和LILO配置

(1)配置LILO可以通过编辑/etc/lilo.conf文件实现,其具体内容如下:

[root@localhost etc]#vi /etc/lilo.conf
prompt
timeout=50
default=linux
boot/dev/hda
map=boot/map
install=/boot/boot.b
message=/boot/message
linear

image=/boot/vmlinuz-2.620-8
label=linux
initrd=/boot/initrd-2.6.20-8.img
read-only
append="root=LABEL=/"


other=/dev/hda1
optional
label=DOS

启动加载文件配置的说明如下:

prompt

timeout=50

default=linux

这三行表示系统启动时将会显示一个LILO提示信息并等待5秒钟。注意,timeout的单位是0.1秒。如果5秒钟之内没有输入系统的名字,那么将使用默认引导default=linux,引导标号为linux的系统。

LILO配置文件解析:

    boot=/dev/hda表示启动盘使用第一个IDE硬盘,也就是hda。

    install=/boot/boot.b表示要将/boot/boot.b文件内容写到引导记录中,该文件在安装linux时已经创建。

    image=/boot/vmlinuz-2.6.20-8表示启动时使用的内核映像是boot/vmlinuz-2.6.20-8。

    label=Linux表示这个启动选择项的名称是Linux,然后是其他引导系统,这种配置适合同时安装了linux和windows两个系统的计算机。

更改后,为了使配置生效,还需要执行/sbin/lilo命令。

(2)配置GRUB可以通过编辑/boot/grub/grub.conf文件实现,具体内容如下:

[root@localhost grub]#vi  /boot/grub/grub.conf
default=0
  timeout=10
  splashimage=(had1,2)/boot/grub/splash.xpm.gz
  title Windows2K3
  rootnoverify(had0,0)
  chainloader+1


title Ubuntu
  root(had1,2)
  kernel /boot/vmlinuz-2.620-9 ro root=LABEL=/
  initrd /boot/initrd-2.6.20-8.img


title Mandrake10
  kernel(had1,4)/boot/vmliuz root=/dev/hda5 quiet devfs=mountacpi=off vga=788
initrd(had,4)/boot/initrd.img

GRUB配置文件解析:
       default=表示默认启动的系统,0为排在第一个的系统,依次类推。

      timeout=X为GRUB菜单停留的时间,单位为秒。

     title XXX:XXX为标题,就是要引导的操作系统的名字。

     root(hdX,Y)X和Y都代表一个数值,X是Linux的根分区所在的硬盘。如只有一个硬盘,则就是hda0。Y是代表Linux安装所在的分区,这个数字有点特殊。如配置文件中将Mandrake安装到第二块硬盘的第二个分区,也就是hdb5。则root(hdX,Y)就应该写为root(hda1,4),也就是说Y=hdaZ或者hdbZ中的Z减去1.

     kernel(hdX,Y)/boot/vmlinuz root=/dev/hdaZ和initrd (hdX,Y)/boot/initrd.img就是要引导硬盘分区的映像和initrd文件,一定要写正确X和Y的值,不然无法引导系统。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值