1. 程式人生 > >systemd服務詳解-技術流ken

systemd服務詳解-技術流ken

1.簡介

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

2.systemd的特性

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

2 systemd所管理的服務可以實現按需啟用

3 支援系統服務狀態快照

4 可以定義程式之間依賴關係

3.unit介紹

unit的配置檔案是uit的核心,在配置檔案中主要包含一下

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

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

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

4. 其他和init相關的配置

unit配置檔案的位置

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

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

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

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

4.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

5.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風格的服務管理指令碼

6systemctl使用舉例

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

7.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

8.案例:編寫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

9.擴充套件

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

 10.進入救援模式方法

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