1. 程式人生 > >systemd和systemctl詳解

systemd和systemctl詳解

systemd systemctl centos7

一、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

    *.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
[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

    [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

systemd和systemctl詳解