Linux引导过程在20,000英尺处的视图:
Init初始化过程:
POST:Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况的检测。
BIOS :Basic Input and Output System,基本输入输出系统,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等。
CMOS:Complementary Metal Oxide Semiconductor,互补金属氧化物半导体,保存各项参数的设定,按次序查找引导设备,第一个有引导程序的设备为本次启动设备。
BIOS与CMOS的关系 CMOS是计算机上另一个重要的存储器。之所以提到它,是因为BIOS程序的设置结果就保存在CMOS中。而且,在BIOS程序引导计算机启动后,计算机需要载入CMOS中的用户信息和常规设置后才能正常使用。UEFI系统则多用NVRAM存储设置。
BIOS与CMOS的区别 二者的区别是,BIOS是存储在只读记忆体(EEPROM),而CMOS为随机存储器(RAM);BIOS中存储的是程序,而CMOS中存储的是普通信息。
EEPROM即是我们常用的U盘和各类存储卡,因此我们可以更新BIOS,其内容亦能在断电后保存。
CMOS RAM的内容在断电会消失。所以,把主板的电池拆出,便可重置其内容。另外,拆出电池也会重置时间。
主引导记录(Master Boot Record,缩写:MBR),又叫做主引导扇区,是计算机开机后访问硬盘时所必须要读取的首个扇区。MBR总共有512个字节,其中前446个字节主要用来放置和启动相关的一段程序boot loader,是GRUB的1 stage。其后是4个16字节的“磁盘分区表”(DPT),以及2字节的结束标志位55aa。
通过hexdump命令可以查看到MBR的内容:
# hexdump -C -n 512 /dev/sda #通过十六进制+ASCII码的形式显示磁盘的前512字节MBR剖析图:
GRUB (GRand Unified Bootloader 简称GRUB)是一个来自GUN项目的多操作系统启动程序,能够启动大多数免费操作系统 Linux、FreeBSD、NetBSD、GNU Mach和其它大多数的商业操作系统。在Linux系统的启动过程中GRUB程序是分为三个阶段在发挥它的作用,分别是1 stage、1.5 stage和2 stage。
1 stage:MBR前446字节中的boot loader,主要用于初始化硬件,进行引导加载。
1.5 stage:存放于MBR 512字节后续的空间之中,这段空间不属于任何分区,可以直接读取,主要用来加载进入boot分区所需的文件系统驱动,默认是ext4文件系统的驱动。
2 stage:/boot/grub/目录中的文件,需要进入boot分区后才能进行读取,包含了挂载根分区的重要信息。
使用rpm -qi grub命令可以查看到CentOS 6系统中安装的GRUB程序的软件信息,可以看到Version是0.97。
ramdisk是一个伪根文件系统,主要用于帮助内核完成自身初始化、加载驱动程序挂载根分区,到此便可以被卸载掉了。而ramdisk便是boot目录中initramfs-$(uname -r).img文件,这是一个gzip的压缩文件,存放了一些和启动相关的文件和驱动,是系统启动过程中的核心文件之一。
生成ramdisk文件的命令有两个可以选择,mkinitrd和dracut,mkinitrd命令是一个脚本,调用了dracut命令。
#为当前正在使用的内核重新制作ramdisk文件 #mkinitrd /boot/initramfs-`uname -r`.img `uname -r` 或 #dracut /boot/initramfs-$(uname-r).img $(uname-r)vmlinuz文件是一个可引导的,压缩的Linux内核,包含了Linux kernel的核心功能模块。内核在编译的时候为了实现精简,只将必要的功能模块打包到了内核文件之中,所以这个文件看起来并不是很大,一些非核心模块一般放置在/lib/modules/目录下。
此文件用于设置系统的运行级别,共0-6七个级别,默认级别一般设置为3或5,0或6不建议设置为默认运行级别,会循环重启或者关机。
0:关机1:单用户模式(root自动登录),single,维护模式2:多用户模式,启动网络功能,但不会启动NFS,维护模式3:多用户模式,正常模式,字符界面4:预留级别,同3级别类似5:多用户模式,正常模式,图形界面6:重启 #cat /etc/inittab ...此处省去部分内容... id:3:initdefault:这是启动过程中一个初始化的脚本,主要作用如下:
设置主机名
设置欢迎信息
激活udev和selinux
挂载/etc/fstab文件中定义的文件系统
检测根文件系统,并以读写方式重新挂载根文件系统
设置系统时钟
激活swap设备
根据/etc/sysctl.conf文件设置内核参数
激活lvm及software raid设备
加载额外设备的驱动程序
清理操作
这是一个脚本文件,负责在运行级别发生更改时启动/停止服务。
/etc/rc.d/rc#.d/目录中包含了启动过程中需要启动的服务,#代表运行级别,以K开头的服务,数字越小,越先关闭;数字越小的服务,通常会依赖到别的服务;以S开头的服务,数字越小,越先运行;数字越小的服务,通常会被其它服务所依赖到;
default=0
如果安装了多个操作系统,这一项的值可以定义启动时默认引导的操作系统,0对应的是下文中的第一个title定义的启动项。
timeout=5 启动等待时间。
splashimage=(hd0,0)/grub/splash.xpm.gz 启动菜单背景图片的位置
password
在配置文件中没有明确写明,但可以通过在文件中两处不同位置添加password字段实现不同的加密效果。示例:password centos
1.password字段添加在title字段之上,设置编辑grub启动菜单的口令,若想编辑启动菜单需要先输入p字母后,输入正确的口令才能进行编辑。
2.password字段添加在配置文件尾部,设置启动操作系统的口令,只有输入正确的口令系统才会正常启动。
补充:为启动菜单设置密码,明文密码并不安全,建议使用加密算法加密。
示例:
password --md5 1 1 1xxxxxxxxxxxxxx #MD5密文使用grub-md5-crypt生成 password --encrypted 6 6 6xxxxxxxxxxxxxx #sha512密文使用grub-crypt生成加密算法的设置方法: 打开vim编辑器的扩展命令模式,:后输入r!grub-md5-crypt,回车,输入口令,再回车,再次输入口令,回车后密码会自动写入到编辑器光标的所在位置。
hiddenmenu 作用是隐藏启动选项菜单,默认是不显示启动选项菜单的,只有在开机时敲任意键才会显示。 title CentOS 6 (2.6.32-696.el6.x86_64) 定义启动菜单启动项的名称。
root (hd0,0)
定义启动时根分区所在硬盘和分区对应磁盘的位置,这里的根指的是/boot,是由grub的独特语法决定的。hd是hard disk的缩写,这段的含义是根分区在第一块硬盘的第一个分区。hd0,0的位置对应的是磁盘boot分区的位置,所以在启动的时候是先将boot分区来做为根分区进行挂载的。
kernel /vmlinuz-2.6.32-696.el6.x86_64
定义了内核文件相对于根分区的绝对路径,如果在安装操作系统时没有给/boot划分独立分区,则需写成/boot/vmlinuz-2.6.32-696.el6.x86_64 ro root=/dev/sda2。
ro root=UUID=58991581-5bce-43b0-8ffa-4cb3dd70574c rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
这一段内容定义的是内核的参数信息,可以使用cat /proc/cmdline命令查看。
ro以只读方式进行挂载,但进入操作系统之后并不是只读的状态,所以后续还会重新挂载一次,选择以只读的方式进行挂载完全是出于安全的考虑。
root=UUID=58991581-5bce-43b0-8ffa-4cb3dd70574c,真正根分区对应磁盘分区的UUID,通过这一行去找要挂载的根分区位置,也可以写成绝对路径/dev/sda2。
rhgb这个字段的作用是启动时产生转圈圈的动画,虽然看着好看,但会隐藏服务的启动流程。建议删除掉,删除后可以看到服务的启动过程,系统出问题有助于排错。不删除的话,只有按Esc键,才会露出这个界面。 quiet这个字段的作用是默认隐藏内核的启动过程,删除此字符可以看到内核的加载过程信息。
initrd /initramfs-2.6.32-696.el6.x86_64.img
定义ramdisk文件相对于根分区的绝对路径,如果在安装操作系统时没有给/boot划分独立分区,则需写成/boot/initramfs-2.6.32-696.el6.x86_64.img
Note:因为只有在加载内核后才能知道谁是操作系统的根,才能知道该加载那种文件系统,所以initrd /initramfs-2.6.32-696.el6.x86_64.img 和kernel /vmlinuz-2.6.32-696.el6.x86_64的顺序不能对调,对调会导致无法启动。