日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

CentOS 7 Linux 的初始化系统(系统服务管理和控制程序/Init System) -- systemd 详解

發布時間:2023/12/3 linux 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CentOS 7 Linux 的初始化系统(系统服务管理和控制程序/Init System) -- systemd 详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、systemd 的由來
    • (一)常用的 init 系統
    • (二)init 程序的缺點
    • (三)systemd 簡介
    • (四)systemd 架構圖
  • 二、服務管理
  • 三、unit 配置文件
    • (一)概述
    • (二)配置文件狀態
    • (三)配置文件格式
      • 1. unit 配置文件格式
      • 2.[Unit] 常用選項
      • 3.[Service] 常用的選項
      • 4.[Install] 常用選項
  • 四、Target
    • (一)Target命令
    • (二)Target與傳統 RunLevel 的對應關系
    • (三)它與init進程的主要差別
  • 五、日志管理
    • (一)命令 journalctl 用法
    • (二)查看指定優先級(及其以上級別)的日志,共有8級

一、systemd 的由來

(一)常用的 init 系統

  • Centos 5 Sys V init 是啟動速度最慢的,串行啟動進程,無論進程相互之間有無依賴關系。

  • Centos6 Upstart init 相對啟動速度快一點有所改進。有依賴的進程之間依次啟動而其他與之沒有依賴關系的則并行同步啟動。

  • (二)init 程序的缺點

  • 啟動時間長。Init進程是串行啟動,只有前一個進程啟動完,才會啟動下一個進程。(這也是Centos5的主要特征)

  • 啟動腳本復雜。Init進程只是執行啟動腳本,不管其他事情。腳本需要自己處理各種情況,這使得腳本變得很長而且復雜。

  • (三)systemd 簡介

    systemd 與以上都不同。systemd為了解決上文的問題而誕生。它的目標是,為系統的啟動和管理提供一套完整的解決方案。所有進程無論有無依賴關系都是并行啟動(當然很多時候進程沒有真正啟動而是只有一個信號或者說是標記而已,在真正利用的時候才會真正啟動。)根據linux慣例,字母d是守護進程(daemon) 的縮寫。systemd名字的含義就是守護整個系統。

    Centos 7里systemd代替了init,成為了系統的第一個進程(PID為1),其他所有的進程都是它的子進程。systemd 的優點是功能強大,使用方便,缺點是體系龐大,非常復雜。事實上,現在還有很多人反對使用 systemd,理由就是它過于復雜,與操作系統的其他部分強耦合,違反"keep simple, keep stupid"的Unix 哲學。

    (四)systemd 架構圖

    二、服務管理

    命令 systemctl 的使用

    三、unit 配置文件

    (一)概述

    每一個 Unit 都有一個配置文件,告訴 systemd 怎么啟動這個 Unit 。

    systemd 默認從目錄 /etc/systemd/system/ 讀取配置文件。但是,里面存放的大部分文件都是符號鏈接,指向目錄 /usr/lib/systemd/system/,真正的配置文件存放在那個目錄。

    systemctl enable httpd.service 命令用于在上面兩個目錄之間,建立符號鏈接關系。(Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.)等同于 ln -s /usr/lib/systemd/system/httpd.service /etc/systemd/system/multi-user.target.wants/httpd.service。當然 systemdctl disable httpd.service 則相當于刪除這個軟連接。

    /usr/lib/system/system:系統默認的單元文件安裝目錄,每個服務最主要的啟動腳本存放在該目錄下,類似于之前的 /etc/init.d/。

    /run/system/system:存放系統單元執行過程中所產生的腳本,比安裝目錄優先運行。

    /etc/systemd/system:存放系統管理員建立的執行腳本,這是系統管理員管理的單元目錄,類似于 /etc/rc.d/rcN.d/Sxx 的功能,比上面目錄優先運行,優先級別最高。

    (二)配置文件狀態

    systemctl list-unit-files 命令用于列出所有配置文件。

    列出所有配置文件

    # systemctl list-unit-files

    列出指定類型的配置文件

    # systemctl list-unit-files --type=service

    systemctl list-unit-files 該命令會輸出一個列表,從中可以看到每個配置文件的狀態。

    Unit config file statuslvm2-lvmetad.service disabledlvm2-lvmetad.socket enabled lvm2-lvmpolld.service disabledlvm2-lvmpolld.socket enabled

    這個列表顯示每個配置文件的狀態,一共有四種:

    enabled:已建立啟動鏈接

    disabled:沒建立啟動鏈接

    static:該配置文件沒有[Install]部分(無法執行),只能作為其他配置文件的依賴

    masked:該配置文件被禁止建立啟動鏈接

    注意,從配置文件的狀態無法看出,該 Unit 是否正在運行。這必須執行前面提到的systemctl status命令。

    # systemctl status httpd.service

    (三)配置文件格式

    1. unit 配置文件格式

    [Unit]Description=backup /etcRequires=atd.service[Service]Type=simpleExecStart=/bin/bash -c "echo /testdir/bak.sh|at now"[Install]WantedBy=multi-user.target

    [Unit] :定義與Unit類型無關的通用選項,用于提供unit的描述信息、 unit行為及依賴關系等

    [Service]:與特定類型相關的專用選項,此處為Service類型

    [Install]:定義由“ systemctl enable”以及"systemctl disable“命令在實現服務啟用或禁用時用到的一些選項

    2.[Unit] 常用選項

    Description:描述信息

    After:定義unit的啟動次序,表示當前unit應該晚于哪些

    unit啟動,其功能與Before相反

    Requires:依賴到的其它units,強依賴,被依賴的units無法激活時,當前unit也無法激活

    Wants:依賴到的其它units,弱依賴

    Conflicts:定義units間的沖突關系

    BindsTo:與Requires類似,它指定的 Unit 如果退出,會導致當前 Unit 停止運行

    Before:如果該字段指定的 Unit 也要啟動,那么必須在當前 Unit 之后啟動

    Conflicts:這里指定的 Unit 不能與當前 Unit 同時運行

    Condition…:當前 Unit 運行必須滿足的條件,否則不會運行

    Assert…:當前 Unit 運行必須滿足的條件,否則會報啟動失敗

    3.[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后運行

    ExecRsload: 重啟當前服務時執行的命令

    ExecStopPost:停止當前服務之后執行的命令

    ExecStartSec:自動重啟當前服務間隔的秒數

    ExecStop:指明停止unit要運行的命令或腳本

    Restart:當設定Restart=1 時,則當次daemon服務意外終止后,會再次自動啟動此服務。

    TimeoutSec:定義 systemd 停止當前服務之前等待的秒數。

    Environment:指定環境變量。

    4.[Install] 常用選項

    Alias:別名,可使用systemctl command Alias.service

    RequiredBy:被哪些units所依賴,強依賴

    WantedBy:被哪些units所依賴,弱依賴

    Also:安裝本服務的時候還要安裝別的相關服務

    注意:對于新創建的unit文件,或者修改了的unit文件,要通知systemd重載此配置文件,而后可以選擇重啟。

    # systemctl daemon-reload# systemctl restart httpd.service

    更加詳細的 unit 配置文件格式請參考官方文檔

    https://www.freedesktop.org/software/systemd/man/systemd.unit.html

    四、Target

    啟動計算機的時候,需要啟動大量的 Unit。如果每一次啟動,都要一一寫明本次啟動需要哪些 Unit,顯然非常不方便。systemd 的解決方案就是 Target。

    簡單說,Target 就是一個 Unit 組,包含許多相關的 Unit 。啟動某個 Target 的時候,systemd 就會啟動里面所有的 Unit。從這個意義上說,Target 這個概念類似于"狀態點",啟動某個 Target 就好比啟動到某種狀態。

    傳統的init啟動模式里面,有 RunLevel 的概念,跟 Target 的作用很類似。不同的是,RunLevel 是互斥的,不可能多個 RunLevel 同時啟動,但是多個 Target 可以同時啟動。

    (一)Target命令

    查看當前系統的所有 Target

    # systemctl list-unit-files --type=target

    查看一個 Target 包含的所有 Unit

    # systemctl list-dependencies multi-user.target

    查看啟動時的默認 Target

    # systemctl get-default

    設置啟動時的默認 Target

    # systemctl set-default multi-user.target

    切換 Target 時,默認不關閉前一個 Target 啟動的進程, systemctl isolate 命令改變這種行為,

    關閉前一個 Target 里面所有不屬于后一個 Target 的進程 systemctl isolate multi-user.target

    (二)Target與傳統 RunLevel 的對應關系

    Traditional runlevel New target name Symbolically linked to…

    Runlevel 0 | runlevel0.target -> poweroff.target

    Runlevel 1 | runlevel1.target -> rescue.target

    Runlevel 2 | runlevel2.target -> multi-user.target

    Runlevel 3 | runlevel3.target -> multi-user.target

    Runlevel 4 | runlevel4.target -> multi-user.target

    Runlevel 5 | runlevel5.target -> graphical.target

    Runlevel 6 | runlevel6.target -> reboot.target

    (三)它與init進程的主要差別

    (1)默認的 RunLevel(在/etc/inittab文件設置)現在被默認的 Target 取代,位置是/etc/systemd/system/default.target,通常符號鏈接到graphical.target(圖形界面)或者multi-user.target(多用戶命令行)。

    (2)啟動腳本的位置,以前是/etc/init.d目錄,符號鏈接到不同的 RunLevel 目錄 (比如/etc/rc3.d、/etc/rc5.d等),現在則存放在/lib/systemd/system和/etc/systemd/system目錄。

    (3)配置文件的位置,以前init進程的配置文件是/etc/inittab,各種服務的配置文件存放在/etc/sysconfig目錄。現在的配置文件主要存放在/lib/systemd目錄,在/etc/systemd目錄里面的修改可以覆蓋原始設置。

    五、日志管理

    systemd 統一管理所有 Unit 的啟動日志。帶來的好處就是,可以只用journalctl一個命令,查看所有日志(內核日志和應用日志)。日志的配置文件是/etc/systemd/journald.conf。

    (一)命令 journalctl 用法

    查看所有日志(默認情況下 ,只保存本次啟動的日志)

    # journalctl

    查看內核日志(不顯示應用日志)

    # journalctl -k

    查看系統本次啟動的日志

    # journalctl -b # journalctl -b -0

    查看上一次啟動的日志(需更改設置)

    # journalctl -b -1

    查看指定時間的日志

    # journalctl --since="2012-10-30 18:17:16" # journalctl --since "20 min ago" # journalctl --since yesterday # journalctl --since "2015-01-10" --until "2015-01-11 03:00" # journalctl --since 09:00 --until "1 hour ago"

    顯示尾部的最新10行日志

    # journalctl -n

    顯示尾部指定行數的日志

    # journalctl -n 20

    實時滾動顯示最新日志

    # journalctl -f

    查看指定服務的日志

    # journalctl /usr/lib/systemd/systemd

    查看指定進程的日志

    # journalctl _PID=1

    查看某個路徑的腳本的日志

    # journalctl /usr/bin/bash

    查看指定用戶的日志

    # journalctl _UID=33 --since today

    查看某個 Unit 的日志

    # journalctl -u nginx.service # journalctl -u nginx.service --since today

    實時滾動顯示某個 Unit 的最新日志

    # journalctl -u nginx.service -f

    合并顯示多個 Unit 的日志

    # journalctl -u nginx.service -u php-fpm.service --since today

    (二)查看指定優先級(及其以上級別)的日志,共有8級

    0: emerg1: alert2: crit3: err4: warning5: notice6: info7: debug # journalctl -p err -b

    日志默認分頁輸出,–no-pager 改為正常的標準輸出

    # journalctl --no-pager

    以JSON格式(單行)輸出

    # journalctl -b -u httpd.service -o json

    以JSON格式(多行)輸出,可讀性更好,建議選擇多行輸出

    # journalctl -b -u httpd.service -o json-pretty

    顯示日志占據的硬盤空間

    # journalctl --disk-usage

    指定日志文件占據的最大空間

    # journalctl --vacuum-size=1G

    指定日志文件保存多久

    # journalctl --vacuum-time=1years

    總結

    以上是生活随笔為你收集整理的CentOS 7 Linux 的初始化系统(系统服务管理和控制程序/Init System) -- systemd 详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。