centos 7 新特性之systemd

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

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

配置文件 :

     /usr/lib/systemd/system : 内个服务最主要的启动脚本设置,类似于之前的 /etc/init.d/

    /run/systemd/system : 系统执行过程中所产生的服务脚本,比上面目录优先运行

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

unti类型:

    systemctl -t help  : 查看unit类型

    

[root@centos7 ~]# systemctl -t help
Available unit types:  #可用的unit类型
service        #文件扩展名为 .service ,用于定义系统服务
socket    #用于标识进程间通信用的socket文件,也可以在系统启动时,延迟启动服务,实现按需启动
busname        
target       #用于模拟实现"运行级别"
snapshot      #管理系统快照
device       #用于定义内核识别的设备
mount       #定义文件系统挂载点
automount     #文件系统的自动挂载点
swap       #用于标识swap设备
timer           
path    #用于定义文件系统的一个文件或目录使用,常用于当文件系统变化时,延迟激活服务,如: spool 目录
slice
scope

关键特性:

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

    基于d-bus的激活机制: 

    基于device的激活机制

    基于path的激活机制

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

    向后兼容sysv init 脚本

不兼容:

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

    非由systemd启动的服务,systemctl无法与之通信和控制

服务管理

管理系统服务:

    CentOS 7 : service unit

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

命令 : systemctl COMMAND name.service

启动 : 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

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

    service name condrestart ==> systemctl try-restart name.service

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

    systemctl reload-or-restart name.service

重载或条件式重启服务 :

    systemctl reload-or-try-restart name.service

禁止自动和手动启动:

    systemctl mask name.service

取消禁止:

    systemctl unmask name.service

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

    systemctl is-active name.service

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

    systemctl list-units –type|-t service

查看所有服务:

    systemctl list-units –type|-t service -all|-a

设定某服务开机自启:

    chkconfig name on ==> systemctl enbale name.service

设定某服务开机禁止启动:

    chkconfig name off ==> systemctl disable name.service

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

    chkconfig –list ==> systemctl list-unit-files –type service

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

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

查看服务是否开机自启:

    systemctl is-enabled name.service

查看服务的依赖关系:

    systemctl list-dependencies name.service

杀掉进程:

    systemctl kill 进程名

服务状态

systemctl list-units –type service –all  显示所有状态

loaded : unit配置文件已处理

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

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

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

inactive : 不运行

enabled : 开机启动

disabled : 开机不启动

static : 开机不启动,但可被另一个启用的服务激活

systemctl 命令示例

显示所有单元状态:

    systemctl 或 systemctl list-units

只显示服务单元的状态:

    systemctl –type=service

显示sshd服务单元:

    systemctl status sshd.service -l

验证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 -t service -a

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

    systemctl list-unit-files -t service

列出失败的服务:

    systemctl –failed -t service
列出依赖的单元:

    systemctl list-dependencies sshd

验证sshd服务是否开机启动:

    systemctl is-enabled sshd

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

    systemctl disable network

启用network

    systemctl enable network

运行级别

target units:

    unit配置文件: .target

    ls /usr/lib/systemd/system/*.target

    systemctl list-unit-files –type target –all

运行级别:

blob.png

    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

blob.png

级别切换: 

    init N ==> sytemctl isolate name.target

    systemctl isolate multi-user.target

    注: 只有 /lib/systemd/system/*.target文件中

    AllowIsolate=yes 才能切换(修改文件需执行 systemctl daemon-reload 才能生效)

查看 target :

    runlevel 或 who -r

    blob.png

   

获取默认运行级别:

    /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 

centos 7 引导顺序

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

选择启动设备

引导装载程序,centos是grub2

加载装载程序的配置文件 : /etc/grub.d/      /etc/default/grub  /boot/grub2/grub.cfg

加载initramfs驱动模块

加载内核

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

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

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

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

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需要的服务

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

    systemctl daemon-reload

服务unit文件示例    

vim /testdir/backup_etc.sh
#!/bin/bash
tar -Jcf  /testdir/backup_etc_date +%F.tar.gz /etc &> /dev/null
vim /etc/systemd/system/backup_etc.service
[Unit]
Description=back up /etc
Requires=atd.service
[Service]
Type=simple
ExecStart=/bin/bash -c "echo /testdir/backup_etc.sh | at now"

blob.png

centos 7 启动相关

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

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

systemd.unit=emergency.target

system.unit=rescue.target

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

启动拍错:

文件系统损坏:

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

在 /etc/fstab 不存在对应的设备和UUID,等一段时间,如不可用,进入emergency shell

在 /etc/fstab 不存在对应挂载点 systemd 尝试创建挂载点,否则提示进入 emergency shell

在 /etc/fstab 不正确的挂载选项,提示进入 emergency shell

破解root口令:

启动时任意键暂停启动

按e键进入编辑模式

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

按ctrl+x 启动

mount -o remount,rw /sysroot

chroot /sysroot

passwd root

touch /.autorelabel

修复grub2 :

引导提示时可以使用命令行界面可从文件系统引导

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

修改配置文件 grub2-mkconfig > /boot/grub2/grub.cfg  或 grub2-mkconfig -o /boot/grub2/grub.cfg

修复grub

    grub2-install /dev/sda

    

练习

1,为编译安装的httpd服务,实现service unit文件

vim /etc/man_db.conf

blob.png

blob.png

blob.png

blob.png

blob.png

blob.png

blob.png

2,破解centos7 口令

 blob.png

3,修改默认的启动内核 

blob.png

4,启动时临时禁用SELinux 

blob.png

5,启动时进入emergency模式 

blob.png

blob.png

6,删除编译安装的新内核

blob.png

类似文章