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/system3 注意: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然後在設定光碟啟動項為第一項也是可以,但是不推薦,因為還要改回來,要不然每次都是光碟第一啟動,很麻煩
上下鍵選擇第三項CD-ROM Drive,光碟啟動
再選擇第三項救援模式
選擇語言,預設English就行
選擇No跳過網口檢測
點選繼續
這裡提示我們,救援模式下的根目錄不是我們以前的根目錄,而/mnt.sysimage這個目錄才是我沒以前的根目錄,如果想要變回以前的根目錄需要執行chroot /mnt/sysimage命令
再一次提示我們根目錄的問題
這時候選擇開啟shell程序,這樣我們就可以使用命令了。
3 CentOS7
centOS7進入圖一 troubleshooting有兩個方法
方法一
首先在重新開機時當出現下面這個接介面時按esc進入到Boot Menu。(ps:如果是虛擬機器,要提前按一下滑鼠,按滑鼠模式是在虛擬機器內操作,不是本地機器的操作,然後,手速要快,在進度條滿之前按,只能按一下,按多了也進不去)
上下鍵選擇第三項CD-ROM Drive,光碟啟動
方法二
虛擬機器開機按F12--》c-->輸入exit --》
以上兩個方法都可以進入troubleshooting頁面,接下來步驟一樣
圖一 選擇troubleshooting --> 圖二 選擇Rescue,等待載入--》選擇 選項1,等待一會兒,按enter,就可以進入救援模式
圖一 選擇troubleshooting
圖二 選擇Rescue