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启动流程:
解析:
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
原文:https://www.cnblogs.com/jason-zxj/p/12511505.html