一.首先简单看一下系统启动的流程图
可以参考: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)
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秒自动进入默认操作系统
splashimage=(hd0,0)/grub/splash.xpm.gz #splashimage是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/sysimage
执行下面的命令,如果要查看具体的创建过程,我们可以加上-v参数。
再来看看/boot目录下面,是不是有了这个initramfs-2.6.32-71.el6.i686.img文件了,软后重新启动系统
7.运行级别的故障解决
系统运行级别的实际相关文件都在/etc/rc.d这个目录下,所以我们删除这个目录里面的全部文件。
重新启动系统错误提示如下
只能硬启动了 ,在运行级别5下,启动时候的错误提示如下
进入救援模式 ,chroot /mnt/sysimage后,
只需要把运行级别inittab文件里面的5改成3或者是2就能登陆系统了,如果是改成1的话,会在Entering non-interactive startkup处卡住。
注1:如果你的默认运行级别是5(图形模式)的话,系统是启动不了的。但如果你的默认运行级别是2、3(命令行模式)的话,系统能启动,只是少了很多有服务而已。
注2:在RHEL6中,如果没有inittab这个文件系统同样能启动,但启动的级别是3。
注3:如果想让整个服务和系统安装时候的一样,那么就只能自己动手来增加了(参考其他的系统来配置相应的服务)
解决方法:
进入救援模式 ,chroot /mnt/sysimage后
把运行级别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将无法正常启动此时,只有通过 救援模式解决。
1、有备份文件的恢复办法
进入救援模式,执行chroot命令后,如果有此文件的备份(强烈建议系统中的重要数据目录,如/etc、/boot等要进行备份),
直接将备份文件拷贝回去,退出重启即可。如果是配置文件修改错误,如比较典型的/boot/grub/grub.conf及 /etc/passwd的文件修改错误,也可以直接修正恢复。假设有备份文件/etc/inittab.bak,则在救援模式下执行:
sh-3.1# chroot /mnt/sysimage
sh-3.1# cp /etc/inittab.bak /etc/inittab
2、没有备份文件的恢复办法
如果一些配置文件丢失或软件误删除,且无备份,可以通过重新安装软件包来恢复,首先查找到/etc/inittab属于哪一个RPM包(即便文件丢失,因为存在RPM数据库,一样可以查找到结果):
sh-3.1# chroot /mnt/sysimage
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/sysimage下,需要使用--root选项指定其位置。覆盖安装/etc/inittab文件所在的RPM包:
sh-3.1# rpm -ivh --replacepkgs --root /mnt/sysimage /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/sysimage/etc
注意此命令执行时不能将文件直接恢复至/etc目录,只能提取到当前目录下,且恢复的文件名称所在路径要写完整绝对路径。提取文件成功后,将其复制到根分区所在的/mnt/sysimage目录下相应位置即可。
11.双系统启动修复
当我们安装双系统环境,先安装Linux再安装Windows;或者已经安装好双系统环境的Windows 损坏,在重新安装Windows后,保存GRUB的MBR(Master Boot Record,主引导记录)
会被Windows系统的自举程序NTLDR所覆盖,造成Linux系统无法引导。
1、如果要恢复双系统引导,首先进入救援模式,执行chroot命令如下:
sh-3.1# chroot /mnt/sysimage
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命令行
5、使用root命令查看赋值并赋值
root (hd0,0)
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命令行
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 image: /boot/vmlinuz-3.2.0-4-amd64
Found initrd image: /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.