Systemd
本章節內容:
CentOS7啟動
Unit介紹
服務管理和查看
啟動排錯
破解口令
修復grub2
1、 CentOS啟動流程:POST –> Boot Sequence –> Bootloader –> kernel + initramfs(initrd) –> rootfs–> /sbin/init
UEFi或BIOS初始化,運行POST開機自檢
選擇啟動設備
引導裝載程序, centos7是grub2
加載裝載程序的配置文件:/etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg(注:一般上修改grub.cfg配置文件,是直接修改/etc/default/grub,然后使用命令#grub2-mkconfig /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需要的服務(此為圖形界面所有)
2、Systemd:系統啟動和服務器守護進程管理器,負責在系統啟動或運行時,激活系統資源,服務器進程和其它進程
3、Systemd新特性:
系統引導時實現服務并行啟動
按需啟動守護進程(端口與服務獨立分離)
自動化的服務依賴關系管理
同時采用socket式與D-Bus總線式激活服務
系統狀態快照
4、Unit介紹:unit表示不同類型的systemd對象,通過配置文件進行標識和配置;文件中主要包含了系統服務、監聽socket、保存的系統快照以及其它與init相關的信息
配置文件:/usr/lib/systemd/system:每個服務最主要的啟動腳本設置,類似于之前的/etc/init.d/
/run/systemd/system:系統執行過程中所產生的服務腳本,比上面目錄優先運行
/etc/systemd/system:管理員建立的執行腳本,類似于/etc/rc.d/rcN.d/Sxx類的功能,比上面目錄優先運行
5、Unit類型:
systemctl -t help 查看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,用于定義文件系統中的一個文件或目錄使用,常用于當文件系統變化時,延遲激活服務,如:spool 目錄
6、Systemd的特性:
關鍵特性:
基于socket的激活機制:socket與服務程序分離
基于d-bus的激活機制:
基于device的激活機制:
基于path的激活機制:
系統快照:保存各unit的當前狀態信息于持久存儲設備中
向后兼容sysvinit腳本
不兼容:
systemctl命令固定不變,不可擴展
非由systemd啟動的服務,systemctl無法與之通信和控制
7、Systemd管理服務:
管理系統服務:CentOS 7: service unit
注意:能兼容早期的服務腳本
命令:systemctlCOMMAND name.service
啟動:service name start ==> systemctlstart name.service
停止:service name stop ==> systemctlstop name.service
重啟:service name restart ==> systemctlrestart name.service
狀態:service name status ==> systemctlstatus name.service
條件式重啟:已啟動才重啟,否則不做操作
service name condrestart==> systemctl try-restart name.service
重載或重啟服務:先加載,再啟動
systemctl reload-or-restart name.service
重載或條件式重啟服務:systemctl reload-or-try-restart name.service
禁止自動和手動啟動:systemctl mask name.service
取消禁止:systemctl unmask name.service
查看某服務當前激活與否的狀態:systemctl is-active name.service
查看所有的服務:systemctl list-unit-files –type|-t service
查看所有激活的服務:systemctl list-units –type service –all|-a
設定某服務開機自啟(chkconfig命令的對應關系):chkconfig name on ==> systemctlenable name.service
設定某服務開機禁止啟動:chkconfig name off ==> systemctl disable name.service
查看所有服務的開機自啟狀態:
chkconfig–list ==> systemctl list-unit-files –type service
用來列出該服務在哪些運行級別下啟用和禁用
chkconfig sshd -list ==>ls /etc/systemd/system/*.wants/sshd.service
查看服務是否開機自啟:systemctl is-enabled name.service
其它命令:查看服務的依賴關系:systemctl list-dependencies name.service
殺掉進程:systemctlkill 進程名
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,使之不能自動啟動,但手動可以:systemctl disable network
啟用network:systemctl enable network
禁用network,使之不能手動或自動啟動:systemclt mask network
啟用network:systemctl umask network
7、服務狀態:
systemctl list-units –type service –all顯示狀態
loaded:Unit配置文件已處理
active(running):一次或多次持續處理的運行
active(exited):成功完成一次性的配置
active(waiting):運行中,等待一個事件
inactive:不運行
enabled:開機啟動
disabled:開機不啟動
static:開機不啟動,但可被另一個啟用的服務激活
8、運行級別:target units
unit配置文件:.target
ls /usr/lib/systemd/system/*.target
systemctl list-unit-files –type target –all
級別切換:init N ==> systemctl isolate name.target
eg:systemctl isolate multi-user.target
注:只有/lib/systemd/system/multi-user.target t文件中AllowIsolate=yes 才能切換(修改文件需執行systemctl daemon-reload才能生效)
查看target:runlevel 或who -r
systemctl list-units –type target
獲取默認運行級別:/etc/inittab==> systemctl get-default
修改默認級別:/etc/inittab==> systemctl set-default name.target
systemctl set-default multi-user.target
ls -l /etc/systemd/system/default.target
9、其他命令:
切換至緊急救援模式:systemctl rescue
切換至emergency模式:systemctl emergency (注:當切換到緊急救援模式失敗,可以嘗試切換到該模式救援)
其它常用命令:
傳統命令init,poweroff,halt,reboot都成為systemctl的軟鏈接:
關機:systemctl halt、systemctlpower off
重啟:systemctl reboot
掛起:systemctl suspend
休眠:systemctl hibernate
休眠并掛起:systemctl hybrid-sleep
10、service units 文件格式:
/etc/systemd/system:系統管理員和用戶使用
/usr/lib/systemd/system:發行版打包者使用
以“#” 開頭的行后面的內容會被認為是注釋
相關布爾值,1、yes、on、true 都是開啟,0、no、off、false 都是關閉。
時間單位默認是秒,所以要用毫秒(ms)分鐘(m)等請顯式說明
service unit file文件通常由三部分組成
[Unit]:定義與Unit類型無關的通用選項;用于提供unit的描述信息、unit行為及依賴關系等
[Service]:與特定類型相關的專用選項;此處為Service類型
[Install]:定義由“systemctl enable”以及"systemctl disable“命令在實現服務啟用或禁用時用到的一些選項
(1)Unit段的常用選項:
Description:描述信息
After:定義unit的啟動次序,表示當前unit應該晚于哪些unit啟動,其功能與Before相反
Requires:依賴到的其它units,強依賴,被依賴的units無法激活時,當前unit即無法激活
Wants:依賴到的其它units,弱依賴
Conflicts:定義units間的沖突關系
(2)Service段的常用選項:Type(定義影響ExecStart及相關參數的功能的unit進程啟動類型)
simple:默認值,這個daemon主要由ExecStart接的指令串來啟動,啟動后常駐于內存中
forking:由ExecStart啟動的程序透過spawns延伸出其他子程序來作為此daemon的主要服務。原生父程序在啟動結束后就會終止
oneshot:與simple類似,不過這個程序在工作完畢后就結束了,不會常駐在內存中
dbus:與simple類似,但這個daemon必須要在取得一個D-Bus的名稱后,才會繼續運作.因此通常也要同時設定BusNname= 才行
notify:在啟動完成后會發送一個通知消息。還需要配合NotifyAccess 來讓Systemd 接收消息
idle:與simple類似,要執行這個daemon必須要所有的工作都順利執行完畢后才會執行。這類的daemon通常是開機到最后才執行即可的服務
EnvironmentFile:環境配置文件
ExecStart:指明啟動unit要運行命令或腳本的絕對路徑
ExecStartPre:ExecStart前運行
ExecStartPost:ExecStart后運行
ExecStop:指明停止unit要運行的命令或腳本
Restart:當設定Restart=1 時,則當次daemon服務意外終止后,會再次自動啟動此服務
(3)Install段的常用選項:
Alias:別名,可使用systemctl command Alias.service
RequiredBy:被哪些units所依賴,強依賴
WantedBy:被哪些units所依賴,弱依賴
Also:安裝本服務的時候還要安裝別的相關服務
注意:對于新創建的unit文件,或者修改了的unit文件,要通知systemd重載此配置文件,而后可以選擇重啟
# systemctl daemon-reload
事例: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
11、設置內核參數,只影響當次啟動
啟動時,在linux16行后添加systemd.unit=desired.target
systemd.unit=emergency.target
systemd.unit=recure.target
recure.target 比emergency 支持更多的功能,例如日志等
12、啟動排錯:
文件系統損壞:先嘗試自動修復,失敗則進入emergency shell,提示用戶修復
在/etc/fstab不存在對應的設備和UUID,一段時間,如不可用,進入emergency shell
在/etc/fstab不存在對應掛載點,systemd嘗試創建掛載點,否則提示進入emergency shell.
在/etc/fstab不正確的掛載選項,提示進入emergency shell
13、破解root密碼:
啟動時任意鍵暫停啟動
按e鍵進入編輯模式
將光標移動linux16開始的行,添加內核參數rd.break
按ctrl-x啟動
#mount –o remount,rw /sysroot
#chroot /sysroot
#passwd root
#touch /.autorelabel
#exit
#exit
14、修改grub2:
GRUB“the Grand Unified Bootloader”
引導提示時可以使用命令行界面
可從文件系統引導
主要配置文件/boot/grub2/grub.cfg
修復配置文件:grub2-mkconfig > /boot/grub2/grub.cfg(grub2-mkconfig -o /boot/grub2/grub.cfg)
修復grub:grub2-install /dev/sda BIOS環境
grub2-install UEFI環境
習題:
1、 為編譯安裝的httpd服務,實現service unit文件
編譯安裝httpd:#./configure –prefix=/usr/local/httpd –sysconfdir=/etc/httpd
編寫httpd的服務Unit:
2、破解centos7 口令
在linux16該行的后面輸入rd.break完成后,使用Ctrl+x啟動系統
下圖為進入破解的命令行操作界面:
執行破解的步驟:
注:需要等待一段時間,修改過后root的密碼,系統需要掃描整個磁盤的文件,將沒有安全標簽的文件給打上標簽。
3、修改默認的啟動內核
#vim /etc/default/grub
4、啟動時臨時禁用SELinux
5、啟動時進入emergency模式
輸入root的密碼后得到下圖的界面:
6、刪除編譯安裝的新內核
#rm -rf /boot/*.3.18.41*
#vim /boot/grub2/grub.cfg 刪除相應的kernel信息
#rm -rf /lib/modules/3.18.41*
#rm -rf /usr/src/linux-3.18.41 (一般建議在編譯安裝完成后,將相應的源碼文件刪除掉)
1、求每班總成績和平均成績
name class score
wang 1 100
zhang 2 90
li 1 80
方法一:
# awk '!/^name/{if($2==1){num1++;sum1+=$3}else{num2++;sum2+=$3}}END{print "class1",sum1,
sum1/num1,"\n""class2",sum2,sum2/num2}' score
方法二:
# awk '!/^name/{class[$2]++;sum[$2]+=$3}END{for(i in class){print i,sum[i],sum[i]/class[i]}}' score
原創文章,作者:Aaron_wang,如若轉載,請注明出處:http://www.www58058.com/48563
文章知識總結的很詳細,贊一個