你好,游客 登录 注册 搜索
背景:
阅读新闻

Linux系统开机引导

[日期:2017-02-18] 来源:Linux社区  作者:Linux [字体: ]

开机自检(BIOS)——>MBR引导——>GRUB菜单——>加载内核(kernel) ——>运行INIT进程

开机自检(BIOS)
// 加载 BIOS 的硬件信息、进行自我测试,并依据设定获得第一个可开机的设备
1.启动BIOS:固化在主板上的芯片 Del 、F2
2.POST ( power on self test )系统检查:检查核心硬件是否正常
3.设备初始化 : 初始化驱动程序,分配资源
4.引导设备选择:使用光驱,硬盘还是PXE引导

5.移交执行区域:加载引导设备的第一个扇区(512Byte)

BOIS :基本输入/输出系统 (微型 操作系统),存储计算机基本硬件的信息
作用:加电自检 、初始化、引导操作系统
BIOS 只读芯片,BIOS 的参数写在 CMOS中。有块小电池为CMOS供电
南北桥是主板上最大的芯片,

由于软驱已不再使用,某些BIOS在启动时检测不到软驱会提示错误,需要将其屏蔽
建议在BIOS配个密码,提高计算机的安全性,确保只有有权限的人员才能修改BIOS的参数
若管理员不记得某个电脑的BIOS密码,需要清空BIOS密码 1)清除CMOS的跳线,2)清除CMOS的按钮

故障排除:
1.POST 信息,包括检测过程和错误提示
启动时显示 “CMOS battery failed" :需更换新电池
启动时显示 ”Floppy disk is fail Press F1 to continue,Del to setup" : 无法驱动软驱,按F1建继续
2. 根据报警音排除
蜂鸣器长鸣 - 内存错误,清理灰尘,或更换一条插槽

MBR 引导
读取并执行第一个开机设备内 MBR 的 boot Loader(grub 等程序),依据 boot loader 的设置加载 Kernel,Kernel 会开始检测硬件与加载驱动程序;
boot loader 的作用就是载入内核
boot loader 装入 kernel,然后 kernel 需要执行/sbin/init
BIOS 向GRUB传递控制权

GRUB引导程序 (GNU赞助的项目)
引导程序的两个工作阶段
stage1 : 第一阶段的引导程序在MBR里面(446Byte),第一阶段用来定位装载第二阶段的引导程序
stage2: 第二阶段指引导程序本身,会运行某种应用程序并读取相应的配置信息
stage1.5:是stage1和stage2之间的桥梁,由于stage1不能识别文件系统格式,需要stage1.5来引导位于某个文件系统当中的stage2
stage1——>stage1.5——>stage2——>grub.conf (Stage2 这个文件会加载/boot/grub/grub.conf 这个文件)

删除stage 的这三个文件仍然能够正常启动,只是删除了文件名,数据还在,stage1只是MBR中前446字节的备份
stage1包含了stage2的物理地址,删除stage2还可以直接找stage2的物理地址,所以能正常启动

stage1 这个文件的大小,发现他正好是 512 字节
那就是(我个人认为)这个 stage1 就是 MBR。所以说,
Stage1 是执行 boot loader 的主程序,它是安装在我们的启动扇区。??
device.map 记录 grub 安装在哪个磁盘上;

1) BIOS 将控制权交给硬盘的主引导区,即 MBR。
2) MBR 中的 bootloader(stage1)通过内置的地址加载*stage1_5。
3) bootloader 通过*stage1_5 的内容,将分区中的 stage2 加载。
4) stage2 此时就可以在文件系统中将 grub.conf 文件加载,让用户看到选项界面。
Linux系统开机引导

#shred
-u
:#shred -u stage2
#grub-install /dev/sda //全部修复stage1 ,stage1.5,stage2

INIT进程初始化
INIT进程
:由Linux 内核加载运行/sbin/init 程序,是系统中第一个进程,PID号永远为1

/sbin/init
在内核加载完毕、进行完硬件检测与驱动程序加载后,此时主机硬件已经准备就绪了,这时候内核会主动的呼叫第一支程序,那就是 /sbin/init
/sbin/init 最主要的功能就是准备软件执行的环境,包括系统的主机名、网络设定、语言、文件系统格式及其他服务的启动等。

/etc/inittab
设定默认的 runlevel (开机运行级别),Linux 就是通过设定 run level 来规定系统使用不同的服务来启动,让 Linux 的使用环境不同
运行级别:运行Linux系统的不同模式,每种模式对应不同的服务程序组合
默认的7种运行级别
0:关机状态 1:当用户模式 2:字符界面的多用户模式(不支持网络) 3:字符界面的完整多用户模式 4:为分配使用 5:图形界面的多用户模式 6:重新启动

#runlevel 查看运行级别
切换前的运行级别 当前运行级别
第一个字符为“N”表示之前未切换过运行级别
#init n(1-6)临时切换运行级别参数

/etc/init/ (不要与目录/etc/init.d 混淆,/etc/init.d 中包含的是服务脚本)

/etc/init/rcS.conf
通过启动大部分的基本服务来对系统进行初始化的设定

/etc/init/rc.conf
对启动各自的运行级别(runlevel)的设定

/etc/init/control-alt-delete.conf
定义当用户按“control-alt-delete”三个键时的系统行为

/etc/init/tty.conf /etc/init/serial.conf
定义了系统处理终端登录的方式

/etc/rc.d/

/etc/rc.d/rc
根据指定的运行级别,加载或终止相应的系统服务,传入参数X, 触发相应的runleve事件

/etc/rc.d/rc.sysinit
由init进程调用执行,完成设置网络、主机名、加载文件系统等初始化工作; 系统模块与相关硬件信息的初始化

/etc/rc.d/rcn.d/* // 按事先设定的优先级依次启动
包含运行级别 n 执行服务状态配置的符号连接
控制系统在相应运行级别会自动启动或停止的服务
符号连接名称:Lddservice_name
L:K / S ,表示停止或启动服务
dd : 两位数字表示启动或停止服务的顺序
:# ls -l /etc/rc.d/rc5.d | grep crond
:# ls -l /etc/rc.d/rc0.d | grep crond

/etc/rc.local 脚本 // 用户自定义开机启动脚本,由rc脚本调用执行
把想启动的脚本写到这个文件中,开机就能启动了,注意一点,写在这里面的脚本要使用绝对路径。只有2、3、4、5级别运行这个文件
:#cat /etc/rc.local
:#ls -l /etc/rc.d/rc?.d/* | grep rc.local


/etc/sysconfig/init
除了这些通用的文件,在文件/etc/sysconfig/init 中还有一些额外的配置在这里,定义
了一些参数来决定启动信息的格式。除了那些不很重要的设置,有三行我们需要注意:

/var/log/dmesg / #dmesg
保存系统启动信息
Linux系统开机引导

查看开机流程顺序
1.GRUB Loading Stage2 // BIOS 向GRUB传递控制权
2. 引导系统内核
3. 启动initrd 挂载虚拟根目录切换真实根目录 (switching root)
4. 加载rc.sysinit脚本(welcom to Red Hat Enterprise Linux Server)
5. 重新读写挂载文件系统
6. 进入相应的运行级别,rc.sysinit到此结束
7. 启动相应运行级别下的脚本(/etc/rc.d/rcn.d)

———————————————————————————————————————

系统启动过程排错

1.使用救援模式引导您的计算机 (使用救援磁盘或者安装盘)
在没有安装红帽企业版 Linux 的计算机中引导命令行 Linux 系统。这可让您使用运行 Linux 系统的程序和功能以便修改或者修复已经安装在您计算机中的系统。
修复模式下,把硬盘的/分区挂到了/mnt/sysimage 下,把/boot 挂到了/mnt/sysimage/boot 下。如果没有提示你 chroot /mnt/sysimage 那么就说明你不可以直接执行 chroot /mnt/sysimage 挂载/根目录,那么为啥出现这个提示,是因为我们的 fstab 这个文件损坏,需要恢复该文件后,才可以直接挂载/。
进入救援模式后无法挂载根文件系统(即chroot无效),此时 #which bash ; cp /usr/bin/bash /mnt/sysimage/bin/bash 即拷贝内存中的bash到虚拟根文件系统
救援模式下,如果还处于虚拟根环境下,就不要安装软件,安装到光盘中去了
涉及到引导程序和MBR的用救援模式

2.引导到单用户模式 : 做一些系统维护,修改密码等。(在内核命令行后加 1)
进入单人维护模式,而这时候/是只读的状态 mount -o remount,rw /

3.修改内核命令行参数排错
如:init进程相关配置文件被误删,系统停滞,无法完成初始化
避开/sbin/init 启动系统,如果重要的配置文件损坏,添加参数init=/bin/bash

4.直接在grub> 下输入命令进行修复,如grub.conf 文件丢失

Linux 在启动时可能出现的 trouble 的地方
第一阶段:MBR 里面的引导管理器(IPL, Initial Program Loader)grub 损坏。

第二阶段: stage1.5, stage2 损坏;找不到 grub.conf ; 找不到 kernel

第三阶段: 找不到 initramfs .img; fstab 分区挂载失败; 磁盘卷标不匹配或丢失

第四阶段: inittab 初始化脚本失败 ;图形界面加载失败;服务进程错误

常见症状
1. 不显示引导加载器初始屏幕或提示
grub 配置错误;引导区损坏;写入引导区之后,BIOS设置(例如磁盘寻址方案)被修改

2.无法加载任何内核区域或只加载部分内核,随后出现异常
内核镜像损坏;通过启动加载传递到内核的参数错误

3.已完全加载内核,但尝试挂载root文件系统并运行/sbin/init时,发生异常或故障
启动加载器配置错误;/sbin/init 损坏或 /etc/inittab配置错误;root文件系统已损坏或不可挂载

4.已完全加载内核,/etc/rc.d/rc.sysinit 已经启动但中断
缺少/bin/bash 或它已损坏;/etc/fstab 可能出现错误,对文件系统进行挂载和fsck操作时很明显;损坏的非root文件系统(因无法进行fsck操作)

5.运行级别错误(典型服务)
没有为指定运行级别配置有故障的服务所需的其他服务;特定于服务的配置错误

常见现象:
一、屏幕一片黑,无法看到 grub 界面 // MBR 里面的 grub 损坏
法一 进入修复模式
sh-4.1# chroot /mnt/sysimage
sh-4.1# grub
grub> root (hd0,0)
grub> setup (hd0)
注意:
1、此方法修复 grub 依赖于/boot/grub/grub.conf,如果 grub.conf 不存在,则需手工创建一个。创建方法请参考下文。
2、用此方法修复 grub 是把/boot/grub 下的 stage 镜像安装到硬盘上的特定位置上。所以使用此法修复 grub 仅限于是硬盘上的 stage1(在 MBR 里)以及 stage1.5,修复依赖于/boot/grub 下的 stage1, stage1.5, stage2 镜像。如果这几个镜像也遭到破坏, 则此法无效。
法二 进入修复模式
SH-4.1# chroot /mnt/sysimage
SH-4.1# grub-install /dev/sda
注意:
1、此方法修复 grub 依赖于/boot/grub/grub.conf,如果 grub.conf 不存在,则需手工创建一个。
2、此方法不依赖于 grub.conf,当/boot /grub 下文件都找到破坏,亦可用次命令修复。但不修复 grub.conf。

二、grub 警告:Error 15——stage1.5 报错,极有可能是stage1.5 加载 stage2 失败
grub-install /dev/sda 不一定能成功。 grub-install 的安装必须依赖 grub.conf 这个配置。如果这个配置不存在,grub 是 install 不了的。按以下方法对修复grub.conf
注意:
1、初始状态的 stage1 并不会去读取/boot/grub/下的 stage1.5 和 stage2。位于 MBR 的 stage1会去读取硬盘某个位置的 stage1.5,然后直接引导内核。
2、如果机器上的 grub 是经过修复的,比如用 grub-install 或者进入 grub 然后 setup 过。那么就不一样了。此时 stage 会去引导/boot/grub 下的 stage2。

三、Grub>: 直接进入 grub shell 界面——找不到 grub.conf 文件
法一
有些配置文件是 rpm 自带的。在安装 rpm 时会自动生成。但是,有些配置文件是根据你机器配置事实生成的。这种配置文件就不一定能靠重装相关的包来修复。自己手动重写。
修复:进入修复模式,参照下面所示根据实际环境编辑 grub.conf
sh-4.1# chroot /mnt/sysimage
sh-4.1# echo /boot/vmlinuz -2.6.32-220.el6.i686 >> /boot/grub/grub.conf
sh-4.1# echo /boot/initramfs -2.6.32-220.el6.i686.img >> /boo t/grub/grub.conf
法二
grub> root (hd0,0)
grub> kernel /vmvmlinuz-2.6.32-279.el6.i686 (补齐)ro root=/dev/sda2
grub> initrd /initramfs-2.6.32-279.el6.i686.img (补齐)
grub> boot
此时可启动系统,启动系统后修复内核配置文件

四、grub 警告:Error 15: File not found——找不到 kernel 或者 initrd.img // Stage1.5 报错。
首先确定 kernel 以及 initrmfs.img 文件是否存在 ——> 确定指定 kernel 所在磁盘分区的 root 参数是否写对 (在 grub 界面利用<TAB>自动补全功能检查/boot/grub/grub
.conf 配置是否正确。)
1. 如果发现内核丢失 进入修复模式,挂载安装盘,强制重装内核
进入修复模式
sh-4.1# chroot /mnt/sysimage
sh-4.1# mount /dev/cdrom /media
sh-4.1# cd /media/Packages
sh-4.1# rpm -ivh --force kernel-2.6.32-220.el6.i686.rpm
sh-4.1# reboot
2. 如果 initramfs.img 文件丢失,可以使用 mkinitrd 命令新建
进入修复模式
sh-4.1# chroot /mnt/sysimage
sh-4.1# mkinitrd /boot/initramfs -$(uname -r).img $(uname-r)

五、Kernel panic (原因很多)
Switchroot: mount failed: No such file or directory
Kernel panic – not syncing: Attempted to kill init! ——内核挂载 root 分区失败
常见的原因有root 分区遭到破坏,或者内核不能正确定位 root 分区。
1.如果是 root 分区遭到破坏,那么这个不在我们讨论的范围之内。
2. 如果是内核不能正确定位 root 分区,则我们可以尝试修复之。通常情况下内核如何定位 root 分区呢?一般是通过 grub 在引导起内核的时候,给内核指定 root 分区的位置。
检查 kernel 选项参数。核对 root 参数是否正确

六:/etc/fstab 文件错误或者丢失

文件丢失怎么办?
1.使用备份的文件还原
2.安装该文件的软件 #rpm -qf [文件绝对路径]
3.参照配置文件手写或导入(echo)

命令丢失且不能安装软件包怎么办?
#which rpm
#rpm -qf /bin/rpm
#cp /mnt/Packages/rpm-4.8.0-32.el6.i686.rpm /test
#rpm2cpio rpm-4.8.0-32.el6.i686.rpm > rpm.cpio
#file rpm.cpio
#cpio -id < rpm.cpio
#ls /test/bin

 

linux
相关资讯       Linux系统引导 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款