http://www.aichengxu.com/linux/11318300.htm
這篇着重講解下Syetemd的相關知識,systemd可以說是centos7上的重大改革,功能之強大媲美一個作業系統,那下面就從以下幾點來進行講解:
CentOS7啟動
Unit介紹
服務管理和檢視
啟動排錯
破解密碼
修複grub2
啟動流程:
post-->BISO-->bootloader(MBR)-->kernel(ramdisk)-->rootfs-->/sbin/init
init程式:
不同系統上的init程式版本
centos5:Sysv lnit
centos6:Upstart
centos7:systemd 系統守護程序
systemd介紹
Systemd:系統啟動和伺服器守護程序管理器,負責在系統啟動或運作時,激活系統資源,伺服器程序和其它程序
systemd的新特性:
系統引導時實作服務并行啟動;實作快速開機
按需啟動守護程序:
能自動儲存系統狀态快照:
基于依賴關系定義服務控制邏輯:(自動化的服務依賴關系管理)
同時采用socket式與D-Bus總線式激活服務
systemd核心概念:
unit(單元):
unit表示不同類型的systemd對象
unit由其相關的配置檔案進行辨別,識别和配置.
相關檔案中主要包含了系統服務,監聽的socket,儲存的快照以及其他與init相關的資訊;
這些配置檔案主要儲存在
/usr/lib/systemd/system:每個服務最主要的啟動腳本設定,類似于之前的/etc/init.d/
/run/systemd/system:系統執行過程中所産生的服務腳本,比上面目錄優先運作
/etc/systemd/system:管理者建立的執行腳本,類似于/etc/rc.d/rcN.d/Sxx類的功能,比上面目錄優先運作
unit的常見類别:

Service unit:檔案擴充名為.service,用于定義系統服務,類似服務腳本
Target unit:檔案擴充為.target,用于模拟實作"運作級别";與/etc/inittab不一樣,隻是為了對應老版本的系統
Device unit:.device,用于定義核心識别的裝置;centos6下,/dev目錄下的裝置檔案是由udev根據/sys/目錄下由核心探測輸出的資訊而建立的,對centos7來說,/dev目錄下是由systemd和udev聯合建立的,主要由systemd完成.systemd識别硬體,主要靠*.device檔案.
Mount unit:.mount,用于定義檔案系統挂載點;kernel 3.0版本後的系統,大都是用cgroup(k控制組)來實作資源配置設定.mount後看到大量的cgroup資訊,cgroup實作對資源配置設定的一種核心中的資源配置設定的機制.systemd負責對cgroup的激活,實作資源配置設定.
Socket unit:.socket,用于辨別程序間通信用到的socket檔案.任何主機監聽在一個套接字上,任何程序監聽在一個套接字上,或者任何程序打開一個随機端口去與别的伺服器的程序進行通道,都要建立socket檔案.現在這些建立等功能是有systemd負責管理實作的
Snapshot unit:.snapshot,管理系統快照
Swap unit:.swap,用于表示swap裝置
Autommount unit:.autommount,檔案系統自動挂載點裝置
Path unit:.path,用于定于檔案系統中的一檔案或目錄使用,常用于當檔案系統發生變化時,延遲激活服務,如: spool 目錄
關鍵特性:
基于socket的激活機制,socket與程式分離;
基于D-bus(總線)的激活機制;如果總線上有對某一個服務的通路,那麼就基于總線的請求,将某一裝置激活
基于device的激活機制;當某個裝置插入,能自動激活mount unit和deviceunit或autommount unit,能監控目前系統和核心所輸出的硬體資訊,一旦發現某個硬體出現,先建立裝置檔案,在自動挂載至某挂載點;挂載點不存在,還能自動建立.
基于Path的激活機制;系統能夠監控某個目錄或檔案的存在,來激活一個服務或程序;比如說,某個程序崩潰時建立一個鎖檔案,系統會根據判斷鎖檔案的存在,去啟動另一個程序來判斷,崩潰程序的原因;
系統快照:儲存各unit的目前狀态資訊于持久儲存設備中;
向後相容sysv lnit腳本:/etc/init.d/下的服務腳本
不相容:
systemctl的指令是固定不變的;
非由systemd啟動的服務,systemctl無法與之通信,控制服務;
管理系統服務:
centos7:service類型的unit檔案;
所有指令要靠systemctl控制;
注意:能相容早期的服務腳本
systemctl指令:
名稱:Control the systemd system and service manager
格式: systemctl [OPTIONS...] COMMAND NAME[.service]
指令示例
啟動服務:service NAME start --> systemctl start NAME.service
停止服務:service NAME stop --> systemctl stop NAME.service
重新開機服務:service NAME restart --> systemctl restart NAME.service
檢視狀态:service NAME status --> systemctl status NAME.service
條件式重新開機服務:service NAME condrestart--> systemctl try-restart-NAME.service
重載或重新開機服務:systemctl reload-or-restart NAME.service
重載或條件式重新開機:systemctl reload-or-try-restart NAME.service
檢視某服務目前激活與否的狀态:systemctl is-active NAME.service
檢視所有已激活的服務:systemctl list-units -t service
檢視所有服務(激活和未激活):chkconfig --list-->systemctl list-units -t service -a
檢視所有服務的開機自啟狀态:
chkconfig --list ==> systemctl list-unit-files --type service
設定服務開機自啟:chkconfig NAME on --> systemctl enable NAME.service
禁止服務開機自啟:chkconfig NAME off --> systemctl disable NAME.service
檢視某服務是否能開機自啟:chkconfig --list NAME --> systemctl is-enabled NAME.service
禁止某服務設定為開機自啟或手動啟動:systemctl mask NAME.service
取消禁止某服務設定為開機自啟或手動啟動:systemctl unmask NAME.service
檢視服務的依賴關系:systemctl list-dependencies NAME.service
用來列出該服務在哪些運作級别下啟用和禁用:chkconfig sshd –list ==>ls /etc/systemd/system/*.wants/sshd.service
殺掉程序:systemctl kill 程序名
服務狀态:
systemctl list-units --type service --all顯示狀态
loaded:Unit配置檔案已處理
active(running):一次或多次持續處理的運作
active(exited):成功完成一次性的配置
active(waiting):運作中,等待一個事件
inactive:不運作
enabled:開機啟動
disabled:開機不啟動
static:開機不啟動,但可被另一個啟用的服務激活
systemctl指令示例:
顯示所有單元狀态
systemctl 或 systemctl list-units
隻顯示服務單元的狀态
systemctl --type=service
顯示sshd服務單元
systemctl status sshd.service –l
驗證sshd服務目前是否活動
systemctl is-active sshd
啟動,停止和重新開機sshd服務
systemctl start sshd.service
systemctl stop sshd.service
systemctl restart sshd.service
重新加載配置
systemctl reload sshd.service
列出活動狀态的所有服務單元
systemctl list-units --type=service
列出所有服務單元
systemctl list-units --type=service --all
檢視服務單元的啟用和禁用狀态。
systemctl list-unit-files --type=service
列出失敗的服務
systemctl --failed --type=service
列出依賴的單元
systemctl list-dependencies sshd
驗證sshd服務是否開機啟動
systemctl is-enabled sshd
禁用network,使之不能自動啟動,但手動可以
systemclt disable network
啟用network
systemctl enable network
禁用network,使之不能手動或自動啟動
systemclt mask network
啟用network
systemctl umask network
管理target units:
unit配置檔案: .target
ls /usr/lib/systemd/system/*.target
systemctl list-unit-files --type target --all
運作級别:
0 ==> runlevel0.target,poweroff.target
1 ==> runlevel1.target,rescue.target
2 ==> runlevel2.target,multi-user.target
3 ==> runlevel3.target,multi-user.target
4 ==> runlevel4.target,multi-user.target
5 ==> runlevel5.target,graphical.target
6 ==> runlevel6.target,reboot.target
檢視依賴性:
systemctl list-dependencies NAME.target
級别切換:
centos6: init N
centos7: systemctl isolate NAME.target
注: 隻有/lib/systemd/system/*.target檔案中AllowIsolate=yes 才能切換(修改檔案需執行systemctl daemonreload才能生效)
檢視級别:
centos6:runlevel 或者 who -r
centos7:systemctl list-units -t target
檢視所有級别:systemctl list-units -t target -a
擷取預設運作級别:sytemctl get-default
修改預設運作級别:
systemctl set-default NAME.target
ls –l /etc/systemd/system/default.target
切換至緊急救援(級别1)模式:systemctl rescue
切換至emergency(緊急)模式:各種驅動不會被加載,各種系統初始化功能不會被加載.是真正的實作系統救援的模式:因驅動不相容導緻系統崩潰,适合切換此模式救援.
systemctl emergency
其他常用指令:
關機:systemctl halt,systemctl poweroff
重新開機:systemctl reboot
挂起:systemctl suspend
快照:systemctl hlbernate
快照并挂起:systemctl hybrid-sleep
修改運作級别就是修改/etc/systemd/system/default.target的連接配接檔案
centos 7 引導順序
UEFi或BIOS初始化,運作POST開機自檢
選擇啟動裝置
引導裝載程式, centos7是grub2
加載裝載程式的配置檔案: /etc/grub.d/
/etc/default/grub /boot/grub2/grub.cfg
加載initramfs驅動子產品
加載核心選項
核心初始化, centos7使用systemd代替init
執行initrd.target所有單元,包括挂載/etc/fstab
從initramfs根檔案系統切換到磁盤根目錄
systemd執行預設target配置,配置檔案
/etc/systemd/default.target /etc/systemd/system/
systemd執行sysinit.target初始化系統及basic.target準備操
作系統
systemd啟動multi-user.target下的本機與伺服器服務
systemd執行multi-user.target下的/etc/rc.d/rc.local
Systemd執行multi-user.target下的getty.target及登入服
務
systemd執行graphical需要的服務
service target file:
/etc/systemd/system:系統管理者和使用者使用
/usr/lib/systemd/system:發行版打包者使用
以 “ #” 開頭的行後面的内容會被認為是注釋
相關布爾值, 1、 yes、 on、 true 都是開啟, 0、 no、 off、false 都是關閉。
時間機關預設是秒,是以要用毫秒( ms)分鐘( m)等請顯式說明
檔案通常有三部分組成:
[Unit]:定義與Unit類型無關的通用選項;用于提供unit的描述資訊,unit行為及依賴關系
Description:意義性描述資訊 "systemctl status NAME"指令 可顯示
After:定義unit的啟動次序;表示目前unit應該晚與那些unit啟動;
Requles:定義依賴到的其他unit;強依賴關系,隻有依賴的unit啟動,此unit才能啟動;任何依賴unit啟動不了,目前unit就無法激活
Wants:定義依賴到的其他unit;弱依賴關系;被依賴的unit對本身的啟動影響不大.
Conflicts:定義unit間的沖突關系
Documentation=man:httpd(8) 文檔的路徑
Documentation=man:apachectl(8)
[Service]:定義與特定類型相關的專用選項;此處為Service類型
Type=notify 用來定義影響execstart及相關參數的功能的unit程序啟動類型
類型:
simple:預設值,表示由execstart啟動的程序是主程序
forking: 表示由execstart指明的程式所啟動的程序生成的一個子程序為主程序,啟動完成後,父程序會退出;
oneshot:類似于simple,在啟動後續的unit前,父程序會退出;一次性的
dbus:類似于simple,後續的unit僅在主程序得到dbus之後,才能啟動;
notify:類似于simple,表示後續的unit僅在通過sdbotify函數發送通知以後,然後才能運作這個指令
ldle:與simple類似,要執行這個daemon必須要所有的工作都順利執行完畢後才會執行。這類的daemon通常是開機到最後才執行即可的服務
EnvironmentFile=/etc/sysconfig/httpd 指定啟動unit時要用到的環境配置檔案,從這個檔案中調用變量
ExecStart=指明啟動unit要t運作的指令或腳本
ExecReload:指明重新加載unit要運作的指令或腳本
ExecStop: 指明停止unit要運作的指令或腳本
Restart:當設定Restart=1 時,則當次daemon服務意外終止後,會再次自動啟動此服務
[Install]:定義由"systemctl enable"以及"systemctl disable"指令在實作服務啟動或禁用時用到的一些選項
Alias:目前unit的别名
RequiredBy:被那些units所依賴;依賴于目前unit的unit清單;強依賴
WantedBy:被那些units所依賴;弱依賴
Also:安裝本服務的時候還要安裝别的相關服務
注意:對于新建立的unit檔案或修改了的init檔案,要通知systemd重載次配置檔案.
#systemctl daemon-reload
#systemctl restart NAME.service
練習:為目前系統的httpd服務提供一個unit檔案;
#vim /etc/systemd/system/bak.service
[Unit]
Description=backup my etc
Requires=atd.service
[Service]
Type=simple
ExecStart=/bin/bash -c "echo /testdir/bak.sh|at now"
[Install]
WantedBy=multi-user.target
#systemctl daemon-reload
#systemctl start bak
設定核心參數進入特殊運作級别
設定核心參數,隻影響當次啟動
啟動時,在linux16行後添加systemd.unit=desired.target
systemd.unit=emergency.target
systemd.unit=recure.target
recure.target 比emergency 支援更多的功能,例如日志等
啟動排錯
檔案系統損壞
先嘗試自動修複,失敗則進入emergency shell,提示使用者修複
在/etc/fstab不存在對應的裝置和UUID等一段時間,如不可用,進入emergency shell
在/etc/fstab不存在對應挂載點
systemd 嘗試建立挂載點,否則提示進入emergency shell.
在/etc/fstab不正确的挂載選項
提示進入emergency shell
centos 7 破解root密碼
啟動時任意鍵暫停啟動按e鍵進入編輯模式
将光标移動linux16開始的行,添加核心參數rd.break
按ctrl-x啟動
mount –o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabel
修複GRUB2
GRUB“ the Grand Unified Bootloader”
引導提示時可以使用指令行界面
可從檔案系統引導
主要配置檔案 /boot/grub2/grub.cfg
修複配置檔案
grub2-mkconfig > /boot/grub2/grub.cfg
修複grub
grub2-install /dev/sda BIOS環境
grub2-install UEFI環境
實戰演練:
為編譯安裝的httpd服務,實作service unit檔案
破解centos7 密碼
修改預設的啟動核心
啟動時臨時禁用SELinux
啟動時進入emergency模式
删除編譯安裝的新核心