systemd和systemctl详解-阿里云开发者社区

开发者社区> 技术小美> 正文

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
[root@MT ~]# systemctl disable named
    Removed symlink /etc/systemd/system/multi-user.target.wants/named.service.
[root@MT ~]# 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    

1
2
3
4
5
6
7
8
9
10
11
    *.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://用于模拟之前的运行级别
    运行级别:

1
2
3
4
5
6
7
        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
    [root@MT 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

1
2
3
4
5
    [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)
1
2
3
4
5
6
7
8
9
10
11
12
13
    [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

    
 

1
2
3
4
5
6
7
8
9
   [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的常用选项
  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
      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 //所有具有守护进程的服务,重载
    











本文转自MT_IT51CTO博客,原文链接:http://blog.51cto.com/hmtk520/1981433,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
8431 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
2757 0
阿里云服务器ECS远程登录用户名密码查询方法
阿里云服务器ECS远程连接登录输入用户名和密码,阿里云没有默认密码,如果购买时没设置需要先重置实例密码,Windows用户名是administrator,Linux账号是root,阿小云来详细说下阿里云服务器远程登录连接用户名和密码查询方法
10854 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
10210 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
11828 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
12064 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
8671 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
4537 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
21584 0
+关注
6906
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载