systemd服務詳解-技術流ken


 

簡介

 

在centos5中生成和管理用戶空間中的進程以及完成系統的初始化使用的是init,並且是依次啟動。在centos6中則是使用的upstart,在一定程度上實現了並行啟動,但是仍然存在依賴關系,到了centos7中開始使用systemd,真正的實現並行啟動、延時按需啟動。

 

systemd的特性

 

1 啟動系統的過程中實現了並行啟動

2 systemd所管理的服務可以實現按需激活

3 支持系統服務狀態快照

4 可以定義程序之間依賴關系

 

unit介紹

 

unit的配置文件是uit的核心,在配置文件中主要包含

1. 需要管理服務或者程序

2. 服務或者程序需要監聽的套接字

3. 保存的系統快照(就是制作快照的時候,系統中各個服務的狀態)

4. 其他和init相關的配置

unit配置文件的位置

/lib/systemd/system         本地配置的系統單元

/run/systemd/system         運行時配置的系統單元

/usr/lib/systemd/system      第三方軟件的系統單元(sshd,nginx..)

注意:unit(單元)init中的服務腳本類似,但是不相同

 

unit的多種類別

 

 1 類型1:service unit,這是服務類型的unit,該類unit后綴是  .service,比如nginx.service,通過這個nuit可以實現啟動、關閉、查看狀態等
 2 該類unit位於 /usr/lib/systemd/system
 3 注意:unit本質上來說並不是腳本,而僅僅是systemd一個配置文件,因此這個unit文件不具有執行權限,而且也無法執行
 4 啟動服務的方式:通過讓systemd去讀取配置文件中的內容,完成nginx進程的啟動
 5 類型2:device unit,這是設備unit,該類unit的后綴是.device,這類unit的作用是用來識別設備文件
 6 類型3:mount unit,后綴 .mount,用來實現掛載文件系統到指定的掛載點
 7 類型4:socket unit,后綴.socket,用來表示進程間通信的socket文件
 8 類型5:snapshot nuit:快照unit,后綴.snapshot, 用來管理快照
 9 類型6:target unit:目標unit,后綴是 .target,模擬centos5、6上的運行級別(主要是為了向后兼容)
10 類型7:swap unit
11 類型8:path unit

 

systemd的特性

 

1 特性1. 基於socket的激活機制
2     在啟動系統的時候,systemd會將所有要啟動的服務都標記已經啟動,標記的方式就是將所有要啟動的服務的套接字都監聽起來,但是是由systemd自己來監聽,而不是讓具體的服務自己來監聽,這樣就解決了進程之間的依賴關系。
3     當某個套接第一次被用戶的訪問的時候,systemd會立刻啟動這個套接字所對應的進程,然后將這個套接字和這個啟動的服務做綁定
4 特性2:基於bus機制激活
5 特性3:基於device機制激活
6 特性4:基於path機制激活
7     可以讓systemd監控某個某個目錄,當目錄中的文件發生更改的時候,立刻激活某個服務
8 特性5:支持快照機制
9 特性6:支持域兼容sysV風格的服務管理腳本

 

systemctl使用舉例

 

1.查看激活的服務

1     查看當前系統中全部已經被激活的unit:systemctl list-units --type service
2     查看當前系統中全部的unit(包括未激活的):systemctl list-units --type service --all

 2.開機自啟動關閉

1     設置某個服務開機自啟動:systemctl enable nginx.service
2     禁止某個服務開機自啟動:systemctl disable nginx.service
3     【設置開機自啟動,其實就是在/etc/systemd/system/multi-user.target.wants/下創建執行/usr/lib/systemd/system/下的配置文件的軟連接】
4 
5     查看當前系統中的全部unit的自動啟動情況:systemctl list-unit-files
6     state
7         disabled:禁止開機自動啟動
8         enabled:開機自動啟動
9         static:該unit不能獨立運行,是其他unit所依賴的

 3.查看是否自啟動

1     查看指定的服務是否開機自動啟動
2         systemctl list-unit-files | grep nginx.service
3         systemctl list-unit-files nginx.service
4         systemctl is-enabled nginx.service
5     查看一個unit的依賴關系:systemctl list-dependencies nginx.service
6     優先用reload,如果無法讓修改生效,才執行restart:systemctl reload-or-restart nginx.service

 4.禁止使用enable

1     禁止用enable讓某服務開機自啟動:systemctl mask nginx.service
2     解除禁止mask功能:systemctl unmask nginx.service
3 
4     注意:所有的.service可以省略

 5.切換級別

1     systemctl使用舉例-2
2     切換級別:systemctl isolate name.target
3 
4     切換到的救援模式(級別):systemctl rescure.tartet   <<< 切換到救援模式不需要用isolate

 6.查看默認級別

1     查看系統默認的運行級別:systemctl get-default
2     查看當前系統可用的target:systemctl list-units --type target
3     修改系統默認運行級別:systemctl set-default name.target

 

unit的文件的基本構成

 

第一部分:unit,用於記錄該unit文件的一些通用信息

第二部分:service,記錄service具體信息(如何啟動、配置文件位置...

第三部分:install,記錄安裝信息(運行級別)

 1 第一部分:Unit部分
 2     1)Description:對該服務的一個簡要說明
 3     2)Before:定義啟動順序,例子:Before=nginx.service,表示該服務需要在nginx啟動之前啟動
 4     3)After:定義啟動順序,同上
 5     4)Documentation:幫助文檔
 6     5)Wants:建議同時啟動某服務,比如:Wants=nginx.service 表示系統中最好啟動nginx服務,但是即使不啟動nginx,當前這個服務也沒啥影響
 7     6)Require:當前服務是需要哪個特定的服務的,比如:Require=nginx.service,這就表示當前服務是需要nginx服務,那么在啟動當前這個服務的時候,會自動將nginx也啟動起來;而且一旦發現nginx服務停止了,那么當前這個服務也就會自動停止
 8     【require無法指定啟動次序,需要結合Before After來用,否則經常出現各種問題】
 9     7)Conflicis:當一個服務啟動的時候,會立刻停止與之相沖突的服務
10 
11 第二部分:Service部分
12     1)Type:指定service的類型
13         類型1:oneshot:程序執行完成就自動結束了,沒有后台進程,比如執行一個shell
14         類型2:forking:需要一個后台守護進程一直在運行,比如運行nginx、apache、sshd
15     2)ExecStart:指定如何啟動服務(指定啟動服務要執行的命令)
16         如果服務類型是oneshot類型,那么可以直接寫上他要執行命令即可,通常不能添加參數和選項
17         如果服務類型不是oneshot類型,那么在寫要執行的命令的時候,可以添加一些參數,比如指定選項、配置文件、用戶
18         【如果要執行多個命令,那么多個命令之間用;分割,如果需要換行可以用 \ 來續行】
19     3)ExecStartPre, ExecStartPost:指定在執行啟動服務之前、之后要執行什么命令
20     4)ExecStop:停止服務
21     5)Restart:
22     6)PIDFile:指定pid文件的路徑
23 第三部分:install部分
24     WantedBy:指定運行級別,WantedBy=multi-user.target

 

案例:編寫unit文件,並注冊到systemd服務中

 

 1     第一步:准備一個shell腳本
 2         # vim /root/name.sh
 3             #!/bin/bash
 4             echo `hostname`>/tmp/name.log
 5 
 6     第二步:創建unit文件
 7         # vim my.service
 8             [Unit]
 9             Description=this is my first unit file
10 
11             [Service]
12             Type=oneshot
13             ExecStart=/bin/bash /root/name.sh
14 
15             [Install]
16             WantedBy=multi-user.target
17 
18 
19         # mv my.service /usr/lib/systemd/system
20 
21     第三步:將我的unit文件注冊到systemd中
22         # systemctl enable my.service
23 
24     第四步:查看該服務的狀態
25         # systemctl status my.service

 

擴展

 

1.grub2的配置文件-/etc/default/grub 

 1     # 指定用戶選擇菜單超時時間
 2     GRUB_TIMEOUT=5      
 3 
 4     # 指定菜單中的描述名稱    
 5     GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
 6 
 7     # GRUB指定哪個是默認的title
 8     # save表示會保存當前的配置,需要結合一個內置變量來使用
 9     GRUB_DEFAULT=saved
10 
11     # 禁用子菜單
12     GRUB_DISABLE_SUBMENU=true
13 
14     # 指定將啟動過程中的信息輸出到終端
15     GRUB_TERMINAL_OUTPUT="console"
16 
17     # 在啟動系統的時候,以命令行的方式向內核傳遞參數
18     GRUB_CMDLINE_LINUX="crashkernel=auto rhgb "
19 
20     # 指定是否顯示啟動過程信息
21     GRUB_DISABLE_RECOVERY="true"

2.定制grub2的配置文件

1     第一步:備份原有的grub.cfg
2         # cp /boot/grub2/grub.cfg{,.bak}
3 
4     第二步:修改/etc/default/grub 
5 
6     第三步:重新生成grub.cfg
7         # grub2-mkconfig>/boot/grub2/grub.cfg

3.CentOS7忘記密碼解決方法

 1         進入緊急救援模式
 2         進入方式:在啟動系統的時候,編輯內核選項,添加 rd.break,然后按ctrl+x
 3         進入救援模式后:
 4             1. 根在 sysroot 下
 5             2. 當前是只讀權限
 6 
 7         操作:
 8             # mount -o remount,rw /sysroot
 9             # chroot /sysroot
10             # passwd 
11                 xxx
12                 xxx
13             # exit
14             # reboot

 

進入救援模式方法

 

1 概述

要使得linux進入救援模式,原則其實就是一個,通過光盤啟動模式進入,所以,就要想辦法讓機器能從光盤啟動。

本文主要模擬了Vmware下的操作。如果是真實機器,操作前將光盤插入機器里即可

2 CentOS6

首先在重新開機時當出現下面這個接界面時按esc進入到Boot Menu。(ps:如果是虛擬機,要提前按一下鼠標,按鼠標模式是在虛擬機內操作,不是本地機器的操作,然后,手速要快,在進度條滿之前按,只能按一下,按多了也進不去)

備注:這里如果按F2進入BIOS然后在設置光盤啟動項為第一項也是可以,但是不推薦,因為還要改回來,要不然每次都是光盤第一啟動,很麻煩

 

1240

上下鍵選擇第三項CD-ROM Drive,光盤啟動

1240

再選擇第三項救援模式

1240

選擇語言,默認English就行

1240

1240

選擇No跳過網口檢測

1240

點擊繼續

1240

這里提示我們,救援模式下的根目錄不是我們以前的根目錄,而/mnt.sysimage這個目錄才是我沒以前的根目錄,如果想要變回以前的根目錄需要執行chroot /mnt/sysimage命令

1240

再一次提示我們根目錄的問題

1240

這時候選擇開啟shell進程,這樣我們就可以使用命令了。

1240

1240

 

3 CentOS7

centOS7進入圖一 troubleshooting有兩個方法

方法一

首先在重新開機時當出現下面這個接界面時按esc進入到Boot Menu。(ps:如果是虛擬機,要提前按一下鼠標,按鼠標模式是在虛擬機內操作,不是本地機器的操作,然后,手速要快,在進度條滿之前按,只能按一下,按多了也進不去)

1240

上下鍵選擇第三項CD-ROM Drive,光盤啟動

1240

方法二

虛擬機開機按F12--》c-->輸入exit --》

以上兩個方法都可以進入troubleshooting頁面,接下來步驟一樣

 圖一 選擇troubleshooting --> 圖二 選擇Rescue,等待加載--》選擇 選項1,等待一會兒,按enter,就可以進入救援模式

 

1240

圖一 選擇troubleshooting

 

1240

圖二 選擇Rescue

 

1240


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM