Ø 简介
本文主要介绍 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 #查看固件时间
2020年02月22日 星期六 17时23分04秒 -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),但是它也必须向一个更高级的功能负责:PID为0的内核调度器(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) 光盘修复(终极修复方法)