首页 > 系统服务 > 详细

Linux系统启动流程及故障处理

时间:2020-03-17 16:40:25      阅读:68      评论:0      收藏:0      [点我收藏+]

Linux系统启动流程及故障处理

Linux组成

kernel+rootfs

kernel:进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能

rootfs:程序和glibc

库:函数集合,function调用接口

      过程调用:procedure,无返回值

      函数调用:function

程序:二进制文件

内核设计:

      单内核:Linux,把所有功能集成于同一个程序,在/boot/下vmlinuz-3.10.0-957.el7.x86_64

      微内核: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

      支持内核模块的动态装载和卸载

组成部分

内核核心文件:/boot/vmlinuz-VERSION-RELEASE(此文件不是安装系统时生成的,而是从光盘复制过来的

辅助的虚拟文件系统-ramdisk:(系统安装时生成的,可以使用命令mkinitrd进行生成

      centos5:/boot/initrd-VERSION-RELEASE.img

      centos6,7:/boot/initramfs-VERSION-RELEASE.img

模块文件:/lib/modules/VERSION-RELEASE

 

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.d/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文件,获取根分区文件系统的驱动,从而挂载根目录。

      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)进入单用户模式,修改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"

                                                                                  

实验:

当/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命令,让文件写入到磁盘,重启系统即可。

 

实验:

当/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退出救援模式,重启系统即可。

 

实验:

系统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退出救援模式,重启即可

 

实验:

grub第二阶段被损坏,无法进入系统,如何修复?

解答:

      第二阶段被损坏后,系统无法找到/boot分区的文件系统驱动,无法进入到/boot分区(与MBR被损坏后的现象不一样),现象为:黑屏界面,白色光标闪烁。

修复方法:

优先使用gurb-install修复,sync同步,重启系统

 

 使用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、在/boot/grub/目录中,除去grub.conf和splash.xpm.gz文件的所有文件,是grub命令用来恢复全阶段启动项的备份文件,删除后不影响系统正常启动,但使用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虚拟文件系统镜像文件的所在位置

[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

Linux系统启动流程及故障处理

原文:https://www.cnblogs.com/jason-zxj/p/12511505.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!