一、Linux开机流程
(一)power on 开机后加载BIOS(Basic Input Output System,基本的输入输出系统),BIOS加载
CMOS中所存放的当前主机各项硬件配置、系统时间、连接设备等信息;然后运行POST自检,
检查硬件设备,再检查启动设备,读取MBR(主引导记录(Master Boot Record)),转接给操
作系统。
BIOS与CMOS都是存储器。二者的区别是BIOS为只读存储器 (ROM或EPROM),而CMOS为随机存储器(RAM);BIOS中存储 的是程序,而CMOS中存储的是普通信息。
CMOS中保存着BIOS程序的设置结果。而且,CMOS中的用户信息和常规设置需要在BIOS程序引导计算机启动后才能载入 。
引导程序称为boot loader,
1、存放在MBR中。512字节分为三部分:
1) Boot loader 446字节,相当于指针程序,
如果是双系统,会出现两个选项。
注意:操作系统不仅会向MBR中写入相应的系统启动程序,还会在系统安装的分区或文件系统上的
第一个扇区保存操作系统安装的另外一份boot loader。
windows的boot loader不具备控制权的转交功能。linux的GNU GRUB启动引导程序支持控制
权的转交。所以安装windows和Linux双系统,要先装windows。
2)Partition table(分区表)64字节,
3)Magic Number(检验码)2字节(校验位必须为55AA,否则boot loader启动无效)。
(二)相关目录
1、boot目录:
vmlinuz-2.6.18-194.el5 当前系统的内核文件
initrd-2.6.18.-194.el5.img 系统的工具箱
System.map-2.6.18-194.el5 系统kernel中的变量的对应表(kernel的索引文件)
Symvers-2.6.18-194.el5.gz 模块的符号信息
config-2.6.18-194.el5 系统kernel的配置文件
2、grub目录:
stage1 bootloader的第一部分,指向调用stage2
*1_5的文件,是stage1到stage2中间过程需要加载的中间程序,主要是文件驱动等,支持对应的文
件系统;支持对应的文件系统后,就可以读取stage2
stage2 bootloader的第二部分,grub的主要程序
1)grub开始运行,grub配置文件为grub.conf
vi grub.conf查看
default=0 指定默认启动引导配置。0表示选择第一个。如果系统有两个系统是用title做为系统
的分隔符,第一个title后面就是第一个系统,用0表示。
timeout=5 就是默认在启动选择界面停留的时间,单位是秒。等待5秒自动进入默认操作系统
splashimage = (hd0,0)/grub/splash.xpm.gz
hd0表示当前主机中的第一块硬盘 ;
,后面的0代表第一个分区。
splash.xpm.gz gzip格式压缩的xpm文件,xpm是一种图形格式,该文件为开机过程中显示的红色
背景
splashimage是grub启动背景画面,如果是自己写grub.conf文件,可以不用写。
hiddenmenu 不是一个参数,是开机倒计时不显示选单的功能 。去掉后直接显示选单。
title title后面就是系统在启动时候显示的文字
每一个title都是启动选单中显示的文字,到下一个title 中间的部分都是对引导选项的相关配
置。
root 指开机过程中grub加载的根文件系统位置
(hd0,0) 第一块硬盘的第一个分区
kernel 当前指定的内核文件,内核所在位置和名称
/vmlinuz-2.6.18-194.el5
ro root=LABEL=/ rhgb quiet 内核参数
ro read only以只读方式挂接/根文件系统,
root 为内核重新指定根目录
LABEl=/ 以卷标名的方式描述一个分区,可以指定为相应的设备名,如/dev/sda2。
以卷标方式表示的优点是避免磁盘加载前后出现的问题。
现在挂接的是真正的根目录(为了避免根目录被破坏,以只读方式挂接)。
rhgb彩色模式,表示redhat graphics boot,就是会看到图片来代替启动过程中显示的文本信
息,这些信息在启动后用dmesg也可以看到
quiet 静默模式,表示在启动过程中只有重要信息显示,类似硬件自检的消息不会显示
initrd 在redhat3、4、5版本下都是以initrd方式加载内核工具箱。
/initrd-2.6.18-194.el5.img加载的目录封装的是最基本的模块.。
initrd文件在内存中会解压缩,内核把它当成/来挂接。
cpio:不支持读取,只支持输入(最开始用于备份磁带)。
cpio -iv < initrd-2.6.18-194.el5.img 将文件传输给cpio,然后删掉原文件,该目录显示为
加载到内存,内核将initrd文件当成/来进行挂接;然后运行init第一个进程。文件类型、内容
如图所示
vi init
init脚本中创建了/dev及子目录、设备文件。
insmod加载模块,/lib/下的ehci-hcd.ko, ohci-hcd.ko,uhci-hcd.ko这三个模块是三种不同的
USB芯片的驱动模块。
最后一条命令switchroot,切换根目录,该命令的的结果是把当前根目录的设置从initrd转换为
硬盘上真正的根目录。现在是以只读的方式挂接根文件系统。
总结:内核读取到内存中,initrd在内存中挂接成内存中的文件系统,内核先将initrd内存中的
文件系统当成根来进行挂接,运行initrd内部的initrd程序(这个initrd程序其实是一个
脚本,这个脚本加载了一系列配置),切换到硬盘上真正的根,然后再运行硬盘上initrd
程序。
模块文件保存在/lib/modules中,这就是/lib目录必须挂载到/目录下的原因。
3、grub出现故障如何修复
1)切换到grub目录下,查看grub.conf文件
2) 查看grub.conf文件
vi grub.conf
注意:只有在redhat按照这个过程执行,redhat规定所有的配置文件以.conf文件结尾;
标准的linux系统下,加载的是menu.lst(软链接文件,指向grub.conf)。
3)执行rm -f grub.conf,删掉grub.conf
4)然后将grub的bootloader 破坏掉,
dd if=/dev/zero of=/dev/sda bs=446 count=1
从/dev/zero(虚拟文件,读取的时候显示无限个0)文件中抽取数据,写到/dev/sda;执行结果是用
0把当前硬盘的头446个字节覆盖。
5)执行reboot重启
6)显示Operating system not found未安装系统,系统无法引导
7)使用光盘的rescue模式修复
(1)进入光盘安装界面,
(2)按F5键进入Rescue模式
(3)输入linux rescue回车
(4)选择安装语言,默认English,点击OK
(5)键盘模式默认us,点击OK
(6)询问是否开启网络,当前用不到,所以点击No
(7)是否扫描当前的分区系统,自动挂接和加载,点击Continue
(8)提示找到分区,并挂接到/mnt/sysimage
(9)执行chroot /mnt/sysimage
(10)现在可以找到硬盘根目录,重新安装grub,利用grub安装程序重写硬盘的MBR。使用grub-install
命令,查看使用方法
--root -directory=DIR 指定安装grub的root目录
--grub -shell=FILE 使用一个文件定义grub的shell程序
--recheck 检查device map文件。如果存在的话.按照devicemap声明的设备名,搜索设备。
devicemap文件属性:
(11)执行grub-install --root-directory=/ --recheck /dev/sda(指定安装的设备,安装设备指的
某块硬盘,不是某个分区)
(12)然后重新启动,进入grub.shell,(一般直接修改grub.conf文件)
(13)查看root已经识别(hd0,0),修改kernel参数、initrd参数,加载完毕
(14)输入boot,开始加载内核启动系统。
(15)进入系统,现在如果重新启动,依然出现grub提示符。因为/boot/grub下的grun.conf文件仍未
恢复,完全修复系统还需要重新编写grub.conf文件文件
vi grub.conf输入如下内容
(16)再次重新启动,系统已经修复完毕。
注意:为了避免硬盘MBR损坏后无法,需要备份分区表。
备份命令
dd if=/dev/sda of=/root/bacup.img bs=512 count=1
将sda硬盘的头512字节的数据保存到/root/bacup.img文件。
如果系统分区表,bootloader损坏,进入rescue修复模式,使用dd命令即可恢复。
(三)grub的结束是当前内核以只读方式挂载根文件系统。然后运行磁盘上的init程序
(/sbin/init)。
这个init程序作用是找到系统配置文件(/etc/inittab),并且指定runlevel(系统运行级
别)。
vi /etc/inittab
runlevel模式
0 关机
1单用户维护模式
2 多用户模式,但不加载网络服务
3 字符界面
4 系统保留,尚未使用
5 图形模式
6 重启
id:5 系统默认启动模式
/etc/rc.d/rc.sysinit 开机启动脚本
vi /etc/rc.d/rc.sysinit
/etc/inittab文件中
分别指定不同的runlevel级别下服务启动的脚本;
l0 表示标签;
0 表示不同runlevel级别;
wait等待前一个脚本运行完毕再运行下一个脚本;
脚本的内容:
该目录下的软链接文件以K打头的服务系统脚本是不启动的:以S打头的是启动的。数字代表启
动或关闭的顺序,如果数字相同则按照ASCII码的顺序排列。
链接的是/etc/rc.d/init.d/目录下的脚本
不同的runlevel启动级别区别是因为启动的服务脚本不同
特殊的是rc0.d,关机模式
除了开启着两个服务(杀死所有进程,关机),其余全部关闭。