天天看點

systemd的運作級别與服務管理指令簡介systemd的運作級别與服務管理指令簡介

systemd的運作級别與服務管理指令簡介systemd的運作級别與服務管理指令簡介

從很久很久以前我們就在使用靜态運作級别。而systemd提供了更為動态靈活的機制,來管控你的系統。

在開始介紹systemd指令前,讓我們先簡單的回顧一下曆史。在linux世界裡,有一個很奇怪的現象,一方面linux和自由軟體(foss)在不斷的向前推進,另一方面人們對這些變化卻不斷的抱怨。這就是為什麼我要在此稍稍提及那些反對systemd所引起的争論的原因,因為我依然記得曆史上有不少類似的争論:

軟體包(pacakge)是邪惡的,因為真正的linux使用者會從源碼建構他所想要的的一切,并嚴格的管理系統中安裝的軟體。

解析依賴關系的包管理器是邪惡的,真正的linux使用者會手動解決這些該死的依賴關系。

apt-get總能把事情幹好,是以隻有yum是邪惡的。

red hat簡直就是linux中的微軟。

好樣的,ubuntu!

滾蛋吧,ubuntu!

諸如此類...就像我之前常常說的一樣,變化總是讓人沮喪。這些該死的變化攪亂了我的工作流程,這可不是一件小事情,任何業務流程的中斷,都會直接影響到生産力。但是,我們現在還處于計算機發展的嬰兒期,在未來的很長的一段時間内将會持續有快速的變化和發展。想必大家應該都認識一些因循守舊的人,在他們的心裡,商品一旦買回家以後就是恒久不變的,就像是買了一把扳手、一套家具或是一個粉紅色的火烈鳥草坪裝飾品。就是這些人,仍然在堅持使用windows vista,甚至還有人在使用運作windows 95的老破爛機器和crt顯示器。他們不能了解為什麼要去換一台新機器。老的還能用啊,不是麼?

這讓我回憶起了我在維護老電腦上的一項偉大的成就,那台破電腦真的早就該淘汰掉。從前我有個朋友有一台286的老機器,安裝了一個極其老的ms-dos版本。她使用這台電腦來處理一些簡單的任務,比如說約會、日記、記賬等,我還用basic給她寫了一個簡單的記賬軟體。她不用關注任何安全更新,是這樣麼?因為它壓根都沒有聯網。是以我會時不時給她維修一下電腦,更換電阻、電容、電源或者是cmos電池什麼的。它竟然還一直能用。它那袖珍的琥珀crt顯示器變得越來越暗,在使用了20多年後,終于退出了曆史舞台。現在我的這位朋友,換了一台運作linux的老thinkpad,來幹同樣的活。

前面的話題有點偏題了,下面抓緊時間開始介紹systemd。

<a target="_blank"></a>

sysvinit使用靜态的運作級别來建構不同的啟動狀态,大部分釋出版本中提供了以下5個運作級别:

單使用者模式(single-user mode)

多使用者模式,不啟動網絡服務(multi-user mode without network services started)

多使用者模式,啟動網絡服務(multi-user mode with network services started)

系統關機(system shutdown)

系統重新開機(system reboot)

對于我來說,使用多個運作級别并沒有太大的好處,但它們卻一直在系統中存在着。 不同于運作級别,systemd可以建立不同的狀态,狀态提供了靈活的機制來設定啟動時的配置項。這些狀态是由多個unit檔案組成的,狀态又叫做啟動目标(target)。啟動目标有一個清晰的描述性命名,而不是像運作級别那樣使用數字。unit檔案可以控制服務、裝置、套接字和挂載點。參考下/usr/lib/systemd/system/graphical.target,這是centos 7預設的啟動目标:

[unit]

description=graphical interface

documentation=man:systemd.special(7)

requires=multi-user.target

after=multi-user.target

conflicts=rescue.target

wants=display-manager.service

allowisolate=yes

[install]

alias=default.target

現在再看看unit檔案長什麼樣? 我來給大家找個例子。 unit檔案存放在下面的兩個目錄下:

/etc/systemd/system/

/usr/lib/systemd/system/

我們可以修改第一個目錄中的檔案來進行自定義配置,而第二個目錄中的檔案是包安裝時儲存的備份。/etc/systemd/system/的優先級高于/usr/lib/systemd/system/。不錯,使用者優先級高于機器。下面是apache web server的unit檔案:

description=the apache http server

after=network.target remote-fs.target nss-lookup.target

[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}

killsignal=sigcont

privatetmp=true

wantedby=multi.user.target

就算是對于新手而言,上面的檔案也是非常簡單易懂的。這可比sysvinit的init檔案要簡單多了,為了便于比較,下面截取了/etc/init.d/apache2的一個片段:

scriptname="${0##*/}"

scriptname="${scriptname##[ks][0-9][0-9]}"

if [ -n "$apache_confdir" ] ; then

if [ "${apache_confdir##/etc/apache2-}" != "${apache_confdir}" ] ; then

dir_suffix="${apache_confdir##/etc/apache2-}"

else

dir_suffix=

整個檔案一共有410行。

你可以檢查unit檔案的依賴關系,我常常被這些複雜的依賴關系給吓到:

$ systemctl list-dependencies httpd.service

$ systemd-cgls

你可以使用ps指令來進行檢視cgroup樹:

$ ps xawf -eo pid,user,cgroup,args

下面的指令行展示了如何為守護程序重新裝載配置檔案,注意不是systemd服務檔案。 使用這個指令能夠激活新的配置項,且盡可能少的打斷業務程序,下面以apache為例:

# systemctl reload httpd.service

重新裝載服務檔案(service file)需要完全停止和重新啟動服務。如果服務挂死了,用下面的指令行可以恢複它:

# systemctl restart httpd.service

你還可以用一個指令重新開機所有的守護程序。這個指令會重新裝載所有守護程序的unit檔案,然後重新生成依賴關系樹:

# systemctl daemon-reload

在非特權模式下,你也可以進行重新開機、挂起、關機操作:

$ systemctl reboot

$ systemctl suspend

$ systemctl poweroff

原文釋出時間:2014-12-23

本文來自雲栖合作夥伴“linux中國”

繼續閱讀