jason-zxj

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的第二阶段生成的),无法进系统,只显示一个白色的横杠。

修复辅助文件系统:

  1. 进入救援模式,切换根目录:chroot  /mnt/sysimage
  2. 使用mkinitrd进行修复
  3. sync命令写磁盘,重启系统。

 

CentOS5,6启动流程:

  1. POST加电自检并获取引导设备(光盘、磁盘、U盘),读取第一个引导设备的MBR分区信息,加载GRUB引导程序
  2. 加载内核文件及相应的驱动模块,开始驱动硬件设备
  3. 找到根分区(在/boot/grub/grub.conf文件中有定义:root=DEV目录)中init程序并启动init进程
  4. init进程读配置文件/etc/inittab,获取默认的运行级别
  5. init进程执行初始化脚本/etc/rc.d/rc.sysinit,获取主机名、加载网络以及文件系统等
  6. 根据默认运行级别,执行脚本/etc/rc.d/rc 5,启动运行级别5对应的服务(触发/etc/rc.d/rc5.d/目录下所有的脚本)
  7. init执行运行的各个批处理文件(执行/etc/rc.d/rc5.d/目录下所有的脚本)
  8. init执行/etc/rc.local
  9. 执行/bin/login程序,等待用户登录
  10. 登录后开始用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程序,进入登录界面。

分类:

技术点:

相关文章: