Linux 引导流程解析

Ø  简介

本文主要介绍 Linux 引导流程相关内容,包括如下内容:

1.   Linux 系统引导流程

2.   Linux 运行级别

3.   Linux 启动服务管理

4.   GRUB 配置与应用

5.   启动故障分析与解决

 

1.   Linux 系统引导流程

1)   常用固件设置

安全设置

可引导介质列表

可引导介质搜索顺序

电源管理

启动细节显示

......

 

2)   固件设置实例

hwclock 命令的使用

功能描述

硬件/固件时钟的相关操作

语法

hwclock [功能] [选项...]

-s, --hctosys        从硬件时钟设置系统时间

-w, --systohc        从当前系统时间设置硬件时钟

执行权限

所有用户

命令所在路径

/usr/bin/which

示例:

[root@localhost ~]# date        #查看软件时间

2020 02 22日 星期六 17:22:59 CST

[root@localhost ~]# hwclock     #查看固件时间

20200222日 星期六 172304  -0.334217

[root@localhost ~]# hwclock –hctosys   #同步硬件时钟到软件时钟

[root@localhost ~]# hwclock –systoh    #同步软件时钟到硬件时钟

 

[root@localhost ~]# date 022118122020.56    #设置软件时间

2020 02 21日 星期五 18:12:56 CST

[root@localhost ~]# hwclock --set="9/22/96 16:45:05"    #高版本的不支持

hwclock:选项“--set”不接受任何参数

 

3)   init 进程的工作

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

在进程管理中有一个基本概念,父进程终止所有子进程必须终止。父子进程有以下两种情况:

n  父进程终止了,子进程没有终止,子进程就变成了孤儿进程;孤儿进程在 Linux 中是不准存在的,系统发现后会将它的父进程指向 init 进程。

n  子进程死了,父进程不知道,还尝试与子进程保持联系;这时子进程就会变为僵尸进程,这种进程也是不允许存在的。

 

2.   Linux 运行级别

1)   查看 inittab 配置文件

vi /etc/inittab        #该文件在 CentOS 7 中与 CentOS 5 中不一样的

6个运行级别:

0 – halt               #关机

1 – Single user mode   #单用户模式,类似于 Windows 中的安全模式,只能 root 用户登录,是没有图形界面的;

2 – Multiuser         #字符界面的多用户模式,所有服务都会启动,但没有图形界面,其他都与运行级别3一致,但是没有NFS(networking)这个服务

3 – Full multiuser     #完整的多用户模式

4 – unused            #没有使用的,用户可以自定义(可以指定需要启动服务)

5 – X11               #系统缺省的运行级别,与运行级别3的区别是,有运行界面的

6 – reboot            #重启

 

2)   inittab 文件剖析

1.   查看当前的运行级别

[root@localhost ~]# runlevel        #N表示之前未切换运行级别,1表示当前的运行级别

N 5

  #5表示切换前的运行级别

 

2.   切换运行级别

[root@localhost ~]# init 1          #切换运行级别为1

或者

[root@localhost ~]# telinit 1

注:init telinit 一样,都是软链接,分别指向 /bin/systemctl /lib/systemd/systemd 文件

 

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

id: 标识符(标记条目的唯一性),一般为两位字母或数字;

run-levels: 指定运行级别,可以指定多个(如:123),为空表示所有运行级别都执行;

action: 指定运行状态,action 常用取值:

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

l  sysinit: 系统启动指定 process 中指定的命令;

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

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

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

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

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

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

 

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

 

id:5:initdefault:   #比较特殊,并没有 process,指定了系统的默认运行级别;

si::sysinit:/etc/rc.d/rc.sysinit    #每个运行级别启动,都会执行该脚本。由这个脚本完成服务程序启动,如设置系统环境变量、系统时钟、加载字体、检查加载文件系统、生成系统启动信息日志文件等。注意:如果希望任何运行级别都执行的脚本、命令,就可以加入到该文件的末尾。

 

l0:0:wait:/etc/rc.d/rc 0

l6:0:wait:/etc/rc.d/rc 6

判断默认运行级别,调用/etc/rc.d/rc脚本,执行相应运行级别目录中的服务程序,完成相应运行级别的初始化设置。

 

/etc/rc.d/rc[0123456].d

分别存放对应于运行级别的服务程序脚本的符号链接,链接到 init.d 目录中的相应脚本。

例如:S12syslog

S – start,表示要启动的服务,注意必须为大写S,小写s将不会被识别;

K – kill,表示要停止的服务;

12 – 数字,启动顺序(数字越小越优先启动,数字相同按照创建顺序启动)

syslog – 脚本名称

提示:一个系统基本的管理原则,授予用户最小的权限,同时开启最少的服务(开启的服务越多被攻击的可能越大,而且越占用资源)。

 

ca::ctrlaltdel:/sbin/shutdown -t3 -r now    #Ctrl + Alt + Delete 键执行相关(关机)命令

 

1:2345:respawn:/sbin/mingetty tty1 ~ tty6   #表示按 Ctrl + Alt + (F1-F6),切换命令终端,另外自己还可以增加终端。

 

3.   Linux 启动服务管理

1)   /etc/rc.d/init.d

该目录下包含各个运行级别的服务程序脚本

[root@localhost ~]# /etc/rc.d/init.d/network    #查看服务程序脚本可以跟的命令

Usage: /etc/rc.d/init.d/network {start|stop|status|restart|force-reload}

[root@localhost ~]# /etc/rc.d/init.d/network start      #启动服务

[root@localhost ~]# /etc/rc.d/init.d/network stop       #停止服务

[root@localhost ~]# /etc/rc.d/init.d/network restart    #重启服务

[root@localhost ~]# /etc/rc.d/init.d/network status     #查看进程

[root@localhost ~]# /etc/rc.d/init.d/network force-reload   #重新读取服务配置文件

 

2)   设置自启动程序

1.   ln -s(如以下示例:设置新添加的服务)

1)   创建 msg.script 脚本

[root@localhost init.d]# vi /etc/rc.d/init.d/msg.script

1 date >> /root/msg.today

2 who >> /root/msg.today

3 free >> /root/msg.today

2)   赋予所有者可执行权限

[root@localhost init.d]# chmod u+x /etc/rc.d/init.d/msg.script

3)   创建软链接到对应运行级别的目录中

[root@localhost init.d]# ln -s /etc/rc.d/init.d/msg.script /etc/rc.d/rc5.d/S100msg.script

 

2.   chkconfig(设置现有的服务)

除了手动方式在每个运行级别中改变文件名的方式:

S12syslog   改为    s12syslog       #启动改为不启动

K85mdmpd    改为    S85mdmpd        #不启动改为启动

还可以使用 chkconfig 命令:

[root@localhost ~]# chkconfig --list        #列出系统安装的服务

[root@localhost ~]# chkconfig --list network    #查看某一个服务

[root@localhost ~]# chkconfig --levels 2345 network off #设置某个服务在某些运行级别中启动或停止

 

3.   ntsysv(菜单点选的方式)

[root@localhost ~]# ntsysv  #设置当前运行级别启动的服务

[root@localhost ~]# ntsysv --level 3    #设置运行级别3启动的服务

*表示启动的,空白表示不启动的;使用上下键选择项;使用空格选中或取消选中;使用<Tab>键切换菜单。

 

3)   相关命令及日志

1.   运行 dmesg 检查引导期间的错误

[root@localhost ~]# dmesg | grep eth0       #检索eth0的错误信息

 

2.   检查系统日志,查找可能被 dmesg 忽略的应用程序错误

linx 中,所有的日志文件都存放在:/var/log 目录下

boot.log        #为启动日志文件(启动出现错误时记录)

messages        #记录程序或服务的日志信息

[root@localhost ~]# grep syslog /var/log/messages   #查看 syslog 服务的相关日志信息

 

4)   Linux 引导步骤流程

 

4.   GRUB 配置与应用

1)   GRUB 的配置文件路径

默认为:/boot/grub/grub.conf

软连接:/etc/grub.conf

 

/boot 目录下存放了系统启动相应的文件,比如:

内核文件:vmlinuz-3.10.0-957.el7.x86_64

 

2)   GRUB 配置选项

 

3)   单用户模式应用

案例:root 密码忘记

进入当用户模式重新设置 root 密码,方法:开机进入 GRUB 界面,按 e 进入编辑行模式,选中 kernel 行,再次按 e 键,在新的界面的最后一行输入 l s,即可进入单用户模式。

 

如果考虑不安全,可以给 GRUB 加密码。

 

注:具体步骤可参考《李明老师讲Linux

 

4)   光盘修复(终极修复方法)

原文地址:https://www.cnblogs.com/abeam/p/15415598.html