Linux中國

理解 systemd 啟動時在做什麼

在本系列的第一篇文章《學著愛上 systemd》,我考察了 systemd 的功能和架構,以及圍繞 systemd 作為古老的 SystemV 初始化程序和啟動腳本的替代品的爭論。在這第二篇文章中,我將開始探索管理 Linux 啟動序列的文件和工具。我會解釋 systemd 啟動序列、如何更改默認的啟動目標(即 SystemV 術語中的運行級別)、以及在不重啟的情況下如何手動切換到不同的目標。

我還將考察兩個重要的 systemd 工具。第一個 systemctl 命令是和 systemd 交互、向其發送命令的基本方式。第二個是 journalctl,用於訪問 systemd 日誌,後者包含了大量系統歷史數據,比如內核和服務的消息(包括指示性信息和錯誤信息)。

務必使用一個非生產系統進行本文和後續文章中的測試和實驗。你的測試系統需要安裝一個 GUI 桌面(比如 Xfce、LXDE、Gnome、KDE 或其他)。

上一篇文章中我寫道計劃在這篇文章創建一個 systemd 單元並添加到啟動序列。由於這篇文章比我預期中要長,這些內容將留到本系列的下一篇文章。

使用 systemd 探索 Linux 的啟動

在觀察啟動序列之前,你需要做幾件事情得使引導和啟動序列開放可見。正常情況下,大多數發行版使用一個開機動畫或者啟動畫面隱藏 Linux 啟動和關機過程中的顯示細節,在基於 Red Hat 的發行版中稱作 Plymouth 引導畫面。這些隱藏的消息能夠向尋找信息以排除程序故障、或者只是學習啟動序列的系統管理員提供大量有關係統啟動和關閉的信息。你可以通過 GRUB( 大統一引導載入器 Grand Unified Boot Loader )配置改變這個設置。

主要的 GRUB 配置文件是 /boot/grub2/grub.cfg ,但是這個文件在更新內核版本時會被覆蓋,你不會想修改它的。相反,應該修改用於改變 grub.cfg 默認設置的 /etc/default/grub 文件。

首先看一下當前未修改的 /etc/default/grub 文件的版本:

[root@testvm1 ~]# cd /etc/default ; cat 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="resume=/dev/mapper/fedora_testvm1-swap rd.lvm.
lv=fedora_testvm1/root rd.lvm.lv=fedora_testvm1/swap rd.lvm.lv=fedora_
testvm1/usr rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
[root@testvm1 default]#

GRUB 文檔 的第 6 章列出了 /etc/default/grub 文件的所有可用項,我只關注下面的部分:

  • 我將 GRUB 菜單倒計時的秒數 GRUB_TIMEOUT,從 5 改成 10,以便在倒計時達到 0 之前有更多的時間響應 GRUB 菜單。
  • GRUB_CMDLINE_LINUX 列出了引導階段傳遞給內核的命令行參數,我刪除了其中的最後兩個參數。其中的一個參數 rhgb 代表 「 紅帽圖形化引導 Red Hat Graphical Boot 」,在內核初始化階段顯示一個小小的 Fedora 圖標動畫,而不是顯示引導階段的信息。另一個參數 quiet,屏蔽顯示記錄了啟動進度和發生錯誤的消息。系統管理員需要這些信息,因此我刪除了 rhgbquiet。如果引導階段發生了錯誤,屏幕上顯示的信息可以指向故障的原因。

更改之後,你的 GRUB 文件將會像下面一樣:

[root@testvm1 default]# cat grub
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="resume=/dev/mapper/fedora_testvm1-swap rd.lvm.
lv=fedora_testvm1/root rd.lvm.lv=fedora_testvm1/swap rd.lvm.lv=fedora_
testvm1/usr"
GRUB_DISABLE_RECOVERY="false"
[root@testvm1 default]#

grub2-mkconfig 程序使用 /etc/default/grub 文件的內容生成 grub.cfg 配置文件,從而改變一些默認的 GRUB 設置。grub2-mkconfig 輸出到 STDOUT,你可以使用程序的 -o 參數指明數據流輸出的文件,不過使用重定向也同樣簡單。執行下面的命令更新 /boot/grub2/grub.cfg 配置文件:

[root@testvm1 grub2]# grub2-mkconfig > /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.18.9-200.fc28.x86_64
Found initrd image: /boot/initramfs-4.18.9-200.fc28.x86_64.img
Found linux image: /boot/vmlinuz-4.17.14-202.fc28.x86_64
Found initrd image: /boot/initramfs-4.17.14-202.fc28.x86_64.img
Found linux image: /boot/vmlinuz-4.16.3-301.fc28.x86_64
Found initrd image: /boot/initramfs-4.16.3-301.fc28.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-7f12524278bd40e9b10a085bc82dc504
Found initrd image: /boot/initramfs-0-rescue-7f12524278bd40e9b10a085bc82dc504.img
done
[root@testvm1 grub2]#

重新啟動你的測試系統查看本來會隱藏在 Plymouth 開機動畫之下的啟動信息。但是如果你沒有關閉開機動畫,又需要查看啟動信息的話又該如何操作?或者你關閉了開機動畫,而消息流過的速度太快,無法閱讀怎麼辦?(實際情況如此。)

有兩個解決方案,都涉及到日誌文件和 systemd 日誌 —— 兩個都是你的好夥伴。你可以使用 less 命令查看 /var/log/messages 文件的內容。這個文件包含引導和啟動信息,以及操作系統執行正常操作時生成的信息。你也可以使用不加任何參數的 journalctl 命令查看 systemd 日誌,包含基本相同的信息:

[root@testvm1 grub2]# journalctl
-- Logs begin at Sat 2020-01-11 21:48:08 EST, end at Fri 2020-04-03 08:54:30 EDT. --
Jan 11 21:48:08 f31vm.both.org kernel: Linux version 5.3.7-301.fc31.x86_64 (mockbuild@bkernel03.phx2.fedoraproject.org) (gcc version 9.2.1 20190827 (Red Hat 9.2.1-1) (GCC)) #1 SMP Mon Oct >
Jan 11 21:48:08 f31vm.both.org kernel: Command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-5.3.7-301.fc31.x86_64 root=/dev/mapper/VG01-root ro resume=/dev/mapper/VG01-swap rd.lvm.lv=VG01/root rd>
Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers'
Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]:  256
Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-provided physical RAM map:
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x000000000009fc00-0x000000000009ffff] reserved
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] reserved
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x0000000000100000-0x00000000dffeffff] usable
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000dfff0000-0x00000000dfffffff] ACPI data
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000fec00000-0x00000000fec00fff] reserved
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000fffc0000-0x00000000ffffffff] reserved
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x0000000100000000-0x000000041fffffff] usable
Jan 11 21:48:08 f31vm.both.org kernel: NX (Execute Disable) protection: active
Jan 11 21:48:08 f31vm.both.org kernel: SMBIOS 2.5 present.
Jan 11 21:48:08 f31vm.both.org kernel: DMI: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
Jan 11 21:48:08 f31vm.both.org kernel: Hypervisor detected: KVM
Jan 11 21:48:08 f31vm.both.org kernel: kvm-clock: Using msrs 4b564d01 and 4b564d00
Jan 11 21:48:08 f31vm.both.org kernel: kvm-clock: cpu 0, msr 30ae01001, primary cpu clock
Jan 11 21:48:08 f31vm.both.org kernel: kvm-clock: using sched offset of 8250734066 cycles
Jan 11 21:48:08 f31vm.both.org kernel: clocksource: kvm-clock: mask: 0xffffffffffffffff max_cycles: 0x1cd42e4dffb, max_idle_ns: 881590591483 ns
Jan 11 21:48:08 f31vm.both.org kernel: tsc: Detected 2807.992 MHz processor
Jan 11 21:48:08 f31vm.both.org kernel: e820: update [mem 0x00000000-0x00000fff] usable ==> reserved
Jan 11 21:48:08 f31vm.both.org kernel: e820: remove [mem 0x000a0000-0x000fffff] usable
<snip>

由於數據流可能長達幾十萬甚至幾百萬行,我在這裡截斷了它。(我的主要工作站上列出的日誌長度是 1,188,482 行。)請確保是在你的測試系統嘗試的這個命令。如果系統已經運行了一段時間 —— 即使重啟過很多次 —— 還是會顯示大量的數據。查看這些日誌數據,因為它包含了很多信息,在進行問題判斷時可能非常有用。了解這個數據文件在正常的引導和啟動過程中的模樣,可以幫助你在問題出現時定位問題。

我將在本系列之後的文章討論 systemd 日誌、journalctl 命令、以及如何整理輸出的日誌數據來尋找更詳細的信息。

內核被 GRUB 載入到內存後,必須先將自己從壓縮後的文件中解壓出來,才能執行任何有意義的操作。解壓自己後,內核開始運行,載入 systemd 並轉交控制權。

引導 boot 階段到此結束,此時 Linux 內核和 systemd 正在運行,但是無法為用戶執行任何生產性任務,因為其他的程序都沒有執行,沒有命令行解釋器提供命令行,沒有後台進程管理網路和其他的通信鏈接,也沒有任何東西能夠控制計算機執行生產功能。

現在 systemd 可以載入所需的功能性單元以便將系統啟動到選擇的目標運行狀態。

目標

一個 systemd 目標 target 代表一個 Linux 系統當前的或期望的運行狀態。與 SystemV 啟動腳本十分類似,目標定義了系統運行必須存在的服務,以及處於目標狀態下必須激活的服務。圖表 1 展示了使用 systemd 的 Linux 系統可能的運行狀態目標。就像在本系列的第一篇文章以及 systemd 啟動的手冊頁(man bootup)所看到的一樣,有一些開啟不同必要服務的其他中間目標,包括 swap.targettimers.targetlocal-fs.target 等。一些目標(像 basic.target)作為檢查點使用,在移動到下一個更高級的目標之前保證所有需要的服務已經啟動並運行。

除非開機時在 GRUB 菜單進行更改,systemd 總是啟動 default.targetdefault.target 文件是指向真實的目標文件的符號鏈接。對於桌面工作站,default.target 通常是 graphical.target,等同於 SystemV 的運行等級 5。對於伺服器,默認目標多半是 multi-user.target,就像 SystemV 的運行等級 3。emergency.target 文件類似單用戶模式。目標和 服務 service 都是一種 systemd 單元。

下面的圖表,包含在本系列的上一篇文章中,比較了 systemd 目標和古老的 SystemV 啟動運行等級。為了向後兼容,systemd 提供了 systemd 目標別名,允許腳本和系統管理員使用像 init 3 一樣的 SystemV 命令改變運行等級。當然,SystemV 命令被轉發給 systemd 進行解釋和執行。

systemd 目標 SystemV 運行級別 目標別名 描述
default.target 這個目標通常是一個符號鏈接,作為 multi-user.targetgraphical.target 的別名。systemd 總是用 default.target 啟動系統。default.target** 不能作為halt.targetpoweroff.targetreboot.target` 的別名。
graphical.target 5 runlevel5.target 帶有 GUI 的 multi-user.target
4 runlevel4.target 未使用。運行等級 4 和 SystemV 的運行等級 3 一致,可以創建這個目標並進行定製,用於啟動本地服務,而不必更改默認的 multi-user.target
multi-user.target 3 runlevel3.target 運行所有的服務,但是只有命令行界面(CLI) 。
2 runlevel2.target 多用戶,沒有 NFS,但是運行其他所有的非 GUI 服務
rescue.target 1 runlevel1.target 一個基本的系統,包括掛載文件系統,但是只運行最基礎的服務,以及一個主控制台上的用於救援的命令行解釋器。
emergency.target S 單用戶模式 —— 沒有服務運行;文件系統沒有掛載。這是最基礎級的操作模式,只有一個運行在主控制台的用於緊急情況的命令行解釋器,供用戶和系統交互。
halt.target 不斷電的情況下停止系統
reboot.target 6 runlevel6.target 重啟
poweroff.target 0 runlevel0.target 停止系統並關閉電源

每個目標在配置文件中都描述了一組依賴關係。systemd 啟動需要的依賴,即 Linux 主機運行在特定功能級別所需的服務。載入目標配置文件中列出的所有依賴並運行後,系統就運行在那個目標等級。如果願意,你可以在本系列的第一篇文章《學著愛上 systemd》中回顧 systemd 的啟動序列和運行時目標。

探索當前的目標

許多 Linux 發行版默認安裝一個 GUI 桌面界面,以便安裝的系統可以像工作站一樣使用。我總是從 Fedora Live USB 引導驅動器安裝 Xfce 或 LXDE 桌面。即使是安裝一個伺服器或者其他基礎類型的主機(比如用於路由器和防火牆的主機),我也使用 GUI 桌面的安裝方式。

我可以安裝一個沒有桌面的伺服器(數據中心的典型做法),但是這樣不滿足我的需求。原因不是我需要 GUI 桌面本身,而是 LXDE 安裝包含了許多其他默認的伺服器安裝沒有提供的工具,這意味著初始安裝之後我需要做的工作更少。

但是,僅僅因為有 GUI 桌面並不意味著我要使用它。我有一個 16 埠的 KVM,可以用於訪問我的大部分 Linux 系統的 KVM 介面,但我和它們交互的大部分交互是通過從我的主要工作站建立的遠程 SSH 連接。這種方式更安全,而且和 graphical.target 相比,運行 multi-user.target 使用更少的系統資源。

首先,檢查默認目標,確認是 graphical.target

[root@testvm1 ~]# systemctl get-default
graphical.target
[root@testvm1 ~]#

然後確認當前正在運行的目標,應該和默認目標相同。你仍可以使用老方法,輸出古老的 SystemV 運行等級。注意,前一個運行等級在左邊,這裡是 N(意思是 None),表示主機啟動後沒有修改過運行等級。數字 5 是當前的目標,正如古老的 SystemV 術語中的定義:

[root@testvm1 ~]# runlevel
N 5
[root@testvm1 ~]#

注意,runlevel 的手冊頁指出運行等級已經被淘汰,並提供了一個轉換表。

你也可以使用 systemd 方式,命令的輸出有很多行,但確實用 systemd 術語提供了答案:

[root@testvm1 ~]# systemctl list-units --type target
UNIT                   LOAD   ACTIVE SUB    DESCRIPTION                
basic.target           loaded active active Basic System              
cryptsetup.target      loaded active active Local Encrypted Volumes    
getty.target           loaded active active Login Prompts              
graphical.target       loaded active active Graphical Interface        
local-fs-pre.target    loaded active active Local File Systems (Pre)  
local-fs.target        loaded active active Local File Systems        
multi-user.target      loaded active active Multi-User System          
network-online.target  loaded active active Network is Online          
network.target         loaded active active Network                    
nfs-client.target      loaded active active NFS client services        
nss-user-lookup.target loaded active active User and Group Name Lookups
paths.target           loaded active active Paths                      
remote-fs-pre.target   loaded active active Remote File Systems (Pre)  
remote-fs.target       loaded active active Remote File Systems        
rpc_pipefs.target      loaded active active rpc_pipefs.target          
slices.target          loaded active active Slices                    
sockets.target         loaded active active Sockets                    
sshd-keygen.target     loaded active active sshd-keygen.target        
swap.target            loaded active active Swap                      
sysinit.target         loaded active active System Initialization      
timers.target          loaded active active Timers                    

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

21 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use &apos;systemctl list-unit-files&apos;.

上面列出了當前載入的和激活的目標,你也可以看到 graphical.targetmulti-user.targetmulti-user.target 需要在 graphical.target 之前載入。這個例子中,graphical.target 是激活的。

切換到不同的目標

切換到 multi-user.target 很簡單:

[root@testvm1 ~]# systemctl isolate multi-user.target

顯示器現在應該從 GUI 桌面或登錄界面切換到了一個虛擬控制台。登錄並列出當前激活的 systemd 單元,確認 graphical.target 不再運行:

[root@testvm1 ~]# systemctl list-units --type target

務必使用 runlevel 確認命令輸出了之前的和當前的「運行等級」:

[root@testvm1 ~]# runlevel
5 3

更改默認目標

現在,將默認目標改為 multi-user.target,以便系統總是啟動進入 multi-user.target,從而使用控制台命令行介面而不是 GUI 桌面介面。使用你的測試主機的根用戶,切換到保存 systemd 配置的目錄,執行一次快速列出操作:

[root@testvm1 ~]# cd /etc/systemd/system/ ; ll
drwxr-xr-x. 2 root root 4096 Apr 25  2018  basic.target.wants
<snip>
lrwxrwxrwx. 1 root root   36 Aug 13 16:23  default.target -> /lib/systemd/system/graphical.target
lrwxrwxrwx. 1 root root   39 Apr 25  2018  display-manager.service -> /usr/lib/systemd/system/lightdm.service
drwxr-xr-x. 2 root root 4096 Apr 25  2018  getty.target.wants
drwxr-xr-x. 2 root root 4096 Aug 18 10:16  graphical.target.wants
drwxr-xr-x. 2 root root 4096 Apr 25  2018  local-fs.target.wants
drwxr-xr-x. 2 root root 4096 Oct 30 16:54  multi-user.target.wants
<snip>
[root@testvm1 system]#

為了強調一些有助於解釋 systemd 如何管理啟動過程的重要事項,我縮短了這個列表。你應該可以在虛擬機看到完整的目錄和鏈接列表。

default.target 項是指向目錄 /lib/systemd/system/graphical.target 的符號鏈接(軟鏈接),列出那個目錄查看目錄中的其他內容:

[root@testvm1 system]# ll /lib/systemd/system/ | less

你應該在這個列表中看到文件、目錄、以及更多鏈接,但是專門尋找一下 multi-user.targetgraphical.target。現在列出 default.target(指向 /lib/systemd/system/graphical.target 的鏈接)的內容:

[root@testvm1 system]# cat default.target
#  SPDX-License-Identifier: LGPL-2.1+
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Graphical Interface
Documentation=man:systemd.special(7)
Requires=multi-user.target
Wants=display-manager.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target display-manager.service
AllowIsolate=yes
[root@testvm1 system]#

graphical.target 文件的這個鏈接描述了圖形用戶介面需要的所有必備條件。我會在本系列的下一篇文章至少探討其中的一些選項。

為了使主機啟動到多用戶模式,你需要刪除已有的鏈接,創建一個新鏈接指向正確目標。如果你的 PWD 不是 /etc/systemd/system,切換過去:

[root@testvm1 system]# rm -f default.target
[root@testvm1 system]# ln -s /lib/systemd/system/multi-user.target default.target

列出 default.target 鏈接,確認其指向了正確的文件:

[root@testvm1 system]# ll default.target
lrwxrwxrwx 1 root root 37 Nov 28 16:08 default.target -> /lib/systemd/system/multi-user.target
[root@testvm1 system]#

如果你的鏈接看起來不一樣,刪除並重試。列出 default.target 鏈接的內容:

[root@testvm1 system]# cat default.target
#  SPDX-License-Identifier: LGPL-2.1+
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes
[root@testvm1 system]#

default.target(這裡其實是指向 multi-user.target 的鏈接)其中的 [Unit] 部分現在有不同的必需條件。這個目標不需要有圖形顯示管理器。

重啟,你的虛擬機應該啟動到虛擬控制台 1 的控制台登錄,虛擬控制台 1 在顯示器標識為 tty1。現在你已經知道如何修改默認的目標,使用所需的命令將默認目標改回 graphical.target

首先檢查當前的默認目標:

[root@testvm1 ~]# systemctl get-default
multi-user.target
[root@testvm1 ~]# systemctl set-default graphical.target
Removed /etc/systemd/system/default.target.
Created symlink /etc/systemd/system/default.target → /usr/lib/systemd/system/graphical.target.
[root@testvm1 ~]#

輸入下面的命令直接切換到 graphical.target 和顯示管理器的登錄界面,不需要重啟:

[root@testvm1 system]# systemctl isolate default.target

我不清楚為何 systemd 的開發者選擇了術語 isolate 作為這個子命令。我的研究表明指的可能是運行指明的目標,但是「隔離」並終結其他所有啟動該目標不需要的目標。然而,命令執行的效果是從一個運行的目標切換到另一個——在這個例子中,從多用戶目標切換到圖形目標。上面的命令等同於 SystemV 啟動腳本和 init 程序中古老的 init 5 命令。

登錄 GUI 桌面,確認能正常工作。

總結

本文探索了 Linux systemd 啟動序列,開始探討兩個重要的 systemd 工具 systemctljournalctl,還說明了如何從一個目標切換到另一個目標,以及如何修改默認目標。

本系列的下一篇文章中將會創建一個新的 systemd 單元,並配置為啟動階段運行。下一篇文章還會查看一些配置選項,可以幫助確定某個特定的單元在序列中啟動的位置,比如在網路啟動運行後。

資源

關於 systemd 網路上有大量的信息,但大部分都簡短生硬、愚鈍、甚至令人誤解。除了本文提到的資源,下面的網頁提供了關於 systemd 啟動更詳細可靠的信息。

  • Fedora 項目有一個優質實用的 systemd 指南,幾乎有你使用 systemd 配置、管理、維護一個 Fedora 計算機需要知道的一切。
  • Fedora 項目還有一個好用的 速查表,交叉引用了古老的 SystemV 命令和對應的 systemd 命令。
  • 要獲取 systemd 的詳細技術信息和創立的原因,查看 Freedesktop.orgsystemd 描述
  • Linux.com 上「systemd 的更多樂趣」提供了更高級的 systemd 信息和提示

還有一系列針對系統管理員的深層技術文章,由 systemd 的設計者和主要開發者 Lennart Poettering 所作。這些文章寫於 2010 年 4 月到 2011 年 9 月之間,但在當下仍然像當時一樣有價值。關於 systemd 及其生態的許多其他優秀的作品都是基於這些文章的。

via: https://opensource.com/article/20/5/systemd-startup

作者:David Both 選題:lujun9972 譯者:YungeG 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國