Systemctl 详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Systemctl 详解相关的知识,希望对你有一定的参考价值。

参考技术A

Systemd 并不是一个命令,而是一组命令,涉及到系统管理的方方面面。

systemctl 是 Systemd 的主命令,用于管理系统。

systemd-analyze 命令用于查看启动耗时。

hostnamectl 命令用于查看当前主机的信息。

localectl 命令用于查看本地化设置。

timedatectl 命令用于查看当前时区设置。

loginctl 命令用于查看当前登录的用户。

Systemd 可以管理所有系统资源。不同的资源统称为 Unit(单位)。

Unit 一共分成12种。

systemctl list-units 命令可以查看当前系统的所有 Unit 。

systemctl status 命令用于查看系统状态和单个 Unit 的状态。

除了 status 命令, systemctl 还提供了三个查询状态的简单方法,主要供脚本内部的判断语句使用。

对于用户来说,最常用的是下面这些命令,用于启动和停止 Unit(主要是 service)。

Unit 之间存在依赖关系:A 依赖于 B,就意味着 Systemd 在启动 A 的时候,同时会去启动 B。

systemctl list-dependencies 命令列出一个 Unit 的所有依赖。

上面命令的输出结果之中,有些依赖是 Target 类型(详见下文),默认不会展开显示。如果要展开 Target,就需要使用 --all 参数。

每一个 Unit 都有一个配置文件,告诉 Systemd 怎么启动这个 Unit 。

Systemd 默认从目录 /etc/systemd/system/ 读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录 /usr/lib/systemd/system/ ,真正的配置文件存放在那个目录。

systemctl enable 命令用于在上面两个目录之间,建立符号链接关系。

如果配置文件里面设置了开机启动, systemctl enable 命令相当于激活开机启动。

与之对应的, systemctl disable 命令用于在两个目录之间,撤销符号链接关系,相当于撤销开机启动。

配置文件的后缀名,就是该 Unit 的种类,比如 sshd.socket 。如果省略,Systemd 默认后缀名为 .service ,所以 sshd 会被理解成 sshd.service 。

systemctl list-unit-files 命令用于列出所有配置文件。

这个命令会输出一个列表。

这个列表显示每个配置文件的状态,一共有四种。

注意,从配置文件的状态无法看出,该 Unit 是否正在运行。这必须执行前面提到的 systemctl status 命令。

一旦修改配置文件,就要让 SystemD 重新加载配置文件,然后重新启动,否则修改不会生效。

配置文件就是普通的文本文件,可以用文本编辑器打开。

systemctl cat 命令可以查看配置文件的内容。

从上面的输出可以看到,配置文件分成几个区块。每个区块的第一行,是用方括号表示的区别名,比如 [Unit] 。注意,配置文件的区块名和字段名,都是大小写敏感的。

每个区块内部是一些等号连接的键值对。

注意,键值对的等号两侧不能有空格。

[Unit] 区块通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及配置与其他 Unit 的关系。它的主要字段如下。

[Install] 通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。它的主要字段如下。

[Service] 区块用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。

Unit 配置文件的完整字段清单,请参考 官方文档 。

启动计算机的时候,需要启动大量的 Unit。如果每一次启动,都要一一写明本次启动需要哪些 Unit,显然非常不方便。Systemd 的解决方案就是 Target。

简单说,Target 就是一个 Unit 组,包含许多相关的 Unit 。启动某个 Target 的时候,Systemd 就会启动里面所有的 Unit。从这个意义上说,Target 这个概念类似于"状态点",启动某个 Target 就好比启动到某种状态。

传统的 init 启动模式里面,有 RunLevel 的概念,跟 Target 的作用很类似。不同的是,RunLevel 是互斥的,不可能多个 RunLevel 同时启动,但是多个 Target 可以同时启动。

Target 与 传统 RunLevel 的对应关系如下。

它与 init 进程的主要差别如下。

(1)默认的 RunLevel (在 /etc/inittab 文件设置)现在被默认的 Target 取代,位置是 /etc/systemd/system/default.target ,通常符号链接到 graphical.target (图形界面)或者 multi-user.target (多用户命令行)。

(2)启动脚本的位置 ,以前是 /etc/init.d 目录,符号链接到不同的 RunLevel 目录 (比如 /etc/rc3.d 、 /etc/rc5.d 等),现在则存放在 /lib/systemd/system 和 /etc/systemd/system 目录。

(3)配置文件的位置 ,以前 init 进程的配置文件是 /etc/inittab ,各种服务的配置文件存放在 /etc/sysconfig 目录。现在的配置文件主要存放在 /lib/systemd 目录,在 /etc/systemd 目录里面的修改可以覆盖原始设置。

Systemd 统一管理所有 Unit 的启动日志。带来的好处就是,可以只用 journalctl 一个命令,查看所有日志(内核日志和应用日志)。日志的配置文件是 /etc/systemd/journald.conf 。

journalctl 功能强大,用法非常多。

systemd和systemctl详解

一、Systemd
二、systemctl
三、service的unit文件格式


systemd与systemctl
一、Systemd:
    POST-->Boot sequence(BIOS)-->Boot loader(MBR)-->kernel(ramdisk)-->rootfs(swtich-root)-->/sbin/init
    所有用户空间的进程,都由init负责,当需要调用特权指令的时候,才会切换到内核
init
    CentOS 5:SysV init //真正的bell实验室
    CentOS 6:Upstart //引用ubuntu的二次发行版
    CentOS 7:Systemd //模仿MAC OS的
Systemd的新特性:
    1.系统引导时实现服务并行启动
    2.按需激活进程//开机后进入需要启动的程序,会进入半激活状态,第一次访问的时候会直接执行,
        //例如http会占用80端口,直到有用户访问
    3.系统状态快照 //用户空间,可以回滚到
    4.基于依赖关系定义服务控制逻辑
    
核心概念:unit
    由其相关的配置文件进程标识和识别和配置
    文件中主要包含了系统服务,监听的socket,保存的快照以及其他与init相关的信息
    这些配置文件保存在:
        /usr/lib/systemd/system/    //每一个文件都可以被称为一个unit
        /run/systemd/system
        /etc/systemd/system
[[email protected] ~]# systemctl disable named
    Removed symlink /etc/systemd/system/multi-user.target.wants/named.service.
[[email protected] ~]# systemctl enable named
    Created symlink from /etc/systemd/system/multi-user.target.wants/named.service to /usr/lib/systemd/system/named.service.
    
unit类别:/usr/lib/systemd/system    

    *.service 用于定义系统服务;类似于service start|stop|restart等的脚本,相当于以前的/etc/init.d/*
    *.target  用于模拟实现"运行级别",因为CentOS7默认是没有运行级别的,主要是为了兼容
    *.device 用于定义内核识别的设备,
                //之前是udev根据/sys目录下内核所探测到的输出的信息创建的/dev,
                //CentOS7设备主要由systemd[主打]和udev创建,systemd用于识别硬件 ,基于*.device识别
    *.mount 定义fs挂载点,    
    *.socket 用于标识进程间通信用到的socket文件,由systemd负责
    *.snapshot 管理系统快照
    *.swap 用于标识swap设备,
    *.automount ,fs的自动挂载点设备 //例如U盘自动挂载点
    *.path  用于定义fs中的一个文件或目录,如果不存在,systemd会自动创建

    
    mount中有大量的cgroup//内核进行资源分配,docker主要依赖于namespace和cgroup技术

systemd关键特性:
    基于socket的激活机制;socket与程序分离;//先把socket分配给一个服务,但是该服务先不启动
    基于bus的激活机制,如果总线上有对该服务的请求,就基于总线的方式激活该服务
    基于device的激活机制,当某个设备插入的时候,激活mount unit和automount unit,自动挂载至某挂载点,挂载点不存在,将自动创建。监控内核输出的硬件信息,
    基于path的激活机制,监控某个文件或目录是否存在,激活相应进程
        //例如某进程异常停止,丢下lockfile,systemd会发起进程,提示用户报告bug等
    系统快照,保存个unit的当前状态,到持久存储中,systemd基于unit工作的
        //可以回到过去,异常关机
    向后兼容sysv init的脚本
        /dev/init.d/* 可以受systemd控制
    
    不兼容:
        systemctl的命令是固定不变的;支持的start|stop|restart...等命令是固定的,不能变
        非由systemd启动的服务,systemctl无法与之通信
    管理系统服务:
        CentOS7:service类型的unit文件来实现管理
            兼容:/etc/init.d/*

二、systemctl:控制systemd和service
    systemctl [options...] command [name...]
    
    COMMANDS:
        启动:systemctl start NAME.service ==> service NAME start
        停止:systemctl stop NAME.service ==> service NAME stop
        重启:systemctl restart NAME.service ==> service NAME resatart
        状态:systemctl status NAME.service ==> service NAME status
        条件式重启://如果服务之前是启动的,就重启,否则就算了
            systemctl try-restart NAME.service ===> service NAME conresart
        重载服务或重启服务:systemctl reload-or-restart NAME.service //支持重载就重载,不支持重载,就重启
        重载或条件式重启:systemctl reload-or-try-restart NAME.service
        
        查看某服务当前激活与否的状态:systemctl is-active NAME.service //或者 /etc/systemd/system/multi-user.target.wants/named.service
        查看所有已经激活的服务:systemctl list-units --type service //--type也可以用-t
        查看所有服务(包括未激活的):systemctl list-units -t service -a ==> chkconfig --list  //-a:--all
        
        设置开机自启与关闭:
            systemctl enable|disable NAME.service ===> chkconfig NAME on|off
        查看某服务是否能开机自启:
            chkconfig --list NAME ==> systemctl is-enabled NAME.service
        禁止/关闭 设置某服务开机自启
            systemctl mask NAME.service
            systemctl unmask NAME.service
        查看服务的依赖关系
            systemctl list-dependencies httpd.service
        
    systemctl status httpd.service
        loaded:loaded ( ......  ; disabled ) //loaded:表示unit文件已经被systemctl装载了,受systemctl管理
                                            //disabled:表示没有开机启动
        Active: inactive(dead) //状态为停止
管理target units://用于模拟之前的运行级别
    运行级别:

        0 ==> runlevel0.target,poweroff.target
        1 ==> runlevel1.target,rescue.target
        2 ==> runlevel2.target,multi-user
        3 ==> runlevel3.target,multi-user
        4 ==> runlevel4.target,multi-user
        5 ==> runlevel5.target,graphical.target
        6 ==> runlevel6.target,reboot.target

    systemd poweroff|reboot
    systemd rescue|multi-user    
    
    级别切换:
        init # | systemctl isolate NAME.target
    查看级别:
        runlevel,who -r ==> systemctl list-units -t target
                        ==> systemctl list-units -t target -a ///查看所有级别
    获取默认运行级别
        systemctl get-default
        systemctl set-default NMAE.target
        
        cat /etc/inittab //CentOS6针对该配置文件
    切换至紧急救援模式:systemctl rescue //CentOS6的话会执行/etc/rc.d/rc.sysinit
    切换到emergency模式 不会执行/etc/rc.d/rc.sysinit ,额外驱动都不会被装载
            systemctl emergency
其他常用命令
    关机:systemctl halt|poweroff
    重启:systemctl reboot
    挂起:systemctl suspend
    快照:systemctl hibernate //hibernate:
    快照并挂起:sytemctl hybrid-sleep //混合睡眠

三、service的unit文件格式
    ls /etc/systemd/system/default.target -l //链接到 /usr/lib/sytemd/system/multi-user.target
    [[email protected] system]#  systemctl set-default graphical.target
        Removed symlink /etc/systemd/system/default.target.        ///删除etc下的default的链接,然后换位graphical.target
        Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/graphical.target.
    
配置文件:
    /etc/systemd/system
    /run/systemd/system
    /usr/lib/sytemd/system
    
cat /usr/lib/systemd/system/httpd.service

    [Unit] //定义与Unit类型相关的通用选项;用于提供unit的描述信息,unit行为及依赖关系等
    Description=The Apache HTTP Server  //描述信息
    After=network.target remote-fs.target nss-lookup.target //依赖关系
    Documentation=man:httpd(8)
    Documentation=man:apachectl(8)
    [Service]    //unit类型,Service|Target|Mount|...,与特定类型相关的专用选项,此处为service类型
    Type=notify    
    EnvironmentFile=/etc/sysconfig/httpd
    ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
    ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
    ExecStop=/bin/kill -WINCH ${MAINPID}
    # We want systemd to give httpd some time to finish gracefully, but still w
    ant# it to kill httpd after TimeoutStopSec if something went wrong during the
    # graceful stop. Normally, Systemd sends SIGTERM signal right after the
    # ExecStop, which would kill httpd. We are sending useless SIGCONT here to 
    give# httpd time to finish.
    KillSignal=SIGCONT
    PrivateTmp=true

    
 

   [Install]    //定义由systemctl enable或systemctl disable命令再实现服务是否能够开机启用或禁用的选项
    WantedBy=multi-user.target    
+++++++++++++++++++++++++++++++++++++++++++++++++++++++        
    Unit段的常用选项
        Description:描述信息,意义性描述
        After:unit的启动次序,隐含有依赖关系,当前unit应该晚于哪些unit启动,其功能与before相反
        Requirts:强依赖:依赖到的其他units,必须有的依赖于其他unit启动
        Wants:弱依赖:依赖到的其他unit,可有可无的依赖于其他unit
        Conflicts:冲突,定义units之间的冲突关系

    Service的常用选项
  

      Type:定义影响ExecStart及相关参数的功能与unit进程启动的类型
            类型 //一个服务启动的进程,有主进程和子进程之分
                simple:默认,ExecStart启动的进程为主进程
                forking: 由ExecStart生成的一个子进程将成为主进程
                        //可能会生成很多子进程,但是之后一个是主进程
                        //选定主进程后,父进程会退出
                oneshot: //一锤定音,在后续的unit启动之前,该进程会退出,类似于simple
                dbus://类似于simple,后续的进程在得到dbus名称之后,才能启动
                notify://类似于simple,获取到notify通知后,才运行该命令
                idle: //类似于simple,
        EnvironmentFile 环境配置文件,加载环境变量,或者变量
        ExecStart //指明启动该unit要运行的命令或脚本;ExecStartPre,ExecStartPost        
        ExecReload 
        ExecStop  //指明停止unit要运行的命令或者脚本
        KillSignal
        PrivateTmp
        Restart: //进程关闭后,会自动重启

    Install的常用选项
        Alias:
        RequiredBy:被那些units所依赖
        WantedBy:被那些units所依赖
            
注意:对于新创建的unit文件,或者修改了的unit文件
    要通知sysemd 重载此配置文件
    systemctl daemon-reload //所有具有守护进程的服务,重载
   

本文出自 “黑马腾空” 博客,请务必保留此出处http://hmtk520.blog.51cto.com/12595610/1981433

以上是关于Systemctl 详解的主要内容,如果未能解决你的问题,请参考以下文章

systemctl 命令详解及使用教程

Linux systemctl 详解&自定义 systemd unit

Systemctl 详解

13个systemd与systemctl命令详解(linux)

红冒系列-Systemctl命令详解说明

Centos7中systemctl命令详解