第十六章 启动和内核管理

104 阅读15分钟

@[TOC](第十六章 启动和内核管理)

实验⼀:描述centos6启动流程

⽬的

掌握centos6系统中的启动顺序,理解其每个过程中完成的任务。

前提

可用的centos6系统,连接物理网络。

centos6启动步骤概述

1、上电POST自检,加载BIOS的硬件信息,获取第一个启动设备 2、读取第一个启动设备MBR里的引导加载程序(grub)的启动信息 3、加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备 4、核心执行init程序,并获取默认的运行信息 5、init程序执行/etc/rc.d/rc.sysinit文件 6、启动核心的外挂模块 7、init执行运行的各个批处理文件(scripts) 8、init执行/etc/rc.d/rc.local 9、执行/bin/login程序,等待一会登录 10、登录之后开始以shell控制主机

即简单流程:

POST(Power On Self Test,加电自检) ----> Boot Sequesce(BIOS,找到第一启动设备) ----> Boot
Loader(加载引导程序到内存中) ----> Kernel(ramdisk,加载内核和虚拟磁盘映像文件) ---->
rootfs(挂载临时根) ----> switchroot(切换临时根为系统根目录) ----> /sbin/init(开机后第一个
读取的文件) ----> (/etc/inittab,/etc/init/*.conf) ----> 设定默认运行级别 ----> 系统初始化
脚本rc.sysinit ----> 关闭或启动对应级别的服务 ----> 启动终端

名称解释:

MBR

MBR(Master Boot Recorder),我们称之为主引导记录。BIOS是怎样寻找可启动设备的呢?我们知道在分区时,
硬盘的第一块扇区512个字节就是存放的MBR,如果该设备是可启动设备,那么该扇区的最后两个字节肯定是
55/AA,所以此时在寻找可启动设备时,如果发现该设备的最后两个字节是这个,那么该设备就是可启动设备。
BIOS在找到可启动设备以后就会执行其引导代码,因为MBR占据了第一块扇区的512字节,分区表占用了 16*4
=64字节,再加上最后两个标志字节,所以MBR的引导代码就是MBR的前446个字节,当然这446个字节太小了,并不
能完成整个操作系统的引导程序,所以这446个字节里面可能存放的就是启动引导程序的一些代码。

GRUB

 GRUB是引导加载程序,将引导操作系统,启动引导器是计算机启动过程中运行的第一个真正的软件,计算机启动
时在通过BISO自检后读取并运行引导介质上最前面的扇区即硬盘主引导扇区(MBR)中的启动引导器程序, 这里的
扇区中:MBR占据了第一块扇区的512字节,但其实际只占用了其中的446个字节,另外的64个字节交给了
DPT(Disk Partition Table硬盘分区表),最后两个字节“55,AA”是分区的结束标志。启动引导器在负责加载
启动硬盘分区中的操作系统。如果启动引导器不能正常工作,将导致操作系统不能正常启动,从而整个计算机瘫
痪。通常,每个操作系统在安装过程中都要将自带的启动器写在硬盘(MBR),以便能过进行自身的引导。

实验⼆:制作centos6系统的ramdisk⽂件

⽬的

掌握centos6系统中的启动顺序中/boot目录的作用,制作启动时所需的文件ramdisk文件。

前提

可用的centos6系统。

/boot⽬录作⽤

在系统启动以后,/boot整目录内容就没什么用了,甚至可以把boot目录删除,只要不重启,系统仍然能正常运行。

利⽤mkinitrd命令创建ramdisk⽂件

为当前正在使用的内核重新制作ramdisk文件,使用mkinitrd命令。

【例1】制作ramdisk⽂件

为了证明制作⼀个ramdisk⽂件⽽且启动正常,则先删除ramdisk⽂件。

[root@magedu ~]# ls /boot/initramfs-2.6.32-696.el6.x86_64.img 
/boot/initramfs-2.6.32-696.el6.x86_64.img
[root@magedu boot]# rm -f /boot/initramfs-2.6.32-696.el6.x86_64.img

注意,该⽂件名不能随意定义,因为在启动⽂件中是已经定义好的了:

[root@magedu ~]# cd /boot
[root@magedu boot]# tail -5 /boot/grub/grub.conf 
hiddenmenu
title CentOS 6 (2.6.32-696.el6.x86_64)
	root (hd0,0)
	kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=536fda35-daa8-45e0-9463-467a64900521 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
	initrd /initramfs-2.6.32-696.el6.x86_64.img

最后⼀⾏,initrd指明了该⽂件的完整名称,这就是之所以为什么不能随意指定⽂件名的原因。

制作ramdisk⽂件:

[root@magedu boot]# mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)

时间可能会稍长⼀些,之后,就可在/boot⽬录中新创建了initramfs-2.6.32-696.el6.x86_64.img⽂件。可以查看该⽂件:

[root@magedu boot]# cp initramfs-2.6.32-696.el6.x86_64.img /tmp/

解压该⽂件:

[root@magedu tmp]# zcat initramfs-2.6.32-696.el6.x86_64.img |cpio -id
152872 blocks

可以使⽤ls命令查看其结果。现在系统上的ramdisk⽂件已经被删除,⽽且⼿动创建了⼀个ramdisk⽂件,此时重启系统使⽤reboot命令,仍然可以正常启动。



实验三:进⼊单⽤户模式破解centos6的root密码

⽬的

掌握centos6系统中的启动过程中,人为中断启动,手动指定启动级别。

前提

可用的centos6系统。

理解系统运⾏级别,⼿动指定运⾏级别

1、启动系统时⼈为中⽌

启动时,出现下图时,快速按方向键上下即可中止启动。

在这里插入图片描述

进⼊菜单输⼊a,进⼊启动时指定内核参数界⾯。 在这里插入图片描述

此时,在命令⾏中输⼊空格后,再输⼊⼀个数⼦,该数⼦表⽰的就是运⾏级别,即0代表关机、1代表单⽤户模式、2代表没⽹络的多⽤户模式、3代表完整的多⽤户模式、4⾃定义模式、5表⽰有图形化的完整的多⽤户模式、6代表重启。

此处, 输⼊的是1,启动单⽤户模式。

<c KEYTABLE=us rd_NO_DM rhgb quiet 1

在这里插入图片描述 直接键⼊回车即可启动单⽤户模式了,这种模式可⽤于当忘记管理员root的密码时,可进⼊单⽤户模式进⾏修改。因为在 此模式下,root可直接使⽤passwd命令设置新密码,⽽⽆需任何限制。

[root@magedu /]$ passwd

再可启动图形化运⾏级别,输⼊init 5。

[root@magedu /]$ init 5


实验四:⾃制centos6开机背景画⾯mage.xpm.gz

⽬的

掌握centos6系统中的启动时,按方向键可中断启动,这时会有一个界面,更换此界面背景为自定义的图片,这就是读取grub.conf文件,创建启动背景图片并使用。

前提

可用的centos6系统。

实验步骤

  1. 上传图⽚到服务器

先选定⼀张图⽚,作为启动时的背景,然后进⾏制作: 先把windows⾥的图⽚route.png传到centos6系统上:

#注意如没有rz命令,可以先安装:
[root@magedu ~]# yum install lrzsz
[root@magedu ~]# rz

会弹出交互窗⼝,选择图⽚即可。 在这里插入图片描述 实际图⽚内容为 在这里插入图片描述

  1. 制作背景图
[root@magedu ~]# convert -resize 640x480 -colors 14 route.png mage.xpm
[root@magedu ~]# gzip mage.xpm

⽣成mage.xpm.gz⽂件,该⽂件就是将要替换的启动时的背景图⽚。

  1. 更换开机启动读取grub时的背景图⽚

开机启动前的配置⽂件是 /boot/grub/grub.conf

[root@magedu ~]# vim /boot/grub/grub.conf
[root@magedu ~]# mv mage.xpm /boot/grub/

在这里插入图片描述

该文件中splashimage=(hd0,0)/grub/splash.xpm.gz行内容的/grub/splash.xpm.gz就是背景图片,把该文件替换成/grub/mage.xpm.gz

default=0表示为是系统启动默认的顺序,即是默认启动第一个title段落的系统内核。 timeout=5表示为延时5秒启动。 splashimage表示为背景图片。 hiddenmenu表示菜单不会默认显示,而是隐藏,可使用方向键的上下箭头打断倒计时并显示菜单。 titile配置段文件还可定义不同的系统内核,一个title段落就代表一个系统内核,所有title缩进下的内容都属于一个系统内核的配置段。所以title可以有多个即可以有多个系统启动内核。 root (hd0,0)表示内核文件和虚拟磁盘映像文件的存放位置即启动过程中的根目录。该位置对应于系统启动完成 后的/boot目录。 kernel 所在的行表示启动所需的内核文件及参数。 initrd所在的行表示启动所需的虚拟磁盘映像文件。

先看⼀下,开机时3秒倒计时按⽅向键,中⽌启动,进⼊grub界⾯,没换图⽚之前: 在这里插入图片描述 开机进⼊引导过程时,按⽅向键,则出现更换图⽚之后界⾯: 在这里插入图片描述



实验六:配置centos6系统各服务的启动运⾏级别

⽬的

掌握centos6系统中配置开机启动时服务的运行级别。

前提

可用的centos6系统。

实验步骤

  1. runlevel命令:查看上⼀次及当前系统启动的运⾏级别
[root@magedu ~]# runlevel 
N 5

N表示上一次切换级别是无切换过。
5表示当前运行级别是有图形化的完整的多用户模式。
  1. chkconfig命令:查看当前系统启动时服务的运⾏级别
[root@magedu ~]# chkconfig --list
NetworkManager 	0:off	1:off	2:on	3:on	4:on	5:on	6:off
abrt-ccpp      	0:off	1:off	2:off	3:on	4:off	5:on	6:off
abrtd          	0:off	1:off	2:off	3:on	4:off	5:on	6:off
acpid          	0:off	1:off	2:on	3:on	4:on	5:on	6:off
atd            	0:off	1:off	2:off	3:on	4:on	5:on	6:off
auditd         	0:off	1:off	2:on	3:on	4:on	5:on	6:off
autofs         	0:off	1:off	2:off	3:on	4:on	5:on	6:off
...

以crond服务为例,查看开机启动时在各运⾏级别中是否开机启动:

[root@magedu ~]# chkconfig --list|grep crond
crond          	0:off	1:off	2:on	3:on	4:on	5:on	6:off

从结果看crond服务分别在0-6的运行级别中开机分别为:
在0级别关机模式中是关闭的;
在1级别单用户模式中开机自动关闭;
在2级别没有网络的多用户模式中开机自动启动;
在3级别完整的多用户模式中的开机自动启动;
在4级别自定义模式中开机自动启动;
在5级别有图形化的完整的多用户模式中开机自动启动;
在6级别重启模式中开机自动关闭。

[root@magedu ~]# ll /etc/rc.d/rc?.d/???crond
lrwxrwxrwx. 1 root root 15 Apr  5 01:07 /etc/rc.d/rc0.d/K60crond -> ../init.d/crond
lrwxrwxrwx. 1 root root 15 Apr  5 01:07 /etc/rc.d/rc1.d/K60crond -> ../init.d/crond
lrwxrwxrwx. 1 root root 15 Apr  5 01:07 /etc/rc.d/rc2.d/S90crond -> ../init.d/crond
lrwxrwxrwx. 1 root root 15 Apr  5 01:07 /etc/rc.d/rc3.d/S90crond -> ../init.d/crond
lrwxrwxrwx. 1 root root 15 Apr  5 01:07 /etc/rc.d/rc4.d/S90crond -> ../init.d/crond
lrwxrwxrwx. 1 root root 15 Apr  5 01:07 /etc/rc.d/rc5.d/S90crond -> ../init.d/crond
lrwxrwxrwx. 1 root root 15 Apr  5 01:07 /etc/rc.d/rc6.d/K60crond -> ../init.d/crond

此结果说明rc0.d-rc6.d分别是设置各个启动运⾏级别时需要启动和停⽌的服务,⽽在其⽬录下K开头的⽂件都是开机⾃动 关闭的服务,S开头的⽂件都是开机⾃动启动的服务。

列出指定crond服务开机启动各级别是否是⾃动关闭还是⾃动开启:

[root@magedu ~]# chkconfig --list crond
crond          	0:off	1:off	2:on	3:on	4:on	5:on	6:off
  1. 指定crond服务,在2、3、4、5运⾏级别时⾃动启动
[root@magedu ~]# chkconfig crond on

默认是在2、3、4、5级别进⾏设置,或单独指定3和5级别开机时⾃动启动:

[root@magedu ~]# chkconfig --level 35 crond on

当然,也可设置crond服务在2/3/4/5运⾏级别⾃动关闭,默认也是在2、3、4、5级别进⾏设置:

[root@magedu ~]# chkconfig crond off

或单独指定2和4运⾏级别的⾃动关闭:

[root@magedu ~]# chkconfig --level 24 crond off
  1. ⾃定义服务启动脚本,并添加到启动项中

编写mageserv服务启动样例脚本:

[root@magedu ~]# vim /etc/init.d/mageserv
#!/bin/bash
#
# chkconfig: 2345 80 30
# description: This is a service script

. /etc/init.d/functions

check_num(){
	if [ ! $1 -eq 1 ];then
		echo "Usage:$0 [start|stop|restart|status]"
		exit 1
	fi
}

check_argument(){
	if [[ ! $1 =~ ^(start)|(stop)|(restart)|(status)$ ]];then
		echo "Usage:$0 [start|stop|restart|status]"
		exit 1
	fi
}

main(){
#下面名字服务名字可改
	script_name=mageserv
	if [[ $2 = start ]];then
		if [ ! -e /var/lock/subsys/${script_name} ];then
			touch /var/lock/subsys/${script_name}
			action "启动成功" true
		else
			echo "启动成功"
		fi
		elif [[ $2 = stop ]];then
		if [ -e /var/lock/subsys/${script_name} ];then
			rm -rf /var/lock/subsys/${script_name}
			action "停止完成" true
		else
			action "停止完成" false
		fi
		elif [[ $2 = restart ]];then
		if [ -e /var/lock/subsys/${script_name} ];then
			rm -rf /var/lock/subsys/${script_name}
			action "停止完成" true
			touch /var/lock/subsys/${script_name}
			action "启动成功" true
		else
			action "停止完成" false
			touch /var/lock/subsys/${script_name}
			action "启动成功" true
		fi
			elif [[ $2 = status ]];then
		if [ -e /var/lock/subsys/${script_name} ];then
			echo "$script_name 启动..."
		else
			echo "$script_name 停止!"
		fi
	fi
}

check_num $#
check_argument $1
main $0 $1

添加执⾏权限:

[root@magedu ~]# chmod +x /etc/init.d/mageserv

把mageserv服务加⼊系统服务管⾥中:

[root@magedu ~]# chkconfig --add mageserv

添加mageserv服务开机⾃启动:

[root@magedu ~]# chkconfig mageserv on

或指定35启动级别时⾃动启动:

[root@magedu ~]# chkconfig mageserv off
[root@magedu ~]# chkconfig mageserv on --level 35

注意:改变启动级别,先关闭启动运⾏时的开机⾃动启动。

查看mageserv服务设置的默认启动级别:

[root@magedu ~]# chkconfig --list mageserv 
mageserv       	0:off	1:off	2:off	3:on	4:off	5:on	6:off

查看:

[root@magedu ~]# ll /etc/rc?.d/???mageserv
lrwxrwxrwx 1 root root 18 Apr  6 15:05 /etc/rc0.d/K30mageserv -> ../init.d/mageserv
lrwxrwxrwx 1 root root 18 Apr  6 15:05 /etc/rc1.d/K30mageserv -> ../init.d/mageserv
lrwxrwxrwx 1 root root 18 Apr  6 15:05 /etc/rc2.d/K30mageserv -> ../init.d/mageserv
lrwxrwxrwx 1 root root 18 Apr  6 15:06 /etc/rc3.d/S80mageserv -> ../init.d/mageserv
lrwxrwxrwx 1 root root 18 Apr  6 15:05 /etc/rc4.d/K30mageserv -> ../init.d/mageserv
lrwxrwxrwx 1 root root 18 Apr  6 15:06 /etc/rc5.d/S80mageserv -> ../init.d/mageserv
lrwxrwxrwx 1 root root 18 Apr  6 15:05 /etc/rc6.d/K30mageserv -> ../init.d/mageserv

使⽤系统服务管理service命令管理mageserv服务:

[root@magedu ~]# service mageserv start
启动成功 									[ OK ]

[root@magedu ~]# service mageserv restart
停止完成 									[ OK ]
启动成功 									[ OK ]

[root@magedu ~]# service mageserv status
mageserv 启动...

[root@magedu ~]# service mageserv stop
停止完成 									[ OK ]

[root@magedu ~]# service mageserv status
mageserv 停止!

当然,也可以直接使⽤该服务脚本⽂件直接运⾏:

[root@magedu ~]# /etc/init.d/mageserv 
Usage:/etc/init.d/mageserv [start|stop|restart|status]

[root@magedu ~]# /etc/init.d/mageserv start
启动成功 									[ OK ]

[root@magedu ~]# /etc/init.d/mageserv restart
停止完成 									[ OK ]
启动成功 									[ OK ]

[root@magedu ~]# /etc/init.d/mageserv status
mageserv 启动...

[root@magedu ~]# /etc/init.d/mageserv stop
停止完成 									[ OK ]

[root@magedu ~]# /etc/init.d/mageserv status
mageserv 停止!

注意:正常级别下,最后启动⼀个服务/etc/rc5.d/S99local没有链接⾄/etc/rc.d/init.d⽬录下的⼀个服务脚本,⽽是指向了/etc/rc.d/rc.local脚本。不便或不需要写为服务脚本放置于/etc/rc.d/init.d/⽬录,且⼜想开机时⾃动运⾏的命令,可直接放置于/etc/rc.d/rc.loal⽂件中。/etc/rc.d/rc.local在指定运⾏级别脚本后运⾏。

该⽂件是⼀个软连接:

[root@magedu ~]# ll /etc/rc5.d/S99local 
lrwxrwxrwx. 1 root root 11 May 16 17:45 /etc/rc5.d/S99local -> ../rc.local

rc.local⽂件也是⼀个软连接:

[root@magedu ~]# ll /etc/rc.local 
lrwxrwxrwx. 1 root root 13 May 16 17:45 /etc/rc.local -> rc.d/rc.local

所以,最终⽤户⾃定义的⼀个启动脚本⽂件位置是/etc/rc.d/rc.local。

[root@magedu ~]# cat /etc/rc.d/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

实验七:破坏grub1阶段并修复

⽬的

掌握centos6系统中开机启动grub的引导三个阶段是:

  1. stage1阶段:保存在MBR中的前446字节。
  2. stage1.5阶段:保存在MBR之后的扇区。目的是为了让boot loader能识别stage2阶段所在的分区上的文件 系统。
  3. stage2阶段:保存在磁盘分区/boot/grub/目录里,其中包含了内核文件、虚拟磁盘映像文件等系统启动时 需要用到的重要文件。

前提

可用的centos6系统,centos6.9的iso系统安装文件。

实验步骤

  1. 删除/boot/grub⽬录下的各的stage⽂件启动不受影响

在/boot/grub/⽬录下,除保留grub.conf引导菜单⽂件以外,其它⽂件都删除,不影响系统启动。

[root@magedu ~]$ cd /boot/grub/
[root@magedu grub]# mv grub.conf ../
[root@magedu grub]# rm -rf *
[root@magedu grub]# ls
[root@magedu grub]# mv ../grub.conf .
[root@magedu grub]# ls
grub.conf
[root@magedu grub]#reboot

在这里插入图片描述 进⼊此grub菜单界⾯,就说明grub的stage1第⼀阶段和stage1.5阶段已经通过了,正在读取stage2阶段。

  1. 破坏grub的stage1第⼀阶段并恢复系统启动

前提系统安装光盘已经放在光驱⾥.

[root@magedu ~]# dd if=/dev/zero of=/dev/sda bs=1 count=446
[root@magedu ~]# reboot

重启后,系统⽆法进⼊正常的原来系统,启动时按F2键,进⼊BIOS设置第⼀启动设备为CD-ROOM设备。或直接在关机状态使⽤虚拟机开机进⼊固件的功能: 在这里插入图片描述 光盘启动界⾯: 在这里插入图片描述

选择语⾔,选择ok,回车确定 在这里插入图片描述

选择键盘类型,选择ok,回车确定 在这里插入图片描述

选择不启⽤⽹络即选择No,回车确定: 在这里插入图片描述 尝试挂载损坏引导的系统中的根,选择Continue,回车确定 在这里插入图片描述

已经挂载损坏系统上的根,回车确定: 在这里插入图片描述 确认把损坏引导系统的根挂载在/mnt/sysimage⽬录下,回车确定: 在这里插入图片描述 进⼊shell,选择第1⾏后,选择Ok,回车确定 在这里插入图片描述

#切根
bash-4.1# chroot /mnt/sysimage
#此时观察MBR当前446字节是⽆内容的
sh-4.1# hexdump -C -n 446 -v /dev/sda
#安装grub
sh-4.1# grub-install /dev/sda
#再次查看、有内容了
sh-4.1# hexdump -C -n 446 -v /dev/sda

关闭selinux,以保证系统因增加了grub所需的⽂件,能正常启动,编辑/boot/grub/grub.conf

sh-4.1# vim /boot/grub/grub.conf

在这里插入图片描述

#退出chroot环境
sh-4.1# exit
#写入
sh-4.1# sync
sh-4.1# sync
sh-4.1# sync
#重启系统
bash-4.1# reboot

重启后,系统成功修改grub引导⽂件。 在这里插入图片描述


实验⼋:破坏grub1.5阶段并恢复

参考: CentOS 6:破坏本机grub stage1.5,⽽后在救援模式下修复之


实验九:给grub和系统添加密码

参考: CentOS 6:给grub和系统添加密码 CentOS 7:给grub和系统添加密码


实验⼗:破解root口令

CentOS6:破解root口令 CentOS7:破解root口令


实验⼗一:破坏grub2阶段即删除/boot/⽬录下所有⽂件

参考: CentOS 6:破坏grub2阶段即删除/boot/⽬录下所有⽂件 CentOS 7:破坏grub2阶段即删除/boot/⽬录下所有⽂件