Centos7服务管理与启动流程

ⅰ亾dé卋堺 提交于 2021-01-27 09:58:04

Centos7服务管理与启动流程

Systemd简介

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

Systemd新特性:

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

按需启动守护进程

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

同时采用socket式与D-bus总线式激活服务

系统状态快照

Centos7的启动过程

POST à Boot Sequence   à BootLoader  à kernel + initramfs(initrd) à rootfs  à /sbin/init

Init:

Centos5: SysV init

Centos6: Upstart

Centos7: Systemd

Unit 对象

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

配置文件:

  1. /usr/lib/systemd/system: 每个服务最主要的启动脚本配置,类似于之前centos6中的/etc/init.d/
  2. /run/systemd/system/:系统执行过程中所产生的服务脚本,比上面目录优先运行
  3. /etc/systemd/system/:管理员建立的执行脚本,类似于/etc/rc.d/rcN.d/Sxx类的功能,比上面目录优先运行

Unit类型

Systemctl –t help 查看unit类型

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

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

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

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

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

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

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

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

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

特性

关键特性:

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

不兼容:

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

service unit文件格式

在/etc/systemd/system下的unit文件是系统管理员和用户使用

在/usr/lib/systemd/system下的供发行版打包者使用

在unit文件中,以“#” 开头的行后面的内容会被认为是注释,相关布尔值,1、yes、on、true 都是开启,0、no、off、false 都是关闭,时间单位默认是秒,所以要用毫秒(ms)分钟(m)等须显式说明

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

    1. [Unit]:定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等
    2. [Service]:与特定类型相关的专用选项;此处为Service类型
    3. [Install]:定义由“systemctl enable”以及"systemctl disable“命令在实现服务启用或禁用时用到的一些选项

unit段的常用选项

    1. Description:描述信息
    2. After:定义unit的启动次序,表示当前unit应该晚于哪些unit启动,其功能与Before相反
    3. Requires:依赖到的其它units,强依赖,被依赖的units无法激活时,当前unit也无法激活
    4. Wants:依赖到的其它units,弱依赖
    5. Conflicts:定义units间的冲突关系

Service段的常用选项

  1. Type:定义影响ExecStart及相关参数的功能的unit进程启动类型
      1. simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内存中
      2. forking:由ExecStart启动的程序透过spawns延伸出其他子程序来作为此daemon的主要服务。原生父程序在启动结束后就会终止
      3. oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中
      4. dbus:与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作.因此通常也要同时设定BusNname= 才行
      5. notify:在启动完成后会发送一个通知消息。还需要配合NotifyAccess 来让Systemd 接收消息
      6. idle:与simple类似,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执行。这类的daemon通常是开机到最后才执行即可的服务
    1. EnvironmentFile:环境配置文件
    2. ExecStart:指明启动unit要运行命令或脚本的绝对路径
    3. ExecStartPre:ExecStart前运行
    4. ExecStartPost:ExecStart后运行
    5. ExecStop:指明停止unit要运行的命令或脚本
    6. Restart:当设定Restart=1 时,则当次daemon服务意外终止后,会再次自动启动此服务

Install段的常用选项

    1. Alias:别名,可使用systemctl command Alias.service
    2. RequiredBy:被哪些units所依赖,强依赖
    3. WantedBy:被哪些units所依赖,弱依赖
    4. Also:安装本服务的时候还要安装别的相关服务

注意:

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

systemctl daemon-reload

管理服务

管理系统服务

CentOS 7: service unit

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

命令:

systemctl COMMAND name.service

服务查看

chkconfig命令的对应关系

其它命令

 

服务状态

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

    1. loaded:Unit配置文件已处理
    2. active(running):一次或多次持续处理的运行
    3. active(exited):成功完成一次性的配置
    4. active(waiting):运行中,等待一个事件
    5. inactive:不运行
    6. enabled:开机启动
    7. disabled:开机不启动
    8. static:开机不启动,但可被另一个启用的服务激活

systemctl示例

显示所有单元状态

systemctl 或systemctl list-units

只显示服务单元的状态

systemctl --type=service

显示sshd服务单元

systemctl –l status sshd.service

验证sshd服务当前是否活动

systemctl is-active sshd

启动,停止和重启sshd服务

systemctl start sshd.service

systemctl stop sshd.service

systemctl restart sshd.service

重新加载配置

systemctl reload sshd.service

列出活动状态的所有服务单元

systemctl list-units --type=service

列出所有服务单元

systemctl list-units --type=service --all

查看服务单元的启用和禁用状态

systemctl list-unit-files --type=service

列出失败的服务

systemctl --failed --type=service

列出依赖的单元

systemctl list-dependencies sshd

验证sshd服务是否开机启动

systemctl is-enabled sshd

禁用network,使之不能自动启动,但手动可以

systemctl disable network

启用network

systemctl enable network

禁用network,使之不能手动或自动启动

systemctl mask network

启用network

systemctl unmask network

运行级别

在centOS7上运行级别的含义已经和之前不同了,运行级别就是通过开启关闭不同的服务产生的效果,在从netOS7上,已然由.target来代替运行级别,我们可以称target为目标态,我们可以通过target定制更符合我们工作运行环境。

我们可以通过命令:ls /usr/lib/systemd/system/*.target查看我们的机器上有多少个target

 

[root@CT731 grub2]#ls /usr/lib/systemd/system/*.target

/usr/lib/systemd/system/anaconda.target

/usr/lib/systemd/system/basic.target

/usr/lib/systemd/system/bluetooth.target

/usr/lib/systemd/system/printer.target

...

/usr/lib/systemd/system/reboot.target

/usr/lib/systemd/system/rescue.target

/usr/lib/systemd/system/rpcbind.target

/usr/lib/systemd/system/runlevel0.target

/usr/lib/systemd/system/runlevel1.target

/usr/lib/systemd/system/runlevel2.target

...

/usr/lib/systemd/system/sleep.target

...

使用systemctl list-unit-files --type target --all可以查看所有目标态的状态,或者systemctl list-dependencies xxx.target命令查看目标态的依赖性。

[root@localhost ~]# systemctl list-dependencies multi-user.target

multi-user.target

● ├─auditd.service

● ├─chronyd.service

● ├─crond.service

● ├─dbus.service

● ├─irqbalance.service

● ├─network.service

● ├─NetworkManager.service

在centOS7上所谓的目标态,其实就是由各种指定的服务和基础target组合而成的。运行级别与target的对照

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

运行级别的切换

在centOS6上,我们切换级别使用init,在centOS7上虽然也能使用,但是已经不再是原来的程序了,现在我们使用systemctlisolate name.target来切换target。比如,我们想切换到字符界面,我们就可以使用systemctlisolate multi-user.target来进行切换。要想切换运行级别,在/lib/systemd/system/*.target文件中AllowIsolate=yes才可以。(修改文件需执行systemctldaemon-reload才能生效)

在centOS7上如何查看运行的目标态呢,使用命令systemctl get-default

使用命令systemctl set-default name.target来修改我们的目标态。

我们看一下我们的默认目标态究竟为何物。

[root@CT731 ~]#locate default.target

/etc/systemd/system/default.target

[root@CT731 ~]#ll /etc/systemd/system/default.target

lrwxrwxrwx.1 root root 36Aug2507:06/etc/systemd/system/default.target ->/lib/systemd/system/runlevel3.target

它其实就是创建了一个软链接到指定的target上去了

CentOS7引导顺序

    1. UEFi或BIOS初始化,运行POST开机自检
    2. 选择启动设备
    3. 引导装载程序, centos7是grub2
    4. 加载装载程序的配置文件:/etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg
    5. 加载initramfs驱动模块
    6. 加载内核选项
    7. 内核初始化,centos7使用systemd代替init
    8. 执行initrd.target所有单元,包括挂载/etc/fstab
    9. 从initramfs根文件系统切换到磁盘根目录
    10. systemd执行默认target配置,配置文件/etc/systemd/system/default.target
    11. systemd执行sysinit.target初始化系统及basic.target准备操作系统
    12. systemd启动multi-user.target下的本机与服务器服务
    13. systemd执行multi-user.target下的/etc/rc.d/rc.local
    14. Systemd执行multi-user.target下的getty.target及登录服务
    15. systemd执行graphical需要的服务

设置简单的内核参数

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

    1. 启动时,在linux16行后添加systemd.unit=desired.target
      1. systemd.unit=emergency.target
      2. systemd.unit=rescue.target
    2. rescue.target 比emergency 支持更多的功能,例如日志等
    3. systemctl default 进入默认target

简单的启动排错

在centOS7中,文件系统损坏,先尝试自动修复,失败则进入emergency shell,提示用户修复

    1. 在/etc/fstab不存在对应的设备和UUID等一段时间,如不可用,进入emergency shell
    2. 在/etc/fstab不存在对应挂载点,systemd尝试创建挂载点,否则提示进入emergency shell.
    3. 在/etc/fstab不正确的挂载选项,提示进入emergency shell

虚拟机环境下破解centOS7 root的口令

1>.破解CentOS7 的root口令方法一

启动时任意键暂停启动

按e键进入编辑模式

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

按Ctrl-x启动
mount -o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabel
exit

reboot

2>.破解CentOS7的root口令方法二

启动时任意键暂停启动

按e键进入编辑模式

将光标移动到linux16开始的行,改为rw init=/sysroot/bin/sh

按Ctrl-x启动
chroot /sysroot
passwd root
touch /.autorelabel        

# (如果你系统没有开启selinux,那么可以不做这一步)
exit
reboot
备注:1. touch /.autorelabel    因为在此情況下,SELinux 並沒有启动,对所有文件的更改,可能会造成文档的context(安全上下文)不正确,为确保开机时重新设定SELinux context,必須在根目录下添加隐藏文件.autorelabel。

 

 

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