centOS7.4启动流程

本文主要介绍:centos7.4启动流程、Unit介绍、服务管理和查看、启动排错、破解口令及修复grub2

一、cenOS7.4开机启动

 

POST –> Boot Sequence –> Bootloader –> kernel + initramfs(initrd) — > rootfs –> /sbin/init

init: CentOS

5: SysV init CentOS

6: Upstart CentOS  ( 较5快,部分并行)

7: Systemd      (服务并行启动,更快)

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

Systemd新特性:

系统引导时实现服务并行启动

按需启动守护进程

自动化的服务依赖关系管理

同时采用socket式与D-Bus总线式激活服务 (例如 原本httpd web -> tcp 80 socket file 现在断开,由80端口监听,有需要时叫醒httpd服务)

系统状态快照

 

CentOS7引导顺序

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=multi-user.target

usystemd.unit=emergency.target

usystemd.unit=rescue.targetu(rescue.target 比emergency 支持更多的功能,例如日志等)

usystemctl default 进入默认target

 

二、Unit介绍

  • 核心概念:unit

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

配置文件: /usr/lib/systemd/system/:每个服务最主要的启动脚本设置,(类似于centos6的 /etc/init.d/*)

/run/systemd/system:系统执行过程中所产生的服务脚本,比上面目录优先运行,一般不需人为更改

/etc/systemd/system:管理员建立的执行脚本,类似于 /etc/rc.d/rcN.d/Sxx类的功能,比上面目录优先运行

 

  • Unit类型

systemctl –t help 查看unit类型   (用的较多的service,target)

Service unit: 文件扩展名为.service, 用于定义系统服务 (用的最多)

Target unit: 文件扩展名为.target,用于模拟实现运行级别  (相当于centos6的 init,运行级别)

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

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

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

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

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

Automount unit: .automount,文件系统的自动挂载点   (比如神奇目录/misc/cd)

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

 

  • 关键特性:

基于socket的激活机制:socket与服务程序分离

基于d-bus的激活机制:

基于device的激活机制:

基于path的激活机制:

系统快照:保存各unit的当前状态信息于持久存储设备中

向后兼容sysv init脚本

不兼容:

systemctl命令固定不变,不可扩展

非由systemd启动的服务,systemctl无法与之通信和控制    (要么全用这个命令,要么全不用这个命令,统一风格,若用自己的脚本启动某服务,就不能用该命令关闭已开启的服务)

 

三、服务管理和查看 (systemctl 2Tab 可补全命令)

1、管理系统服务:

CentOS 7: service unit

注意:能兼容早期的服务脚本

  • 命令:systemctl COMMAND name.service …  ( .service可省略,可一次对多个服务进行操作;c7也能用service,系统会自动重定向到/bin/systemctl)

启动:service name start ==> systemctl start name.service

停止:service name stop ==> systemctl stop name.service

重启:service name restart ==> systemctl restart name.service

状态:service name status ==> systemctl status name.service

禁止自动和手动启动:systemctl mask name.service  (有用,不想卸载又不想被启用)

取消禁止:systemctl unmask name.service

重新加载配置:systemctl reload sshd.service   (不影响用户,只加载服务的配置文件,比较友好)

条件式重启:已启动才重启,否则不做操作

service name condrestart ==> systemctl try-restart name.service  (了解)

重载或重启服务:先加载,再启动

systemctl reload-or-restart name.service   (了解)

重载或条件式重启服务:

systemctl reload-or-try-restart name.service  (上面两个功能组合,了解即可)

 

例:如图,禁止atd服务后会生成软连接指向/dev/null

图片1

 

2、服务查看

查看某服务当前激活与否的状态:

systemctl is-active name.service   ( 有用,会有标准输出,且若是启用$?是0,若是未启用$?是非0,脚本可用)

查看所有已经激活的服务:

systemctl list-units –type|-t service   (指定查看类型是service的)

查看所有服务:

systemctl list-units –type service –all|-a   (服务状态会有颜色区别,后面讲)

chkconfig命令的对应关系:

设定某服务开机自启:chkconfig name on ==> systemctl enable name.service  (其实是创建了软连接)

设定某服务开机禁止启动:chkconfig name off ==> systemctl disable name.service    (其实是删除了软连接)

 

例:multi-user模式下下面的服务开机启动,相当于centos6,S开头的服务

图片2

 

查看所有服务的开机自启状态:

chkconfig –list ==> systemctl list-unit-files –type service  指定类型

用来列出该服务在哪些运行级别下启用和禁用

chkconfig sshd –list ==> ls /etc/systemd/system/*.wants/sshd.service

图片3

查看服务是否开机自启:systemctl is-enabled name.service

其它命令:

查看服务的依赖关系:systemctl list-dependencies name.service

杀掉进程:systemctl kill UNITNAME

图片4

 

3、服务状态

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

loaded:Unit配置文件已处理

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

active(exited):成功完成一次性的配置  (做完一次结束)

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

inactive:不运行

enabled:开机启动

disabled:开机不启动

static:开机不启动,但可被另一个启用的服务激活   (不是人为启动,通过依赖性激活)

 

Centos6服务有依赖性

图片6

Centos7解决了服务的依赖性

图片5

Centos7上telnet服务不再依赖xinetd超级守护进程,由systemd取代,安装时不会同时下载xinetd

图片7

 

4、service unit文件格式   (了解,系统自动生成,一般不会手写)

图片8

/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文件,要通知systemd重载此配置文件,而后可以选择重启  systemctl daemon-reload   

 

服务Unit文件示例:

vim /etc/systemd/system/bak.service

[Unit]

Description=backup /etc

Requires=atd.service

[Service]

Type=simple

ExecStart=/bin/bash -c “echo /testdir/bak.sh|at now”

[Install]

WantedBy=multi-user.target

systemctl daemon-reload

systemctl start bak

 

5、运行级别

target units:

unit配置文件:.target

ls /usr/lib/systemd/system/*.target   (较直观)

systemctl list-unit-files –type target –all

运行级别:

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 (查看graphical.target的依赖性,可见它依赖multi-user.target级别)

 

级别切换:init N ==> systemctl isolate name.target  ( init N 也可以用)

例:systemctl isolate multi-user.target

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

查看target:Runlevel  ;  who -r  ;  systemctl list-units –type target

获取默认运行级别:/etc/inittab ==> systemctl get-default

修改默认级别: /etc/inittab ==> systemctl set-default name.target

例如:systemctl set-default multi-user.target

ls –l /etc/systemd/system/default.target (查看默认级别)

其它命令

切换至紧急救援模式:systemctl rescue    (默认进入单用户模式)

切换至emergency模式:systemctl emergency

其它常用命令:

传统命令init,poweroff,halt,reboot都成为systemctl的软链接

关机:systemctl halt、systemctl poweroff

重启:systemctl reboot

挂起:systemctl suspend

休眠:systemctl hibernate

休眠并挂起:systemctl hybrid-sleep

 

设置开机默认级别,其实是相当于改软连接,如下图:

图片9

所以直接改软连接也可设置,如下:

图片10

 

四、启动排错

1、文件系统损坏

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

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

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

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

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

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

提示进入emergency shell

五、破解口令及修复grub2

1、破解CentOS7的root口令 :      RHCE考试必考!!!

  • 方法一

启动时任意键暂停启动

按e键进入编辑模式

将光标移动linux16开始的行,添加内核参数rd.break

ctrl-x启动

mount –o remount,rw /sysroot

chroot /sysroot

passwd root

touch /.autorelabel    (SElinux启用状态必须有这一步,关闭状态不要,getenforce命令查看,Disabled为关闭)

exit

reboot

 

  • 方法二

启动时任意键暂停启动

按e键进入编辑模式

将光标移动linux16开始的行,改为rw init=/sysroot/bin/sh ( 改成读写权限并启动第一个程序/bin/bash)

按ctrl-x启动

chroot /sysroot

passwd root

touch /.autorelabel   (SElinux启用状态必须有这一步,getenforce命令可查看,Disabled为关闭)

exit

reboot

 

2、修复GRUB2

GRUB“the Grand Unified Bootloader”

引导提示时可以使用命令行界面

可从文件系统引导

  • 主要配置文件 /boot/grub2/grub.cfg
  • 修复配置文件

grub2-mkconfig > /boot/grub2/grub.cfg   或者grub2-mkconfig -o /boot/grub2/grub.cfg 

  • 修复grub

grub2-install /dev/sda BIOS环境

grub2-install UEFI环境

  • 调整默认启动内核

vim /etc/default/grub   (配置文件的模板,损坏可以从别处拷或者自己写)

GRUB_DEFAULT=0  (代表菜单第一项为默认启动内核,改成1则默认第二项) 

 

  • 实验:
  • 1、删除/boot/grub2/下面的所有文件

(1)进救援模式

(2)df查看挂载情况

(3)chroot /mnt/sysimage (切根)

(4)grub2-install /dev/sda  (修复grub)

(5)grub2-mkconfig > /boot/grub2/grub.cfg  (修复配置文件grub.cfg)

(6)exit

(7)reboot

  • 2、删除/boot/grub2/grub.cfg文件

重启后直接到输入命令界面,操作如下图所示:

QQ截图20180516132315

  • 3、删除/boot/下所有文件

(1)进救援

(2)切根

(3)挂光盘

(4)强行安装内核包 rpm -ivh /mnt/P…/kernel…  –force   (路径和包文件可 Tab键补全)需要点时间(修复内核两个核心文件)

(5)grub2-install /dev/sda  (修复grub)

(6)grub2-mkconfig > /boot/grub2/grub.cfg  (修复配置文件grub.cfg)

(7)exit

(8)reboot

 

 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/98618

发表评论

登录后才能评论

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1823388528@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班