天天看點

linux-認識系統服務-systemd

從Centos7.x開始,傳統的init已經被舍棄,取而代之的是Systemd

什麼是daemon與服務(service)

簡單的說,系統為某些功能提供了一些服務

daemon既然是一個程式執行後的程序,那麼daemon所處的那個本來的程式通常是如何命名的(daemon程式的命名方式)?每一個服務的開發者,在開發他們的服務時,都有特别的故事.不過無論如何,這些服務的名稱被建立之後,在Linux中使用時,通常在服務的名稱之後會加一個d,例如計劃任務指令建立的at與cron這兩個服務,他們的程式名會被取為atd和cornd,這個d就是代表daemon的意思.是以我們在使用ps和top檢視程序時,都會發現很多的{xxxx}d程序,通常就是daemon的一些程序

systemd使用的unit分類

從Centos7.x開始,Red Hat系列的發行版放棄沿用多年的SystemV開機啟動服務的流程,就是前一屆提到的init啟動腳本的方法,改用systemd這個啟動服務管理機制.那麼systemd有什麼好處呢?

并行處理所有服務,加速開機流程

一經要求就響應的on-daemon啟動方式

systemd全部就是僅有一個systemctl服務搭配systemctl指令來處理,無需其他額外的指令來支援

服務依賴性得到自我檢查

依賴daemon功能分類

systemd旗下管理的服務非常多,為了梳理清楚所有服務的類型,是以首先systemd先定義所有的服務為一個服務機關(unit),并将該unit歸類到不同的服務類型(type)之中.就得init僅分為stand,alone與super daemon, 是在不夠好,systemd将服務機關(unit)區分為service,socket,target,path,snapshot,timer等多種不同的類型(type),友善管理者分類與記憶

将多個daemon集合成為一個群組

linux-認識系統服務-systemd

向下相容舊有的init服務腳本

  • 如果某個服務啟動是管理者自己手動執行啟動,而不是使用systemctl去啟動(例如你自己手動輸入crond來啟動crond服務),那麼systemd将無法檢測到該服務,而無法進一步管理
  • systemd啟動過程中,無法與管理者通過标準輸入傳入資訊,是以自行編寫systemd的啟動設定時,務必取消互動機制

systemd的配置檔案放置目錄

基本上systemd将過去所謂的daemon執行腳本統統稱為一個服務機關(unit),而每種服務機關根據功能來區分時,就分類為不同的類型(type).基本的我服務包括系統服務,資料監聽與交換的socket檔案服務(socket),存儲系統狀态的快照服務,提供不同類似運作級别分類的操作環境(target).這些服務的配置檔案都放在一下的目錄中:

  • /usr/lib/systemd/system/:每個系統最主要的啟動腳本設定,有點;類似以前的/etc/init.d下面的檔案
  • /run/systemd/system/:系統執行過程中所産生的服務腳本,這個腳本的優先級比/usr/lib/systemd/system/的優先級高
  • /etc/systemd/system/:管理者根據主機系統的需求建立的執行腳本,其實這個目錄有點像之前的/etc/rc.d/rc5.d/Sxx之類的功能,執行優先級又比/run/systemd/system高

也就是說到底作業系統會不會啟動某些服務需要看/etc/systemd/system/下面的配置,是以該目錄下面有一大堆連結檔案,其實都是放置在/usr.lib/systemd/system/下面,是以如果你想要修改某個服務啟動的設定,應該去/usr/lib/systemd/system/下面修改才對,/etc/systemd/system/僅是連結到正确的執行腳本配置檔案而已.是以想要看執行腳本設定,應該就得要到/usr/lib/systemd/system/下面去看才對

systemd的unit類型分類說明

linux-認識系統服務-systemd

通過systemctl管理服務

通過systemctl管理單一服務(service unit)的啟動/開機啟動與檢視狀态

一般服務的啟動有兩個階段,一個是開機的時候設定要不要啟動這個服務,以及你現在要不要啟動這個服務,這兩者之間有很大 的差異.舉個例子,假如我們現在要立刻停止atd這個服務,正确的方法(不要用kill)要怎麼處理

linux-認識系統服務-systemd
linux-認識系統服務-systemd

上面的範例中我們已經關閉了atd,這樣做才是對的.不應該使用kill來關閉一個正常的服務

使用systemctl status atd的輸出結果中,第2,3行十分重要,因為哪個是告知我們該unit下次開機會不會預設啟動,以及目前啟動的狀态,這個相當重要,最下面的unit日志檔案,如果你的unit出錯過,檢視這個地方也是相當重要的

那麼現在問一個問題,你的atd現在是關閉的,未來重新啟動之後,這個服務會不會再次啟動?答案是會.因為胡第二行中他是enabled,這樣了解所謂的現在的狀态和開機預設狀态兩者的差異

第三行有一下幾個狀态:

linux-認識系統服務-systemd

通過systemctl檢視系統上的所有服務

linux-認識系統服務-systemd
linux-認識系統服務-systemd

使用systemctl list-unit-files會将系統中所欲的服務統統顯示出來,而不像list-units僅僅以unit分類做大緻得到說明.至于STATE狀态就是前兩個小節談到的開機是否會加載的那個狀态項目.主要有enabled,disabled,mask,static等假設我不需要這麼多的unit項目,我隻想知道service這種類别的daemon而已,而且不論是否已經成功,統統都要顯示出來,那該如何是好?

linux-認識系統服務-systemd

與systemd的daemon運作過程相關的目錄簡介

linux-認識系統服務-systemd

systemctl針對service類型的配置檔案

以前我們想要建立系統服務,就得到/etc/init.d/下面建立對應的bash腳本來完成.那麼現在systemd的環境下面,如果我們想要設定相關的服務啟動環境,那應該如何處理?這就是本小節的任務

systemctl配置檔案相關目錄簡介

我們知道服務的管理是通過systemd來完成,而systyemd的配置檔案大部分放置于/usr/lib/systemd/system/目錄中.但是Red Hat官方檔案中指出,該目錄的檔案主要是原本軟體所提供的設定,建議不要修改.而要修改的位置應該放置于/etc/systemd/system/目錄中.舉例來說,你想要額外修改vsftpd.service的話,他們的建議應該放置到那些位置?

  • /usr/lib/systemd/system/vsftpd.service:官方釋出的預設配置檔案
  • /etc/systemd/system/vsftpd.service.d/custom.conf:在/etc/systemd/system下面建立與配置檔案相同檔案名的目錄,但要加上.d的擴充名,然後在該目錄下建立配置檔案即可.另外,配置檔案的擴充名最好使用.conf.這個目錄下的檔案會"累加其他設定"到/usr/lib/systremd/system/vsftpd.service中
  • /etc/systemd/system/vsftpd.service.wants/*:此目錄的檔案為連結檔案,設定依賴服務的連結,意思是啟動vsftpd.service之後,最好在加上該目錄下建議的服務
  • /etc/systemd/system/vsftpd.service.requires/*:此目錄的檔案為連結檔案,設定依賴服務的連結,意思是啟動vsftpd.service之前,需要啟動那些服務的意思

systemctl配置檔案的設定項目簡介

了解了配置檔案的相關目錄與檔案之後,當然得要了解一下配置檔案本身的内容了,讓我們先來看一看sshd.service的内容

linux-認識系統服務-systemd

分析上面的配置檔案,我們大概能夠将整個設定分為三個部分

  • [Service],[Socket],[Timer],[Mount],[Path]:不同的unit類型就得要使用相對應的設定項目.我們使用ssh.service來當模闆,是以使用[Service]來設定.這個項目主要用來規範服務啟動的腳本,環境配置檔案名,重新啟動的方式等

至于配置檔案内的有些設定骨=規則還是要說明一下:

  • 設定項目通常是可以重複的,例如我們可以重複設定兩個After在配置檔案中,不過,後面的設定會替代前面的.是以,如果你想将設定值歸零,可以使用類似[After=]的設定,亦即該項目的等号後面什麼都沒有,就将設定值歸零了(reset)
  • 如果設定參數需要有[是/否]的項目(布爾值,boolean),你可以使用1,yes,true,on代表啟動,用0,no,false,off代表關閉,随你喜好設定
  • 空白行,開頭為#或者;的那一行,都代表注釋

    每一部分裡面還有很多的設定,我們使用一個簡單的表格來說明每個項目的内容

linux-認識系統服務-systemd
linux-認識系統服務-systemd

繼續閱讀