你值得拥有,通俗易懂的讲解linux的启动过程

通俗易懂的讲解linux的启动过程

对于Linux你知道多少呢,反正我知道的是有限的,这边做一下笔记,随便再熟悉一下相关的知识和内容,也希望大家看了这篇文档,也可以熟悉一下相关的知识

其中centos7的启动过程,大家可以进行一个大概的了解,自己也是结合了网上大量的文章总结出来的,可以用来参考

先大概的了解一下开机启动过程

Centos6的开机启动流程

  • 第一步:开机自检,加载BIOS
  • 第二步:读取MBR
  • 第三步:grub引导菜单
  • 第四步:加载kernel内核
  • 第五步,启动init进程
  • 第六步:init进程依据inittab文件夹来设定运行级别
  • 第七步:init进程执行rc.sysinit
  • 第八步:执行不同运行级别的脚本程序
  • 第九步:执行/etc/rc.d/rc.local
  • 第十步:执行/bin/login程序,启动mingetty,进入登录状态

Centos7的开机启动流程

  • 第一步:开机自检,加载BIOS
  • 第二步:读取MBR
  • 第三步:grub引导菜单
  • 第四步:加载内核和inintamfs模块
  • 第五步、初始化内核 使用systemd来替代centos6中的init程序(登录服务在这个里面启动)

CentOS6解析启动过程

第一步,开机自检,加载BIOS

当我们打开服务器电源的那一刻开始,会听见“滴”的一声,开始进行自检,这个过程呢主要是检测服务器的硬件设备;比如说cpu了,内存了,主板了等等设备是不是存在故障等情况

第二步,读取MBR

BIOS自检,首先会在一个Boot Sequence程序中所搜可以让系统启动的引导设备(比如我们在BIOS里面设置的从硬盘启动或者是从cd-rom中启动等等)
这时,如果BIOS找不到可以引导的设备及相关的程序后,便会启动失败,如果按照顺序找到了相关的设备硬盘,那么BIOS将把控制权交给启动设备中的MBR(Master Boot Record)俗称主引导记录,MBR在大小为512字节,存放着预启动信息,分区表等信息。

第三步,GRUP引导菜单

在MBR中找到前446字节的Boot Loader,这个就是在操作系统内核中运行之前运行的一小段程序,通过这段程序,我们可以初始化硬件设备,见谅内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备。
Boot Loader有若干种,其中Grub、Lilo和spfdisk是常见的Loader
系统读取内存中的grup配置信息,并依照配置文件来启动不同的操作系统

在这里插入图片描述

[root@localhost ~]# cat /etc/grub.conf 
###也可读取/boot/grub/menu.lst(软链接)或/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/VolGroup-lv_root
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda

#默认情况下如何加载系统,0表示加载菜单中对应的第一个名字,多系统时可以调节默认加载项
default=0

#表示多少秒之后开始加载默认的系统,给管理员提前选择的时间
timeout=5

##启动时显示的背景图标,在(hd0,0)代表/boot分区
splashimage=(hd0,0)/grub/splash.xpm.gz

##系统启动时,会隐藏启动菜单信息,按默认设置启动系统,除非用户按键干预
hiddenmenu

当编辑grub菜单时需要输入密码认证,Linux基础优化之一,默认没有
password [–md5|–encrypted ] STRING   

要启动的系统对应的项目名称,可按需修改
title CentOS (2.6.32-431.el6.x86_64)
	
	##其中hd0表示计算机的第一块磁盘,(hd0,0)中逗号后面的0表示第一个分区,即(hd0,0)表示第一块磁盘的第一个分区,即/dev/sda1(分区通常最先独立分出的/boot分区,对应的设备名就是sda1)
	root (hd0,0)
	#内核启动列表,多内核此处会有多项显示,后面跟的都是内核相关的参数
	##/vmlinuz-2.6.32-696.el6.x86_64为内核文件。root=UUID=后面一串数字表示根对应的设备信息
	kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS rd_NO_MD rd_LVM_LV=VolGroup/lv_swap crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=VolGroup/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
	##内核启动所需的驱动文件的所在地,存在于boot区
	initrd /initramfs-2.6.32-431.el6.x86_64.img

第四步,加载kernel内核

根据grub设定的内核影响所在的路径,系统读取内存映像,并进行解压缩操作。此时,屏幕一般会输出“Uncompressing Linux”的提示。当解压缩内核文件完成后,屏幕会输出“OK, booting the kernel”。
系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立。至此,Linux内核已经建立起来了,基于Linux的程序应该可以正常运行了。
内核完成的任务主要有:(1)硬件的特测(2)硬件驱动的初始化(3)挂载根文件系统(4)启动init进程。

第五步,启动init进程

grub中默认指定init=/sbin/init程序,可以在grub.conf中kernel行自定义执行程序init=/bin/bash,此时可以绕过下面步骤直接进入bash界面

第六步,init进程依据inittab文件夹来设定运行级别

内核被加载之后,第一个运行的程序便是/sbin/init,该文件会读取/etc/inittab文件,并依据此文件来进行初始化操作。

在这里插入图片描述

init级别systemctl target含义
0shutdown.target-halt 关机
1emergency.target-single user mode 单用户模式
2rescure.target-Multi-user,without NFS无网络支持的多用户模式
3multi-user.target-Full multi-user mode 有网络支持的多用户模式
4-unused 保留,未使用
5graphical.target-X11 有网络支持有X-Window支持的多用户模式
6- reboot 重新引导系统,即重启

第七步,inint进程执行rc.sysinit

在设定了运行级别之后。Linux系统会执行第一个用户层文件就是/etc/rc.d/rc.sysinit脚本程序

  • 主要工作
  • 设置主机名
  • 设置欢迎信息
  • 设置PATH
  • 激活udev和selinux可以在grub.conf中,kernel行添加selinux=0以关闭selinux
  • 挂载/etc/fstab文件中定义的文件系统
  • 检测根文件系统,并以读写方式重新挂载根文件系统
  • 设置系统时钟
  • 启动swap分区
  • 根据/etc/sysctl.conf文件设置内核参数
  • 激活lvm及software raid设备
  • 加载额外设备的驱动程序
  • 还有其他的一些脚本操作
[root@localhost ~]# head -100 /etc/rc.d/rc.sysinit
#!/bin/bash
#
# /etc/rc.d/rc.sysinit - run once at boot time
#
# Taken in part from Miquel van Smoorenburg's bcheckrc.
#

HOSTNAME=$(/bin/hostname)

set -m

if [ -f /etc/sysconfig/network ]; then
    . /etc/sysconfig/network
fi
if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then
    HOSTNAME=localhost
fi

if [ ! -e /proc/mounts ]; then
	mount -n -t proc /proc /proc
	mount -n -t sysfs /sys /sys >/dev/null 2>&1
fi
if [ ! -d /proc/bus/usb ]; then
	modprobe usbcore >/dev/null 2>&1 && mount -n -t usbfs /proc/bus/usb /proc/bus/usb
else
	mount -n -t usbfs /proc/bus/usb /proc/bus/usb
fi

#remount /dev/shm to set attributes from fstab #669700
mount -n -o remount /dev/shm >/dev/null 2>&1
#remount /proc to set attributes from fstab #984003
mount -n -o remount /proc >/dev/null 2>&1

. /etc/init.d/functions

PLYMOUTH=
[ -x /bin/plymouth ] && PLYMOUTH=yes

# Check SELinux status
SELINUX_STATE=
if [ -e "/selinux/enforce" ] && [ "$(cat /proc/self/attr/current)" != "kernel" ]; then
	if [ -r "/selinux/enforce" ] ; then
		SELINUX_STATE=$(cat "/selinux/enforce")
	else
		# assume enforcing if you can't read it
		SELINUX_STATE=1
	fi
fi

if [ -n "$SELINUX_STATE" -a -x /sbin/restorecon ] && __fgrep " /dev " /proc/mounts >/dev/null 2>&1 ; then
	/sbin/restorecon -R -F /dev 2>/dev/null
fi

disable_selinux() {
	echo $"*** Warning -- SELinux is active"
	echo $"*** Disabling security enforcement for system recovery."
	echo $"*** Run 'setenforce 1' to reenable."
	echo "0" > "/selinux/enforce"
}

relabel_selinux() {
    # if /sbin/init is not labeled correctly this process is running in the
    # wrong context, so a reboot will be required after relabel
    AUTORELABEL=
    . /etc/selinux/config
    echo "0" > /selinux/enforce
    [ -n "$PLYMOUTH" ] && plymouth --hide-splash

    if [ "$AUTORELABEL" = "0" ]; then
	echo
	echo $"*** Warning -- SELinux ${SELINUXTYPE} policy relabel is required. "
	echo $"*** /etc/selinux/config indicates you want to manually fix labeling"
	echo $"*** problems. Dropping you to a shell; the system will reboot"
	echo $"*** when you leave the shell."
	start rcS-emergency

    else
	echo
	echo $"*** Warning -- SELinux ${SELINUXTYPE} policy relabel is required."
	echo $"*** Relabeling could take a very long time, depending on file"
	echo $"*** system size and speed of hard drives."

	/sbin/fixfiles -F restore > /dev/null 2>&1
    fi
    rm -f  /.autorelabel
    echo $"Unmounting file systems"
    umount -a
    mount -n -o remount,ro /
    echo $"Automatic reboot in progress."
    reboot -f
}

# Print a text banner.
echo -en $"\t\tWelcome to "
read -r system_release < /etc/system-release
if [[ "$system_release" == *"Red Hat"* ]]; then
 [ "$BOOTUP" = "color" ] && echo -en "\\033[0;31m"
 echo -en "Red Hat"
 [ "$BOOTUP" = "color" ] && echo -en "\\033[0;39m"
 PRODUCT=$(sed "s/Red Hat \(.*\) release.*/\1/" /etc/system-release)

********************省略好多***************

第八步:执行不同运行级别的脚本程序

根据运行级别的不同,系统会运行rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务

在这里插入图片描述

第九步:执行/etc/rc.d/rc.local

你如果打开了此文件,里面有一句话,读过之后,你就会对此命令的作用一目了然:

[root@localhost ~]# 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


rc.local就是在一切初始化工作后,Linux留给用户进行个性化的地方。你可以把你想设置和启动的东西放到这里。

第十步:执行/bin/login程序,启动mingetty,进入登录状态

执行/bin/login程序,等待用户登录

在这里插入图片描述

CentOS7解析启动过程

第一步,开机自检,加载BIOS

当我们打开服务器电源的那一刻开始,会听见“滴”的一声,开始进行自检,这个过程呢主要是检测服务器的硬件设备;比如说cpu了,内存了,主板了等等设备是不是存在故障等情况

第二步,读取MBR

BIOS自检,首先会在一个Boot Sequence程序中所搜可以让系统启动的引导设备(比如我们在BIOS里面设置的从硬盘启动或者是从cd-rom中启动等等)
这时,如果BIOS找不到可以引导的设备及相关的程序后,便会启动失败,如果按照顺序找到了相关的设备硬盘,那么BIOS将把控制权交给启动设备中的MBR(Master Boot Record)俗称主引导记录,MBR在大小为512字节,存放着预启动信息,分区表等信息。

第三步,GRUP引导菜单

在MBR中找到前446字节的Boot Loader,这个就是在操作系统内核中运行之前运行的一小段程序,通过这段程序,我们可以初始化硬件设备,见谅内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备。
Boot Loader有若干种,其中Grub、Lilo和spfdisk是常见的Loader
系统读取内存中的grup配置信息,并依照配置文件来启动不同的操作系统

CentOS 6 之前是GRUB 0.97版本,CentOS 7之后是GRUB 2,两者区别还是比较大的

由grub2-mkconfig命令会分析/etc/grub.d/目录下面的文件,然后根据/etc/default/grub的配置来重新生成grub.cfg文件,然后存放到/boot/grub2/grub.cfg,来让GRUB2引导程序来读取

第四步,加载内核和inintamfs模块

这一步与CentOS6也差不多,加载驱动,切换到真正的根文件系统,唯一不同的是执行的初始化程序变成了/usr/lib/systemd/systemd

第五步,初始化内核 使用systemd来替代centos6中的init程序

CentOS7中我们的初始化进程变为了systemd。执行默认target配置文件/etc/systemd/system/default.target(这是一个软链接,与默认运行级别有关)。然后执行sysinit.target来初始化系统和basic.target来准备操作系统。接着启动multi-user.target下的本机与服务器服务,并检查/etc/rc.d/rc.local文件是否有用户自定义脚本需要启动。最后执行multi-user下的getty.target及登录服务=,检查default.target是否有其他的服务需要启动。

注意:/etc/systemd/system/default.target指向了/lib/systemd/system/目录下的graphical.target或multiuser.target。而graphical.target依赖multiuser.target,multiuser.target依赖basic.target,basic.target依赖sysinit.target,所以倒过来执行。

在这里插入图片描述

(1)./etc/systemd/system/default.target 这是一个软链接,和默认运行级别相关

(2)./usr/lib/systemd/system/ 这个目录存储每个服务的脚本,类似CentOS6的/etc/init.d/

(3)./run/systemd/system/ 系统执行过程中产生的脚本

(4)./etc/systemd/system/ 类似于CentOS6的/etc/rc.d/rc#.d/SXX类文件的功能,管理员建立的执行脚本,大部分是软链接
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘帅0952

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值