1. 程式人生 > >centOS7服務管理與啟動流程

centOS7服務管理與啟動流程

當前 接下來 提示 設置 內存 ios 名稱 .gz 還要

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
CentOS 
6: Upstart CentOS 7: Systemd

Systemd:系統啟動和服務器守護進程管理器,負責在系統啟動或運行時,激活系統資源,服務器進程和其它進程

Systemd新特性

  • 系統引導時實現服務並行啟動
  • 按需啟動守護進程
  • 自動化的服務依賴關系管理
  • 同時采用socket式與D-Bus總線式激活服務
  • 系統狀態快照

unit對象

核心概念unit
unit表示不同類型的systemd對象,通過配置文件進行標識和配置;文件中主要包含了系統服務、監聽socket、保存的系統快照以及其它與init相關的信息
配置文件

  • /usr/lib/systemd/system
    :每個服務最主要的啟動腳本設置,類似於之前的/etc/init.d/
  • /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

-centOS6CentOS7
啟動 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

服務查看

-centOS6CentOS7
查看某服務當前激活與否的狀態 - systemctl is-active name.service
查看所有已經激活的服務 - systemctl list-units --type
查看所有服務 - systemctl list-units --type service --all

chkconfig命令的對應關系

-centOS6CentOS7
設定某服務開機自啟 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

其他命令

-centOS6CentOS7
查看服務的依賴關系 - 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引導順序

  1. UEFi或BIOS初始化,運行POST開機自檢
  2. 選擇啟動設備
  3. 引導裝載程序, centos7是grub2
  4. 加載裝載程序的配置文件:/etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg
  5. 加載initramfs驅動模塊
  6. 加載內核選項
  7. 內核初始化,centos7使用systemd代替init
  8. 執行initrd.target所有單元,包括掛載/etc/fstab
  9. 從initramfs根文件系統切換到磁盤根目錄
  10. systemd執行默認target配置,配置文件/etc/systemd/system/default.target
  11. systemd執行sysinit.target初始化系統及basic.target準備操作系統
  12. systemd啟動multi-user.target下的本機與服務器服務
  13. systemd執行multi-user.target下的/etc/rc.d/rc.local
  14. Systemd執行multi-user.target下的getty.target及登錄服務
  15. 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服務管理與啟動流程