CentOS7/RHEL7 systemd詳解html
目錄
1. 爲何是systemd
(1) 關於Linux服務管理
(2) SysV init的優缺點
(3) UpStart的改進
(4) systemd的誕生
(5)爲何systemd能作到啓動很快
2. SysV init介紹
(1) 什麼是SystemV
(2)SysV init的運行級別
(3)SysV init運行順序
(4)SysV init和系統關閉
(5)SysV init的管理和控制功能
3. systemd的特性
(1)systemd解決了那些問題?
(2)systemd的爭議在哪裏?
(3)systemd能更完全的結束服務進程
4. CentOS 7的systemd特性
(1)套接字服務保持激活功能
(2)進程間通信保持激活功能
(3)設備保持激活功能
(4)文件路徑保持激活功能
(5)系統狀態快照
(6)掛載和自動掛載點管理
(7)閃電並行啓動
(8)單元邏輯模擬檢查
(9)和SysV init向後兼容
5. 如何分析衡量systemd啓動速度
(1)查看詳細的每一個服務消耗的啓動時間
(2)查看嚴重消耗時間的服務樹狀表
(3)打印分析圖及其餘命令
6. CentOS 7的systemd向後兼容
(1)systemd對運行級別支持有限。
(2)systemd不支持像init腳本那樣的個性化命令。
(3)systemd不支持和沒有從systemd啓動的服務通信。
(4)systemd能夠只中止運行的服務
(5)不能從標準輸出設備讀到系統服務信息。
(6)systemd不繼承任何上下文環境。
(7)SysV init腳本依賴性
(8)超時機制
7. systemd服務管理
(1) 什麼是單元
(2)systemd的服務管理
(3)服務詳細信息查看
8. 使用systemd target
(1)怎樣知道一個目標須要哪些進程服務?
(2)target與運行級別
(3)target管理
9. 關閉、暫停、休眠系統
10. 經過systemd管理遠程系統
11. 建立和修改systemd單元文件
(1)單元文件概述
(2)理解單元文件結構
(3)建立自定義的單元文件
(4)建立emacs.service例子:
(5)建立第二個sshd服務的例子
(6)修改已經存在的單元文件
(7)擴展默認單元配置文件配置
12. 單元實例化
13. VNC SERVER配置
1.爲何是systemdlinux
(1) 關於Linux服務管理shell
Linux系統從啓動到提供服務的過程是這樣,先是機器加電,而後經過MBR或者UEFI加載GRUB,再啓動內核,內核啓動服務,而後開始對外服務。
SysV init UpStart systemd主要是解決服務引導管理的問題。
提示:關於systemd的拼寫,官方的說法就是systemd,既不是Syetemd,也是不systemD。api
(2) SysV init的優缺點瀏覽器
SysV init是最先的解決方案,依靠劃分不一樣的運行級別,啓動不一樣的服務集,服務依靠腳本控制,而且是順序執行的。
SysV init方案的優勢是:
原理簡單,易於理解;
依靠shell腳本控制,編寫服務腳本門檻比較低。
缺點是:
服務順序啓動,啓動過程比較慢;
不能作到根據須要來啓動服務,好比一般但願插入U盤的時候,再啓動USB控制的服務,這樣能夠更好的節省系統資源。緩存
(3) UpStart的改進安全
爲了解決系統服務的即插即用,UpStart應運而生,在CentOS6系統中,SysV init和UpStart是並存的,UpStart主要解決了服務的即插即用。服務順序啓動慢的問題,UpStart的解決辦法是把相關的服務分組,組內的服務是順序啓動,組之間是並行啓動。bash
(4) systemd的誕生服務器
SysV init服務啓動慢,在之前並非一個問題,尤爲是Linux系統之前主要是在服務器系統上,常年也可貴重啓一次。有的服務器光硬件檢測都須要5分鐘以上,相對來講系統啓動已經很快了。
可是隨着移動互聯網的到來,SysV init服務啓動慢的問題顯得愈來愈突出,許多移動設備都是基於Linux內核,好比安卓。移動設備啓動比較頻繁,每次啓動都要等待服務順序啓動,顯然難以接受,systemd就是爲了解決這個問題誕生的。
systemd的設計思路是:
儘量的快速啓動服務;
儘量的減小系統資源佔用。網絡
(5)爲何systemd能作到啓動很快
systemd使用並行的方法啓動服務,不像SysV init是順序執行的,因此大大節省了系統啓動時間。
使用並行啓動,最大的難點是要解決服務之間的依賴性,systemd的解決辦法是使用相似緩衝池的辦法。好比對TCP有依賴的服務,在啓動的時候會檢查依賴服務的TCP端口,systemd會把對TCP端口的請求先緩存起來,當依賴的服務器啓動以後,在將請求傳遞給服務,使兩個服務通信。一樣的進程間通信的D-BUS也是這樣的原理,目錄掛載則是先讓服務覺得目錄被掛載了,到真正訪問目錄的時候,纔去真正操做。
2.SysV init介紹
SysV init是systemV風格的init系統,顧名思義,它源於SystemV系列UNIX。它提供了比BSD風格init系統更高的靈活性。是已經風行了幾十年的UNIX init系統,一直被各種Linux發行版所採用。
(1) 什麼是SystemV
SystemV,曾經也被稱爲AT&T SystemV,是Unix操做系統衆多版本中的一支。它最初由AT&T開發,在1983年第一次發佈。一共發行了4個SystemV的主要版本:版本一、二、3和4。SystemV Release4,或者稱爲SVR4,是最成功的版本,成爲一些UNIX共同特性的源頭,例如」SysV初始化腳本「(/etc/init.d),用來控制系統啓動和關閉,SystemV Interface Definition(SVID)是一個SystemV如何工做的標準定義。
(2)SysV init的運行級別
SysV init用術語runlevel來定義"預訂的運行模式"。SysV init檢查'/etc/inittab'文件中是否含有'initdefault'項。來告訴init系統是否有一個默認運行模式。若是沒有默認的運行模式,那麼用戶將進入系統控制檯,手動決定進入何種運行模式。
SysV init中運行模式描述了系統各類預訂的運行模式。一般會有8種運行模式,即運行模式0到6和S或者s。
每種Linux發行版對運行模式的定義都不太同樣。但0,1,6卻獲得了你們的一致贊同:
0關機
1單用戶模式
6重啓
一般在/etc/inittab文件中定義了各類運行模式的工做範圍。好比RedHat定義了runlevel3和5。運行模式3將系統初始化爲字符界面的shell模式;運行模式5將系統初始化爲GUI模式。不管是命令行界面仍是GUI,運行模式3和5相對於其餘運行模式而言都是完整的正式的運行狀態,計算機能夠完成用戶須要的任務。而模式1,S等每每用於系統故障以後的排錯和恢復。
很顯然,這些不一樣的運行模式下系統須要初始化運行的進程,須要進行的初始化準備都是不一樣的。好比運行模式3不須要啓動X系統。用戶只須要指定須要進入哪一種模式,SysV init負責執行全部該模式所必須的初始化工做。
(3)SysV init運行順序
SysV init巧妙地用腳本,文件命名規則和軟連接來實現不一樣的runlevel。首先,SysV init須要讀取/etc/inittab文件。分析這個文件的內容,它得到如下一些配置信息:
系統須要進入的runlevel;
捕獲組合鍵的定義;
定義電源fail/restore腳本;
啓動getty和虛擬控制檯;
獲得配置信息後,SysV init順序地執行如下這些步驟,從而將系統初始化爲預訂的runlevelX:
/etc/rc.d/rc.sysinit
/etc/rc.d/rc和/etc/rc.d/rcX.d/(X表明運行級別0-6)
/etc/rc.d/rc.local
XDisplayManager(若是須要的話)
1)rc.sysinit腳本功能
首先,運行rc.sysinit以便執行一些重要的系統初始化任務。在RedHat公司的RHEL5中(RHEL6已經使用UpStart了),rc.sysinit主要完成如下這些工做:
激活udev和selinux;
設置定義在/etc/sysctl.conf中的內核參數;
設置系統時鐘;
加載keymaps;
激活交換分區;
設置主機名(hostname);
根分區檢查和remount;
激活RAID和LVM設備;
開啓磁盤配額;
檢查並掛載全部文件系統;
清除過時的locks和PID文件;
2)rc.d腳本
完成了以上這些工做以後,SysV init開始運行/etc/rc.d/rc腳本。根據不一樣的runlevel,rc腳本將打開對應runlevel的rcX.d目錄(X就是runlevel),找到並運行存放在該目錄下的全部啓動腳本。每一個runlevelX都有一個這樣的目錄,目錄名爲/etc/rc.d/rcX.d。
在這些目錄下存放着不少不一樣的腳本。文件名以S開頭的腳本就是啓動時應該運行的腳本,S後面跟的數字定義了這些腳本的執行順序。在/etc/rc.d/rcX.d目錄下的腳本其實都是一些軟連接文件,真實的腳本文件存放在/etc/init.d目錄下。以下所示:
rc5.d目錄下的腳本
[root@www~]#ll/etc/rc5.d/ lrwxrwxrwx1rootroot16Sep42008K02dhcdbd->../init.d/dhcdbd ....(中間省略).... lrwxrwxrwx1rootroot14Sep42008K91capi->../init.d/capi lrwxrwxrwx1rootroot23Sep42008S00microcode_ctl->../init.d/microcode_ctl lrwxrwxrwx1rootroot22Sep42008S02lvm2-monitor->../init.d/lvm2-monitor ....(中間省略).... lrwxrwxrwx1rootroot17Sep42008S10network->../init.d/network ....(中間省略).... lrwxrwxrwx1rootroot11Sep42008S99local->../rc.local lrwxrwxrwx1rootroot16Sep42008S99smartd->../init.d/smartd ....(底下省略)....
當全部的初始化腳本執行完畢。SysV init運行/etc/rc.d/rc.local腳本。
rc.local是Linux留給用戶進行個性化設置的地方。能夠把本身私人想設置和啓動的東西放到這裏,一臺LinuxServer的用戶通常不止一個,因此纔有這樣的考慮。
(4)SysV init和系統關閉
SysV init不只須要負責初始化系統,還須要負責關閉系統。在系統關閉時,爲了保證數據的一致性,須要當心地按順序進行結束和清理工做。
好比應該先中止對文件系統有讀寫操做的服務,而後再umount文件系統。不然數據就會丟失。
這種順序的控制這也是依靠/etc/rc.d/rcX.d/目錄下全部腳本的命名規則來控制的,在該目錄下全部以K開頭的腳本都將在關閉系統時調用,字母K以後的數字定義了它們的執行順序。
這些腳本負責安全地中止服務或者其餘的關閉工做。
(5)SysV init的管理和控制功能
此外,在系統啓動以後,管理員還須要對已經啓動的進程進行管理和控制。SysV init軟件包包含了一系列的控制啓動,運行和關閉全部其餘程序的工具。
halt中止系統。
init就是SysV init自己的init進程實體,以pid1身份運行,是全部用戶進程的父進程。最主要的做用是在啓動過程當中使用/etc/inittab文件建立進程。
killall5就是System V的killall命令。向除本身的會話(session)進程以外的其它進程發出信號,因此不能殺死當前使用的shell。
last回溯/var/log/wtmp文件(或者-f選項指定的文件),顯示自從這個文件創建以來,全部用戶的登陸狀況。
lastb做用和last差很少,默認狀況下使用/var/log/btmp文件,顯示全部失敗登陸企圖。
mesg控制其它用戶對用戶終端的訪問。
pidof找出程序的進程識別號(pid),輸出到標準輸出設備。
poweroff等於shutdown-h–p,或者telinit0。關閉系統並切斷電源。
reboot等於shutdown–r或者telinit6。重啓系統。
runlevel讀取系統的登陸記錄文件(通常是/var/run/utmp)把之前和當前的系統運行級輸出到標準輸出設備。
shutdown以一種安全的方式終止系統,全部正在登陸的用戶都會收到系統將要終止通知,而且不許新的登陸。
sulogin當系統進入單用戶模式時,被init調用。當接收到啓動加載程序傳遞的-b選項時,init也會調用sulogin。
telinit實際是init的一個鏈接,用來向init傳送單字符參數和信號。
utmpdump以一種用戶友好的格式向標準輸出設備顯示/var/run/utmp文件的內容。
wall向全部有信息權限的登陸用戶發送消息。
不一樣的Linux發行版在這些SysV init的基本工具基礎上又開發了一些輔助工具用來簡化init系統的管理工做。好比RedHat的RHEL在SysV init的基礎上開發了initscripts軟件包,包含了大量的啓動腳本(如rc.sysinit),還提供了service,chkconfig等命令行工具,甚至一套圖形化界面來管理init系統。其餘的Linux發行版也有各自的initscript或其餘名字的init軟件包來簡化SysV init的管理。
只要理解了SysV init的機制,在一個最簡的僅有SysV init的系統下,能夠直接調用腳本啓動和中止服務,手動建立inittab和建立軟鏈接來完成這些任務。所以理解SysV init的基本原理和命令是最重要的。甚至也能夠開發本身的一套管理工具。
3.systemd的特性
(1)systemd解決了那些問題?
按需啓動服務,減小系統資源消耗;
儘量並行啓動進程,減小系統啓動等待時間;
提供一個一致的配置環境,不光是服務配置;
提供服務狀態快照,能夠恢復特定點的服務狀態。
(2)systemd的爭議在哪裏?
systemd試圖提供一個一致的配置環境,請注意不光是服務配置,還包括其餘方面的系統配置,這個也是systemd的野心,但願能把Linux系統上的配置統一塊兒來,爲了達到這個目標,systemd犧牲掉了SysV init和BSD系統的兼容性。systemd充分利用了Linux內核API,不在支持BSD系統,這個是systemd目前在開源社區最大的爭論。
我的人爲這個是個好事情,對管理員來說,不再用學習不一樣發行版上不一樣的配置,也不用爲了寫一個腳本,先去寫一堆判斷,判斷不一樣的髮型版。運維自動化的前提是標準化,只有標準化了,才能自動化,systemd朝這個方向走了一大步。即便systemd的學習成本比較高。
(3)systemd能更完全的結束服務進程
服務(daemon)進程,爲了成爲服務,會fork兩次,因此進程編號會發生變化,UpStart在結束進程的時候,有可能會找錯進程編號,形成服務永遠不被中止。
還有更特殊的狀況,若是進程產生了子進程,子進程又本身fork了兩次,脫離了主進程,要結束這樣的子進程,UpStart的辦法是經過strace追蹤fork,exit調用,這種方法很是複雜。
systemd利用了內核最新的特性,使用CGroup解決這個問題,CGroup的進程是樹狀的,所以不管服務如何啓動新的子進程,全部的這些相關進程都會屬於同一個CGroup,systemd只須要簡單地遍歷指定的CGroup便可正確地找到全部的相關進程,將它們一一中止便可。
4.CentOS 7的systemd特性
(1)套接字服務保持激活功能
在系統啓動的時候,systemd爲全部支持套接字激活功能的服務建立監聽端口,當服務啓動後,就將套接字傳給這些服務。這種方式不只能夠容許服務在啓動的時候平行啓動,也能夠保證在服務重啓期間,試圖鏈接服務的請求,不會丟失。對服務端口的請求被保留,而且存放到隊列中。
(2)進程間通信保持激活功能
當有客戶端應用第一次經過D-Bus方式請求進程間通信時,systemd會當即啓動對應的服務。systemd依據D-Bus的配置文件使用進程間通信保持激活功能。
(3)設備保持激活功能
當特定的硬件插入時,systemd啓動對應的硬件服務支持。systemd依據硬件服務單元配置文件保持硬件隨時被激活。
(4)文件路徑保持激活功能
當特定的文件或者路徑狀態發生改變的時候,systemd會激活對應的服務。systemd依據路徑服務單元配置文件保證服務被激活。
(5)系統狀態快照
systemd能夠臨時保存當前全部的單元配置文件,或者從前一個快照中恢復單元配置文件。爲了保存當前系統服務狀態,systemd能夠動態的生成單元文件快照。
(6)掛載和自動掛載點管理
systemd監控和管理掛載和自動掛載點,並根據掛載點的單元配置文件進行掛載。
(7)閃電並行啓動
由於使用套接字保持激活功能,systemd能夠並行的啓動因此套接字監聽服務,大大減小系統啓動時間。
(8)單元邏輯模擬檢查
當激活或者關閉一個單元,systemd會計算依賴行,產生一個臨時的模擬檢查,而且校驗一直性。若是不一致,systemd會嘗試自動修正,而且移除報錯的不重要的任務。
(9)和SysV init向後兼容
systemd徹底支持SysV initLinux標準的基礎核心規範腳本,這樣的腳本易於升級到systemd服務單元。
5.如何分析衡量systemd啓動速度
systemd-analyze是一個分析啓動性能的工具,用於分析啓動時服務時間消耗。默認顯示啓動是內核和用戶空間的消耗時間:
[root@localhost~]#systemd-analyze Startupfinishedin818ms(kernel)+6.240s(initrd)+32.979s(userspace)=40.038s
和使用systemd-analyzetime命令的效果同樣。
(1)查看詳細的每一個服務消耗的啓動時間
經過systemd-analyzeblame命令查看詳細的每一個服務消耗的啓動時間:
[root@localhost~]#systemd-analyzeblame 30.852siscsi.service 16.994skdump.service 10.871sboot.mount ... 103mssystemd-sysctl.service 101msdatapool.mount
(2)查看嚴重消耗時間的服務樹狀表
systemd-analyzecritical-chain命令打印嚴重消耗時間的服務樹狀表,按照啓動消耗的時間進行排序,時間消耗越多,越排到前面。@以後是服務激活或者啓動的時間,+號以後是服務啓動消耗的時間。我的理解@是從系統引導到服務啓動起來的時間,是一個相對時間消耗,+是服務啓動消耗的時間,是一個絕對時間消耗。
[root@localhost~]#systemd-analyzecritical-chain Thetimeaftertheunitisactiveorstartedisprintedafterthe"@"character. Thetimetheunittakestostartisprintedafterthe"+"character. multi-user.target@32.976s └─kdump.service@15.981s+16.994s └─network.target@15.980s └─NetworkManager.service@15.069s+54ms └─firewalld.service@14.532s+535ms └─basic.target@14.532s └─sockets.target@14.532s └─dbus.socket@14.532s └─sysinit.target@14.527s └─systemd-update-utmp.service@14.524s+2ms └─systemd-tmpfiles-setup.service@14.456s+67ms └─local-fs.target@14.447s └─boot.mount@3.575s+10.871s └─systemd-fsck@dev-disk-by\x2duuid-8c77568b\x2d7e51\x2d4e32\x2dbbdf\x2ddc12ff737bbf.service@3.348s+226ms └─systemd-fsck-root.service@1.237s+152ms └─systemd-readahead-replay.service@1.073s+25ms
(3)打印分析圖及其餘命令
systemd-analyzeplot打印一個svg格式的服務消耗時間表,經過瀏覽器能夠以圖形的方式展現,很是直觀:
[root@localhost~]#systemd-analyzeplot>plot.svg
其餘參數:
systemd-analyzedot用分隔符產生當前服務
systemd-analyzedump以友好方式顯示當前服務狀態
6systemd文件類型及存放位置
systemd配置文件被稱爲unit單元,根據類型不一樣,以不一樣的擴展名結尾。
.service系統服務;
.target一組系統服務;
.automount自動掛載點;
.device能被內核識別的設備;
.mount掛載點;
.path文件系統的文件或者目錄;
.scope外部建立的進程;
.slice一組分層次管理的系統進程;
.snapshot系統服務狀態管理;
.socket進程間通信套接字;
.swap定義swap文件或者設備;
.timer定義定時器。
6.CentOS 7的systemd向後兼容
systemd被設計成儘量向後兼容SysV init和Upstart,下面是一些特別要注意的和以前主要版本的RHEL再也不兼容的部分。
(1)systemd對運行級別支持有限。
爲了保存兼容,systemd提供必定數量的target單元,能夠直接和運行級別對應,也能夠被早期的分佈式的運行級別命令支持。不是全部的target均可以被映射到運行級別,在這種狀況下,使用runlevel命令有可能會返回一個爲N的不知道的運行級別,因此推薦儘可能避免在RHEL7中使用runlevel命令。
(2)systemd不支持像init腳本那樣的個性化命令。
除了一些標準命令參數例如:start、stop、status,SysV init腳本能夠根據須要支持想要的任何參數,經過參數提供附加的功能,由於SysV init的服務器腳本實際上就是shell腳本,命令參數實際上就是shell子函數。舉個例子,RHEL6的iptables服務腳本能夠執行panic命令行參數,這個參數可讓系統當即進入緊急模式,丟棄全部的進入和發出的數據包。可是相似這樣的命令行參數在systemd中是不支持的,systemd只支持在配置文件中指定命令行參數。
(3)systemd不支持和沒有從systemd啓動的服務通信。
當systemd啓動服務的時候,他保存進程的主ID以便於追蹤,systemctl工具使用進程PID查詢和管理服務。相反的,若是用戶從命令行啓動特定的服務,systemctl命令是沒有辦法判斷這個服務的狀態是啓動仍是運行的。
(4)systemd能夠只中止運行的服務
在RHEL6及以前的版本,當關閉系統的程序啓動以後,RHEL6的系統會執行/etc/rc0.d/下全部服務腳本的關閉操做,無論服務是處於運行或者根本沒有運行的狀態。而systemd能夠作到只關閉在運行的服務,這樣能夠大大節省關機的時間。
(5)不能從標準輸出設備讀到系統服務信息。
systemd啓動服務的時候,將標準輸出信息定向到/dev/null,以避免打擾用戶。
(6)systemd不繼承任何上下文環境。
systemd不繼承任何上下文環境,如用戶或者會話的HOME或者PATH的環境變量。每一個服務獲得的是乾淨的上下文環境。
(7)SysV init腳本依賴性
當systemd啓動SysV init腳本,systemd在運行的時候,從LinuxStandardBase(LSB)Linux標準庫頭文件讀取服務的依賴信息並繼承。
(8)超時機制
爲了防止系統被卡住,全部的服務有5分鐘的超時機制。
7.systemd服務管理
(1) 什麼是單元
在RHEL7以前,服務管理是分佈式的被SysV init或UpStart經過/etc/rc.d/init.d下的腳本管理。這些腳本是經典的Bash腳本,容許管理員控制服務的狀態。在RHEL7中,這些腳本被服務單元文件替換。
在systemd中,服務、掛載等資源統一被稱爲單元,因此systemd中有許多單元類型,服務單元文件的擴展名是.service,同腳本的功能類似。例若有查看、啓動、中止、重啓、啓用或者禁止服務的參數。
systemd單元文件放置位置:
/usr/lib/systemd/system/systemd默認單元文件安裝目錄
/run/systemd/systemsystemdsystemd單元運行時建立,這個目錄優先於按照目錄
/etc/systemd/system系統管理員建立和管理的單元目錄,優先級最高。
(2)systemd的服務管理
使用systemcl命令能夠控制服務,service命令和chkconfig命令依然可使用,可是主要是出於兼容的緣由,應該儘可能避免使用。
使用systemctl命令的時候,服務名字的擴展名能夠寫全,例如:
systemctl stop bluuetooth.service
也能夠忽略,例如:
systemctl stop bluetooth
systemctl經常使用命令:
啓動服務 systemctl start name.service
關閉服務 systemctl stop name.service
重啓服務 systemctl restar tname.service
僅當服務運行的時候,重啓服務 systemctl try-restart name.service
從新加載服務配置文件 systemctl relaod name.service
檢查服務運做狀態 systemctl status name.service 或者 systemctl is-active\ name.service
展現全部服務狀態詳細信息 systemctl list-units--type service --all
容許服務開機啓動 systemctl enable name.service
禁止服務開機啓動 systemclt disable name.service
檢查服務開機啓動狀態 systemctl status name.service 或者systemctl\
is-enabled name.service
列出全部服務而且檢查是否開機啓動 systemctl list-unit-files --type service
(3)服務詳細信息查看
使用以下命令列出服務:
systemctl list-units --type service
默認只列出處於激活狀態的服務,若是但願看到全部的服務,使用--all或-a參數:
systemctl list-units--type service --all
有時候但願看到因此能夠設置開機啓動的服務,使用以下命令:
systemctl list-unit-files --type service
查看服務詳細信息,使用以下命令:
systemctl status name.service
服務信息關鍵詞解釋
Loaded服務已經被加載,顯示單元文件絕對路徑,標誌單元文件可用。
Active服務已經被運行,而且有啓動時間信息。
Main PID與進程名字一致的PID,主進程PID。
Status服務的附件信息。
Process相關進程的附件信息。
CGroup進程的CGroup信息。
8.使用systemd target
(1)怎樣知道一個目標須要哪些進程服務?
例如,可能想搞明白目標單元multi-user.target究竟啓用了哪些服務,使用如下命令:
$systemctlshow-p"Wants"multi-user.target Wants=rc-local.serviceavahi-daemon.servicerpcbind.serviceNetworkManager.serviceacpid.servicedbus.serviceatd.servicecrond.serviceauditd.servicentpd.serviceudisks.servicebluetooth.serviceorg.cups.cupsd.servicewpa_supplicant.servicegetty.targetmodem-manager.serviceportreserve.serviceabrtd.serviceyum-updatesd.serviceupowerd.servicetest-first.servicepcscd.servicersyslog.servicehaldaemon.serviceremote-fs.targetplymouth-quit.servicesystemd-update-utmp-runlevel.servicesendmail.servicelvm2-monitor.servicecpuspeed.serviceudev-post.servicemdmonitor.serviceiscsid.servicelivesys.servicelivesys-late.serviceirqbalance.serviceiscsi.service
除了Wants,還能夠查看各類形式的依賴和被依賴信息:WantedBy、Requires、RequiredBy、Conflicts、ConflictedBy、Before、After。
(2)target與運行級別
在RHEL7以前的版本,使用運行級別表明特定的操做模式。運行級別被定義爲七個級別,用數字0到6表示,每一個級別能夠啓動特定的一些服務。RHEL7使用target替換運行基本。
systemd target使用target單元文件描述,target單位文件擴展名是.target,target單元文件的惟一目標是將其餘systemd單元文件經過一連串的依賴關係組織在一塊兒。舉個例子,graphical.target單元,用於啓動一個圖形會話,systemd會啓動像GNOME顯示管理(gdm.service)、賬號服務(axxounts-daemon)這樣的服務,而且會激活multi-user.target單元。類似的multi-user.target單元,會啓動必不可少的NetworkManager.service、dbus.service服務,並激活basic.target單元。
RHEL7預約義了一些target和以前的運行級別或多或少有些不一樣。爲了兼容,systemd也提供一些target映射爲SysV init的運行級別,具體的對應信息以下:
0runlevel0.target,poweroff.target關閉系統。
1runlevel1.target,rescue.target進入救援模式。
2runlevel2.target,multi-user.target進入非圖形界面的多用戶方式。
3runlevel3.target,multi-user.target進入非圖形界面的多用戶方式。
4runlevel4.target,multi-user.target進入非圖形界面的多用戶方式。
5runlevel5.target,graphical.target進入圖形界面的多用戶方式。
6runlevel6.target,reboot.target重啓系統。
(3)target管理
1)使用以下命令查看目前可用的target:
systemctl list-units --type target
改變當前的運行基本使用以下命令:
systemctl isolate name.target
2)修改默認的運行級別
使用systemctl get-default命令獲得默認的運行級別:
[root@localhost~]#systemctlget-default multi-user.target
使用systemctl set-default name.target修改默認的運行基本
[root@localhost~]#systemctlset-defaultgraphical.target rm'/etc/systemd/system/default.target' ln-s'/usr/lib/systemd/system/graphical.target''/etc/systemd/system/default.target'
3)救援模式和緊急模式
使用systemctl rescue進入救援模式,若是連救援模式都進入不了,能夠進入緊急模式:
systtmctl emergency
緊急模式進入作小的系統環境,以便於修復系統。緊急模式根目錄以只讀方式掛載,不激活網絡,只啓動不多的服務,進入緊急模式須要root密碼。
9.關閉、暫停、休眠系統
RHEL7中,使用systemctl替換一些列的電源管理命令,原有的命令依舊可使用,可是建議儘可能不用使用。systemctl和這些命令的對應關係爲:
hatl,systemctl halt中止系統
poweroff,systemctl poweroff關閉系統,關閉系統電源。
reboot,systemctl reboot重啓系統
pm-suspend,systemctl suspend暫停系統
pm-hibernate,systemct lhibernate休眠系統
pm-suspend-hybrid,systemctl hybrid-sleep暫停並休眠系統
10.經過systemd管理遠程系統
不光是能夠管理本地系統,systemd還能夠控制遠程系統,管理遠程系統主要是經過SSH協議,只有確承認以鏈接遠程系統的SSH,在systemctl命令後面添加-H或者--host參數,加上遠程系統的ip或者主機名就能夠。
11.建立和修改systemd單元文件
(1)單元文件概述
單元文件包含單元的指令和行爲信息。在後臺systemctl命令和單元文件一塊兒工做。爲了出色而正確的完成工做,系統管理員必須可以手工編輯單元文件。通常系統管理員手工建立的單元文件建議存放在/etc/systemd/system/目錄下面。
單元配置文件的格式是:
unit_name.type_extension
這裏的unit_name表明單元名稱,type_extension表明單元類型。
單元文件能夠做爲附加的文件放置到一個目錄下面,好比爲了定製sshd.service服務,能夠建立sshd.service.d/custom.conf文件,在文件中作一些自定義的配置。
一樣的,能夠建立sshd.service.wants/和sshd.service.requires/目錄。這些目錄包含sshd服務關聯服務的軟鏈接,在系統安裝的時候,這些軟鏈接或自動建立,也能夠手工建立軟鏈接。
許多單元配置文件可使用單元說明符--通配的字符串,能夠在單元文件被引導的時候動態的被變量替換。這使建立一些通用的單元配置模版成爲可能。
(2)理解單元文件結構
典型的單元文件包含三節:
[Unit]節,包含不依賴單元類型的通常選項,這些選型提供單元描述,知道單元行爲,配置單元和其餘單元的依賴性。
[unittype]節,若是單元有特定的類型指令,在unittype節這些指令被組織在一塊兒。舉個例子,服務單元文件包含[Service]節,裏面有常用的服務配置。
[Install]節,包含systemctlenable或者disable的命令安裝信息。
1)[Unit]節選項
Description單元描述信息,這些文字信息在systemclstatus命令是會輸出。
Documentation單元文檔信息的URLs。
After定義在那些單元以後啓動,本單元只在制定的單元啓動以後啓動,不像Requires選項,After選項不明確激活特定的單元,Before選項則是有相反的功能。
Requires配置單元的依賴性,在Requires選項中的單元須要一塊兒被激活,若是有一個單元啓動失敗,其餘單元都不會被啓動。
Wants比Requires選項依賴性要弱不少,若是列表之中的的單元啓動失敗,不會對其餘單元形成影響,這是推薦的創建自定義單元依賴性的方式。
Conflicts定義單元衝突關係,和Requires相反。
2)[unittype]類型是[Service]時的選項
Type配置單元進程在啓動時候的類型,影響執行和關聯選項的功能,可選的關鍵字是:
simple默認值,進程和服務的主進程一塊兒啓動;
forking進程做爲服務主進程的一個子進程啓動,父進程在徹底啓動以後退出。
oneshot同simple類似,可是進程在啓動單元以後隨之退出。
dbus同simple類似,可是隨着單元啓動後只有主進程獲得D-BUS名字。
notify同simple類似,可是隨着單元啓動以後,一個主要信息被sd_notify()函數送出。
idle同simple類似,實際執行進程的二進制程序會被延緩直到全部的單元的任務完成,主要是避免服務狀態和shell混合輸出。
ExecStart指定啓動單元的命令或者腳本,ExecStartPre和ExecStartPost節指定在ExecStart以前或者以後用戶自定義執行的腳本。Type=oneshot容許指定多個但願順序執行的用戶自定義命令。
ExecStop指定單元中止時執行的命令或者腳本。
ExecReload指定單元從新加載是執行的命令或者腳本。
Restart這個選項若是被容許,服務重啓的時候進程會退出,會經過systemctl命令執行清除並重啓的操做。
RemainAfterExit若是設置這個選擇爲真,服務會被認爲是在激活狀態,即便因此的進程已經退出,默認的值爲假,這個選項只有在Type=oneshot時須要被配置。
3)[Install]節選項
Alias爲單元提供一個空間分離的附加名字。
RequiredBy單元被容許運行須要的一系列依賴單元,RequiredBy列表從Require得到依賴信息。
WantBy單元被容許運行須要的弱依賴性單元,Wantby從Want列表得到依賴信息。
Also指出和單元一塊兒安裝或者被協助的單元。
DefaultInstance實例單元的限制,這個選項指定若是單元被容許運行默認的實例。
4)一個postfix服務的例子:
單元文件位於/usr/lib/systemd/system/postifix.service,內容以下:
[Unit] Description=PostfixMailTransportAgent After=syslog.targetnetwork.target Conflicts=sendmail.serviceexim.service [Service] Type=forking PIDFile=/var/spool/postfix/pid/master.pid EnvironmentFile=-/etc/sysconfig/network ExecStartPre=-/usr/libexec/postfix/aliasesdb ExecStartPre=-/usr/libexec/postfix/chroot-update ExecStart=/usr/sbin/postfixstart ExecReload=/usr/sbin/postfixreload ExecStop=/usr/sbin/postfixstop [Install] WantedBy=multi-user.target
(3)建立自定義的單元文件
如下幾種場景須要自定義單元文件:
但願本身建立守護進程;
爲現有的服務建立第二個實例;
引入SysV init腳本。
另一方面,有時候須要修改已有的單元文件。
下面介紹建立單元文件的步驟:
1)準備自定義服務的執行文件。
可執行文件能夠是腳本,也能夠是軟件提供者的的程序,若是須要,爲自定義服務的主進程準備一個PID文件,一保證PID保持不變。另外還可能須要的配置環境變量的腳本,確保因此腳本都有可執行屬性而且不須要交互。
2)在/etc/systemd/system/目錄建立單元文件,而且保證只能被root用戶編輯:
touch/etc/systemd/system/name.servicechmod664/etc/systemd/system/name.service
文件不須要執行權限。
3)打開name.service文件,添加服務配置,各類變量如何配置視所添加的服務類型而定,下面是一個依賴網絡服務的配置例子:
[Unit] Description=service_description After=network.target [Service] ExecStart=path_to_executable Type=forking PIDFile=path_to_pidfile [Install] WantedBy=default.target
4)通知systemd有個新服務添加:
systemctldaemon-reload systemctlstartname.service
(4)建立emacs.service例子:
1)建立文件,並確保正確權限:
~]#touch/etc/systemd/system/emacs.service ~]#chmod664/etc/systemd/system/emacs.service
2)添加配置信息:
[Unit] Description=Emacs:theextensible,self-documentingtexteditor [Service] Type=forking ExecStart=/usr/bin/emacs--daemon ExecStop=/usr/bin/emacsclient--eval"(kill-emacs)" Environment=SSH_AUTH_SOCK=%t/keyring/ssh Restart=always [Install] WantedBy=default.target
3)通知systemd並開啓服務:
~]#systemctldaemon-reload ~]#systemctlstartemacs.service
(5)建立第二個sshd服務的例子
1)拷貝sshd_config文件
]#cp/etc/ssh/sshd{,-second}_config
2)編輯sshd-second_config文件,添加22220的端口,和PID文件:
Port22220 PidFile/var/run/sshd-second.pid
若是還須要修改其餘參數,請閱讀幫助。
3)拷貝單元文件:
~]#cp/usr/lib/systemd/system/sshd{,-second}.service
4)編輯單元文件sshd-second.service
修改描述字段
Description=OpenSSHserversecondinstancedaemon
添加sshd.service服務在After關鍵字以後:
After=syslog.targetnetwork.targetauditd.servicesshd.service
移除sshdkey建立:
ExecStartPre=/usr/sbin/sshd-keygen移除這一行
在執行腳本里,添加第二sshd服務的配置文件:
ExecStart=/usr/sbin/sshd-D-f/etc/ssh/sshd-second_config$OPTIONS
修改後的sshd-second.service文件內容以下:
[Unit] Description=OpenSSHserversecondinstancedaemon After=syslog.target network.targe tauditd.service sshd.service [Service] EnvironmentFile=/etc/sysconfig/sshd ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd-second_config$OPTIONS ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target
5)若是使用SELinux,添加tcp端口,負責第二sshd服務的端口就會被拒絕綁定:
~]#semanage port -a -tssh_port_t -p tcp22220
6)設置開機啓動並測試:
~]#systemctl enable sshd-second.service ~]$ssh -p 22220 user@server
確保防火牆端口也開放。
(6)修改已經存在的單元文件
systemd單元配置文件默認保存在/usr/lib/systemd/system/目錄,系統管理員不建議直接修改這個目錄下的文件,自定義的文件在/etc/systemd/system/目錄下,若是有擴展的需求,可使用如下方案:
建立一個目錄/etc/systemd/system/unit.d/,這個是最推薦的一種方式,能夠參考初始的單元文件,經過附件配置文件來擴展默認的配置,對默認單元文件的升級會被自動升級和應用。
從/usr/lib/systemd/system/拷貝一份原始配置文件到/etc/systemd/system/,而後修改。複製的版本會覆蓋原始配置,這種方式不能增長附件的配置包,用於不須要附加功能的場景。
若是須要恢復到默認的配置文件,只須要刪除/etc/systemd/system/下的配置文件就能夠了,不須要重啓機器,使用以下命令應用改變就能夠:
systemctl daemon-reload
daemon-reload選項從新加載因此單元文件並從新建立依賴書,在須要當即應用單元文件改變的時候使用。另外,也可使用下面的命令達到一樣的目的:
init q
還有,若是修改的是一個正在運行服務的單元文件,服務須要被重啓下:
systemct lrestart name.service
(7)擴展默認單元配置文件配置
爲了擴展默認的單元文件配置,須要先在/etc/systemd/system/下建立一個目錄,用root執行相似下面的命令:
mkdir/etc/systemd/system/name.service.d
在剛纔建立的目錄之下建立配置文件,必須以.conf文件結尾。
例如建立一個自定義的依賴文件,內容以下:
[Unit] Requires=new_dependency After=new_dependency
另一個例子,能夠配置重啓的時候,在主進程退出後30秒在重啓,配置例子以下:
[Service] Restart=always RestartSec=30
推薦每次只產生一個小文件,每一個文件只聚焦完善一個功能,這樣配置文件很容易被移除或者連接到其餘服務對的配置目錄中。
爲了應用剛纔的修改,使用root執行如下操做:
systemctldaemon-reload systemctlrestartname.service
例子:擴展httpd.service服務配置
爲了是httpd服務啓動的時候執行用戶自定義的腳本,須要修改httpd的單元配置文件,執行如下幾步操做,首先建立一個自定義文件的目錄及自定義文件:
~]#mkdir/etc/systemd/system/httpd.service.d ~]#touch/etc/systemd/system/httpd.service.d/custom_script.conf
假設自定義文件位置在/usr/local/bin/custom.sh,將這個信息添加到custom_script.conf自定義腳本中:
[Service] ExecStartPost=/usr/local/bin/custom.sh
應用更改:
~]#systemctldaemon-reload ~]#systemctlrestarthttpd.service
12.單元實例化
在運行的時候有可能須要將一個模版實例化好幾個單元,@字符用於標識模版和單元文件的關係,實例化單元能夠從另一個單元文件(使用Requires或者Wants選項),或者使用systemctlstart命令。實例化服務單元能夠按照下面的方式命名:
template_name@instance_name.service
幾個實例能夠指向同一個模板文件配置選項常見的全部實例,舉個例子,一個單元配置文件的Wants選項能夠是:
Wants=getty@ttyA.service,getty@ttyB.service
首先讓systemd搜索給定服務單位,若是沒有發現,systemd忽略@和點號之間的部分,直接搜索getty@.service服務文件,讀取配置,並啓動服務。
通配符字段,稱爲單元說明符,能夠在任何單元配置文件使用。單位說明符替代某些單位在運行時參數和解釋。經常使用的單元說明符說明以下:
%n整個單元名字,包括類型的後綴,%N是相同的意義,可是ASCII取代爲禁止字符。
%p前綴名字,在實例化的時候,%p表明@字符前面的部分。
%i實例名字,@字符和單元類型直接的部分。%I是相同的意義,可是ASCII取代爲禁止字符。
%H主機名字,當配置文件被加載的時候的主機名。
%t運行時目錄,當前的運行目錄,對root用戶就是/run目錄,對於無特權用戶就是XDG_RUNTIME_DIR變量指定的目錄。
舉個例子,getty@.service包含下面的結構:
[Unit] Description=Gettyon%I ... [Service] ExecStart=-/sbin/agetty--noclear%I$TERM ...
當getty@ttyA.service和getty@ttyB.service實例化的時候,Description=被解釋爲「GettyonttyA」和"GettyonttyB"。
13.VNC SERVER配置
安裝:
yum install tigervnc-server
配置:
(1) 複製配置文件:
~]# cp /lib/systemd/system/vncserver@.service \ /etc/systemd/system/vncserver@.service
(2) 編輯配置文件:
ExecStart=/sbin/runuser -l USER -c "/usr/bin/vncserver %i -geometry 1280x1024" PIDFile=/home/USER/.vnc/%H%i.pid
將USER換成要使用的VNC服務的用戶,好比root:
ExecStart=/sbin/runuser -l root -c "/usr/bin/vncserver %i"
若是要修改分辨率能夠修改geometry內容,其餘不須要作修改。
而後保持配置。
(3)使用systemctl命令,強制從新讀取配置文件:
~]# systemctl daemon-reload
(4)配置vncserver密碼
vncpasswd
(5)若是有兩個用戶但願同時使用vnc,須要配置兩份配置文件:
vncserver-USER_1@.service 及 vncserver-USER_2@.service,文件內容同root用戶的配置方法
而後爲兩個用戶建立vnc密碼:
~]$ su - USER_1 ~]$ vncpasswd Password: Verify: ~]$ su - USER_2 ~]$ vncpasswd Password: Verify:
(6)啓動vnc服務
systemctl start vncserver@:10
爲了開機啓動,使用以下命令:
systemctl enable vncserver@:10 ln -s '/etc/systemd/system/vncserver@.service' \ '/etc/systemd/system/multi-user.target.wants/vncserver@:10.service'
(7) 關閉進程
systemctl disable vncserver@:display_number.service systemctl stop vncserver@:display_number.service
參考文檔:
https://www.ibm.com/developerworks/cn/linux/1407_liuming_init1/