• systemd服务详解-技术流ken


    简介

    在centos5中生成和管理用户空间中的进程以及完成系统的初始化使用的是init,并且是依次启动。在centos6中则是使用的upstart,在一定程度上实现了并行启动,但是仍然存在依赖关系,到了centos7中开始使用systemd,真正的实现并行启动、延时按需启动。

    systemd的特性

    1 启动系统的过程中实现了并行启动

    2 systemd所管理的服务可以实现按需激活

    3 支持系统服务状态快照

    4 可以定义程序之间依赖关系

    unit介绍

    unit的配置文件是uit的核心,在配置文件中主要包含

    1. 需要管理服务或者程序

    2. 服务或者程序需要监听的套接字

    3. 保存的系统快照(就是制作快照的时候,系统中各个服务的状态)

    4. 其他和init相关的配置

    unit配置文件的位置

    /lib/systemd/system         本地配置的系统单元

    /run/systemd/system         运行时配置的系统单元

    /usr/lib/systemd/system      第三方软件的系统单元(sshd,nginx..)

    注意:unit(单元)init中的服务脚本类似,但是不相同

    unit的多种类别

     1 类型1:service unit,这是服务类型的unit,该类unit后缀是  .service,比如nginx.service,通过这个nuit可以实现启动、关闭、查看状态等
     2 该类unit位于 /usr/lib/systemd/system
     3 注意:unit本质上来说并不是脚本,而仅仅是systemd一个配置文件,因此这个unit文件不具有执行权限,而且也无法执行
     4 启动服务的方式:通过让systemd去读取配置文件中的内容,完成nginx进程的启动
     5 类型2:device unit,这是设备unit,该类unit的后缀是.device,这类unit的作用是用来识别设备文件
     6 类型3:mount unit,后缀 .mount,用来实现挂载文件系统到指定的挂载点
     7 类型4:socket unit,后缀.socket,用来表示进程间通信的socket文件
     8 类型5:snapshot nuit:快照unit,后缀.snapshot, 用来管理快照
     9 类型6:target unit:目标unit,后缀是 .target,模拟centos5、6上的运行级别(主要是为了向后兼容)
    10 类型7:swap unit
    11 类型8:path unit

    systemd的特性

    1 特性1. 基于socket的激活机制
    2     在启动系统的时候,systemd会将所有要启动的服务都标记已经启动,标记的方式就是将所有要启动的服务的套接字都监听起来,但是是由systemd自己来监听,而不是让具体的服务自己来监听,这样就解决了进程之间的依赖关系。
    3     当某个套接第一次被用户的访问的时候,systemd会立刻启动这个套接字所对应的进程,然后将这个套接字和这个启动的服务做绑定
    4 特性2:基于bus机制激活
    5 特性3:基于device机制激活
    6 特性4:基于path机制激活
    7     可以让systemd监控某个某个目录,当目录中的文件发生更改的时候,立刻激活某个服务
    8 特性5:支持快照机制
    9 特性6:支持域兼容sysV风格的服务管理脚本

    systemctl使用举例

    1.查看激活的服务

    1     查看当前系统中全部已经被激活的unit:systemctl list-units --type service
    2     查看当前系统中全部的unit(包括未激活的):systemctl list-units --type service --all

     2.开机自启动关闭

    1     设置某个服务开机自启动:systemctl enable nginx.service
    2     禁止某个服务开机自启动:systemctl disable nginx.service
    3     【设置开机自启动,其实就是在/etc/systemd/system/multi-user.target.wants/下创建执行/usr/lib/systemd/system/下的配置文件的软连接】
    4 
    5     查看当前系统中的全部unit的自动启动情况:systemctl list-unit-files
    6     state
    7         disabled:禁止开机自动启动
    8         enabled:开机自动启动
    9         static:该unit不能独立运行,是其他unit所依赖的

     3.查看是否自启动

    1     查看指定的服务是否开机自动启动
    2         systemctl list-unit-files | grep nginx.service
    3         systemctl list-unit-files nginx.service
    4         systemctl is-enabled nginx.service
    5     查看一个unit的依赖关系:systemctl list-dependencies nginx.service
    6     优先用reload,如果无法让修改生效,才执行restart:systemctl reload-or-restart nginx.service

     4.禁止使用enable

    1     禁止用enable让某服务开机自启动:systemctl mask nginx.service
    2     解除禁止mask功能:systemctl unmask nginx.service
    3 
    4     注意:所有的.service可以省略

     5.切换级别

    1     systemctl使用举例-2
    2     切换级别:systemctl isolate name.target
    3 
    4     切换到的救援模式(级别):systemctl rescure.tartet   <<< 切换到救援模式不需要用isolate

     6.查看默认级别

    1     查看系统默认的运行级别:systemctl get-default
    2     查看当前系统可用的target:systemctl list-units --type target
    3     修改系统默认运行级别:systemctl set-default name.target

    unit的文件的基本构成

    第一部分:unit,用于记录该unit文件的一些通用信息

    第二部分:service,记录service具体信息(如何启动、配置文件位置...

    第三部分:install,记录安装信息(运行级别)

     1 第一部分:Unit部分
     2     1)Description:对该服务的一个简要说明
     3     2)Before:定义启动顺序,例子:Before=nginx.service,表示该服务需要在nginx启动之前启动
     4     3)After:定义启动顺序,同上
     5     4)Documentation:帮助文档
     6     5)Wants:建议同时启动某服务,比如:Wants=nginx.service 表示系统中最好启动nginx服务,但是即使不启动nginx,当前这个服务也没啥影响
     7     6)Require:当前服务是需要哪个特定的服务的,比如:Require=nginx.service,这就表示当前服务是需要nginx服务,那么在启动当前这个服务的时候,会自动将nginx也启动起来;而且一旦发现nginx服务停止了,那么当前这个服务也就会自动停止
     8     【require无法指定启动次序,需要结合Before After来用,否则经常出现各种问题】
     9     7)Conflicis:当一个服务启动的时候,会立刻停止与之相冲突的服务
    10 
    11 第二部分:Service部分
    12     1)Type:指定service的类型
    13         类型1:oneshot:程序执行完成就自动结束了,没有后台进程,比如执行一个shell
    14         类型2:forking:需要一个后台守护进程一直在运行,比如运行nginx、apache、sshd
    15     2)ExecStart:指定如何启动服务(指定启动服务要执行的命令)
    16         如果服务类型是oneshot类型,那么可以直接写上他要执行命令即可,通常不能添加参数和选项
    17         如果服务类型不是oneshot类型,那么在写要执行的命令的时候,可以添加一些参数,比如指定选项、配置文件、用户
    18         【如果要执行多个命令,那么多个命令之间用;分割,如果需要换行可以用  来续行】
    19     3)ExecStartPre, ExecStartPost:指定在执行启动服务之前、之后要执行什么命令
    20     4)ExecStop:停止服务
    21     5)Restart:
    22     6)PIDFile:指定pid文件的路径
    23 第三部分:install部分
    24     WantedBy:指定运行级别,WantedBy=multi-user.target

    案例:编写unit文件,并注册到systemd服务中

     1     第一步:准备一个shell脚本
     2         # vim /root/name.sh
     3             #!/bin/bash
     4             echo `hostname`>/tmp/name.log
     5 
     6     第二步:创建unit文件
     7         # vim my.service
     8             [Unit]
     9             Description=this is my first unit file
    10 
    11             [Service]
    12             Type=oneshot
    13             ExecStart=/bin/bash /root/name.sh
    14 
    15             [Install]
    16             WantedBy=multi-user.target
    17 
    18 
    19         # mv my.service /usr/lib/systemd/system
    20 
    21     第三步:将我的unit文件注册到systemd中
    22         # systemctl enable my.service
    23 
    24     第四步:查看该服务的状态
    25         # systemctl status my.service

    扩展

    1.grub2的配置文件-/etc/default/grub 

     1     # 指定用户选择菜单超时时间
     2     GRUB_TIMEOUT=5      
     3 
     4     # 指定菜单中的描述名称    
     5     GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
     6 
     7     # GRUB指定哪个是默认的title
     8     # save表示会保存当前的配置,需要结合一个内置变量来使用
     9     GRUB_DEFAULT=saved
    10 
    11     # 禁用子菜单
    12     GRUB_DISABLE_SUBMENU=true
    13 
    14     # 指定将启动过程中的信息输出到终端
    15     GRUB_TERMINAL_OUTPUT="console"
    16 
    17     # 在启动系统的时候,以命令行的方式向内核传递参数
    18     GRUB_CMDLINE_LINUX="crashkernel=auto rhgb "
    19 
    20     # 指定是否显示启动过程信息
    21     GRUB_DISABLE_RECOVERY="true"

    2.定制grub2的配置文件

    1     第一步:备份原有的grub.cfg
    2         # cp /boot/grub2/grub.cfg{,.bak}
    3 
    4     第二步:修改/etc/default/grub 
    5 
    6     第三步:重新生成grub.cfg
    7         # grub2-mkconfig>/boot/grub2/grub.cfg

    3.CentOS7忘记密码解决方法

     1         进入紧急救援模式
     2         进入方式:在启动系统的时候,编辑内核选项,添加 rd.break,然后按ctrl+x
     3         进入救援模式后:
     4             1. 根在 sysroot 下
     5             2. 当前是只读权限
     6 
     7         操作:
     8             # mount -o remount,rw /sysroot
     9             # chroot /sysroot
    10             # passwd 
    11                 xxx
    12                 xxx
    13             # exit
    14             # reboot

    进入救援模式方法

    1 概述

    要使得linux进入救援模式,原则其实就是一个,通过光盘启动模式进入,所以,就要想办法让机器能从光盘启动。

    本文主要模拟了Vmware下的操作。如果是真实机器,操作前将光盘插入机器里即可

    2 CentOS6

    首先在重新开机时当出现下面这个接界面时按esc进入到Boot Menu。(ps:如果是虚拟机,要提前按一下鼠标,按鼠标模式是在虚拟机内操作,不是本地机器的操作,然后,手速要快,在进度条满之前按,只能按一下,按多了也进不去)

    备注:这里如果按F2进入BIOS然后在设置光盘启动项为第一项也是可以,但是不推荐,因为还要改回来,要不然每次都是光盘第一启动,很麻烦

    1240

    上下键选择第三项CD-ROM Drive,光盘启动

    1240

    再选择第三项救援模式

    1240

    选择语言,默认English就行

    1240

    1240

    选择No跳过网口检测

    1240

    点击继续

    1240

    这里提示我们,救援模式下的根目录不是我们以前的根目录,而/mnt.sysimage这个目录才是我没以前的根目录,如果想要变回以前的根目录需要执行chroot /mnt/sysimage命令

    1240

    再一次提示我们根目录的问题

    1240

    这时候选择开启shell进程,这样我们就可以使用命令了。

    1240

    1240

    3 CentOS7

    centOS7进入图一 troubleshooting有两个方法

    方法一

    首先在重新开机时当出现下面这个接界面时按esc进入到Boot Menu。(ps:如果是虚拟机,要提前按一下鼠标,按鼠标模式是在虚拟机内操作,不是本地机器的操作,然后,手速要快,在进度条满之前按,只能按一下,按多了也进不去)

    1240

    上下键选择第三项CD-ROM Drive,光盘启动

    1240

    方法二

    虚拟机开机按F12--》c-->输入exit --》

    以上两个方法都可以进入troubleshooting页面,接下来步骤一样

     图一 选择troubleshooting --> 图二 选择Rescue,等待加载--》选择 选项1,等待一会儿,按enter,就可以进入救援模式

    1240

    图一 选择troubleshooting

    1240

    图二 选择Rescue

    1240

  • 相关阅读:
    Codeforces Gym100502H:Clock Pictures(KMP算法)
    SPOJ MINSUB
    POJ 2796:Feel Good(单调栈)
    搭建(WSTMart)php电商环境时缺少fileinfo函数
    TP微信扫码支付
    tp3.2 支付宝app支付
    tp3.2 支付宝手机网站支付
    Thinkphp3.2+PHPQRCode 二维码生成示例
    百度UEditor粘贴或插入的表格不显示边框的解决办法
    PHP:导出数据到word(包含图片)
  • 原文地址:https://www.cnblogs.com/kenken2018/p/9762823.html
Copyright © 2020-2023  润新知