一.首先简单看一下系统启动的流程图html
能够参考:http://maoqiu.blog.51cto.com/8570467/1368586 linux
http://www.opsers.org/base/learning-that-the-rhel6-day-boot-linux-troubleshooting.html shell
二.linux系统启动过程数据库
1,BIOS自检,检测硬件,决定启动介质vim
BIOS为写入到主板上的一块闪存或EEPROM的程序,它在开机时候执行,并经过BIOS程序去加载CMOS的信息,并经过CMOS内的设置取得主机的各项硬件配置,BIOS程序也能够修改CMOS当中的参数,通常使用Del按键进入BIOS设置界面。bash
2,从硬盘启动,读硬盘第一个扇区MBR,而后将启动引导工做交给boot loader网络
MBR引导记录位于物理硬盘的第一块扇区的一段引导代码(第一块扇区512个字节,其中MBR占446字节,分区表占64字节,结束标志占2字节),该扇区又称为主引导扇区(MBR扇区)ide
3,boot loader去找grub,grub读取配置文件grub.conf,决定默认启动项,找到内核(kernel)和驱动(initrd)测试
Boot loader:认识操做系统的文件格式并加载内核到内存中去执行,因为不一样的操做系统的文件格式不一致,所以每种操做系统都有本身的bootloader,ui
bootloader分为两阶:
一、stage1: 执行boot loader加载文件系统驱动
二、stage2:加载真正的配置文件: grub.conf
b. grub.conf里面有内核和驱动的信息,下面会对grub.conf文件作具体的介绍
4,内核会主动调用init进程,读取配置文件/etc/inittab,决定启动级别,运行初始化脚本/etc/rc.d/rc.sysinit,运行相应的启动级别下的脚本/etc/rc.d/rcN.d/
a. vim /etc/inittab
id:5:initdefault: //默认的runlevel设置,此处为5
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit //准备系统软件执行的环境的脚本执行文件
l0:0:wait:/etc/rc.d/rc 0 //0 - 关机(千万不要把initdefault 设置为0 )
l1:1:wait:/etc/rc.d/rc 1 //1 - 单用户模式
l2:2:wait:/etc/rc.d/rc 2 //2 - 多用户,可是没有 NFS服务
l3:3:wait:/etc/rc.d/rc 3 //3 - 彻底多用户模式
l4:4:wait:/etc/rc.d/rc 4 //4 - 没有用到(系统保留功能)
l5:5:wait:/etc/rc.d/rc 5 //5 - X11(与 3相似,可是加载使用X Window)
l6:6:wait:/etc/rc.d/rc 6 //6 - 从新启动 (千万不要把initdefault 设置为6 )
ca::ctrlaltdel:/sbin/shutdown -t3 -r now //是否容许按【ctrl】【alt】【del】从新启动的选项
#不断电系统的pf,pr两种机制,一个是没电时的关机,一个是复电的处理
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
#tty1~tty6是由这六行决定的
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
#启动X window是由这里决定的
x:5:respawn:/etc/X11/prefdm -nodaemon
b./etc/rc.d/rc.sysinit做用,简单说明一下
1.取得网路环境和主机类型
2.测试与挂载内存设备/proc及USB设备 /sys
3.决定是否启动SELinux
4.启动系统的随机数生成器
5.用户自定义模块
6.加载内核的相关设置
7.初始化软件磁盘阵列,lvm
8.启动相关信息加载/var/log/dmesg文件中
5.依据/etc/inittab 执行/etc/rc.d/rc0~6.d
找到/etc/rc.d/rcN.d/K??*开头的文件,并进行/etc/rcN.d/K??* stop的动做
找到/etc/rc.d/rcN.d/S??* 开头的文件,并进行/etc/rcN.d/S??* start的动做
若是默认启动是命令模式开启6个文本控制台 [ALT+F1~F6]
若是默认启动项是图形则开启图形界面以及6个文本控制台
用户自定义的开机启动程序/etc/rc.d/rc.local
6.加载X Window界面,等待用户输入用户名和密码
a.经过/etc/passwd、/etc/shadow验证,若是用户名和密码输入正确,
读取4个初始化文件:/etc/profile、/etc/bashrc、~/.bashrc、~/.bash_profile
文本界面直接开启shell
图形界面开启桌面,进入X Window,经过开启终端打开shell
b.系统还会自定义设备与模块对应文件为/etc/modprobe.conf
三. 介绍grub.conf文件
#vim /etc/grub.conf
default=0 # 默认的启动项,也就是启动那个title,从0开始计数。
timeout=5 #就是默认在启动选择界面停留的时间,等待5秒自动进入默认操做系统
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz #splashp_w_picpath是grub启动背景画面,这个能够不要。
hiddenmenu #hiddenmenu 是隐藏菜单只有按上下键才会出现
title Red Hat Enteprise Linux Server (2.6.18-308.el5) #title后面就是系统在启动时显示的名字
root (hd0,0) #root指定你内核所在分区。hd0表示第一块硬盘设备。0表示第一个分区,也是/boot所在分区
kernel /vmlinuz-2.6.18-53.el5 ro root=LABEL=/ rhgb quiet
#kernel 内核在哪里;ro 只读;root=LABEL=/ 用于指定根分区是谁;rhgb (图形化显示启动过程) ;quiet (静默式启动,不显示dmesg信息)
initrd /initrd-2.6.18-53.el5.img #initrd内核镜象的名字
四,下面是几个故障修复的例子
1.把title下面的三行删掉,而后重启系统
重启系统后,会卡在这里,由于修改了grub.conf这个文件
须要把grub.conf里的三行内容手动添加进去,须要指定/boot所在的分区,linux内核,和initrd文件,而后boot启动。
看到红色的Red Hat就证实你的内核加载成功了
启动成功后再把/etc/grub.conf文件的那三行内容加回去
2.把/boot/grub/grub.conf删掉,会怎样呢
能够把这个grub.conf文件备份到其余地方,这样启动后能够把文件恢复回去, 运行root或find /vmlinuz-2.6.18-53el5(可使用TAB补全),能够搜索vmlinuz所在分区.
内核成功被加载
3.MBR损坏
#dd if=/dev/zero of=/dev/hda bs=446 count=1 //模拟Boot loader 损坏
#reboot
从光盘启动,在这以前要把镜像挂载上
选择语言:enginsh-----选择美式键盘----对网络接口选择no----对挂载之前的操做系统选择continue-----进入救援模式操做
4.把/boot/下的内容删了再试一下
一样使用光盘启动,进入linux rescue模式,查看一下/boot下什么都没有了
把光盘挂上,而后安装kernel
内核安装完,还须要安装grub
没有grub.conf文件,手动添加进去,而后重启系统
内核加载成功
5.若是boot分区删了(前提是df能够看到/dev/hda1是boot分区记录),也能够恢复。
从光盘进入到救援模式后,把那个boot分区添加回去,按照上面安装内核和grub就能够启动系统了,添加grub.conf文件。
注:若是重启后出现fsck.ext4: Unable to resolve 'LABEL=boot',从新进入救援模式
解决方法:# e2label /dev/sda1 /boot #e2label能够给分区加上label
6.initramfs故障的解决
RHEL6由initrd走向initramfs ,initramfs目的和initrd同样的,就是提供开机过程当中所须要的最重要内核模块,以让系统开机过程能够顺利完成。由于内核模块放在/lib/modules/$(uname -r)/kernel/ 当中, 这些模块在根目录(/)被挂载时才可以被读取。若是内核自己不具有磁盘的驱动程序时, 固然没法挂载根目录,也就没有办法取得驱动程序,那么就形成开不了机了。虽然通常状况下,没有这个文件,系统一样启动,但遇到一些特殊应用时候,系统就启动不了了。
如今咱们来删除这个文件(建议备份)。
要想从新建立这个文件其实很简单就是用mkinitrd这个命令来建立,下面就来看看这个的用法。
(例如: mkinitrd /boot/initramfs-2.6.32-71.el6.i686.img 2.6.32-71.el6.i686)
经过上面的帮助,咱们能够看到他给的例子就是用mkinitrd建立initramfs的。那么OK,咱们也来建立一个。
咱们发现启动后就黑屏了,没有反应。一样仍是进入救援模式,而后chroot /mnt/sysp_w_picpath
执行下面的命令,若是要查看具体的建立过程,咱们能够加上-v参数。
再来看看/boot目录下面,是否是有了这个initramfs-2.6.32-71.el6.i686.img文件了,软后从新启动系统
7.运行级别的故障解决
系统运行级别的实际相关文件都在/etc/rc.d这个目录下,因此咱们删除这个目录里面的所有文件。
从新启动系统错误提示以下
只能硬启动了 ,在运行级别5下,启动时候的错误提示以下
进入救援模式 ,chroot /mnt/sysp_w_picpath后,
只须要把运行级别inittab文件里面的5改为3或者是2就能登录系统了,若是是改为1的话,会在Entering non-interactive startkup处卡住。
注1:若是你的默认运行级别是5(图形模式)的话,系统是启动不了的。但若是你的默认运行级别是二、3(命令行模式)的话,系统能启动,只是少了不少有服务而已。
注2:在RHEL6中,若是没有inittab这个文件系统一样能启动,但启动的级别是3。
注3:若是想让整个服务和系统安装时候的同样,那么就只能本身动手来增长了(参考其余的系统来配置相应的服务)
解决方法:
进入救援模式 ,chroot /mnt/sysp_w_picpath后
把运行级别inittab文件里面的5调整到3后,进入系统(固然不换到3运行级别也行,直接在救援模式下操做)
首先建立咱们的rc?.d这7个目录,否则执行chkconfig命会出错
建立目录
在不一样运行级别中的服务,调用的都是/etc/init.d这个目录中脚本,因此咱们想增长什么服务,就能够参考这个目录。
咱们以network这个服务为例
若是不知道如何使用chkconfig命令,就能够用帮助,咱们来增长一个network服务
增长后,咱们再来看看/etc/rc.d/rcN.d中的变化
8.系统超级用户root密码破解
开机的时候进入Centos的画面按Esc----按键盘的"e"键,出现下面界面:
用键盘上的方向键移动光标至第二项,而后再按“e”键,会出现下面界面:
先输入一个空格键,而后再输入数字1,按回车;或者输入空格键,再输入single,按回车。而后会出现下面界面:
按键盘的“b”键,重启系统,而后就进入单用户模式了,进入系统后输入#passwd root,就能够从新更改root密码了,而后重启系统就Ok了
9.硬盘扇区错乱
在启动过程当中最容易遇到的问题就是硬盘有坏道或扇区错乱(数据损坏)状况,这种状况多因为异常断电、不正常关机致使。
此种问题发生,在系统启动的时候,屏幕会显示:
Press root password or ctrl+D:
此时输入root密码系统自动进入单用户模式,输入“fsck -y /dev/sda6”(fsck为文件系统检测修复命令,“-y”设定检测到错误自动修复,/dev/sda6为发生错误的硬盘分区,请依据具体状况更改此参数),系统修复完成后,用命令“reboot”从新启动便可。
10.系统配置文件丢失修复
系统在引导期间,很重要过程就是init进程读取其配置文件/etc/inittab,启动系统基本服务程序及默认运行级别的服务程序完成系统引导,若是/etc/inittab误删除或修改错误,Linux将没法正常启动此时,只有经过 救援模式解决。
一、有备份文件的恢复办法
进入救援模式,执行chroot命令后,若是有此文件的备份(强烈建议系统中的重要数据目录,如/etc、/boot等要进行备份),
直接将备份文件拷贝回去,退出重启便可。若是是配置文件修改错误,如比较典型的/boot/grub/grub.conf及 /etc/passwd的文件修改错误,也能够直接修正恢复。假设有备份文件/etc/inittab.bak,则在救援模式下执行:
sh-3.1# chroot /mnt/sysp_w_picpath
sh-3.1# cp /etc/inittab.bak /etc/inittab
二、没有备份文件的恢复办法
若是一些配置文件丢失或软件误删除,且无备份,能够经过从新安装软件包来恢复,首先查找到/etc/inittab属于哪个RPM包(即使文件丢失,由于存在RPM数据库,同样能够查找到结果):
sh-3.1# chroot /mnt/sysp_w_picpath
sh-3.1#rpm -qf /etc/inittab
initscrīpts-8.45.3-1
退出chroot模式:
sh-3.1#exit
挂载存放RPM包的安装光盘(在救援模式下,光盘一般挂载在/mnt/source目录下):
sh-3.1# mount /dev/sdc /mnt/source
Fedora系统的RPM包存放在光盘Fedora/RPMS目录下,其余Linux存放位置大同小异,另外,由于要修复的硬盘系统的根目录在/mnt/sysp_w_picpath下,须要使用--root选项指定其位置。覆盖安装/etc/inittab文件所在的RPM包:
sh-3.1# rpm -ivh --replacepkgs --root /mnt/sysp_w_picpath /mnt/source/Fedora/RPMS/initscrīpts-8.45.3-1.i386.rpm
其中的rpm命令选项“--replacepkgs”表示覆盖安装,执行完成后,即已经恢复了此文件。
若是想只提取RPM包中的/etc/inittab文件进行恢复,能够在进入救援模式后,执行命令:
sh-3.1#rpm2cpio /mnt/source/Fedora/RPMS/initscrīpts-8.45.3-1.i386.rpm | cpio -idv ./etc/inittab
sh-3.1# cp etc/inittab /mnt/sysp_w_picpath/etc
注意此命令执行时不能将文件直接恢复至/etc目录,只能提取到当前目录下,且恢复的文件名称所在路径要写完整绝对路径。提取文件成功后,将其复制到根分区所在的/mnt/sysp_w_picpath目录下相应位置便可。
11.双系统启动修复
当咱们安装双系统环境,先安装Linux再安装Windows;或者已经安装好双系统环境的Windows 损坏,在从新安装Windows后,保存GRUB的MBR(Master Boot Record,主引导记录)
会被Windows系统的自举程序NTLDR所覆盖,形成Linux系统没法引导。
一、若是要恢复双系统引导,首先进入救援模式,执行chroot命令以下:
sh-3.1# chroot /mnt/sysp_w_picpath
二、将根目录切换到硬盘系统的根目录中,而后执行grub-install命令从新安装GRUB:
sh-3.1#grub-install /dev/sda
“/dev/sda”为硬盘名称,如使用SCSI硬盘或Linux安装在第二块scsi硬盘,此项设置要作相应调整。
三、而后依次执行exit命令,退出chroot模式及救援模式(执行两次exit命令):
sh-3.1# exit
sh-3.1# exit
系统重启后,将恢复GRUB引导的双系统启动。
grub(1,2)文件修复
1、grub1文件修复
一、内核
cat /etc/debian_version
5.0.10
二、版本
uname -r
2.6.26-2-amd64
三、先模拟破坏mv /boot/grub/menu.lst /boot/grub/menu.lst.bak ,这样的话系统会找不到配置文件 直接进入grub命令行
五、使用root命令查看赋值并赋值
root (hd0,0)
六、kernel命令
kernel /boot/vmlinuz-2.6.26-2-amd64 root=/dev/sda1
七、initrd命令
initrd /boot/initrd.img-2.6.26-2-amd64八、使用boot命令进入系统
boot
九、进入系统后使用update-grub命令来检测内核、启动文件,并添加全部的操做系统,自动生成你的启动菜单。
cd /boot/grub && update-grub
十、确认下文件是否已生成
ls /boot/grub/menu.lst
/boot/grub/menu.lst
十一、最后使用grub-install命令对/dev/sda
grub-install /dev/sda
2、grub2文件修复
一、内核
cat /etc/debian_version
7.8
二、版本
uname -r
3.2.0-4-amd64
三、先模拟破坏mv /boot/grub/grub.cfg /boot/grub/grub.cfg.bak ,这样的话系统会找不到配置文件 直接进入grub命令行
八、linux命令
linux /boot/vmlinuz-3.2.0-4-amd64 root=/dev/sda1
九、initrd命令
initrd /boot/initrd.img-3.2.0-4-amd64
十、使用boot命令进入系统
boot
十一、进入系统后使用update-grub命令来检测内核、启动文件,并添加全部的操做系统,自动生成你的启动菜单。
cd /boot/grub && update-grub
Generating grub.cfg ...
Found linux p_w_picpath: /boot/vmlinuz-3.2.0-4-amd64
Found initrd p_w_picpath: /boot/initrd.img-3.2.0-4-amd64
done
十二、确认下文件是否已生成
ls /boot/grub/grub.cfg
/boot/grub/grub.cfg
1三、最后使用grub-install命令对/dev/sda
grub-install /dev/sda
Installation finished. No error reported.