systemd的作用

来源:https://www.cnblogs.com/linhaostudy/archive/2018/03/17/8577504.html
-Advertisement-
Play Games

早上群上討論了一下systemd的作用,還導致了一個人的直接退群,出於求知心理,搜索了一些systemd,對此也作出了一些相應的整理; 一、systemd的誕生: 學習嵌入式bootloader與kernel銜接的時候,就入門了init進程;init進程也就是系統的第一個進程,PID號為1; ini ...


早上群上討論了一下systemd的作用,還導致了一個人的直接退群,出於求知心理,搜索了一些systemd,對此也作出了一些相應的整理;

一、systemd的誕生:

學習嵌入式bootloader與kernel銜接的時候,就入門了init進程;init進程也就是系統的第一個進程,PID號為1;

 

init進程總所周知的問題是從它開始啟動,並從下一個程式開始,都是以一個進程啟動另一個進程的方式來進行;這樣做的顯而易見的缺點就是執行速度慢,沒有一整套的系統來管理,並且/ect/目錄下的隨便一個腳本簡直長的髮指;關機過程差不多是相反的過程,首先init停止所有服務,最後階段會卸載文件系統。

 

所以偉大的程式員開始了自己的創作,systemd也就誕生啦。systemd 幾乎完全相容傳統的 SysV init 系統: SysV init 腳本可以作為另一種配置文件格式被識別; 提供與 SysV 相容的 /dev/initctl 介面; 提供各種 SysV 工具的相容實現; 依然相容例如 /etc/fstab 或者 utmp之類傳統的 Unix 特性。

 

systemd現在廣泛用於Fedora 21、Ubuntu(Ubuntu 15.04以上)、Centos等linux操作系統上;

 

二、systemd是什麼?

開發Systemd的主要目的就是減少系統引導時間和計算開銷。

Systemd(系統管理守護進程),最開始以GNU GPL協議授權開發,現在已轉為使用GNU LGPL協議,它是如今討論最熱烈的引導和服務管理程式。如果你的Linux系統配置為使用Systemd引導程式,它取替傳統的init進程,啟動過程將交給systemd處理。Systemd的一個核心功能是它同時支持init進程的後開機啟動腳本。

 

 Systemd引入了並行啟動的概念,它會為每個需要啟動的守護進程建立一個套接字,這些套接字對於使用它們的進程來說是抽象的,這樣它們可以允許不同守護進程之間進行交互。Systemd會創建新進程併為每個進程分配一個控制組(cgroup)。處於不同控制組的進程之間可以通過內核來互相通信。 cgroups 信息由內核負責維護, 並且可以通過 /sys/fs/cgroup/systemd/ 介面進行訪問。

 

當作為系統實例運行時, systemd 將會按照 system.conf 配置文件 以及 system.conf.d 配置目錄中的指令工作; 當作為用戶實例運行時,systemd 將會按照 user.conf 配置文件 以及 user.conf.d 配置目錄中的指令工作。

2.1 單位:

systemd 將各種系統啟動和運行相關的對象, 表示為各種不同類型的單元(unit), 並提供了處理不同單元之間依賴關係的能力。 

Systemd 的其中一個目標就是簡化這些事物之間的相互作用,因此如果你有程式需要在某個掛載點被創建或某個設備被接入後開始運行,Systemd 可以讓這一切正常運作起來變得相當容易。

各種不同的單元類型如下:

  1. service 單元。用於封裝一個後臺服務進程。 

  2. socket 單元。 用於封裝一個系統套接字(UNIX)或互聯網套接字(INET/INET6)或FIFO管道。 相應的服務在第一個"連接"進入套接字時才會被啟動。

  3. target 單元。 用於將多個單元在邏輯上組合在一起。

  4. device 單元。用於封裝一個設備文件,可用於基於設備的啟動。 並非每一個設備文件都需要一個 device 單元, 但是每一個被 udev 規則標記的設備都必須作為一個 device 單元出現。

  5. mount 單元。 用於封裝一個文件系統掛載點(也向後相容傳統的 /etc/fstab 文件)。

  6. automount 單元。 用於封裝一個文件系統自動掛載點,也就是僅在掛載點確實被訪問的情況下才進行掛載。 它取代了傳統的 autofs 服務。

  7. timer 單元。 用於封裝一個基於時間觸發的動作。它取代了傳統的 atd, crond 等任務計劃服務。

  8. swap 單元。 用於封裝一個交換分區或者交換文件。 它與 mount 單元非常類似。

  9. path 單元。 用於根據文件系統上特定對象的變化來啟動其他服務。

  10. slice 單元。 用於控制特定 CGroup 內(例如一組 service 與 scope 單元)所有進程的總體資源占用。

  11. scope 單元。它與 service 單元類似,但是由 systemd 根據 D-bus 介面接收到的信息自動創建, 可用於管理外部創建的進程。

systemd 能夠處理各種類型的依賴關係, 包括依賴與衝突(也就是 Requires= 與 Conflicts= 指令), 以及先後順序(也就是 After= 與 Before= 指令)。 註意, 上述兩種類型的依賴關係(依賴與衝突、先後順序)之間是相互獨立的(無關的)。 舉例來說,假定 foo.service 依賴於(Requires) bar.service 但並未指定先後順序, 那麼這兩個服務將被同時並行啟動。 不過在兩個單元之間既存在依賴關係也存在先後順序的情形也很常見。 另外需要註意的是, 大多數依賴關係都是由 systemd 隱式創建和維護的, 因此沒有必要額外手動創建它們。

 

 

2.2 systemctl:

systemctrl是systemd的系統管理的指令,相應指令如下:http://man.linuxde.net/systemctl

 1 # 重啟系統
 2 $ sudo systemctl reboot
 3 
 4 # 關閉系統,切斷電源
 5 $ sudo systemctl poweroff
 6 
 7 # CPU停止工作
 8 $ sudo systemctl halt
 9 
10 # 暫停系統
11 $ sudo systemctl suspend
12 
13 # 讓系統進入冬眠狀態
14 $ sudo systemctl hibernate
15 
16 # 讓系統進入互動式休眠狀態
17 $ sudo systemctl hybrid-sleep
18 
19 # 啟動進入救援狀態(單用戶狀態)
20 $ sudo systemctl rescue

 

 

2.3 target文件:

Systemd使用“target”來處理引導和服務管理過程。這些systemd里的“target”文件被用於分組不同的引導單元以及啟動同步進程。

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

 

傳統的init啟動模式裡面,有運行級別的概念,跟 Target 的作用很類似。不同的是,運行級別是互斥的,不可能多個運行級別同時啟動,但是多個 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目錄裡面的修改可以覆蓋原始設置;

 

2.4 日誌文件:

systemd使用journalctl來管理相應的日誌文件;

 1 # 查看所有日誌(預設情況下 ,只保存本次啟動的日誌)
 2 $ sudo journalctl
 3 
 4 # 查看內核日誌(不顯示應用日誌)
 5 $ sudo journalctl -k
 6 
 7 # 查看系統本次啟動的日誌
 8 $ sudo journalctl -b
 9 $ sudo journalctl -b -0
10 
11 # 查看上一次啟動的日誌(需更改設置)
12 $ sudo journalctl -b -1
13 
14 # 查看指定時間的日誌
15 $ sudo journalctl --since="2012-10-30 18:17:16"
16 $ sudo journalctl --since "20 min ago"
17 $ sudo journalctl --since yesterday
18 $ sudo journalctl --since "2015-01-10" --until "2015-01-11 03:00"
19 $ sudo journalctl --since 09:00 --until "1 hour ago"
20 
21 # 顯示尾部的最新10行日誌
22 $ sudo journalctl -n
23 
24 # 顯示尾部指定行數的日誌
25 $ sudo journalctl -n 20
26 
27 # 實時滾動顯示最新日誌
28 $ sudo journalctl -f
29 
30 # 查看指定服務的日誌
31 $ sudo journalctl /usr/lib/systemd/systemd
32 
33 # 查看指定進程的日誌
34 $ sudo journalctl _PID=1
35 
36 # 查看某個路徑的腳本的日誌
37 $ sudo journalctl /usr/bin/bash
38 
39 # 查看指定用戶的日誌
40 $ sudo journalctl _UID=33 --since today
41 
42 # 查看某個 Unit 的日誌
43 $ sudo journalctl -u nginx.service
44 $ sudo journalctl -u nginx.service --since today
45 
46 # 實時滾動顯示某個 Unit 的最新日誌
47 $ sudo journalctl -u nginx.service -f
48 
49 # 合併顯示多個 Unit 的日誌
50 $ journalctl -u nginx.service -u php-fpm.service --since today
51 
52 # 查看指定優先順序(及其以上級別)的日誌,共有8級
53 # 0: emerg
54 # 1: alert
55 # 2: crit
56 # 3: err
57 # 4: warning
58 # 5: notice
59 # 6: info
60 # 7: debug
61 $ sudo journalctl -p err -b
62 
63 # 日誌預設分頁輸出,--no-pager 改為正常的標準輸出
64 $ sudo journalctl --no-pager
65 
66 # 以 JSON 格式(單行)輸出
67 $ sudo journalctl -b -u nginx.service -o json
68 
69 # 以 JSON 格式(多行)輸出,可讀性更好
70 $ sudo journalctl -b -u nginx.serviceqq
71  -o json-pretty
72 
73 # 顯示日誌占據的硬碟空間
74 $ sudo journalctl --disk-usage
75 
76 # 指定日誌文件占據的最大空間
77 $ sudo journalctl --vacuum-size=1G
78 
79 # 指定日誌文件保存多久
80 $ sudo journalctl --vacuum-time=1years

 

 

三、systemd的爭議:

直接看知乎問題吧:https://www.zhihu.com/question/25873473

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • .NET Core 是一個通用開發平臺,由 Microsoft 和 GitHub 上的 .NET 社區共同維護。 它是跨平臺的,支持 Windows、macOS 和 Linux,並且可用於設備、雲和嵌入式/IoT 方案。 本教程學習如何創建基於ASP.NET Core Razor頁面的Web應用程式... ...
  • 寫在前面 「守護進程」是 Linux 的一種長期運行的後臺服務進程,也有人稱它為「精靈進程」。我們常見的 httpd、named、sshd 等服務都是以守護進程 Daemon 方式運行的,通常服務名稱以字母d結尾,也就是 Daemon 第一個字母。與普通進程相比它大概有如下特點: 無需控制終端(不需 ...
  • What is FFmpeg? FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,並能將其轉化為流的開源電腦程式。它提供了錄製、轉換以及流化音視頻的完整解決方案。 What is x264? H.264是ITU(國際通信聯盟)和MPEG(運動圖像專家組)聯合制定的視頻編碼標準。而x264是一個開... ...
  • 本文目錄:1.vpn概述 1.1 vpn應用場景 1.2 隧道協議 1.3 SSL VPN和IPSEC VPN2.openvpn搭建client-to-site的vpn 2.1 安裝lzo和openvpn 2.2 創建CA和SSL證書 2.3 配置服務端 2.4 配置客戶端 2.5 查看vpn的連接 ...
  • 歸檔(tar) 將許多文件一起保存至一個單獨的磁帶或磁碟歸檔,並能從歸檔中單獨還原所需文件。歸檔不是壓縮!!!所謂歸檔,就是將一些文件歸到一起,並沒有對其進行壓縮的操作。 -c:創建歸檔文件 .tar -f:表示使用歸檔文件 -j:調用bzip2程式進行壓縮或解壓 用來壓縮的選項 -z:調用gzip ...
  • 前面小Alan給大家說了jdk的安裝,這篇跟大家聊聊redis非關係型資料庫在Linux伺服器的安裝。 redis簡單介紹 REmote DIctionary Server(Redis) 是一個由Salvatore Sanfilippo寫的key-value存儲系統。 Redis是一個開源的使用AN ...
  • 原文鏈接:http://blog.csdn.net/qq_38646470/article/details/79564392 符號表示 和管道特別形象。 作用: & 160;& 160;& 160;& 160;管道是Linux中很重要的一種通信方式,是把一個程式的輸出直接連接到另一個程式的輸入,常說 ...
  • 1.將iso鏡像文件上傳到linux系統。註意要將文件放在合適的目錄下,因為後面機器重啟時還要自動掛載,所以此次掛載成功之後該文件也不要刪除。 2.將iso光碟掛載到/mnt/iso目錄下。 (1)先創建掛載的目標目錄/mnt/iso (2)接著使用mount -o loop /data/iso/r ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...