Linux系统启动原理和故障排除

  • centos6系统启动过程及相关配置文件
  • centos7系统启动过程及相关配置文件
  • 实战-加密grub防止黑客通过单用户系统破解root密码
  • 实战-通过liveCD进入救援模式-重装grub修复损坏的系统

一、centos6系统启动过程

  1. 加载 BIOS 的硬件信息,跟据设定取得第一个可开机引导设置,如:光驱,硬盘,网络,USB; 如果是硬盘为第一引导。
    Linux系统启动原理和故障排除_第1张图片
  2. 读取硬盘中 MBR 的 boot Loader 就是 grub引导
    GRUB(GRand Unified Bootloader简称“GRUB”)是一个来自GNU项目的多操作系统启动程序。
    MBR的硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR)。它由三个部分组成,主引导程序、硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA)。
    互动:为什么MBR分区表,只能分4个主分区?
    注:磁盘默认一个扇区大小为:512字节。MBR由以下3部分组成:
    第一部分是:主引导程序(boot loader)占446个字节。主引导程序,它负责从活动分区中装载,并运行系统引导程序。
    第二部分是Partition table区(分区表),即DPT,占64个字节,硬盘中分区有多少以及每一分区的大小都记在其中。每个分区表项长16个字节,164=64字节。为分区项1、分区项2、分区项3、分区项4。64字节只存4个分区表。
    第三部分是MBR有效标识位,占2个字节,固定为55AA。如果这个标志位0xAA55,就认为这个是MBR。
    所以:16
    4+446+2=512
  3. 依据 boot loader 的设定,到引导分区加载 Kernel ,Kernel 会开始侦测硬件并加载驱劢程序;
  4. 在硬件驱动成功后,Kernel 会主动执行 init 程序,而 init 会取得 run-level 信息;
  5. init 执行 /etc/rc.d/rc.sysinit 文件来准备软件执行的作业环境 (如网络、时区等);
    在这里插入图片描述
    作用:系统初始化、主机名和fstab都在这里指定、mount分区、激活swap、加载modules等重要工作
    6.init 执行 run-level 下各个服务并启动 (script 方式);
    /etc/rc.d/rc3.d/(这里的程序/服务S开头的全部开机执行;K开头的表示开机不执行,表明了关机时顺序)
    在这里插入图片描述
    rcn.d (n为1到6) 是对应于不同的runlevel下起不同的服务. 这些目录下都是一些符号连接, 连接到/etc/rc.d/init.d下的一些文件.以S开头的表示要启动, 以K开头的不启动.
    在这里插入图片描述
    7.init 执行开机后自动运行脚本 /etc/rc.d/rc.local 文件;
    Linux系统启动原理和故障排除_第2张图片
    8.init 执行虚拟终端机控制程序 mingetty 来启动 login 程序,最后就等待用户登入啦;

如图:
Linux系统启动原理和故障排除_第3张图片

二、centos6相关配置文件
1、grub.conf引导配置文件

[root@xuegod120 ~]# cat /boot/grub/grub.conf
#grub.conf generated by anaconda
#Note that you do not have to rerun grub after making changes to this file
#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/vg_xuegod120-lv_root
#initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0 #设置默认启动菜单项,当系统中有多个内核时,0表示第一个,1表示第二个内核
timeout=5 #菜单项等待选项的时间是5秒
splashimage=(hd0,0)/grub/splash.xpm.gz #菜单背景图片路径
hiddenmenu #隐藏菜单
title CentOS (2.6.32-431.el6.x86_64) #定义菜单栏
root (hd0,0) #grub查找stage2及kernel文件所在设备分区,grub的根
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/vg_xuegod120-lv_root rd_NO_LUKS rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=vg_xuegod120/lv_swap KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rd_LVM_LV=vg_xuegod120/lv_root rhgb quiet #启动的内核文件
initrd /initramfs-2.6.32-431.el6.x86_64.img #内核匹配的ramf文件(虚拟的系统,尽在kernel系统之间的虚拟系统)

2、系统启动级别

[root@xuegod120 ~]# cat /etc/inittab
#inittab is only used by upstart for the default runlevel.
#ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#System initialization is started by /etc/init/rcS.conf
#Individual runlevels are started by /etc/init/rc.conf
#Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#erminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
#with configuration in /etc/sysconfig/init.
#For information on how to write upstart event handlers, or how
#upstart works, see init(5), init(8), and initctl(8).
#Default runlevel. The runlevels used are:
#0 - halt (Do NOT set initdefault to this)
#1 - Single user mode
#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)
id:5:initdefault: #这里是决定系统启动级别的关键

3、启动级别下对应的服务
Linux系统启动原理和故障排除_第4张图片
/etc/rc.d/目录下对应7个启动级别有各自的目录
每个目录下有相对应的服务或程序的开机或者关机顺序文件

[root@xuegod120 ~]# ll /etc/rc.d/rc3.d/ | grep network
lrwxrwxrwx. 1 root root 17 2月 11 04:50 S10network -> …/init.d/network
[root@xuegod120 ~]# vim /etc/init.d/network
#! /bin/bash
#network Bring up/down networking
#chkconfig: 2345 10 90 #2345对应启动级别 10启动顺序 90关机顺序
[root@xuegod120 ~]# chkconfig --list | grep network
network 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
[root@xuegod120 ~]# chkconfig network off #关闭network开机自启动
[root@xuegod120 ~]# chkconfig --list | grep network #查看
network 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
[root@xuegod120 ~]# ll /etc/rc.d/rc3.d/ | grep network
lrwxrwxrwx. 1 root root 17 4月 24 00:06 K90network -> …/init.d/network

4、所有服务执行后,开机执行这个文件/etc/rc.local
如果有需要开机后执行的操作,可以写入这个文件

[root@xuegod120 ~]# ll /etc/rc.local
lrwxrwxrwx. 1 root root 13 2月 11 04:50 /etc/rc.local -> rc.d/rc.local
[root@xuegod120 ~]# cat !$
cat /etc/rc.local
#!/bin/sh
#This script will be executed after all the other init scripts.
#You can put your own initialization stuff in here if you don’t
#want to do the full Sys V style init stuff.
touch /var/lock/subsys/local

三、centos7系统启动过程
1、UEFI或BIOS初始化,运行POST开机自检
2、选择启动设备
3、引导装载程序(加载引导文件grub2)
4、加载程序的配置文件(/etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg)
5、加载内核选项
6、加载initramfs初始化伪文件系统(虚拟文件系统)
7、内核初始化,centos7使用systemd代替init
8、执行initrd.target所有单元,包括挂载/etc/fstab
9、从initramfs根文件系统切换到磁盘根目录(虚拟根切换到内核根)
10、systemd执行默认target配置,配置文件/etc/systemd/system/default.target
11、systemd执行sysinit.target初始化系统即basic.target准备操作系统
12、systemd启动multi-user.target下的本机与服务器服务
13、systemd执行multi-user.target下的/etc/rc.d/rc.local
14、systemd执行multi-user.target下的getty.target及登录服务
15、systemd执行graphical需要的服务
Linux系统启动原理和故障排除_第5张图片

四、Centos7相关配置文件
1、gurb2和grub区别
centos6中,grub文件是/boot/grub/grub.conf
centos7中,使用grub2,配置文件改为/boot/grub2/grub.cfg,但是功能还是大致一样的都是用于加载内核,不过在centos7上设置默认启动项发生变化
2、修改centos7的内核启动顺序

[root@xuegod140 ~]# cat /etc/default/grub
GRUB_TIMEOUT=5 #菜单栏启动时间
GRUB_DISTRIBUTOR=" ( s e d ′ s , r e l e a s e . ∗ (sed 's, release .* (seds,release.,g’ /etc/system-release)"
GRUB_DEFAULT=saved #改为GRUB_DEFAULT=1;0表示第一个内核,1表示第二个内核
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT=“console”
GRUB_CMDLINE_LINUX=“rhgb quiet”
GRUB_DISABLE_RECOVERY=“true”

修改配置文件后,需要使用grub2-mkconfig命令生成grub.cfg

[root@xuegod140 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file …
Found linux image: /boot/vmlinuz-3.10.0-862.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-862.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-9a72d96b863a419c8f569bb047f1b0e1
Found initrd image: /boot/initramfs-0-rescue-9a72d96b863a419c8f569bb047f1b0e1.img
done
[root@xuegod140 ~]#reboot

注:在centos7中,如果要修改grub.cfg文件,不能直接修改,需要修改相对应的配置文件,后再使用命令更新grub.cfg文件。这里和centos6不同,6可以直接修改此文件。

3、修改centos6的内核启动顺序

[root@xuegod120 ~]# vim /boot/grub/grub.conf
default=0 #默认启动第一个内核
timeout=5 #启动菜单等待时间是5秒
[root@xuegod120 ~]#reboot

五、实战-加密grub防止黑客通过单用户破解root密码
1、centos6系统的加密
先使用命令生产grub的md5密码

[root@xuegod120 ~]# grub-md5-crypt
Password:
Retype password:
1 1 1GKL3M0$mj0VvXWXOJyWdj5n71nJL0

将$1$GKL3M0$mj0VvXWXOJyWdj5n71nJL0文件写入到grub.conf文件中
在我们的内核启动菜单前面加上grub加密的密码
Linux系统启动原理和故障排除_第6张图片
重启系统,测试
编辑grub时,需要按下P键,输入加密的密码:123456
按下e键,需要编辑grub菜单,会弹出如下,正常没有加密,可以直接进行编辑,加密有需要按下p键,输入密码,进行编辑
Linux系统启动原理和故障排除_第7张图片
Linux系统启动原理和故障排除_第8张图片
现在可以按下e键,进入编辑模式
Linux系统启动原理和故障排除_第9张图片

可以进入救援模式,恢复root密码,恢复grub引导文件之类的操作
Linux系统启动原理和故障排除_第10张图片

2、centos7的grub加密
使用grub2-mkpasswd-pbkdf2命令生成密文密码

[root@xuegod140 ~]# grub2-mkpasswd-pbkdf2
Enter password:
Reenter password:
PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.E1551FDA801645975C7C664466E313261C902E73BE1D231BCDA49854698FBCCB972AE73EEC79BC56380F4A8438FE127B9435213FDE489D0FD89DE329734D79DD.2B7B298731E1ABBEDD519466821F107C8DED95ED47F797C357D947918C8BE99EC70B1FD77F8A5EB9801819CB20D6C00417CC4AE6097D1009021F39E7043C288F

上述的密码是从grub.pbkdf2开始到结尾是加密后密码
先查看如果需要修改grub菜单,需要修改那个相关配置文件,来改变grub.cfg文件

[root@xuegod140 ~]# cat /boot/grub2/grub.cfg
###BEGIN /etc/grub.d/00_header ###
###END /etc/grub.d/00_header ### #grub菜单文件
###BEGIN /etc/grub.d/01_users ###
###END /etc/grub.d/01_users ### #用户加密文件
###BEGIN /etc/grub.d/10_linux ###
###END /etc/grub.d/10_linux ### #内核文件

所以需要修改/etc/grub.d/00_header文件,在文件最后加上如下内容:

cat << EOF
set superusers=‘zx’
password_pbkdf2 zx
grub.pbkdf2.sha512.10000.E1551FDA801645975C7C664466E313261C902E73BE1D231BCDA49854698FBCCB972AE73EEC79BC56380F4A8438FE127B9435213FDE489D0FD89DE329734D79DD.2B7B298731E1ABBEDD519466821F107C8DED95ED47F797C357D947918C8BE99EC70B1FD77F8A5EB9801819CB20D6C00417CC4AE6097D1009021F39E7043C288F
EOF
Linux系统启动原理和故障排除_第11张图片
更新grub.cfg文件的信息
[root@xuegod140 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file …
Found linux image: /boot/vmlinuz-3.10.0-862.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-862.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-9a72d96b863a419c8f569bb047f1b0e1
Found initrd image: /boot/initramfs-0-rescue-9a72d96b863a419c8f569bb047f1b0e1.img
done

发现内容,已经加载到配置文件中
重启系统,测试
Linux系统启动原理和故障排除_第12张图片
Linux系统启动原理和故障排除_第13张图片

你可能感兴趣的:(第一阶段-基础篇)