systemd自定義指令碼普通使用者最經常碰到的應該是Service unit寫法其實我覺得比init指令碼還容易,自定義功能也比init指令碼要豐富很多,就算你不會寫SHELL指令碼,你也可以輕鬆使用systemd Service unit編寫語法很快寫一個服務的啟動檔案。以httpd指令碼為例,最簡單的unit檔案只要包含以下幾段配置就可以了
如果是說systemd程序的話,systemd是一個替代init的程序,只是啟動服務的機制不同,init根據rcx.d裡的指令碼順序,執行啟動/關閉服務。而systemd使用Linux程序的繼承等機制,解決依賴問題,巧妙的實現了並行啟動,大大提升啟動速度。但是Systemd和init的區別不僅僅是啟動快這麼簡單,cgroup的結合,systemd-cgls、systemd-cgtop不僅服務跟蹤管理起來更方便,也可以直接在systemd service unit裡設定cgroup的的記憶體、cpu等限額功能。還有日誌系統的結合,journalctl用起來也很方便。
恰好最近在看RHEL7的相關資料,RHEL7與6對比,改變真不是一點點,RHEL7上各種不適應。
1、systemd下的自定義指令碼如何編寫?
systemd自定義指令碼普通使用者最經常碰到的應該是Service unit寫法其實我覺得比init指令碼還容易,自定義功能也比init指令碼要豐富很多,就算你不會寫SHELL指令碼,你也可以輕鬆使用systemd Service unit編寫語法很快寫一個服務的啟動檔案。以httpd指令碼為例,最簡單的unit檔案只要包含以下幾段配置就可以了
[Unit]
Description=Apache HTTP Server
#unit描述
After=syslog.target network.target
#定義啟動的順序,用init指令碼得在rcX.d裡命名Sxx來決定啟動優先順序,在systemd的unit檔案裡,直接指定after
[Service]
ExecStart=/usr/sbin/httpd -k start
ExecReload=/usr/sbin/httpd -k restart
ExecStop=/usr/sbin/httpd -k stop
#簡單的3條命令設定啟動、重啟、停止。比自己寫script去判定指令碼傳入引數簡單多了。
[Install]
WantedBy=multi-user.target
#設定systemctl enable時httpd的執行級別,和chkconfig xxxx on類似。
對比下httpd的init指令碼,部署起來簡單不是一兩個級別。當然,我這裡只是舉一個簡單例子,systemd自定義unit的寫法其實很多引數可用,可以參考http://www.freedesktop.org/software/systemd/man/systemd.unit.html
2、各種/lib/systemd/system/下的Service、Socket檔案中的具體配置的意義和關係?
Service和Socket的的關係應該不是透過unit配置檔案建立的,除了某些Service的unit檔案定義Also=xxx.Socket欄位,這情況下systemctl enable/disable的時候會將Socket檔案一起復制到target目錄。
個人理解,我覺得systemd的原理和inetd類似,inetd可以接管FTP/TELNET等服務,負責監控Socket的狀態,在有訪問請求時再去啟動FTP/TELNET服務。systemd也類似這樣,他預先建立程序需要的Socket,透過Linux程序的繼承等機制,將套接字傳遞給新的服務程序,這樣服務啟動時就可以不再建立這些程序,而另外依賴這些Socket的服務也可以在依賴的服務還未啟動時就啟動完成。
使用init的情況下,假設A.Service啟動建立了A.Socket,而B.Service啟動依賴A.Socket,這種情況下,B.Service只能等A.Service啟動完成後才能啟動。
使用systemd的情況下,systemd先建立A.Socket,再透過fork或者exec啟動A.Service和B.Service。這樣A.Service和B.Service都可以同時啟動。
同理,systemd情況下,dbus、檔案系統等依賴關係也是透過這樣打破的,因此可以實現一些服務的並行啟動,減少系統啟動時間。
假設init下,nfs共享/home目錄,待網路啟動後,/home目錄對應的裝置需要fsck,得fsck完才掛載檔案系統,這過程是序列的。但是systemd可以先建立nfs需要的/home臨時掛載點,先啟動nfs服務,待/home目錄對應的掛載裝置完成fsck後,將臨時的掛載點對應的裝置替換成真正的掛載裝置。這時候就算nfs對應的/home目錄裝置未完成fsck,這時systemd也可以將nfs訪問請求的open系統呼叫掛起,待/home真正掛載完成後再執行open系統呼叫。
3、systemctl命令執行機制的詳細過程。
沒看明白systemctl命令執行的機制是指什麼,systemctl只是一個控制命令,和chkconfig、service命令功能類似。
如果是說systemd程序的話,systemd是一個替代init的程序,只是啟動服務的機制不同,init根據rcx.d裡的指令碼順序,執行啟動/關閉服務。而systemd使用Linux程序的繼承等機制,解決依賴問題,巧妙的實現了並行啟動,大大提升啟動速度。但是Systemd和init的區別不僅僅是啟動快這麼簡單,cgroup的結合,systemd-cgls、systemd-cgtop不僅服務跟蹤管理起來更方便,也可以直接在systemd service unit裡設定cgroup的的記憶體、cpu等限額功能。還有日誌系統的結合,journalctl用起來也很方便。