Linux系统的启动分为4个阶段,每个阶段都会完成不同的启动任务。其主要流程可以概括为:
1.POST:Power-On Self Test,加电自检
2.BootSequence:启动顺序
3.内核
4.Init
1、计算机启动后,首先进行固件(BIOS)的自检,即所谓的POST(Power On Self Test),然后把保存在MBR中的引导程序加载到内存中。
2、主引导加载程序通过分区表查找活动分区,然后将活动分区的次引导加载程序从设备读入内存中并运行。
3、加载次引导程序(GRUB),其中次引导加载程序又可以分为三个阶段
1st stage:位于MBR中,为了引导 2nd stage 1.5 stage:位于boot基本磁盘分区中,为识别内核文件所在的文件系统提供文件系统识别扩展 2nd stage:位于boot基本磁盘分区中,GRUB 的引导程序(/boot/grub/) |
4、Linux内核镜像,在内核的引导过程中,会加载必要的系统模块,以挂载根文件系统(/),完成后内核会启动init进程,并把引导的控制器交给init进程。
5、init进程会挂载/etc/fstab中设置的所有文件系统,并根据/etc/inittab文件来执行相应的脚本进行系统初始化。
BIOS加电自检
x86计算机在启动后会进行BIOS的加电自检,检测计算机的硬件设备,然后按照CMOS设置的顺序搜索处于活动状态并可以引导的设备。引导设备可以是软盘、光驱、USB设备等。
一般Linux都是从硬盘上进行引导,硬盘上的主引导记录(MBR)中保存有加载程序。MBR是一个512字节大小的扇区,位于硬盘的第一个扇区中。
引导加载程序GRUB
GRUB是Centos6.x中默认的引导加载程序。引导过程又可以分为启动主引导加载程序和启动次引导加载程序两个阶段。第一阶段是保存在MBR中的主引导加载程序,主引导加载程序的任务就是查找并加载保存在硬盘分区上的次引导加载程序,它通过分区表查找活动分区,将活动分区的次引导加载程序从设备读入内存并运行,进入引导加载程序的第二个阶段。
次引导加载程序也被称为内核加载程序,这个阶段的任务是加载Linux内核。一旦次引导加载程序被加载到内存中,便显示GRUB图形界面。
在此界面下提供的功能有:
(1) 提供菜单、并提供交互式接口 e: 编辑模式,用于编辑菜单;c: 命令模式,交互式接口; (2) 加载用户选择的内核或操作系统 允许传递参数给内核可隐藏此菜单 (3) 为菜单提供了保护机制 为编辑菜单进行认证为启用内核或操作系统进行认证 |
单击c进入命令行交互模式后,可使用的命令:
help: 获取帮助列表help KEYWORD: 详细帮助信息 find (hd#,#)/PATH/TO/SOMEFILE:root (hd#,#) hd#:磁盘编号,用数字表示;从0开始编号 #: 分区编号,用数字表示;从0开始编号 kernel /PATH/TO/KERNEL_FILE: 设定本次启动时用到的内核文件; initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdisk; boot: 引导启动选定的内核; |
手动在grub命令行接口启动系统的方法:
grub> root (hd#,#) grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE quiet grub> initrd /initramfs-VERSION-RELEASE.img grub> boot |
GRUB的配置文件:/boot/grub/grub.conf
配置语法: default=0 #设定默认启动的title的编号,从0开始 timeout=5 #等待用户选择的超时时长,单位是秒 splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz #grub的背景图片 hiddenmenu #隐藏菜单 password #给grub添加密码 title Red Hat Enterprise Linux Server (2.6.18-308.el5) #内核标题 root(hd#,#) #内核磁盘所在分区 hd#:磁盘编号,用数字表示;从0开始编号 #: 分区编号,用数字表示;从0开始编号 kernel #内核文件路径,及传递给内核的参数 Initrd #ramdisk文件路径 |
init进程 |
init是linux系统所有进程的起点,内核在完成内核引导后,便会加载init进程,其进程号是1。init进程启动后,会初始化操作系统,并启动特定的运行级别(Runlevel)下的自动运行程序。
当init进程获得控制权后,首先会执行/etc/rc.d/rc.sysinit脚本,根据脚本中的代码完成如下一些操作:
1、激活udev和selinux; 2、根据/etc/sysctl.conf文件,来设定内核参数; 3、设定时钟时钟; 4、装载键盘映射; 5、启用交换分区; 6、设置主机名; 7、根文件系统检测,并以读写方式重新挂载;8、激活RAID和LVM设备; 9、启用磁盘配额; 10、根据/etc/fstab,检查并挂载其它文件系统; 11、清理过期的锁和PID文件 |
接下来,init进程会执行inittab脚本中的代码。该脚本代码中定义了linux系统的运行级别,以及每个级别所对应的引导步骤。
0:halt关机 1: single user mode,直接以管理员身份切入,s,S,single 2:multi user mode, no NFS 3: multi user mode, text mode 4:reserved 5: multi user mode, graphic mode 6: reboot 查看运行级别:runlevel |
inittab文件的配置语法: 每一行定义一种action以及与之对应的process id:runlevel:action:process id: 操作的ID runlevels: 在哪些级别下执行此操作 action: 动作 initdefault: 设置默认运行级别,无需定义操作 sysinit:指定系统初始化脚本(/etc/rc.d/rc.sysinit) wait: 等待系统切换至此级别时运行一次; ctrlaltdel: 定义组合键被按下时要运行的命令; respawn: 当指定操作进程被关闭时立即再启动一次; process: 操作 |
在linux系统中每个级别所运行的服务都不一样,每个级别的运行服务脚本文件都分别存放在7个名为/etc/rc.drcN.d的目录下。
例如在运行级别为3,那么init进程会查找并执行/etc/rc.d/rc3.d/目录下的所有的脚本。目录下的脚本都是一些链接文件,指向了init.d目录下,命名规则为Snn服务名或者Knn服务名。其中,对于S开头的文件,系统会启动对应服务,对于K开头的,系统会终止对应的服务;nn位数字,表示脚本执行顺序,S开头的为文件会按数字从小到大执行,K带头的会从大到小关闭服务。 |
使用chkconfig命令可以配置自动运行的服务。 |
chkconfig [--list] [-- type < type >] [name] chkconfig --add <name> chkconfig --del <name> chkconfig --override <name> chkconfig [--level <levels>] [-- type < type >] <name> <on|off|reset|resetpriorities> |
在启动过程中/etc/rc.d/rc.local是系统最后启动的一个服务执行的一个脚本。当需要系统启动或关闭时自动执行某些任务可以写在此脚本中。