systemd概述 systemd核心概念:unit systemd的service unit file詳解 實例:編譯安裝httpd,並實現通過systemd進行管理 1)通過 rpm -q httpd 命令檢查系統是否已安裝apache,如有先進行卸載; 2)下載Apache(httpd)源碼: ...
systemd概述
1)systemd是一種新的linux系統服務管理器,用於替換init系統,能夠管理系統啟動過程和系統服務,一旦啟動起來,就將監管整個系統。在centos7系統中,PID1被systemd所占用; 2)systemd可以並行地啟動系統服務進程,並且最初僅啟動確實被依賴的服務,極大減少了系統的引導時間,這也就是為什麼centos7系統啟動速度比centos6快許多的原因; 3)systemctl 是 systemd 的主命令,用於管理系統及服務。 systemd的新特性: 系統引導時實現服務並行啟動; 按需激活進程; 系統狀態快照; 基於依賴關係定義服務控制邏輯 systemd的關鍵特性: 基於socket的激活機制:socket與程式分離; 基於bus的激活機制; 基於device的激活機制; 基於Path的激活機制; 系統快照:保存各unit的當前狀態信息於持久存儲設備中; 向後相容sysv init腳本,放在/etc/init.d/ 註意:systemctl的命令是固定不變的;非由systemd啟動的服務,systemctl無法與之通信
systemd核心概念:unit
unit由其相關配置文件進行標識、識別和配置;文件中主要包含了系統服務、監聽的socket、保存的快照以及其它與init相關的信息; 這些配置文件主要保存在: /usr/lib/systemd/system /run/systemd/system /etc/systemd/system unit的常見類型: Service unit:文件擴展名為.service,用於定義系統服務; Target unit:文件擴展名為.target,用於模擬實現“運行級別”; Device unit:文件擴展名為.device,用於定義內核識別的設備; Mount unit:文件擴展名為.mount,定義文件系統掛載點; Socket unit:文件擴展名為.socket,用於標識進程間通信用到的socket文件; Snapshot unit:文件擴展名為.snapshot, 管理系統快照; Swap unit:文件擴展名為.swap, 用於標識swap設備; Automount unit:文件擴展名為.automount,文件系統自動點設備; Path unit:文件擴展名為.path, 用於定義文件系統中的一文件或目錄
systemd的service unit file詳解
1)service unit file 通常由三部分組成: [Unit]:定義與Unit類型無關的通用選項;用於提供unit的描述信息、unit行為及依賴關係等; [Service]:與特定類型相關的專用選項;此處為Service類型; [Install]:定義由“systemctl enable”以及"systemctl disable“命令在實現服務啟用或禁用時用到的一些選項 2)各部分釋義: [Unit] 段的常用選項: Description:描述信息; 意義性描述; After:定義unit的啟動次序,表示當前unit應該晚於哪些unit啟動;其功能與Before相反; Requies:依賴到的其它units;強依賴,被依賴的units無法激活時,當前unit即無法激活; Wants:依賴到的其它units;弱依賴; Conflicts:定義units間的衝突關係 [Service] 段的常用選項: Type:用於定義影響ExecStart及相關參數的功能的unit進程啟動類型,其類型有: simple:預設值,執行ExecStart指定的命令,啟動主進程 forking:以 fork 方式從父進程創建子進程,創建後父進程會立即退出 oneshot:一次性進程,Systemd 會等當前服務退出,再繼續往下執行 dbus:當前服務通過D-Bus啟動 notify:當前服務啟動完畢,會通知systemd再繼續往下執行 idle:若有其他任務執行完畢,當前服務才會運行 EnvironmentFile:環境配置文件; ExecStart:指明啟動unit要運行命令或腳本; ExecStartPre:在ExecStart之前運行; ExecStartPost:在ExecStart之後運行; ExecStop:指明停止unit要運行的命令或腳本; Restart:當設定Restart=1時,則當次daemon服務意外終止後,會再次自動啟動。 [Install] 段的常用選項: Alias:別名,可使用systemctl command Alias.service; RequiredBy:被哪些units所依賴; WantedBy:被哪些units所依賴 註意:對於新創建的unit文件或修改了的unit文件,要通知systemd重載此配置文件,通過命令 systemctl daemon-reload.
實例:編譯安裝httpd,並實現通過systemd進行管理
1)通過 rpm -q httpd 命令檢查系統是否已安裝apache,如有先進行卸載;
2)下載Apache(httpd)源碼:https://httpd.apache.org/
3)自定義安裝依賴APR,需要先下載APR庫和PCRE環境:http://apr.apache.org/download.cgi http://www.pcre.org
4)通過 yum group install "Development Tools" 安裝開發工具包
5)解壓所有已下載的文件
6)安裝PCRE
[root@happiness pcre-8.42]# ./configure --prefix=/usr/local/pcre [root@happiness pcre-8.42]# make [root@happiness pcre-8.42]# make install
註意:此處如果安裝的是pcre2的版本,後期編譯Apache時會出現錯誤提示:configure: error: Did not find pcre-config script at /usr/local/pcre。
此時我們需要卸載已安裝的pcre2:rm -rf /usr/loca/pcre,直接刪除編譯安裝的目錄即可刪除pcre。
7)安裝APR
[root@happiness apr-1.6.3]# ./configure --prefix=/usr/local/apr [root@happiness apr-1.6.3]# make [root@happiness apr-1.6.3]# make install
8)安裝APR-util
[root@happiness apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr [root@happiness apr-util-1.6.1]# make [root@happiness apr-util-1.6.1]# make install
9)安裝Apache(httpd)
[root@happiness httpd-2.4.33]# ./configure --prefix=/usr/apache24 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-pcre=/usr/local/pcre [root@happiness httpd-2.4.33]# make [root@happiness httpd-2.4.33]# make install
10)運行httpd服務
[root@happiness httpd-2.4.33]# /usr/apache24/bin/apachectl start
註意:啟動httpd服務時有可能提示:servername未設置:
AH00557: httpd: apr_sockaddr_info_get() failed for happiness
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message
此時我們可通過修改配置文件解決問題:
[root@happiness httpd-2.4.33]# vim /usr/apache24/conf/httpd.conf
11)添加服務腳本,使得可以通過systemd來管理httpd服務:
CentOS7服務的systemctl腳本存放在/usr/lib/systemd目錄下,有系統(/usr/lib/systemd/system)和用戶(/usr/lib/systemd/user)之分。此處我們在/usr/lib/systemd/system目錄下新建httpd.service的腳本文件,內容如下:
[Unit] Description=The Apache HTTP Server 2.4.33 After=network.target remote-fs.target nss-lookup.target [Service] Type=simple EnvironmentFile=/usr/apache24/conf/httpd.conf ExecStart=/usr/apache24/bin/httpd -k start -DFOREGROUND ExecReload=/usr/apache24/bin/httpd -k graceful ExecStop=/bin/kill -WINCH ${MAINPID} [Install] WantedBy=multi-user.target
此時我們可以通過 systemctl命令來管理httpd服務了。