男女疯狂一边摸一边做羞羞视频|啊好深好硬快点用力别停动态图|亚洲一区无码中文字幕|特级无码毛片免费视频播放▽|久久狠狠躁免费观看|国内精品久久久久久网站

Systemd 入門(mén)教程:命令篇

Systemd 入門(mén)教程:實(shí)戰篇

Systemd 入門(mén)教程:命令篇

作者: 阮一峰

日期: 2016年3月 7日

Systemd 是 Linux 系統工具,用來(lái)啟動(dòng)守護進(jìn)程,已成為大多數發(fā)行版的標準配置。

本文介紹它的基本用法,分為上下兩篇。今天介紹它的主要命令,下一篇介紹如何用于實(shí)戰。img

 

一、由來(lái)

歷史上,Linux 的啟動(dòng)一直采用init進(jìn)程。

下面的命令用來(lái)啟動(dòng)服務(wù)。

這種方法有兩個(gè)缺點(diǎn)。

一是啟動(dòng)時(shí)間長(cháng)。init進(jìn)程是串行啟動(dòng),只有前一個(gè)進(jìn)程啟動(dòng)完,才會(huì )啟動(dòng)下一個(gè)進(jìn)程。

二是啟動(dòng)腳本復雜。init進(jìn)程只是執行啟動(dòng)腳本,不管其他事情。腳本需要自己處理各種情況,這往往使得腳本變得很長(cháng)。

 

二、Systemd 概述

Systemd 就是為了解決這些問(wèn)題而誕生的。它的設計目標是,為系統的啟動(dòng)和管理提供一套完整的解決方案。

根據 Linux 慣例,字母d是守護進(jìn)程(daemon)的縮寫(xiě)。 Systemd 這個(gè)名字的含義,就是它要守護整個(gè)系統。

img

( 上圖為 Systemd 作者 Lennart Poettering

使用了 Systemd,就不需要再用init了。Systemd 取代了initd,成為系統的第一個(gè)進(jìn)程(PID等于 1),其他進(jìn)程都是它的進(jìn)程。

上面的命令查看 Systemd 的版本。

Systemd 的優(yōu)點(diǎn)是功能強大,使用方便,缺點(diǎn)是體系龐大,非常復雜。事實(shí)上,現在還有很多人反對使用 Systemd,理由就是它過(guò)于復雜,與操作系統的其他部分強耦合,違反"keep simple, keep stupid"的Unix 哲學(xué)img

(上圖為 Systemd 架構圖)

 

三、系統管理

Systemd 并不是一個(gè)命令,而是一組命令,涉及到系統管理的方方面面。

3.1 systemctl

systemctl是 Systemd 的主命令,用于管理系統。

3.2 systemd-analyze

systemd-analyze 命令用于查看啟動(dòng)耗時(shí)。

3.3 hostnamectl

hostnamectl命令用于查看當前主機的信息。

3.4 localectl

localectl命令用于查看本地化設置。

3.5 timedatectl

timedatectl命令用于查看當前時(shí)區設置。

3.6 loginctl

loginctl命令用于查看當前登錄的用戶(hù)。

 

四、unit

4.1 含義

Systemd 可以管理所有系統資源。不同的資源統稱(chēng)為 Unit(單位)。

Unit 一共分成12種。

  • Service unit:系統服務(wù)
  • Target unit:多個(gè) Unit 構成的一個(gè)組
  • Device Unit:硬件設備
  • Mount Unit:文件系統的掛載點(diǎn)
  • Automount Unit:自動(dòng)掛載點(diǎn)
  • Path Unit:文件或路徑
  • Scope Unit:不是由 Systemd 啟動(dòng)的外部進(jìn)程
  • Slice Unit:進(jìn)程組
  • Snapshot Unit:Systemd 快照,可以切回某個(gè)快照
  • Socket Unit:進(jìn)程間通信的 socket
  • Swap Unit:swap 文件
  • Timer Unit:定時(shí)器

systemctl list-units命令可以查看當前系統的所有 Unit 。

4.2 Unit 的狀態(tài)

systemctl status命令用于查看系統狀態(tài)和單個(gè) Unit 的狀態(tài)。

除了status命令,systemctl還提供了三個(gè)查詢(xún)狀態(tài)的簡(jiǎn)單方法,主要供腳本內部的判斷語(yǔ)句使用

4.3 Unit 管理

對于用戶(hù)來(lái)說(shuō),最常用的是下面這些命令,用于啟動(dòng)和停止 Unit(主要是 service)。

4.4 依賴(lài)關(guān)系

Unit 之間存在依賴(lài)關(guān)系:A 依賴(lài)于 B,就意味著(zhù) Systemd 在啟動(dòng) A 的時(shí)候,同時(shí)會(huì )去啟動(dòng) B。

systemctl list-dependencies命令列出一個(gè) Unit 的所有依賴(lài)。

上面命令的輸出結果之中,有些依賴(lài)是 Target 類(lèi)型(詳見(jiàn)下文),默認不會(huì )展開(kāi)顯示。如果要展開(kāi) Target,就需要使用--all參數。

 

五、Unit 的配置文件

5.1 概述

每一個(gè) Unit 都有一個(gè)配置文件,告訴 Systemd 怎么啟動(dòng)這個(gè) Unit 。

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

systemctl enable命令用于在上面兩個(gè)目錄之間,建立符號鏈接關(guān)系。

如果配置文件里面設置了開(kāi)機啟動(dòng),systemctl enable命令相當于激活開(kāi)機啟動(dòng)。

與之對應的,systemctl disable命令用于在兩個(gè)目錄之間,撤銷(xiāo)符號鏈接關(guān)系,相當于撤銷(xiāo)開(kāi)機啟動(dòng)。

配置文件的后綴名,就是該 Unit 的種類(lèi),比如sshd.socket。如果省略,Systemd 默認后綴名為.service,所以sshd會(huì )被理解成sshd.service。

5.2 配置文件的狀態(tài)

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

這個(gè)命令會(huì )輸出一個(gè)列表。

這個(gè)列表顯示每個(gè)配置文件的狀態(tài),一共有四種。

  • enabled:已建立啟動(dòng)鏈接
  • disabled:沒(méi)建立啟動(dòng)鏈接
  • static:該配置文件沒(méi)有[Install]部分(無(wú)法執行),只能作為其他配置文件的依賴(lài)
  • masked:該配置文件被禁止建立啟動(dòng)鏈接

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

一旦修改配置文件,就要讓 SystemD 重新加載配置文件,然后重新啟動(dòng),否則修改不會(huì )生效。

5.3 配置文件的格式

配置文件就是普通的文本文件,可以用文本編輯器打開(kāi)。

systemctl cat命令可以查看配置文件的內容。

從上面的輸出可以看到,配置文件分成幾個(gè)區塊。每個(gè)區塊的第一行,是用方括號表示的區別名,比如[Unit]。注意,配置文件的區塊名和字段名,都是大小寫(xiě)敏感的。

每個(gè)區塊內部是一些等號連接的鍵值對。

5.4 配置文件的區塊

[Unit]區塊通常是配置文件的第一個(gè)區塊,用來(lái)定義 Unit 的元數據,以及配置與其他 Unit 的關(guān)系。它的主要字段如下。

  • Dsecription:簡(jiǎn)短描述
  • Documentation:文檔地址
  • Requires:當前 Unit 依賴(lài)的其他 Unit,如果它們沒(méi)有運行,當前 Unit 會(huì )啟動(dòng)失敗
  • Wants:與當前 Unit 配合的其他 Unit,如果它們沒(méi)有運行,當前 Unit 不會(huì )啟動(dòng)失敗
  • BindsTo:與Requires類(lèi)似,它指定的 Unit 如果退出,會(huì )導致當前 Unit 停止運行
  • Before:如果該字段指定的 Unit 也要啟動(dòng),那么必須在當前 Unit 之后啟動(dòng)
  • After:如果該字段指定的 Unit 也要啟動(dòng),那么必須在當前 Unit 之前啟動(dòng)
  • Conflicts:這里指定的 Unit 不能與當前 Unit 同時(shí)運行
  • Condition...:當前 Unit 運行必須滿(mǎn)足的條件,否則不會(huì )運行
  • Assert...:當前 Unit 運行必須滿(mǎn)足的條件,否則會(huì )報啟動(dòng)失敗

[Install]通常是配置文件的最后一個(gè)區塊,用來(lái)定義如何啟動(dòng),以及是否開(kāi)機啟動(dòng)。它的主要字段如下。

  • WantedBy:它的值是一個(gè)或多個(gè) Target,當前 Unit 激活時(shí)(enable)符號鏈接會(huì )放入/etc/systemd/system目錄下面以 Target 名 + .wants后綴構成的子目錄中
  • RequiredBy:它的值是一個(gè)或多個(gè) Target,當前 Unit 激活時(shí),符號鏈接會(huì )放入/etc/systemd/system目錄下面以 Target 名 + .required后綴構成的子目錄中
  • Alias:當前 Unit 可用于啟動(dòng)的別名
  • Also:當前 Unit 激活(enable)時(shí),會(huì )被同時(shí)激活的其他 Unit

[Service]區塊用來(lái) Service 的配置,只有 Service 類(lèi)型的 Unit 才有這個(gè)區塊。它的主要字段如下。

  • Type:定義啟動(dòng)時(shí)的進(jìn)程行為。它有以下幾種值。
  • Type=simple:默認值,執行ExecStart指定的命令,啟動(dòng)主進(jìn)程
  • Type=forking:以 fork 方式從父進(jìn)程創(chuàng )建子進(jìn)程,創(chuàng )建后父進(jìn)程會(huì )立即退出
  • Type=oneshot:一次性進(jìn)程,Systemd 會(huì )等當前服務(wù)退出,再繼續往下執行
  • Type=dbus:當前服務(wù)通過(guò)D-Bus啟動(dòng)
  • Type=notify:當前服務(wù)啟動(dòng)完畢,會(huì )通知Systemd,再繼續往下執行
  • Type=idle:若有其他任務(wù)執行完畢,當前服務(wù)才會(huì )運行
  • ExecStart:?jiǎn)?dòng)當前服務(wù)的命令
  • ExecStartPre:?jiǎn)?dòng)當前服務(wù)之前執行的命令
  • ExecStartPost:?jiǎn)?dòng)當前服務(wù)之后執行的命令
  • ExecReload:重啟當前服務(wù)時(shí)執行的命令
  • ExecStop:停止當前服務(wù)時(shí)執行的命令
  • ExecStopPost:停止當其服務(wù)之后執行的命令
  • RestartSec:自動(dòng)重啟當前服務(wù)間隔的秒數
  • Restart:定義何種情況 Systemd 會(huì )自動(dòng)重啟當前服務(wù),可能的值包括always(總是重啟)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
  • TimeoutSec:定義 Systemd 停止當前服務(wù)之前等待的秒數
  • Environment:指定環(huán)境變量

Unit 配置文件的完整字段清單,請參考官方文檔

 

六、Target

啟動(dòng)計算機的時(shí)候,需要啟動(dòng)大量的 Unit。如果每一次啟動(dòng),都要一一寫(xiě)明本次啟動(dòng)需要哪些 Unit,顯然非常不方便。Systemd 的解決方案就是 Target。

簡(jiǎn)單說(shuō),Target 就是一個(gè) Unit 組,包含許多相關(guān)的 Unit 。啟動(dòng)某個(gè) Target 的時(shí)候,Systemd 就會(huì )啟動(dòng)里面所有的 Unit。從這個(gè)意義上說(shuō),Target這個(gè)概念類(lèi)似于"狀態(tài)點(diǎn)",啟動(dòng)某個(gè) Target 就好比啟動(dòng)到某種狀態(tài)。

傳統的init啟動(dòng)模式里面,有 RunLevel 的概念,跟 Target 的作用很類(lèi)似。不同的是,RunLevel 是互斥的,不可能多個(gè) RunLevel同時(shí)啟動(dòng),但是多個(gè) Target 可以同時(shí)啟動(dòng)。

Target 與 傳統 RunLevel 的對應關(guān)系如下。

它與init進(jìn)程的主要差別如下。

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

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

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

 

七、日志管理

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

journalctl功能強大,用法非常多。

(完)

 

文檔信息

您最近使用了:

收藏 菜單 QQ
男女疯狂一边摸一边做羞羞视频|啊好深好硬快点用力别停动态图|亚洲一区无码中文字幕|特级无码毛片免费视频播放▽|久久狠狠躁免费观看|国内精品久久久久久网站