CentOS7启动流程与常见故障修复

CentOS7启动流程与故障修复

centos7启动流程与centos6区别

systemd

service unit
target unit

grub2

centos7启动流程与centos6区别

1)grub版本不同,centos7使用的是grub2版本
2)第一个启动进程不同:centos7:systemd
因此:主要介绍grub2的修复和system的相关内容

服务依赖关系启动举例:nfs服务启动依赖于rcpbind
    centos6上:
        如果rcpbind服务未启动,那么nfs服务不能启动
        总结:如果一个服务所依赖的服务未启动,此服务也无法启动
            即centos6需要人为手动解决服务依赖关系
    centos7上:
        如果rcpbind服务未启动,那么nfs服务也能启动
        总结:如果一个服务所依赖的服务未启动,此服务也能启动
            即一个依赖于别的服务需要启动时,将自动解决依赖关系,将其依
            赖的服务也启动

centos7 systemd

开机启动流程:POST --> Boot Sequence --> Bootloader --> kernel + initramfs(initrd) --> rootfs --> /sbin/init

  • init: CentOS 5 SysV init
  • CentOS 6 Upstart
  • CentOS 7 Systemd

Systemd:系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其他进程

systemd的新特性:

  • ①系统引导时实现服务并行启动
  • ②按需启动守护进程
  • ③自动化的服务依赖关系管理
  • ④同时采用socket式与D-Bus总线式激活服务
  • ⑤系统状态

UNIT systemd的核心概念

unit:unit表示不同类型的systemd对象,通过配置文件进行标识和配置,文件中主要包含了系统服务、监听socket、保存的系统快照以及其他与init相关的信息

systemd 管理centos7上的所有资源,所有资源统称为unit。

unit配置文件:

  • unit配置文件优先级:/usr/lib/systemd/system < /run/systemd/system < /etc/systemd/system
  • /etc/systemd/system/:管理员建立的执行脚本,类似于/etc/rc#.d/S**
  • /run/systemd/system/:系统执行过程中产生的服务脚本
  • /lib/systemd/system/:每个服务最主要的启动脚本设置,存放了各种各样的unit
/run/systemd/system/ 和/etc/systemd/system/ 这两个目录下的内容一般都
是通过一些工具自动生成的,无需手动修改。

/usr/lib/systemd/system 可能接触添加删除.service文件,源码编译安装的
软件需要添加.service文件时,才能被systemd进行管理。

unit类型

unit类型:

  • 类型查看命令:sytemctl -t help

service unit:文件扩展名为.service,用于定义系统服务

  • 编译安装的软件没有对应的service文件,就不能使用Systemctl进行管理
  • systemd启动的服务,systemctl无法与之通信和控制

target unit:文件扩展名为.target,用于模拟实现运行级别

Device unit: .device, 用于定义内核识别的设备

Mount unit: .mount, 定义文件系统挂载点

Socket unit: .socket, 用于标识进程间通信用的socket文件,也可在系统启动时,延迟启动服务,实现按需启动

  • 由systemd实现按需激活
telnet 启动时,由systemd监听23端口,当需要时启动Telnet,因此centos6上
的xinetd被淘汰。

Snapshot unit: .snapshot, 管理系统快照

Swap unit: .swap, 用于标识swap设备

Automount unit: .automount,文件系统的自动挂载点

Path unit: .path,用于定义文件系统中的一个文件或目录使用,常用于当文件系统变化时,延迟激活服务,如:spool 目录

unit特性

关键特性:

  • 基于socket的激活机制:socket与服务程序分离
  • 基于d-bus的激活机制:
  • 基于device的激活机制:
  • 基于path的激活机制:
  • 系统快照:保存各unit的当前状态信息于持久存储设备中
  • 向后兼容sysv init脚本

不兼容:

  • systemctl命令固定不变,不可扩展
  • 非由systemd启动的服务,systemctl无法与之通信和控制

服务管理(systemctl命令)

~]systemctl(tab 补全查看其子命令)
常用:systemctl start|restart|status|mask|default|get-default..

systemctl管理服务的变化:
    ①systemctl可以同时管理多个服务
    ②启动服务时没有标准输出进行提示咯。没有消息就是最好的消息。

CentOS 7: service unit (注意:能兼容早期的服务脚本)

centos7也能使用service命令,但是其实被重定向至/bin/systemctl 
~]# service nfs status
Redirecting to /bin/systemctl status nfs.service

命令:systemctl COMMAND name.service

其中.service可以省略不写,也只有service unit 可以省略不写,
因此省略不写时都会被认为是.service

COMMAND:start,restart,stop,status

禁止自动和手动启动:

  • systemctl mask name.service
当有多个服务提供同一功能时,eg:httpd和Nginx,
    避免冲突,只能启动一个服务
    或者暂时不需启动时,防止别人或自己误启动:
systemctl mask name.service

systemctl mask实质:
~]# systemctl mask atd
Created symlink from /etc/systemd/system/atd.service to /dev/null.
    /etc/systemd/system/目录下文件优先级最高
    再高优先级目录下创建对应的软链接指向/dev/null

取消禁止:

  • systemctl unmask name.service

查看某服务当前激活与否的状态:(查看对应返回值 脚本中使用)

  • systemctl is-active name.service

设定某服务开机自启

  • systemctl enable name.service

设定某服务开机禁止启动

  • systemctl disable name.service
查看某服务是否开机自启动:
(..../autofs.service; enabled-->主要看这个enabled

某服务设为开机自动实质:
Removed symlink /etc/systemd/system/multi-user.target.wants/atd.service.
/etc/systemd/system/multi-user.target.wants/此目录下为234模式开机启动的服务

服务状态

systemctl list-unit-files --type service --all显示状态

loaded Unit配置文件已处理

active(running) 一次或多次持续处理的运行

active(exited) 成功完成一次性的配置

active(waiting) 运行中,等待一个事件

inactive 不运行

enabled 开机启动

disabled 开机不启动

static 开机不启动,但可被另一个启用的服务激活<只能由另一服务激活,系统管理>

显示所有单元状态
    systemctl 或 systemctl list-units

只显示服务单元的状态
    systemctl --type=service

service unit文件格式

/etc/systemd/system:系统管理员和用户使用

/usr/lib/systemd/system:发行版打包者使用

以 “#” 开头的行后面的内容会被认为是注释

相关布尔值,1、yes、on、true 都是开启,0、no、off、false 都是关闭

时间单位默认是秒,所以要用毫秒(ms)分钟(m)等须显式说明

service unit file文件通常由三部分组成:

  • [Unit]:定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等

  • [Service]:与特定类型相关的专用选项;此处为Service类型

  • [Install]:定义由“systemctl enable”以及"systemctl disable“命令在实现服务启用或禁用时用到的一些选项

Unit段的常用选项:

①Description:描述信息

②After:定义unit的启动次序,表示当前unit应该晚于哪些unit启动,其功能与
Before相反

③Requires:依赖到的其它units,强依赖,被依赖的units无法激活时,当前unit也无法激活

④Wants:依赖到的其它units,弱依赖

⑤Conflicts:定义units间的冲突关系

Service段的常用选项:

①Type:定义影响ExecStart及相关参数的功能的unit进程启动类型

  • simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内存中
  • forking:由ExecStart启动的程序透过spawns延伸出其他子程序来作为此daemon的主要服务。原生父程序在启动结束后就会终止
  • oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常在内存中
  • dbus:与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作.因此通常也要同时设定BusNname= 才行
  • notify:在启动完成后会发送一个通知消息。还需要配合 NotifyAccess 来让Systemd 接收消息
  • idle:与simple类似,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执行。这类的daemon通常是开机到最后才执行即可的服务

②EnvironmentFile:环境配置文件

③ExecStart:指明启动unit要运行命令或脚本的绝对路径

④ExecStartPre: ExecStart前运行

⑤ExecStartPost: ExecStart后运行

⑥ExecStop:指明停止unit要运行的命令或脚本

⑦Restart:当设定Restart=1 时,则当次daemon服务意外终止后,会再次自动启动此服务

Install段的常用选项:

①Alias:别名,可使用systemctl command Alias.service

②RequiredBy:被哪些units所依赖,强依赖

③WantedBy:被哪些units所依赖,弱依赖

④Also:安装本服务的时候还要安装别的相关服务

创建/修改unit文件时

注意:对于新创建的unit文件,或者修改了的unit文件,要通知systemd重载此
配置文件,而后可以选择重启

  • systemctl daemon-reload

运行级别(runlevel.target)

运行级别

target units:

  • unit配置文件:.target
  • ls /usr/lib/systemd/system/*.target
  • systemctl list-unit-files --type target --all
target:就是各种资源的状态,某一target就是对应于各种资源的开机状态
    表现位一个对应的文件夹,启用相应的资源
    各个target还有相互的依赖,或者表现位相互调用关系。

查看centos7系统的开机启动分析:

  • systemd-analyze命令
~]# systemd-analyze <默认显示>
Startup finished in 684ms (kernel) + 2.993s (initrd) + 6.537s (userspace) = 10.215s

systemd-analyze <\tab> 还有诸多选项
    eg:systemd-analyze plot > boot.html
    然后网页版查看如下图:

启动时各服务状态和启动次序:
CentOS7启动流程与常见故障修复_第1张图片

运行级别:

  • 0 ==> runlevel0.target, poweroff.target
  • 1 ==> runlevel1.target, rescue.target
  • 2 ==> runlevel2.target, multi-user.target
  • 3 ==> runlevel3.target, multi-user.target
  • 4 ==> runlevel4.target, multi-user.target
  • 5 ==> runlevel5.target, graphical.target
  • 6 ==> runlevel6.target, reboot.target

查看依赖性:

  • systemctl list-dependencies graphical.target

级别切换:init N ==> systemctl isolate name.target

  • systemctl isolate multi-user.target
    注:只有/lib/systemd/system/*.target文件中AllowIsolate=yes 才能切换(修改文件需执行systemctl daemon-reload才能生效)

修改默认级别:

  • cat /etc/initta 文件已经失效,但是提供了修改说明
  • /etc/inittab ==> systemctl set-default name.target
  • systemctl set-default multi-user.target
  • ls –l /etc/systemd/system/default.target
禁用ctrl + alt + delete (重启快捷键)禁用防止误操作
    systemctl mask ctrl-alt-del.target

开机启动模式设置出错时,修复(单用户模式修复)

单用户修复 systemctl set-default runlevel6.target

grub菜单选择时:按e进入菜单编辑:
CentOS7启动流程与常见故障修复_第2张图片

进入gurb.cfg选项设置:
CentOS7启动流程与常见故障修复_第3张图片

在Linux16行末尾添加:systemd.unit=multi-user.target,然后Ctrl-x
CentOS7启动流程与常见故障修复_第4张图片
注意: 输入完不要敲回车,直接Ctrl+x

待系统启动后,将系统开机设为multi-user.target即可

  • systemctl set-default multi-user.target

Grub

centos7 使用的是grub2 ==>grub启动与centos6类似(stage1,stage1.5,stage2 三个阶段),但是grub2的配置文件/boot/grub2/grub.cfg不建议直接修改了,可以使用grub2-mkconfig 命令生成。

破坏grub2 stage1阶段修复:

grub2 stage1—>BootLoader前446字节。

查看MBR信息:
CentOS7启动流程与常见故障修复_第5张图片

破坏BootLoader:
CentOS7启动流程与常见故障修复_第6张图片

重启,故障现象:
CentOS7启动流程与常见故障修复_第7张图片

修复:救援模式,重新生成BootLoader
CentOS7启动流程与常见故障修复_第8张图片

chroot–>grub2-install /dev/sda(grub2-install依赖于系统根下的工具)
然后重启即可
CentOS7启动流程与常见故障修复_第9张图片

CentOS 7 引导顺序

UEFi或BIOS初始化,运行POST开机自检

选择启动设备

引导装载程序, centos7是grub2

加载装载程序的配置文件:

  • /etc/grub.d/
  • /etc/default/grub
  • /boot/grub2/grub.cfg

加载initramfs驱动模块

加载内核选项

内核初始化,centos7使用systemd代替init

执行initrd.target所有单元,包括挂载/etc/fstab

从initramfs根文件系统切换到磁盘根目录

systemd执行默认target配置,配置文件/etc/systemd/system/default.target

systemd执行sysinit.target初始化系统及basic.target准备操作系统

systemd启动multi-user.target下的本机与服务器服务

systemd执行multi-user.target下的/etc/rc.d/rc.local

Systemd执行multi-user.target下的getty.target及登录服务

systemd执行graphical需要的服务

设置内核参数

设置内核参数,只影响当次启动

启动时,在linux16行后添加systemd.unit=desired.target

systemd.unit=emergency.target

systemd.unit=rescue.target

rescue.target 比emergency 支持更多的功能,例如日志等

systemctl default 进入默认target

启动排错

文件系统损坏

  • 先尝试自动修复,失败则进入emergency shell,提示用户修复

在/etc/fstab不存在对应的设备和UUID

  • 等一段时间,如不可用,进入emergency shell

在/etc/fstab不存在对应挂载点

  • systemd 尝试创建挂载点,否则提示进入emergency shell.

在/etc/fstab不正确的挂载选项

  • 提示进入emergency shell

centos7故障修复

破解CentOS7的root口令方法一

  • 启动时任意键暂停启动
  • 按e键进入编辑模式
  • 将光标移动linux16开始的行,添加内核参数rd.break
  • 按ctrl-x启动
  • mount –o remount,rw /sysroot
  • chroot /sysroot
  • passwd root
  • touch /.autorelabel
  • exit
  • reboot

添加内核参数rd.break,此时就会进入类似于单用户模式
CentOS7启动流程与常见故障修复_第10张图片

查看当前模式的 / :
CentOS7启动流程与常见故障修复_第11张图片

注意: 目前是只读挂载,重新使/读写挂载

mount –o remount,rw /sysroot
chroot
然后可以进行密码重置,修改/etc/shadow文件之类的

破解CentOS7的root口令方法二

  • 启动时任意键暂停启动
  • 按e键进入编辑模式
  • 将光标移动linux16开始的行,改为rw init=/sysroot/bin/sh
  • 按ctrl-x启动
  • chroot /sysroot
  • passwd root
  • touch /.autorelabel
  • exit
  • reboot

设置grub口令

grub2-setpassword

grub2-<\tab> 许多子命令

/boot/grub2下的文件
~]# ls /boot/grub2
device.map  fonts  grub.cfg  grubenv  i386-pc  locale

[root@centos7-17 ~]# ls /boot/grub2
device.map  fonts  grub.cfg  grubenv  i386-pc  locale  user.cfg
[root@centos7-17 ~]# cat /boot/grub2/user.cfg 
GRUB2_PASSWORD=grub.pbkdf2.sha512.1...
设置口令后多出的文件/boot/grub2/user.cfg 
则此文件即为加密的密码文件

若想删除grub口令
    删除/boot/grub2/user.cfg 文件或者 > /boot/grub2/user.cfg 
        覆盖重定向清空

添加grub口令后,grub选择菜单输入“e”
CentOS7启动流程与常见故障修复_第12张图片
输入口令之后才能进入/boot/grub2/grub.cfg文件内容显示部分

删除/boot/grub2/目录修复

故障现象:
CentOS7启动流程与常见故障修复_第13张图片

修复操作:

    救援模式 --> chroot /mnt/sysimage 
--> grub2-install /dev/sda
--> grub2-mkconfig -o /boot/grub2/grub.cfg
--> 重启系统

删除/boot/目录修复

故障现象:
CentOS7启动流程与常见故障修复_第14张图片

修复操作:

    救援模式 --> chroot /mnt/sysimage
--> 挂载光盘mount /dev/sr0 /mnt
--> 重装内核rpm -ivh /mnt/Packages/kernel-VERSION.rpm --force
--> grub2-install /dev/sda
--> grub2-mkconfig -o /boot/grub2/grub.cfg
--> 重启系统
注意: /boot/grub2/grub.cfg 生成一定要在内核文件生成之后
因为它需要内核作为参数提供选择

修改内核启动的默认选择项

当一个系统安装多个内核时,如何修改默认启动内核?
CentOS7启动流程与常见故障修复_第15张图片
上图可见:/boot/grub2/grub.cfg文件中5.2.9的内核是在内核3.10.0之前,如果按照顺序启动时,内核5.2.9应该为默认启动内核。默认排序为前面的5.2.9为0,其后的内核3.10.0为1;修复默认内核启动命令:grub2-set-default

grub2-set-default 1
--> 此命令修改/boot/grub2/grubenv这个文件
cat /boot/grub2/grubenv 
# GRUB Environment Block
saved_entry=CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)
....
注意/boot/grub2/grubenv不建议直接修改此文件,建议使用命令修改

当然还可直接修改/etc/default/grub 此文件
GRUB_DEFAULT=saved  这个值
但是一般还是建议命令修改。

删除/etc/fstab文件的修复

故障现象:
CentOS7启动流程与常见故障修复_第16张图片

修复/etc/fstab文件:
    救援模式 --> 
--> mkdir /mnt/sysroot
--> mount /de/sda2  /mnt/sysroot
--> vi /mnt/sysroot/etc/fstab <还原系统挂载>
--> 修复/etc/fstab文件后
--> 重启
相当于删除/boot目录修复。

你可能感兴趣的:(linux操作系统相关,centos7系统启动,centos7常见故障修复)