Linux进阶_systemd详解(CentOS 7)

本意内容

  • systemd
    • Unit类型
    • 管理服务
    • 服务状态
    • systemctl 命令示例
    • service unit文件格式
  • CentOS 7 引导顺序
    • 设置内核参数
  • 实验:破解CentOS7的root口令方法一
  • 实验:破解CentOS7的root口令方法二
  • 实验:修复GRUB2

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/rcN.d/Sxx的功能,比上面目录优先运行

Unit类型

  • systemctl –t help 查看unit类型
    1. service unit: 文件扩展名为.service, 用于定义系统服务
    2. Target unit: 文件扩展名为.target,用于模拟实现运行级别
    3. Device unit: 文件扩展名为.device, 用于定义内核识别的设备
    4. Mount unit: 文件扩展名为.mount, 定义文件系统挂载点
    5. Socket unit: 文件扩展名为.socket, 用于标识进程间通信用的socket文件,也可在系统启动时,延迟启动服务,实现按需启动
    6. Snapshot unit: 文件扩展名为.snapshot, 管理系统快照
    7. Swap unit: 文件扩展名为.swap, 用于标识swap设备
    8. Automount unit: 文件扩展名为.automount,文件系统的自动挂载点
    9. Path unit: 文件扩展名为.path,用于定义文件系统中的一个文件或目录使用,常用于当文件系统变化时,延迟激活服务,如:spool 目录

管理服务

管理系统服务:CentOS 7: service unit

  • 命令:systemctl COMMAND name.service
控制 centos6 centos7
启动 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

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

  • 其它命令
控制 命令(Centos 7)
重载或重启服务:先加载,再启动 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 service --all|-a
查看服务的依赖关系 systemctl list-dependencies name.service
杀掉进程 systemctl kill unitname
  • chkconfig命令的对应关系
命令 CentOS 6

(chkconfig)

CentOS 7

(systemctl)

设定某服务开机自启 chkconfig name on systemctl enable 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-unit-files --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 –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

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段的常用选项:

    1. Type:定义影响ExecStart及相关参数的功能的unit进程启动类型
    2. simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内存中
    3. forking:由ExecStart启动的程序透过spawns延伸出其他子程序来作为此daemon的主要服务。原生父程序在启动结束后就会终止
    4. oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中
    5. dbus:与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作.因此通常也要同时设定BusNname= 才行
    6. notify:在启动完成后会发送一个通知消息。还需要配合 NotifyAccess 来让 Systemd 接收消息
    7. 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
  • target units:
    unit配置文件:.target
    查看所有target文件:
    ls /usr/lib/systemd/system/*.targetsystemctl 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

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

  • 查看target:
    runlevel ; who -r
    systemctl list-units --type target

  • 获取默认运行级别:systemctl get-default

  • 修改默认级别: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

  • 生成GRUB配置文件
    (1)修改模板配置文件:/etc/default/grub
    (2)然后执行:grub2-mkconfig -o /boot/grub2/grub.cfg

CentOS 7 引导顺序

详细的引导可以参考我的另一篇博客:由浅入深_CentOS系统启动流程

  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
  • systemd执行顺序
    (1)systemd执行sysinit.target初始化系统及basic.target准备操作系统
    (2)systemd启动multi-user.target下的本机与服务器服务
    (3)systemd执行multi-user.target下的/etc/rc.d/rc.local
    (4)Systemd执行multi-user.target下的getty.target及登录服务
    (5)systemd执行graphical需要的服务

设置内核参数

  • 设置内核参数,只影响当次启动
    启动时按e键,在linux16行后添加如下参数,Ctrl+x启动
    (1)systemd.unit=desired.target
    (2)systemd.unit=emergency.target
    (3)systemd.unit=rescue.target
    (4)rescue.target (比emergency支持更多的功能,例如日志等)
    (5)systemctl default (进入默认target)

实验:破解CentOS7的root口令方法一

  1. 启动时任意键暂停启动
  2. 按e键进入编辑模式
  3. 将光标移动linux16开始的行,添加内核参数rd.break,按ctrl-x启动
  4. 接下来如下:
switch_root# mount –o remount,rw /sysroot
switch_root# chroot /sysroot
sh-4.2# passwd root
sh-4.2# touch /.autorelabel
sh-4.2# sync
sh-4.2# exit
switch_root# reboot

实验:破解CentOS7的root口令方法二

  1. 启动时任意键暂停启动
  2. 按e键进入编辑模式
  3. 将光标移动linux16开始的行,改为rw init=/sysroot/bin/sh,按ctrl-x启动
  4. 接下来如下:
switch_root# chroot /sysroot
sh-4.2# passwd root
sh-4.2# touch /.autorelabel
sh-4.2# sync
sh-4.2# exit
switch_root# reboot

实验:修复GRUB2

  1. 修复配置文件
    grub2-mkconfig -o /boot/grub2/grub.cfg
  2. 修复grub
    grub2-install /dev/sda #BIOS环境(grub2-install #UEFI环境)
  3. 调整默认启动内核
    vim /etc/default/grub
     GRUB_DEFAULT=0

你可能感兴趣的:(#,Linux进阶)