一.首先简单看一下系统启动的流程图

wKiom1UuAsXjSY6pAAF6iYGqw-A549.jpg

可以参考:http://maoqiu.blog.51cto.com/8570467/1368586 

http://www.opsers.org/base/learning-that-the-rhel6-day-boot-linux-troubleshooting.html 

二.linux系统启动过程

1,BIOS自检,检测硬件,决定启动介质

BIOS为写入到主板上的一块闪存或EEPROM的程序,它在开机时候执行,并通过BIOS程序去加载CMOS的信息,并通过CMOS内的设置取得主机的各项硬件配置,BIOS程序也可以修改CMOS当中的参数,一般使用Del按键进入BIOS设置界面。


2,从硬盘启动,读硬盘第一个扇区MBR,然后将启动引导工作交给boot loader

MBR引导记录位于物理硬盘的第一块扇区的一段引导代码(第一块扇区512个字节,其中MBR占446字节,分区表占64字节,结束标志占2字节),该扇区又称为主引导扇区(MBR扇区)


3,boot loader去找grub,grub读取配置文件grub.conf,决定默认启动项,找到内核(kernel)和驱动(initrd)

  1. Boot loader:认识操作系统的文件格式并加载内核到内存中去执行,由于不同的操作系统的文件格式不一致,因此每种操作系统都有自己的bootloader,

    bootloader分为两阶:                                           

    1、stage1: 执行boot loader加载文件系统驱动     

    2、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下面的三行删掉,然后重启系统

wKiom1UuC8TxL2ORAAGOJPFbY8U119.jpg

重启系统后,会卡在这里,因为修改了grub.conf这个文件

wKiom1UuC_3Sy3NWAACcnxJ9bI0178.jpg

需要把grub.conf里的三行内容手动添加进去,需要指定/boot所在的分区,linux内核,和initrd文件,然后boot启动。

wKiom1UuDLyhBfUkAAG-h-5_fS4493.jpg

看到红色的Red Hat就证明你的内核加载成功了

wKiom1UuDI7Bn0psAADP1XOSmCE959.jpg

启动成功后再把/etc/grub.conf文件的那三行内容加回去

wKioL1UuDkjA3dbjAAH5GCYZUaw913.jpg

2.把/boot/grub/grub.conf删掉,会怎样呢

可以把这个grub.conf文件备份到其他地方,这样启动后可以把文件恢复回去,   运行root或find /vmlinuz-2.6.18-53el5(可以使用TAB补全),可以搜索vmlinuz所在分区.

wKioL1UuD1-i1zOcAAEWRN51QB4361.jpg

内核成功被加载

wKiom1UuD-uhWniLAADOKPGwDq8986.jpg

3.MBR损坏

#dd if=/dev/zero of=/dev/hda bs=446 count=1 //模拟Boot loader 损坏

#reboot

从光盘启动,在这之前要把镜像挂载上

wKioL1UuEcLyktWEAACaBVJ_dtE492.jpg

选择语言:enginsh-----选择美式键盘----对网络接口选择no----对挂载以前的操作系统选择continue-----进入救援模式操作

wKioL1UuEmLzNnRNAAI1maIMKsg072.jpg

4.把/boot/下的内容删了再试一下

wKiom1UuEanh4ZW-AACxRacCZAs659.jpg

同样使用光盘启动,进入linux rescue模式,查看一下/boot下什么都没有了

wKioL1UuEyXCVtehAADBRpscxwY695.jpg

把光盘挂上,然后安装kernel

wKioL1UuE1eDeG_TAAD43R0nh1o000.jpg

wKioL1UuE4jRfX1UAABd45ugEVQ783.jpg

内核安装完,还需要安装grub

wKioL1UuE7KS4XFNAAFrlq66D38803.jpg

没有grub.conf文件,手动添加进去,然后重启系统

wKiom1UuEojjG8NCAAFxPApYrBw656.jpg

内核加载成功

wKiom1UuEyWwbpAAAAFS_JGjrqs453.jpg

5.如果boot分区删了(前提是df可以看到/dev/hda1是boot分区记录),也可以恢复。

wKioL1UuFJaQoie7AAHidedVzAU107.jpg

从光盘进入到救援模式后,把那个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这个命令来创建,下面就来看看这个的用法。 

wKioL1UuHMPQFbWZAACsEzPFuj8053.jpg

(例如: mkinitrd /boot/initramfs-2.6.32-71.el6.i686.img 2.6.32-71.el6.i686)

通过上面的帮助,我们可以看到他给的例子就是用mkinitrd创建initramfs的。那么OK,我们也来创建一个。

wKioL1UuHQuCJSzxAACEs2T0qMo563.jpg

我们发现启动后就黑屏了,没有反应。同样还是进入救援模式,然后chroot  /mnt/sysp_w_picpath 
执行下面的命令,如果要查看具体的创建过程,我们可以加上-v参数。 

wKioL1UuHWzR_gEdAACgWBq4Q5A107.jpg

再来看看/boot目录下面,是不是有了这个initramfs-2.6.32-71.el6.i686.img文件了,软后重新启动系统

wKiom1UuHGrSyZusAABfB7CqOT8678.jpg

7.运行级别的故障解决

系统运行级别的实际相关文件都在/etc/rc.d这个目录下,所以我们删除这个目录里面的全部文件。

wKiom1UuHWfyPgY6AABdya4D4_0411.jpg

重新启动系统错误提示如下

wKioL1UuHwjD4XwbAAAQcZ9zpyY214.jpg

只能硬启动了 ,在运行级别5下,启动时候的错误提示如下 

wKioL1UuHyyhPsu3AAM5B8UcJY4485.jpg

进入救援模式 ,chroot  /mnt/sysp_w_picpath后, 

只需要把运行级别inittab文件里面的5改成3或者是2就能登陆系统了,如果是改成1的话,会在Entering non-interactive startkup处卡住。

注1:如果你的默认运行级别是5(图形模式)的话,系统是启动不了的。但如果你的默认运行级别是2、3(命令行模式)的话,系统能启动,只是少了很多有服务而已。 

注2:在RHEL6中,如果没有inittab这个文件系统同样能启动,但启动的级别是3。 

注3:如果想让整个服务和系统安装时候的一样,那么就只能自己动手来增加了(参考其他的系统来配置相应的服务)

解决方法:

进入救援模式 ,chroot  /mnt/sysp_w_picpath后

把运行级别inittab文件里面的5调整到3后,进入系统(当然不换到3运行级别也行,直接在救援模式下操作) 
首先创建我们的rc?.d这7个目录,不然执行chkconfig命会出错 

wKiom1UuH0zjLA6WAACmJrJn44o120.jpg

创建目录

wKioL1UuIMyR9aKTAACsHfKvAA0200.jpg

在不同运行级别中的服务,调用的都是/etc/init.d这个目录中脚本,所以我们想增加什么服务,就可以参考这个目录。 
我们以network这个服务为例 
如果不知道如何使用chkconfig命令,就可以用帮助,我们来增加一个network服务 

wKiom1UuH7zydysyAAD-otFvYy0797.jpg

wKiom1UuIAjz1o7wAABLRpQhojE901.jpg

增加后,我们再来看看/etc/rc.d/rcN.d中的变化

wKiom1UuIDTgj-D2AAD6bpEV9bo989.jpg

8.系统超级用户root密码破解

开机的时候进入Centos的画面按Esc----按键盘的"e"键,出现下面界面:

wKiom1UuI0fQDo_jAADLPY9i6qM425.jpg

用键盘上的方向键移动光标至第二项,然后再按“e”键,会出现下面界面:

 wKioL1UuJpWyTYJ8AAC8BMAVDO4487.jpg

先输入一个空格键,然后再输入数字1,按回车;或者输入空格键,再输入single,按回车。然后会出现下面界面:

wKiom1UuJVngI6yHAAC-PjhiPsA290.jpg

按键盘的“b”键,重启系统,然后就进入单用户模式了,进入系统后输入#passwd root,就可以重新更改root密码了,然后重启系统就Ok了

wKioL1UuJvXDaGavAACyR_kJi_4710.jpg

9.硬盘扇区错乱

在启动过程中最容易遇到的问题就是硬盘有坏道或扇区错乱(数据损坏)情况,这种情况多由于异常断电、不正常关机导致。

此种问题发生,在系统启动的时候,屏幕会显示:

Press root password or ctrl+D

此时输入root密码系统自动进入单用户模式,输入“fsck -y /dev/sda6”(fsck为文件系统检测修复命令,“-y”设定检测到错误自动修复,/dev/sda6为发生错误的硬盘分区,请依据具体情况更改此参数),系统修复完成后,用命令“reboot”重新启动即可。

10.系统配置文件丢失修复

系统在引导期间,很重要过程就是init进程读取其配置文件/etc/inittab,启动系统基本服务程序及默认运行级别的服务程序完成系统引导,如果/etc/inittab误删除或修改错误,Linux将无法正常启动此时,只有通过 救援模式解决。

wKiom1UuKAHy1yUGAAEKGcoW-CE175.jpg


1、有备份文件的恢复办法

进入救援模式,执行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

2、没有备份文件的恢复办法

如果一些配置文件丢失或软件误删除,且无备份,可以通过重新安装软件包来恢复,首先查找到/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系统无法引导。


1、如果要恢复双系统引导,首先进入救援模式,执行chroot命令如下:

sh-3.1# chroot /mnt/sysp_w_picpath


2、将根目录切换到硬盘系统的根目录中,然后执行grub-install命令重新安装GRUB:

sh-3.1#grub-install /dev/sda

“/dev/sda”为硬盘名称,如使用SCSI硬盘或Linux安装在第二块scsi硬盘,此项设置要做相应调整。


3、然后依次执行exit命令,退出chroot模式及救援模式(执行两次exit命令):

sh-3.1# exit

sh-3.1# exit

系统重启后,将恢复GRUB引导的双系统启动。




grub(1,2)文件修复

一、grub1文件修复

1、内核

cat /etc/debian_version 

5.0.10

 

2、版本

uname -r

2.6.26-2-amd64

 

3、先模拟破坏mv /boot/grub/menu.lst /boot/grub/menu.lst.bak ,这样的话系统会找不到配置文件 直接进入grub命令行

wKioL1YjfszzkAHwAADXWVO8urU012.jpg

5、使用root命令查看赋值并赋值     

root (hd0,0)

wKioL1YjfzmQ7YtiAAECw0aRi_8645.jpg

6、kernel命令

kernel /boot/vmlinuz-2.6.26-2-amd64 root=/dev/sda1

7、initrd命令

initrd /boot/initrd.img-2.6.26-2-amd648、使用boot命令进入系统

boot

9、进入系统后使用update-grub命令来检测内核、启动文件,并添加所有的操作系统,自动生成你的启动菜单。

cd /boot/grub && update-grub

10、确认下文件是否已生成

ls /boot/grub/menu.lst

/boot/grub/menu.lst

11、最后使用grub-install命令对/dev/sda

grub-install /dev/sda


二、grub2文件修复

1、内核

cat /etc/debian_version 

7.8

 

2、版本

uname -r

3.2.0-4-amd64

 

3、先模拟破坏mv /boot/grub/grub.cfg /boot/grub/grub.cfg.bak ,这样的话系统会找不到配置文件 直接进入grub命令行

wKioL1YjgEyiOb3pAACqLtaTNy0580.jpg

wKiom1YjgHWRhFI1AABSGw26qOg991.jpg

wKiom1YjgIDRtNBgAAD6Izo3mJo181.jpg

8、linux命令

linux /boot/vmlinuz-3.2.0-4-amd64 root=/dev/sda1

9、initrd命令

initrd /boot/initrd.img-3.2.0-4-amd64

10、使用boot命令进入系统

boot

 

11、进入系统后使用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

 

12、确认下文件是否已生成

ls /boot/grub/grub.cfg

/boot/grub/grub.cfg

 

13、最后使用grub-install命令对/dev/sda

grub-install /dev/sda

Installation finished. No error reported.