systemd
- POST --> Boot Sequence --> Bootloader --> kernel + initramfs(initrd) --> rootfs --> /sbin/init
init: CentOS 5 SysV init
CentOS 6 Upstart
CentOS 7 Systemdlinux
- Systemd:系統啓動和服務器守護進程管理器,負責在系統啓動或運行時,激活系統資源,服務器進程和其它進程,它很是強大,包含了許多功能(好比xinetd等),以往的好多模塊功能都被集合在一塊兒了
- Systemd新特性
- 系統引導時實現服務並行啓動
- 按需啓動守護進程(相似xinetd)
- 自動化的服務依賴關係管理:某個服務須要依賴於其餘服務的時候,當啓動它時會自動啓動須要依賴的服務,而早期沒有此功能
- 同時採用socket式與D-Bus總線式激活服務
- 系統狀態快照
比較5 6 7 啓動流程:
5:所有串行啓動,一個接一個啓動
6:非依賴性的驅動,軟件,服務等並行啓動,有依賴性的串行啓動
7:所有並行啓動,依賴性先忽略,服務先啓動,等到用戶真正使用和訪問服務的時候再去查看依賴性,而後再相應啓動依賴的服務。nginx
核心概念:unit
unit表示不一樣類型的systemd對象,經過配置文件進行標識和配置;文件中主要包含了系統服務、監聽socket、保存的系統快照以及其它與init相關的信息shell
- 配置文件
/usr/lib/systemd/system:每一個服務最主要的啓動腳本設置,相似於以前的/etc/init.d/
/run/systemd/system:系統執行過程當中所產生的服務腳本,比上面目錄優先運行
/etc/systemd/system:管理員創建的執行腳本,相似於/etc/rcN.d/Sxx的功能,比上面目錄優先運行
Unit類型
systemctl –t help 查看unit類型
service unit: 文件擴展名爲.service, 用於定義系統服務
Target unit: 文件擴展名爲.target,用於模擬實現運行級別(相似於runlevel)
Device unit: .device, 用於定義內核識別的設備
Mount unit: .mount, 定義文件系統掛載點
Socket unit: .socket,用於標識進程間通訊用的socket文件,也可在系統啓動時,延遲啓動服務,實現按需啓動
Snapshot unit: .snapshot, 管理系統快照
Swap unit: .swap, 用於標識swap設備
Automount unit: .automount,文件系統的自動掛載點
Path unit: .path,用於定義文件系統中的一個文件或目錄使用,經常使用於當文件系統變化時,延遲激活服務,如:spool 目錄vim
特性
- 關鍵特性:
基於socket的激活機制:socket與服務程序分離
基於d-bus的激活機制:
基於device的激活機制:
基於path的激活機制:
系統快照:保存各unit的當前狀態信息於持久存儲設備中
向後兼容sysv init腳本
- 不兼容:
systemctl命令固定不變,不可擴展
非由systemd啓動的服務,systemctl沒法與之通訊和控制
管理系統服務:
- CentOS 7: service unit
注意:能兼容早期的服務腳本
命令:systemctl 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 mask name.service
取消禁止:
systemctl unmask name.service
- 具備相似相同功能的兩個服務有衝突,(好比httpd和 nginx 都是tcp80端口等),讓其中一個服務禁止啓動先。
服務查看
查看某服務當前激活與否的狀態:(可用$?查看結果,0表明啓動)
systemctl is-active name.service
查看是否開機啓動的服務:
systemctl is-enabled name.service
查看全部已經激活的服務:
systemctl list-units --type|-t service
查看全部服務:
systemctl list-units --type service --all|-ac#
- chkconfig命令的對應關係:
設定某服務開機自啓:
chkconfig name on ==> systemctl enable 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.servicewindows
- 其它命令:
查看服務的依賴關係:
systemctl list-dependencies name.service
殺掉進程:
systemctl kill unitname
服務狀態
systemctl list-unit-files --type service --all顯示狀態
loaded Unit配置文件已處理
active(running) 一次或屢次持續處理的運行
active(exited) 成功完成一次性的配置
active(waiting) 運行中,等待一個事件
inactive 不運行
enabled 開機啓動
disabled 開機不啓動
static 開機不啓動,但可被另外一個啓用的服務激活centos
systemctl命令示例
- 顯示全部單元狀態
systemctl 或 systemctl list-units
- 只顯示服務單元的狀態
systemctl --type=service
- 顯示sshd服務單元
systemctl –l status sshd.service
- 驗證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,使之不能手動或自動啓動
systemctl mask network
- 啓用network
systemctl unmask network
注意點1:
- /usr/lib/systemd/system中不只包含了之前的相似的各類服務(如今以.service結尾),並且包含了其餘unit單元類型(看後綴可區別),它是最關鍵的目錄,通常都是修改此目錄的文件。而run和etc下的通常不會去修改,由系統本身調控。
- systemctl 默認執行目標的unit單元類型就是service,會自動補上service後綴,所以可省略不寫它。
- 主要關注service ,target 有時會看一下socket單元。其餘的通常由系統調控。其中target單元保留了centos6中的runlevel 0-6 ,同時還增長了更多。
- 新特性socket和服務(service)相分離並可激活,即便服務不啓動,socket也能監聽對應的端口核協議等,當訪問服務時,socket會把沒激活的服務自動激活。(相似於xinetd的功能了,systemd自己就可基於此功能來監聽服務和激活,好比telnet,rpcbind. )
- 就算服務service中止了,socket也能夠啓用。好比rpcbind.service關閉可是rpcbind.socket仍然激活(並處於listening)狀態。所以當有人訪問端口時就會自動激活服務。也正是由於這個機制,它也會把具備依賴性的服務給一併啓動。
- 而之前老版本的必須是服務啓動後socket才啓動,而且它們不能分離,服務關閉了,socket也關閉。
- 示例:再好比telnet-server服務在centos7上安裝後就會在usr/lib/systemd/system下出現telnet.socket和telnet.service兩個文件,而不像centos6中的是有一個/etc/xinetd/telnet配置文件。此時激活socket而後用ss -ntlp 可看到23端口是有systemd來監聽的,而不是xinetd。而此時telnet自己的進程並未啓動。
- systemd的unit所有是由systemctl二進制可執行程序來配置,而不像centos6中能夠本身在init.d中添加服務腳本並本身編寫各類功能(各類參數好比start,stop等均可以本身編寫)。所以systemd中必須按照systemctl的功能來使用。
- centos7中能夠一次性處理多個服務,6中不行。7中成功操做沒有任何提示,6中會有OK字樣。
- 重要點:systemctl命令當用enable,disable,mask,unmask等命令時,就是在/etc/systemd/system中建立同名的unit軟連接指向/usr/lib/systemd/system中真正的unit文件或者刪除軟連接(mask就是建立軟鏈接並指向/dev/null,unmask刪除它)。由於etc的文件夾的優先級比usr中的高,所以就實現了配置調控的功能。
- systemcl enable和disable就是在/etc/systemd/system/multi-user.target.wants/ 建立和刪除軟連接來控制開機是否啓動服務。
service unit文件格式
/etc/systemd/system:系統管理員和用戶使用/usr/lib/systemd/system:發行版打包者使用bash
- 以 「#」 開頭的行後面的內容會被認爲是註釋
- 相關布爾值,一、 yes、 on、 true 都是開啓,0、 no、 off、 false 都是關閉
- 時間單位默認是秒,因此要用毫秒(ms)分鐘(m)等須顯式說明
- service unit file文件一般由三部分組成:
- [Unit]:定義與Unit類型無關的通用選項;用於提供unit的描述信息、 unit行
爲及依賴關係等
- [Service]:與特定類型相關的專用選項;此處爲Service類型
- [Install]:定義由「systemctl enable」 以及"systemctl disable「命令在實現服務啓用或禁用時用到的一些選項
Unit段的經常使用選項:
Description:描述信息,在命令systemctl status中看的就是這裏寫的
After:定義unit的啓動次序,表示當前unit應該晚於哪些unit啓動,其功能與Before相反
Requires:依賴到的其它units,強依賴,被依賴的units沒法激活時,當前unit也沒法激活
Wants:依賴到的其它units,弱依賴
Conflicts:定義units間的衝突關係服務器
Service段的經常使用選項:
Type:定義影響ExecStart及相關參數的功能的unit進程啓動類型ssh
- simple:默認值(不寫的時候就這個),這個daemon主要由ExecStart接的指令串來啓動,啓動後常駐於內存中
- forking:由ExecStart啓動的程序透過spawns延伸出其餘子程序來做爲此daemon的主要服務。原生父程序在啓動結束後就會終止
- oneshot:與simple相似,不過這個程序在工做完畢後就結束了,不會常駐在內存中
- dbus:與simple相似,但這個daemon必需要在取得一個D-Bus的名稱後,纔會繼續運做.所以一般也要同時設定BusNname= 才行
- notify:在啓動完成後會發送一個通知消息。還須要配合 NotifyAccess 來讓Systemd 接收消息
- idle:與simple相似,要執行這個daemon必需要全部的工做都順利執行完畢後纔會執行。這類的daemon一般是開機到最後才執行便可的服務
EnvironmentFile:環境變量配置文件,服務啓動時須要的變量和參數等的值就在這裏寫的,能夠供給下面的來使用(參考atd.service)
ExecStart:指明啓動unit要運行命令或腳本的絕對路徑(參數可用上面定義的環境變量$var)
ExecStartPre: ExecStart前運行
ExecStartPost: ExecStart後運行
ExecStop:指明中止unit要運行的命令或腳本
Restart:當設定Restart=1時,則當次daemon服務意外終止後,會再次自動啓動此服務
Install段的經常使用選項:
Alias:別名,可以使用systemctl command Alias.service
RequiredBy:被哪些units所依賴,強依賴
WantedBy:被哪些units所依賴,弱依賴(好比multi-user.target)
Also:安裝本服務的時候還要安裝別的相關服務
注意:對於新建立的unit文件,或者修改了的unit文件,要通知systemd重載此配置文件,然後能夠選擇重啓
從新加載配置文件命令:systemctl daemon-reload
服務Unit文件示例:
- vim /etc/systemd/system/bak.service
[Unit]
Description=backup /etc
Requires=atd.service
[Service]
Type=simple
ExecStart=/bin/bash -c "echo /testdir/bak.sh|at now" :at now表明當即執行此任務,不過注意它的全部輸出結果都在郵件中
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start bak
其中腳本bak.sh中:
tar cf /data/etc_`date +%F`.tar /etc &> /dev/null
運行級別
其它命令
- 切換至緊急救援模式:
systemctl rescue
- 切換至emergency模式:
systemctl emergency
- 其它經常使用命令:
傳統命令init,poweroff,halt,reboot都成爲systemctl的軟連接
關機:systemctl halt、 systemctl poweroff
重啓:systemctl reboot
掛起:systemctl suspend
休眠:systemctl hibernate
休眠並掛起:systemctl hybrid-sleep
注意點2:
- 通常不用本身書寫service,書寫的時候能夠參考已經存在的service文件來寫(usr/lib中)。
- 好比說本身編譯的最新版本的服務等,裝到了其餘的目錄中可是沒有service文件。此時即可參考老版本存在的service文件進行修改(尤爲修改執行的目標腳本位置),這樣之後即可以用systemctl命令來控制新裝的在其餘目錄中的服務程序了。
- 注意修改了service配置文件以後要從新載入daemon-reaload
- 在usr/lib/systemd/system中ls *.target ,而後最好把ctrl-alt-delete.target
- 修改成其餘的指向(好比/dev/null)
- 或者直接刪除掉這個軟連接
- 或者mask它也行。
- 修改/etc/下的default.target指向便可修改開機進入的runlevel.固然要用systemctl命令來修改,具體命令能夠查看/etc/inittab來修改。
- systemctl get-default
- systemctl set-default multi-user.target
- 若是這裏設置錯誤成reboot.target或者poweroff.target,則開機進入菜單界面後能夠用e按鍵,而後在linux16後面添加systemd.unit=multi-user.target,而後按ctrl+x按鍵 便可讓這一次啓動進入,但需注意進入系統以後仍要修改默認啓動模式爲正確的。
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/system/default.target
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須要的服務
- 注意Centos7中也保留了6中的啓動服務腳本和文件夾(rc.d和init.d)
設置內核參數
設置內核參數,隻影響當次啓動
啓動時,在linux16行後添加systemd.unit=desired.target
systemd.unit=emergency.target
systemd.unit=rescue.target
rescue.target 比emergency 支持更多的功能,例如日誌等
systemctl default 進入默認target
啓動排錯
- 文件系統損壞
先嚐試自動修復,失敗則進入emergency shell,提示用戶修復
- 在/etc/fstab不存在對應的設備和UUID
等一段時間,如不可用,進入emergency shell
- 在/etc/fstab不存在對應掛載點
ystemd 嘗試建立掛載點,不然提示進入emergency shell.
- 在/etc/fstab不正確的掛載選項
提示進入emergency shell
破解CentOS7的root口令
方法1:
啓動時任意鍵暫停啓動
按e鍵進入編輯模式
將光標移動linux16開始的行,添加內核參數rd.break
按ctrl-x啓動
mount –o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabel :若是沒有啓動selinux這一項可不寫
exit
reboot
方法2:
啓動時任意鍵暫停啓動
按e鍵進入編輯模式
將光標移動linux16開始的行,改成rw init=/sysroot/bin/sh
按ctrl-x啓動
chroot /sysroot
passwd root
touch /.autorelabel
exit
reboot
grub2加口令
grub2-setpassword 按回車而後輸入口令便可
- 它把生成的口令放在了/boot/grub2/user.cfg文件中.
加完口令以後想要在開機時設置grub.cfg文件就得先輸入用戶名和密碼了。
- 刪除grub2口令:只須要把user.cfg文件刪除便可
修復grub2
注意點3:
-
因爲7中unit太複雜,啓動順序沒法直接查看(6中可在對應的rc#.d中查看KS軟連接查看順序)。所以要用命令查看
- systemd-analyze
- systemd-analyze plot :它會生成xml格式的信息並標準輸出
- systemd-analyze plot > boot.xml :在windows中查看它便可
-
因爲/boot/grub2/grub.cfg文件內容太多,所以不要手工去改它,可按照它所寫的註釋信息,去修改/etc/default/grub模板文件 (其中/etc/grub2.cfg是個軟連接就是指向boot中的grub.cfg),而後利用命令grub2-mkconfig -o /boot/gurb2/grub.cfg(或者重定向,文件也可指向/etc/下的軟連接)命令來生成。
- 利用rpm -ql grub2 查看不到任何文件,說明它只是運行了一些命令腳本
- 利用rpm -qf /boot/grub2/grub.cfg 可看到它來自grub2-pc包
-
修改默認啓動內核項(相似6中的title,修改default=0或其餘數字),在這裏就是修改模板文件中的GRUB_DEFAULT=0或者其餘數字便可即可修改默認的啓動內核項。而後再用grub2-mkconfig生成便可。
- 也可用命令grub2-set-default 0 設置,更加詳情查看幫助
-
Centos7中也能夠用老的service命令,和Centos6中相同。同時它裏面也有rc.d以及init.d文件夾。只不過裏面的服務文件比較少。
- 所以若是想要一個程序(注意不是服務)或者說本身自定義的服務開機自動啓動:
1)一種方法是寫service的可執行腳本放入init.d中而後用chkconfig添加到各個模式的啓動項中
2)一種是直接寫在rc.d的rc.local中便可
3)還有一種就是能夠在usr/lib/systemd/system中寫入unit的service類型的服務文件,這裏可參考其餘的service文件,而後在/etc/systemd/system中建立軟鏈接指向它(這裏的目的是能用systemctl 命令控制它),而且在/etc/systemd/system/multi-user.target.wants建立軟連接指向usr中的這個文件(這裏的目的纔是讓它開機自動啓動)
- 建立這個service文件和兩個軟連接的時候,注意service的真正文件在usr的文件夾中,而第一個用於systemctl控制命令(好比start,mask等等)的軟連接在/etc/systemd/system下面,這個必須手動建立。而控制它自動開機啓動的軟連接在/etc/systemd/system/multi-user.target.wants下面,這個在上一個控制的軟連接建立以後能夠用命令建立(enable),也能夠手動建立。
- 不過要注意service的格式還有各類名字別寫錯了。
- 4中的3種方法,若是僅僅爲了開機啓動一個程序,最方便的方法建議仍是第2種方法直接寫在/etc/rc.d/rc.local中。(前兩中方法的具體過程能夠參照centos6中所寫的步驟。)