centOS7服務管理與啟動流程
centOS7服務管理與啟動流程
- centOS7啟動流程
- systemd簡介
- unit對象
- unit類型
- 特性
- service unit文件格式
- service unit file文件通常由三部分組成
- unit段的常用選項
- Service段的常用選項
- Install段的常用選項
- 管理服務
- 管理系統服務
- 服務查看
- chkconfig命令的對應關系
- 其他命令
- 服務狀態
- systemctl示例
- 運行級別
- 運行級別與target的對照
- 運行級別的切換
- CentOS7引導順序
- 設置簡單的內核參數
- 簡單的啟動排錯
- 虛擬機環境下破解centOS7root的口令
- 方法一
- 方法二
- centOS7 grub2
- 實驗:在centOS7下破壞前446字節並修復
- 實驗:在centOS7下刪除grub2下文件,並修復
systemd簡介
POST --> Boot Sequence --> Bootloader --> kernel + initramfs(initrd) -->rootfs --> /sbin/init
init:
CentOS 5: SysV init CentOS6: Upstart CentOS 7: Systemd
Systemd
:系統啟動和服務器守護進程管理器,負責在系統啟動或運行時,激活系統資源,服務器進程和其它進程
Systemd新特性
:
- 系統引導時實現服務並行啟動
- 按需啟動守護進程
- 自動化的服務依賴關系管理
- 同時采用socket式與D-Bus總線式激活服務
- 系統狀態快照
unit對象
核心概念:unit
unit
表示不同類型的systemd對象,通過配置文件進行標識和配置;文件中主要包含了系統服務、監聽socket、保存的系統快照以及其它與init相關的信息
配置文件:
/usr/lib/systemd/system
/run/systemd/system
:系統執行過程中所產生的服務腳本,比上面目錄優先運行/etc/systemd/system
:管理員建立的執行腳本,類似於/etc/rc.d/rcN.d/Sxx類的功能,比上面目錄優先運行
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 目錄
特性
關鍵特性:
- 基於socket的激活機制:socket與服務程序分離
- 基於d-bus的激活機制:
- 基於device的激活機制:
- 基於path的激活機制:
- 系統快照:保存各unit的當前狀態信息於持久存儲設備中向後兼容sysv init腳本
不兼容:
- systemctl命令固定不變,不可擴展
- 非由systemd啟動的服務,systemctl無法與之通信和控制
service unit文件格式
在/etc/systemd/system下的unit文件是系統管理員和用戶使用
在/usr/lib/systemd/system下的供發行版打包者使用
在unit文件中,以“#” 開頭的行後面的內容會被認為是註釋,相關布爾值,1、yes、on、true 都是開啟,0、no、off、false 都是關閉,時間單位默認是秒,所以要用毫秒(ms)分鐘(m)等須顯式說明
service unit file文件通常由三部分組成
- [Unit]:定義與Unit類型無關的通用選項;用於提供unit的描述信息、unit行為及依賴關系等
- [Service]:與特定類型相關的專用選項;此處為Service類型
- [Install]:定義由“systemctlenable”以及"systemctldisable“命令在實現服務啟用或禁用時用到的一些選項
unit段的常用選項
- Description:描述信息
- After:定義unit的啟動次序,表示當前unit應該晚於哪些unit啟動,其功能與Before相反
- Requires:依賴到的其它units,強依賴,被依賴的units無法激活時,當前unit也無法激活
- Wants:依賴到的其它units,弱依賴
- Conflicts:定義units間的沖突關系
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服務意外終止後,會再次自動啟動此服務
Install段的常用選項
- Alias:別名,可使用systemctlcommand Alias.service
- RequiredBy:被哪些units所依賴,強依賴
- WantedBy:被哪些units所依賴,弱依賴
- Also:安裝本服務的時候還要安裝別的相關服務
註意:
對於新創建的unit文件,或者修改了的unit文件,要通知systemd重載此配置文件,而後可以選擇重啟
systemctldaemon-reload
管理服務
管理系統服務
CentOS 7: service unit
註意:能兼容早期的服務腳本
命令:
systemctl COMMAND name.service
- | centOS6 | CentOS7 |
---|---|---|
啟動 | 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 |
服務查看
- | centOS6 | CentOS7 |
---|---|---|
查看某服務當前激活與否的狀態 | - | systemctl is-active name.service |
查看所有已經激活的服務 | - | systemctl list-units --type |
查看所有服務 | - | systemctl list-units --type service --all |
chkconfig命令的對應關系
- | centOS6 | CentOS7 |
---|---|---|
設定某服務開機自啟 | 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.service |
其他命令
- | centOS6 | CentOS7 |
---|---|---|
查看服務的依賴關系 | - | systemctl list-dependencies name.service |
殺掉進程 | - | systemctl kill unitname |
切換至緊急救援模式 | - | systemctl rescue |
切換至emergency模式 | - | systemctl emergency |
關機 | - | systemctlhalt、systemctlpoweroff |
重啟 | - | systemctl reboot |
掛起 | - | systemctl suspend |
休眠 | - | systemctl hibernate |
休眠並掛起 | - | systemctlhybrid-sleep |
服務狀態
systemctl list-unit-files --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 –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
運行級別
在centOS7上運行級別的含義已經和之前不同了,運行級別就是通過開啟關閉不同的服務產生的效果,在從netOS7上,已然由.target來代替運行級別,我們可以稱target為目標態
,我們可以通過target定制更符合我們工作運行環境。
我們可以通過命令:ls /usr/lib/systemd/system/*.target
查看我們的機器上有多少個target
"grub.cfg"140L,4397C written [[email protected] grub2]#ls /usr/lib/systemd/system/*.target /usr/lib/systemd/system/anaconda.target /usr/lib/systemd/system/basic.target /usr/lib/systemd/system/bluetooth.target /usr/lib/systemd/system/printer.target ... /usr/lib/systemd/system/reboot.target /usr/lib/systemd/system/rescue.target /usr/lib/systemd/system/rpcbind.target /usr/lib/systemd/system/runlevel0.target /usr/lib/systemd/system/runlevel1.target /usr/lib/systemd/system/runlevel2.target ... /usr/lib/systemd/system/sleep.target ...
使用systemctl list-unit-files --type target --all
可以查看所有目標態的狀態,或者systemctl list-dependencies xxx.target
命令查看目標態的依賴性。
在centOS7上所謂的目標態,其實就是由各種指定的服務和基礎target組合而成的。
運行級別與target的對照
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
運行級別的切換
在centOS6上,我們切換級別使用init
,在centOS7上雖然也能使用,但是已經不再是原來的程序了,現在我們使用systemctlisolate name.target
來切換target。
比如,我們想切換到字符界面,我們就可以使用systemctlisolate multi-user.target來進行切換。要想切換運行級別,在/lib/systemd/system/*.target
文件中AllowIsolate=yes
才可以。(修改文件需執行systemctldaemon-reload才能生效)
在centOS7上如何查看運行的目標態呢,使用命令systemctl get-default
使用命令systemctl set-default name.target
來修改我們的目標態。
我們看一下我們的默認目標態究竟為何物。
[[email protected] ~]#locate default.target /etc/systemd/system/default.target
[[email protected] ~]#ll /etc/systemd/system/default.target lrwxrwxrwx.1 root root 36Aug2507:06/etc/systemd/system/default.target ->/lib/systemd/system/runlevel3.target
它其實就是創建了一個軟鏈接到指定的target上去了
CentOS7引導順序
- 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需要的服務
設置簡單的內核參數
設置內核參數,只影響當次啟動
- 啟動時,在linux16行後添加systemd.unit=desired.target
- systemd.unit=emergency.target
- systemd.unit=rescue.target
- rescue.target 比emergency 支持更多的功能,例如日誌等
- systemctl default 進入默認target
簡單的啟動排錯
在centOS7中,文件系統損壞,先嘗試自動修復,失敗則進入emergency shell
,提示用戶修復
- 在/etc/fstab不存在對應的設備和UUID等一段時間,如不可用,進入emergency shell
- 在/etc/fstab不存在對應掛載點,systemd嘗試創建掛載點,否則提示進入emergency shell.
- 在/etc/fstab不正確的掛載選項,提示進入emergency shell
虛擬機環境下破解centOS7root的口令
方法一
啟動時任意鍵暫停啟動
按e鍵進入編輯模式
將光標移動linux16開始的行,添加內核參數rd.break
按ctrl-x啟動,然後:
mount –o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabel
exit
reboot
然後可以使用設置的密碼登錄root
方法二
啟動時任意鍵暫停啟動(同方法1)
按e鍵進入編輯模式(同方法1)
將光標移動linux16開始的行,改為rw init=/sysroot/bin/sh
按ctrl-x啟動
chroot /sysroot
passwd root
touch /.autorelabel
exit
reboot
最後,用新密碼登錄root
centOS7 grub2
在centOS6上,我們的grub文件是/boot/grub/grub.conf
在centOS7上,文件改成/boot/grub2/grub.cfg了,但是功能還是大致一樣的都是用於加載內核的,不過在centOS7上設置默認啟動項發生了一些變化,假如我們現在有兩個內核,我們需要改變默認啟動應該如何做到呢?
首先,vim /etc/default/grub
打開如下文件:
GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed ‘s, release .*$,,g‘ /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet net.ifnames=0" GRUB_DISABLE_RECOVERY="true" ~
打開文件後,我們修改GRUB_DEFAULT
的值,和centOS一樣,0代表第一個內核,1代表第二個,以此類推。
我們在修改完成後,並沒有立即生效,使用grub2-mkconfig -o /boot/grub2/grub.cfg
命令來生成grub2.cfg文件,我們在下次啟動的時候就會默認選擇新的默認內核。
實驗:在centOS7下破壞前446字節並修復
第一步:破壞硬盤的前446字節:
dd if=/dev/zero of=/dev/sda bs=1 count=446
[[email protected] ~]#dd if=/dev/zero of=/dev/sda bs=1 count=446 446+0 records in 446+0 records out 446 bytes (446 B) copied,0.000758682 s,588 kB/s [[email protected] ~]#hexdump -C -n 512/dev/sda 0000000000000000000000000000000000000000|................| * 000001b000000000000000000000000000008020|...............| 000001c021008335700500080000000040000035|[email protected]5| 000001d0710583 fe ff ff 000840000000400600 fe |[email protected]@...| 000001e0 ff ff 83 fe ff ff 000880060000400600 fe |[email protected]| 000001f0 ff ff 05 fe ff ff 0008 c0 0c00 f8 3f0c55 aa |............?.U.| 00000200
第二步:重啟計算機
由於我的虛擬機掛載了光盤,所以一重啟就進入光盤啟動的界面
上面有三項,我們選擇第三項進入troubleshooting
進入第三項後,點擊第二項,進入救援模式的centos的系統
然後我們進入如下模式:
選擇1,繼續進行:
接下來,我們就會進入到一個shell模式中,不需要切根,進行系統修復:
修復過程:
grub2-install --root-directory=/mnt/sysimage/ /dev/sda
我們來查看一下:
hexdump -C -n 512 /dev/sda
重啟,修復完成。
實驗:在centOS7下刪除grub2下文件,並修復
第一步:刪除grub2
rm -rf grub2
[[email protected] boot]#rm -rf grub2 [[email protected] boot]#ls config-3.10.0-514.el7.x86_64 grub initramfs-0-rescue-618d3baeb5754f7092242f811c7aa740.img initramfs-3.10.0-514.el7.x86_64.img initramfs-3.10.0-514.el7.x86_64kdump.img initrd-plymouth.img symvers-3.10.0-514.el7.x86_64.gz System.map-3.10.0-514.el7.x86_64 vmlinuz-0-rescue-618d3baeb5754f7092242f811c7aa740 vmlinuz-3.10.0-514.el7.x86_64
第二步,重啟計算機
進入如下界面:
接下來,我們重啟系統,按Esc,進入光盤救援模式:
選擇第三項,進入光盤救援(前提是掛載光盤)
以下步驟到進入shell同實驗一相同,不在過多演示;
進入救援模式後:
第一步:切根
然後執行命令
grub2-install
下圖中,我們可以看到在grub2文件夾中,還沒有grub.cfg文件,接下來,我們需要生成:
生成配置文件:
進入到grub2下,
grub2-mkconfig -o grub.cfg
exit然後,
重啟電腦:
完成!
centOS7服務管理與啟動流程