[Linux学习笔记] Linux系统引导流程(一)

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-03 02:16:58

前面我们已经介绍过以CentOS为例的Linux系统的安装以及Linux常用命令的使用,本节内容我们将介绍Linux系统引导流程。当按下电源的那一刻,到我们看到用户界面,这其中都发生了些什么呢?赶快来一探究竟.

下图为Linux系统引导流程过程图: 

以下对Linux引导流程过程做一个简单的说明: 

1. POST加电自检

POST(POST ON SELF TEST)首先对每一个设备进行检查,完成后会寻找存有引导记录的设备,找到读入操作系统的引导记录,将系统控制权交给引导记录。

2. MBR引导

MBR(Master Boot Record),MBR记录一般是在磁盘0磁道1扇区,共512字节,前446个字节是BootLoader,后面的4*16个字节是存放分区信息的,最后两个字节是校验信息的 。

3. GRUB加载内核

GRUB(GRand Unified Bootloader)就是MBR前446个字节,是Booloader的一种,它的作用是选择要启动的内核。

GRUB用于载入内核,查看GRUB配置文件: CentOS-7系统: /boot/grub2/grub.cfg

内核启动后完成了两件事: (1)驱动硬件; (2)启动init进程

4. 启动init进程

init启动后读取inittab配置文件,执行缺省运行级别,从而继续引导进程。在UNIX系统中,init是第一个可以存在的进程,它的PID恒为1,但它也必须想一个更高级的功能负责: PID为0的内核调度器(分配CPU时间)。

这个过程包含了多个步骤,以CentOS-7以前的系统为例说明:

    (1) 读取/etc/inittab,选择默认级别<常用的运行级别有3:表示多用户; 5:X Window环境,关于运行级别的内容放在本文最后,并且十分重要>

    (2) 执行初始化系统脚本,这个脚本在/etc/rc.d/rc.sysinit中

    (3) 执行/etc/rc.d/rcX.d/下的脚本<默认级别是5,则会读取rc5.d下的所有脚本,来控制系统启动的时候启动或关闭那些服务>

        这里的脚本大致分为两类,以S开头的和以K开头的。 

        S:代表开机启动的 

        K:表示开机时不启动的 

        文件命令格式,例如: 

        S01sysstat S: 开机启动; 01: 启动次序; sysstat: 启动脚本名。注意: 该文件为软链接

    (4) 执行/etc/rc.d/rc.local脚本,这是启动过程中最后启动的一个脚本,然后会执行/bin/login 登陆用户。

下面图片中将更具体的展现了系统启动过程中经历的过程:


注意:

CentOS-7版本以前系统inittab配置文件存放目录: /etc/inittab

CentOS-7系统inittab配置文件也存放在/etc/inittab,但并未做实际配置,而是引向了运行级别配置文件

-------------------------------------------------------------------------------- L v S a n t o r i n i 的 分 割 线 -------------------------------------------------------------------------------- 

设置开机自启动服务或程序:

(1) 确定系统运行级别

(2) 编写脚本文件,并赋予文件可执行权限

(3) 创建对应的软连接文件置于在对应的rcN.d目录下(N表示运行级别: 0,1,2,3,4,5,6)

    注意: 软连接文件名要以启动脚本命名规范来命名,例如: S10sysstat

如此操作,下次设备重启就可以执行自定义的启动脚本了。

举例(CentOS 7以前版本)<此段由于无设备环境,未验证,读者可看下边用chkconfig添加启动服务的示例>:

[root@localhost rc5.d]# cd /etc/rc.d/rc5.d
[root@localhost rc5.d]# pwd
/etc/rc.d/rc5.d
[root@localhost rc5.d]# vi /etc/rc.d/init.d/start.script 
[root@localhost rc5.d]# cat /etc/rc.d/init.d/start.script 
date >> /home/santorini/out.log
who >> /home/santorini/out.log
ls -l /etc >> /home/santorini/out.log
[root@localhost rc5.d]# ll /etc/rc.d/init.d/start.script 
-rw-r--r--. 1 root root 101 Nov 16 21:36 /etc/rc.d/init.d/start.script
[root@localhost rc5.d]# chmod 755 /etc/rc.d/init.d/start.script 
[root@localhost rc5.d]# ll /etc/rc.d/init.d/start.script 
-rwxr-xr-x. 1 root root 101 Nov 16 21:36 /etc/rc.d/init.d/start.script
[root@localhost rc5.d]# ln -s /etc/rc.d/init.d/start.script S20defineBySantorini
[root@localhost rc5.d]# ll
total 0
lrwxrwxrwx. 1 root root 20 Nov 14 10:24 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 17 Nov 16 21:00 S10network -> ../init.d/network
lrwxrwxrwx. 1 root root 29 Nov 16 21:39 S20defineBySantorini -> /etc/rc.d/init.d/start.script

在介绍完下面的chkconfig命令后,我们将给出CentOS-7系统如何运行安装自启动服务.

chkconfig命令:

chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息。chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接.

语法: 
chkconfig [--add][--del][--list][系统服务] 或 chkconfig [--level <等级代号>][系统服务][on/off/reset]
参数用法:
 --add  增加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统启动的叙述文件内增加相关数据;
 --del  删除所指定的系统服务,不再由chkconfig指令管理,并同时在系统启动的叙述文件内删除相关数据;
 --level<等级代号>  指定读系统服务要在哪一个执行等级中开启或关闭;
详细:
chkconfig --list [name]:显示所有运行级系统服务的运行状态信息(on或off)。如果指定了name,那么只显示指定的服务在不同运行级的状态。
chkconfig --add name:增加一项新的服务。chkconfig确保每个运行级有一项启动(S)或者杀死(K)入口。如有缺少,则会从缺省的init脚本自动建立。
chkconfig --del name:删除服务,并把相关符号连接从/etc/rc[0-6].d删除。
chkconfig [--level levels] name [on/off/reset]:设置某一服务在指定的运行级别是启动,停止还是重置。

CentOS-7系统安装自启动服务:

[root@localhost init.d]# pwd
/etc/rc.d/init.d
[root@localhost init.d]# vi defined 
[root@localhost init.d]# cat defined 
#!/bin/bash
#chkconfig: 5 10 90   (注意10表示启动优先级,90表示停止优先级, 5表示运行级别)
#description: define
date >> /Hello.log
ls -l /etc >> /Hello.log
[root@localhost init.d]# ls -l
total 36
-rw-r--r--. 1 root root    97 Nov 17 21:49 defined
-rw-r--r--. 1 root root 13430 Jan 15  2015 functions
-rwxr-xr-x. 1 root root  2989 Jan 15  2015 netconsole
-rwxr-xr-x. 1 root root  6470 Jan 15  2015 network
-rw-r--r--. 1 root root  1160 Mar  6  2015 README
[root@localhost init.d]# chmod 755 defined 
[root@localhost init.d]# ls -l
total 36
-rwxr-xr-x. 1 root root    97 Nov 17 21:49 defined
-rw-r--r--. 1 root root 13430 Jan 15  2015 functions
-rwxr-xr-x. 1 root root  2989 Jan 15  2015 netconsole
-rwxr-xr-x. 1 root root  6470 Jan 15  2015 network
-rw-r--r--. 1 root root  1160 Mar  6  2015 README
[root@localhost init.d]# chkconfig --add defined 
[root@localhost init.d]# cd /etc/rc.d/rc5.d
[root@localhost rc5.d]# pwd
/etc/rc.d/rc5.d
[root@localhost rc5.d]# ll
total 0
lrwxrwxrwx. 1 root root 20 Nov 14 10:24 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 17 Nov 17 21:43 S10defined -> ../init.d/defined
lrwxrwxrwx. 1 root root 17 Nov 16 21:00 S10network -> ../init.d/network

CentOS-7安装自启动服务步骤:

(1) 在/etc/init.d目录下新建开机启动时要执行的脚本,并赋予执行权限

(2) 使用chkconfig --add 命令添加启动服务.(执行完此命令后将在对应的运行级别rcN.d下生成相应的软链接文件,并且软链接指向/etc/init.d下刚才创建的执行脚本)

ntsysv命令:

ntsysv:类似图形界面管理模式来设置开机启动服务。(RedHat特有的,基本上chkconfig就很好用了)

注意: 执行此命令需要root用户权限

总结一下功能按钮:

上下键:可以在中间的方框当中,在各个服务之间移动;

空格键:可以用来选择或取消你所需要或需要取消的服务,[*]表示开机启动;

tab键:可以在方框、OK、Cancel之间移动;

[F1]键:可以显示该服务的说明。

[root@localhost ~]# runlevel   ##查看当前运行级别
N 5
[root@localhost ~]# ntsysv --level 3   ##设置运行级别为3的开机启动项
[root@localhost ~]# ntsysv    ##设置当前运行级别的开机启动项

下图为键入ntsysv后显示的类图形界面:

+++++++++++++++++++++++++++++++++++++++++++ O T H E R   I N T R O D U C T I O N ++++++++++++++++++++++++++++++++++++++++++++++++

相关概念:

CMOS: 在计算机领域,CMOS常指保存计算机基本启动信息(如日期、时间、启动设置等)的芯片。有时人们会把CMOS和BIOS混称,其实CMOS是主板上的一块可读写的并行或串行FLASH芯片,是用来保存BIOS的硬件配置和用户对某些参数的设定。

硬件时钟(hwclock)和软件时钟(系统时间):

[root@localhost ~]# date   ##软件时钟
Sat Nov 14 08:28:12 CST 2015
[root@localhost ~]# hwclock   ##硬件时钟
Sat 14 Nov 2015 08:27:35 AM CST  -0.192386 seconds

软硬件同步时钟及时间设置:

-s, --hctosys        set the system time from the hardware clock  ##将系统时间设置为硬件时钟
-w, --systohc        set the hardware clock from the current system time  ##将硬件时钟设置为系统时间
[root@localhost ~]# hwclock --set --date="2011-08-14 16:45:05"  ##设置硬件时钟时间
[root@localhost ~]# date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]  ##设置系统时间

runlevel(运行级别):

    runlevel 用来表示在init进程结束之后的系统状态,在系统的硬件中没有固定的信息来表示runlevel,它纯粹是一种软件结构。init和 inittab是runlevel影响系统状态的唯一原因。下面简单说明各运行级别runlevel:

0 - halt 关机,让init关闭所有进程并关机;

1 - Single user mode 单用户模式,只能系统管理员进入,没有图形界面,在该模式下处理在有登录用户时不能进行更改的文件;

2 - Multiuser,without NFS 允许系统进入多用户的模式,没有图形界面,但并不支持文件共享,这种模式很少应用;

3 - Full multiuser mode 最常用的运行模式,主要用来提供真正的多用户模式,也是多数服务器的缺省模式;

4 - unused 一般不被系统使用;

5 - X11 将系统初始化为专用的X Window终端;

6 - 关闭所有运行的进程并重新启动系统(系统将不断重启).

运行级别的切换:

[root@localhost ~]# init 5

inittab文件剖析:

在inittab中,所有条目采取以下格式:  id:run-levels:action:process

id:标识符,一般为两位字母或数字

run-levels:指定运行级别,可以指定多个

action:指定运行状态

process:指定要运行的脚本/命令

=====

action常用取值:

initdefault: 指定系统缺省启动的运行级别;

sysinit: 系统启动执行process中指定的命令

wait: 执行process中指定的命令,并等其结束在运行其他命令

once: 执行process中指定的命令,不等待其结束

ctrlaltdel: 按下Ctrl+Alt+Del时执行process指定的命令

powerfail: 当出现电源错误时执行process指定的命令,不等待其结束

powerokwait: 当电源恢复时执行process指定的命令

respawn: 一旦process指定的命令终止,便重新运行该命令


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!