http://www.aichengxu.com/linux/11318300.htm
這篇著重講解下Syetemd的相關知識,systemd可以說是centos7上的重大改革,功能之強大媲美一個操作系統,那下面就從以下幾點來進行講解:
CentOS7啟動
Unit介紹
服務管理和查看
啟動排錯
破解口令
修復grub2
post-->BISO-->bootloader(MBR)-->kernel(ramdisk)-->rootfs-->/sbin/initinit程序:
不同系統上的init程序版本centos5:Sysv lnitcentos6:Upstartcentos7: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.localSystemd執行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 shellcentos 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模式刪除編譯安裝的新內核
新聞熱點
疑難解答