Linux系统启动流程及故障处理
Linux组成
kernel+rootfs
kernel:进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能
rootfs:程序和glibc
库:函数集合,function调用接口
过程调用:procedure,无返回值
函数调用:function
程序:二进制文件
内核设计:
单内核:Linux,把所有功能集成于同一个程序,在/boot/下vmlinuz-VERSION-RELEASE
微内核:Windows,每种功能使用一个单独子系统实现
Linux内核
支持模块化:.ko(内核对象驱动模块),如文件系统、硬件驱动、网络协议等
[root@clouder ~]# locate ext4.ko
/lib/modules/2.6.32-358.el6.x86_64/kernel/fs/ext4/ext4.ko
[root@clouder ext4]# ll -h ext4.ko
-rwxr--r--. 1 root root 607K Jan 30 2013 ext4.ko
支持内核模块的动态装载和卸载
列出系统加载的模块使用命令:
lsmod list module
lsmod - program to show the status of modules in the Linux Kernel
[root@clouder ~]# lsmod |grep ext4
ext4 363408 2 ##驱动模块大小为363408,用了2次
mbcache 8193 1 ext4
jbd2 90230 1 ext4
卸载内核中的模块使用命令:
modprobe
modprobe - program to add and remove modules from the Linux Kernel
modprobe [ -r ] [ modulename... ] 删除内核中的驱动模块
组成部分
内核核心文件:/boot/vmlinuz-VERSION-RELEASE(此文件不是安装系统时生成的,而是从光盘复制过来的)
辅助的虚拟文件系统-ramdisk:(系统安装时生成的,可以使用命令mkinitrd进行生成,里面包含和系统启动相关的各种驱动模块、库文件等)
centos5:/boot/initrd-VERSION-RELEASE.img
centos6,7:/boot/initramfs-VERSION-RELEASE.img
模块文件:/lib/modules/VERSION-RELEASE
在centos6上辅助文件系统是一个gzip格式的压缩文件:
[root@lmstest boot]# file /boot/initramfs-2.6.32-358.el6.x86_64.img
/boot/initramfs-2.6.32-358.el6.x86_64.img: gzip compressed data, from Unix, last modified: Thu Feb 27 16:31:40 2020, max compression
在centos7上辅助文件系统本身就是一个cpio格式文件:
[root@clouder ~]# file /boot/initramfs-3.10.0-957.el7.x86_64.img
/boot/initramfs-3.10.0-957.el7.x86_64.img: ASCII cpio archive (SVR4 with no CRC)
cpio命令用来建立、还原备份档的工具,它可以加入、解开或tra备份档内的文件。
在centos6中initramfs文件为gzip压缩文件,可以使用gzip工具进行解压,但解压的时候提示错误,因为gzip解压的时候对文件的后缀是又要求的:文件后缀必须是“.gz”,所以需要先修改文件名,再解压
NAME
gzip, gunzip, zcat - compress or expand files
SYNOPSIS
gzip [ -acdfhlLnNrtvV19 ] [-S suffix] [ name ... ]
gunzip [ -acfhlLnNrtvV ] [-S suffix] [ name ... ]
zcat [ -fhLV ] [ name ... ]
[root@lmstest test]# cp /boot/initramfs-2.6.32-358.el6.x86_64.img initramfs-2.6.32-358.el6.x86_64.img
[root@lmstest test]# gzip -d initramfs-2.6.32-358.el6.x86_64.img ##参数d,对文件解压
gzip: initramfs-2.6.32-358.el6.x86_64.img: unknown suffix – ignored
[root@lmstest test]# mv initramfs-2.6.32-358.el6.x86_64.img initramfs-2.6.32-358.el6.x86_64.img.gz
[root@lmstest test]# gzip -d initramfs-2.6.32-358.el6.x86_64.img.gz
[root@lmstest test]# ll /boot/initramfs-2.6.32-358.el6.x86_64.img initramfs-2.6.32-358.el6.x86_64.img -h
-rw-r--r--. 1 root root 16M Feb 27 16:32 /boot/initramfs-2.6.32-358.el6.x86_64.img
-rw-r--r-- 1 root root 46M Apr 10 08:14 initramfs-2.6.32-358.el6.x86_64.img
[root@lmstest test]# file initramfs-2.6.32-358.el6.x86_64.img
initramfs-2.6.32-358.el6.x86_64.img: ASCII cpio archive (SVR4 with no CRC)
可以使用cpio命令查看cpio文件的内容:
[root@lmstest test]# cpio -tv < initramfs-2.6.32-358.el6.x86_64.img
[root@lmstest test]# cpio -tv < initramfs-2.6.32-358.el6.x86_64.img |grep ext4.ko ##驱动模块
-rwxr--r-- 1 root root 619736 Feb 27 16:31 lib/modules/2.6.32-358.el6.x86_64/kernel/fs/ext4/ext4.ko
92324 blocks
系统中的内核文件vmlinuz-RELEASE文件是系统光盘自带的,不是安装系统时生成的:
查看光盘isolinux目录下的vmlinuz和系统中内核文件,两个文件的字节数相同,执行md5校验,校验值一样,说明两个文件内容相同。
[root@lmstest isolinux]# pwd
/misc/cd/isolinux
[root@lmstest isolinux]# ll vmlinuz /boot/vmlinuz-2.6.32-358.el6.x86_64
-rwxr-xr-x. 1 root root 4044560 Jan 30 2013 /boot/vmlinuz-2.6.32-358.el6.x86_64
-r-xr-xr-x 2 root root 4044560 Jan 31 2013 vmlinuz
[root@lmstest isolinux]# md5sum vmlinuz /boot/vmlinuz-2.6.32-358.el6.x86_64
fdda4b37d52e1d9bcec6253e0ff3489e vmlinuz
fdda4b37d52e1d9bcec6253e0ff3489e /boot/vmlinuz-2.6.32-358.el6.x86_64
系统辅助文件系统initramfs-2.6.32-358.el6.x86_64.img文件是系统安装时生成的,如果文件损坏可以使用命令mkinitrd命令修复:
mkinitrd /boot/initramfs-`uname -r`.img `uname -r` ##后面需要多加一个uname -r选项
辅助文件系统丢失或损坏后启动系统,可以看到启动菜单(Booting启动菜单是由grub的第二阶段生成的),无法进系统,只显示一个白色的横杠。
修复辅助文件系统:
- 进入救援模式,切换根目录:chroot /mnt/sysimage
- 使用mkinitrd进行修复
- sync命令写磁盘,重启系统。
CentOS5,6启动流程:
- POST加电自检并获取引导设备(光盘、磁盘、U盘),读取第一个引导设备的MBR分区信息,加载GRUB引导程序
- 加载内核文件及相应的驱动模块,开始驱动硬件设备
- 找到根分区(在/boot/grub/grub.conf文件中有定义:root=DEV目录)中init程序并启动init进程
- init进程读配置文件/etc/inittab,获取默认的运行级别
- init进程执行初始化脚本/etc/rc.d/rc.sysinit,获取主机名、加载网络以及文件系统等
- 根据默认运行级别,执行脚本/etc/rc.d/rc 5,启动运行级别5对应的服务(触发/etc/rc.d/rc5.d/目录下所有的脚本)
- init执行运行的各个批处理文件(执行/etc/rc.d/rc5.d/目录下所有的脚本)
- init执行/etc/rc.local
- 执行/bin/login程序,等待用户登录
- 登录后开始用shell操作主机
解析:
POST:Power-on-self-test,是BIOS功能的一个主要部分,集成在主板中的一段程序,负责完成对CPU、主板、内存、接口等硬件情况的检测。
ROM:只读的,BIOS—Basic input output system,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动的自举程序等。
RAM:CMOS互补金属氧化物半导体,保存各项参数的设定,按次序查找引导设备,第一个有引导程序的设备为本次启动设备,CMOS由主板上的电池供电,保存数据。
bootloader:引导加载器,引导程序,GRUB:GRand Unified Bootloader,centos7上使用的grub2
MBR:磁盘第一个扇区的前446字节,含有64字节分区表,还有其它一些空间是给bootloader的
GRUB:
第1阶段在前446字节(不属于任何分区,二进制形式存放数据),启动完后寻找/boot/grub分区
第1.5阶段放在磁盘的第二个扇区或其它扇区,存放着/boot分区的文件系统驱动,进入到/boot分区
第2阶段读取放在/boot/grub/目录下的各个文件,生成启动引导菜单,然后以只读方式挂载“/”目录,这时需要读取/boot/目录下的vmlinuz-RELEASE.img文件,获取根分区文件系统的驱动,从而挂载根目录。
kernel
自身初始化:
1.探测可识别的所有硬件设备
2.加载硬件驱动程序(借助于ramfs加载驱动)
3.以只读方式挂载根文件系统
4.运行用户空间的第一个应用程序:/sbin/init
init进程:进程类型
SysV:标准的init(/sbin/init),CentOS5及之前,配置文件为/etc/inittab
Upstart:升级版的init(/sbin/init),CentOS6版本,配置文件/etc/inittab,/etc/init/*.conf
Systemd:systemd(/lib/systemd/systemd),CentOS7版本,配置文件/usr/lib/systemd/system,/etc/systemd/system
init进程/etc/rc.d/rc/sysinit执行初始化脚本。
/etc/inittab文件说明了系统启动级别:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode #当忘记root密码时,在启动菜单按a键进入编辑模式,在quiet后面加上相应的字符:quiet 1(S s single,也可以写成5直接进入5模式)进入单用户模式,这样会跳过/etc/inittab配置文件定义的启动级别,进入单用户后可直接修改root密码
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
/etc/rc.d/rc.sysinit系统初始化脚本
1.设置默认主机名
2.设置欢迎信息
3.激活udev和selinux
4.挂载/etc/fstab文件定义的文件系统
5.检测根文件系统,并以只读方式重新挂载文件系统
6.设置系统时钟
7.激活swap设备
8.根据/etc/sysctl.conf文件设置内核参数
9.激活lvm及software raid设备
10.加载额外设备的驱动程序
11.清理操作
chkconfig命令用来管理独立服务是否开机启动。
chkconfig iptalbes off关闭的是运行级别为2345下的iptables服务。
yum安装xinetd程序,管理瞬态(Transient)服务被xineted进程所管理
进入的请求首先被xinetd代理
配置文件:/etc/xinetd.conf、/etc/xinetd<service>与libarap.so文件链接
同样适用chkconfig命令查看与管理服务。
[root@clouder /]# yum install xinetd* -y
在centos6中的level3界面下,按下Ctrl+Alt+Delete键后系统会自动重启。
原因是在/etc/init/control-alt-delete.conf(在/etc/inittab中有说明)文件中定义了这个事件。
最好注释掉按三个键重启的行:#exec /sbin/shutdown -r now "Control-Alt-Delete pressed"
使用grub命令修复MBR
[root@lmstest ~]# grub
Probing devices to guess BIOS drives. This may take a long time.
GNU GRUB version 0.97 (640K lower / 3072K upper memory)
[ Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists the possible
completions of a device/filename.]
grub> root (hd0,0)
root (hd0,0)
Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
setup (hd0)
Checking if "/boot/grub/stage1" exists... no
Checking if "/grub/stage1" exists... yes
Checking if "/grub/stage2" exists... yes
Checking if "/grub/e2fs_stage1_5" exists... yes
Running "embed /grub/e2fs_stage1_5 (hd0)"... 27 sectors are embedded.
succeeded
Running "install /grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded
Done.
总结:
1、使用gurb命令修复时,需要/boot/grub/目录下的的文件,使用grub-install命令则不需要。
2、在/boot/grub/目录中,除去grub.conf和splash.xpm.gz文件的所有文件,是grub-install命令用来恢复全阶段启动项的备份文件,删除后不影响系统正常启动,但使用grub修复系统时,提示失败。
2、使用grub-install /dev/sda修复时,会生成/boot/grub/目录下的文件。
3、一旦使用grub命令修复后,/boot/grub/目录下的所有文件都变成系统启动的必需文件,丢失后启动提示:ERROR 15。
4、在/boot/grub/目录中,grub.conf文件是grub的配置文件,十分关键。
grub.conf文件详解:
[root@lmstest grub]# cat grub.conf
# grub.conf generated by anaconda
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/mapper/vg0-lv0
# initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux (2.6.32-358.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/vg0-lv0 rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=vg0/lv0 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=128M KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-358.el6.x86_64.img
|
default=0 |
默认选择的启动菜单项,0表示第一个 |
|
timeout=5 |
5秒之后超时,选择默认的启动菜单项 |
|
splashimage=(hd0,0)/grub/splash.xpm.gz |
定义启动菜单选择时的背景,一个纯黑的图片 |
|
hiddenmenu |
提示以下是不显示的,在VMware需要按ESC键才能显示 |
|
title |
定义的是启动菜单,下面显示的启动菜单的参数 |
|
root (hd0,0) |
定义了/boot分区所在的位置,第一块硬盘的第一个分区,下面的会用到 |
|
kernel |
定义内核文件,/vmlinuz-2.6.32-358.el6.x86_64此文件前的‘/’表示的是/boot分区,即内核文件在/boot/目录下,可以把上面的root (hd0,0)删掉,写成:kernel (hd0,0)/vmlinuz-2.6.32-358.el6.x86_64 |
|
ro |
只读方式,第一次找到根分区后,以只读方式挂载,第二次使用rw方式挂载 |
|
root=/dev/mapper/vg0-lv0 |
定义了根分区,这个是设备名,也可以写成UUID方式: root=UUID=b68112c6-0680-449f-a521-d22a2dae0eb5 |
|
rd_NO_NAME |
禁用程序,只是在启动过程中禁用,是为了加速系统启动的: rd_NO_LUKS:禁用 LUKS,LUKS 用于给磁盘加密 rd_NO_MD:禁用软 RAID rd_NO_DM:禁用硬 RAID rd_NO_LVM:禁用 LVM |
|
rhgb |
系统启动加载时,是否显示centos的图形界面,如果有此项内容则显示 |
|
quiet |
系统加载的时候是否显示内核加载过程,quiet代表不显示 |
|
initrd /initramfs-2.6.32-358.el6.x86_64.img |
定义了initramfs虚拟文件系统镜像文件的所在位置 |
/boot/grub/目录下文件:
[root@clouder grub]# ls
device.map fat_stage1_5 grub.conf jfs_stage1_5 minix_stage1_5 splash.xpm.gz stage2 vstafs_stage1_5 e2fs_stage1_5 ffs_stage1_5 iso9660_stage1_5 menu.lst reiserfs_stage1_5 stage1 ufs2_stage1_5 xfs_stage1_5
实验:1
当/boot/目录下的initramfs-2.6.32-358.el6.x86_64.img文件损坏后如何修复?
解答:
当/boot/initramfs-2.6.32-358.el6.x86_64.img文件损坏后,系统可以进入到系统启动菜单选项,但无法正常进入系统。
修复步骤:
1、重启系统,进入救援模式,切换到本地硬盘实际的根目录
chroot /mnt/sysimage
2、使用mkinitrd命令进行修复,执行命令后需要等待文件的生成。
mkinitrd /boot/initramfs-`uname -r`.img `uname -r`
3、文件生成后,可以多执行几次sync命令,让文件写入到磁盘,exit退出shell,在图形界面重启系统即可。
实验:2
当/boot/目录下的vmlinuz-2.6.32-358.el6.x86_64文件损坏后如何修复?
解答:
在Redhat6.4中,当/boot/vmlinuz-2.6.32-358.el6.x86_64文件丢失后,系统可以进入到系统启动菜单选项,但无法正常进入系统,提示错误Error 15:File not found。
修复步骤:
1、 进入救援模式,切换到本地硬盘实际的根目录
chroot /mnt/sysimage
2、 df查看光盘是否挂载,如果光盘没有挂载,手动挂载光盘:
mkdir /xiufu
mount /dev/cdrom /xiufu
3、 将光盘目录下的vmlinuz文件复制到/boot/目录
cp /xiufu/isolinux/vmlinuz /boot/vmlinuz-`uname -r`
4、多执行几次sync命令同步内存和磁盘数据,exit退出救援模式,重启系统即可。
实验:3
系统MBR被损坏,grub第一阶段也被损坏,无法进入系统,如何修复?
解答:
MBR占用的512个字节(主要有引导程序和分区表)被损坏后,主机认为本地磁盘失去引导功能,无法引导系统,系统会从网络或光盘寻找引导项,如果没有网络和光盘,会提示Opertating System not found。需要使用
grub-install命令修复,gurb-install修复的是系统grub的全阶段,而不是只修复MBR。
修复步骤:
1、制作U盘启动或使用其他方式挂载光盘,进入救援模式,切换到本地硬盘实际的根目录(光盘系统中没有grub-install命令,需要切到本地磁盘的根目录)
chroot /mnt/sysimage/
2、查看本地硬盘信息,使用grub-install命令进行修复
df -hT ##确定本地磁盘为/dev/sda
grub-install /dev/sda
修复完成后会提示:
#this device map was generated by anaconda
(hd0) /dev/sda
使用命令查看MBR信息已修复,命令:
hexdump -C /dev/sda -n 512 –v
3、多执行几次sync命令,同步内存和磁盘的数据,exit退出救援模式,重启即可
实验:4
grub第二阶段被损坏,无法进入系统,如何修复?
解答:
第二阶段被损坏后,系统无法找到/boot分区的文件系统驱动,无法进入到/boot分区(与MBR被损坏后的现象不一样),现象为:黑屏界面,只显示白色横杠。
修复方法:
优先使用gurb-install修复,sync同步,重启系统
实验:5
/boot/目录下所有文件丢失如何修复?
解答:
在/boot/目录文件丢失后,/boot/目录下的内核文件vmlinuz-VERSION-RELEASE丢失,虚拟文件系统文件initramfs-VERSION-RELEASE.img丢失,/boot/grub/目录下的grub.conf、splash.xpm.gz文件丢失。 主机启动会加电自检,通过后进入到系统引导程序,进入系统启动过程;
grub第1阶段会读取MBR信息,寻找并挂载/boot分区,但/boot分区需要自己文件系统的驱动模块,grub会在第1.5阶段加载/boot分区的文件系统驱动并挂载/boot分区,grub进入到第二阶段会读取/boot/grub目录下的grub.conf文件,获取内核文件、虚拟文件系统、根分区位置,进而加载内核文件、挂载各个模块驱动、挂载根分区等。/boot分区文件丢失,系统启动时,直接进入grub命令行界面。
若要使系统正常启动:
1、如果系统之前未修过grub程序,只需要新建grub.conf文件,创建initramfs-VERSION-RELEASE.img文件,恢复splash.xpm.gz文件和vmlinuz-VERSION-RELEASE文件,即可使系统正常启动
2、如果修复过grub程序,则还需要重新生成/boot/grub/目录下的文件,再创建grub.conf等文件等。
[root@clouder boot]# ls
config-2.6.32-358.el6.x86_64 initramfs-2.6.32-358.el6.x86_64.img
symvers-2.6.32-358.el6.x86_64.gz efi initrd-2.6.32-358.el6.x86_64kdump.img
System.map-2.6.32-358.el6.x86_64 grub lost+found vmlinuz-2.6.32-358.el6.x86_64
[root@clouder boot]# rm -fr ./*
[root@clouder boot]# ls
[root@clouder boot]# reboot
系统直接进入grub命令行界面:
grub>
修复方法:
1、 插入光盘进入救援模式,切换到本地硬盘的根目录
chroot /mnt/sysimage
2、创建/boot/grub目录及grub.conf文件,重新配置grub文件
mkdir /boot/grub
touch grub.conf
打开grub.conf文件,写入:
default=0
splashimage=(hd0,0)/grub/splash.xpm.gz
title Red Hat 6.4
root (hd0,0)
kernel /vmlinuz-2.6.32-358.el6.x86_64 root=/dev/mapper/vg0-lv0
initrd /initramfs-2.6.32-358.el6.x86_64.img
保存退出
3、挂载光盘并复制光盘目录下
mkdir /linshi
mount /dev/sr0 /linshi
cp /linshi/EFI/BOOT/splash.xpm.gz /boot/grub/
4、 复制光盘下内核文件vmlinuz文件到/boot/目录下并改名
cp /linshi/isolinux/vmlinuz /boot/vmlinuz-`uname -r`
5、 生成虚拟文件系统配置文件(执行命令后需等待文件生成)
mkinitrd /boot/initramfs-`uname -r`.img `uname -r`
6、多执行几次sync命令,同步内存和磁盘中数据,exit退出光盘shell,退回至图形界面重启系统,完成恢复。
总结-启动流程:
主机启动会加电自检,通过后进入到系统引导程序,进入系统启动过程;
grub第1阶段会读取MBR信息,寻找并挂载/boot分区,但/boot分区需要自己文件系统的驱动模块,grub会在第1.5阶段加载/boot分区的文件系统驱动并挂载/boot分区,grub进入到第二阶段会读取/boot/grub目录下的grub.conf文件,获取内核文件、虚拟文件系统、根分区位置,进而加载内核文件、挂载各个模块驱动、挂载根分区等。
系统启动init进程,读取/etc/inittab文件并根据文件的默认启动级别,执行系统初始化脚本/etc/rc.d/rc.sysinit,执行启动级别的服务脚本(关闭或启动对应级别的服务),执行/etc/rc.local脚本,执行/bin/login程序,进入登录界面。