章 3. 系統初始化

# 章 3. 系統初始化

作爲系統管理員，粗略地瞭解 Debian 系統的啓動和調配方式是明智的。儘管準確的細節在安裝的軟體包及對應的文檔中，但這些知識對我們大多數人來說都是必須掌握的。

下面是 Debian 系統初始化的要點概述。由於 Debian 系統在不斷發展，您應該參考最新的文件。

- Debian Linux 核心手冊 是關於 Debian 核心的主要資訊來源。

- bootup(7) 介紹了基於 `systemd` 的系統啟動流程。（近期的 Debian）

- boot(7) 介紹了基於 UNIX System V Release 4 的系統啟動流程。（舊版的 Debian）

## 3.1. 啓動過程概述

電腦系統從上電事件到能爲使用者提供完整的作業系統（OS）功能爲止，需要經歷幾個階段的啓動過程。

爲簡便起見，筆者將討論範圍限定在具有預設安裝的典型 PC 平臺上。

典型的啓動過程像是一個四級的火箭。每一級火箭將系統控制權交給下一級。

- 節 3.1.1, “第一階段：UEFI”

- 節 3.1.2, “第二階段：引載加載程序”

- 節 3.1.3, “第三階段：迷你 Debian 系統”

- 節 3.1.4, “第四階段：常規 Debian 系統”

當然，這些階段可以有不同的調配。比如，你編譯了自己的核心，則可能會跳過迷你 Debian 系統的步驟。因此，在讀者親自確認之前，請勿假定自己系統的情況也是如此。

### 3.1.1. 第一階段：UEFI

Unified Extensible Firmware Interface (UEFI) 統一可擴充套件韌體介面 定義了啟動管理器作為 UEFI 規範的一部分。當一個計算機開啟電源，啟動管理器是啟動流程的第一階段，它檢查啟動配置並基於啟動配置的設定，執行特定的作業系統引導載入程式或作業系統核心（通常是引導載入程式）。啟動配置通過變數儲存在 NVRAM，變數包括指示作業系統引導載入程式或作業系統核心的檔案系統路徑的變數。

EFI system partition (ESP) EFI 系統分割槽 是一個數據儲存裝置分割槽，在計算機裡用來遵照 UEFI 規範。當計算機開啟電源時，由 UEFI 韌體來訪問，它儲存了 UEFI 應用程式和這些應用程式執行所需要的檔案，包括作業系統的引導載入程式。（在老的 PC 系統，存放在 MBR 裡的 BIOS 可以用來代替。）

### 3.1.2. 第二階段：引載加載程序

引導載入程式是啟動過程的第二階段，由 UEFI 啟動。引導載入程式將系統核心映像和 initrd 映像載入到記憶體並將控制權交給它們。initrd 映像是根檔案系統映像，其支援程度依賴於所使用的引導載入程式。

Debian 系統通常使用 Linux 核心作為預設的系統核心。當前的 5.x Linux 核心的 initrd 映像在技術上是 initramfs（初始 RAM 檔案系統）映像。

有許多引導載入程式和配置選項存在。

表格 3.1. 引導加載程序列表

軟體包 | 流行度 | 大小 | initrd | 引導加載程序 | 說明
--- | --- | --- | --- | --- | ---
grub-efi-amd64 | I:451 | 142 | 支援 | GRUB UEFI | 可智慧識別磁碟分割槽和檔案系統，例如 vfat、ext4…（UEFI）
grub-pc | V:17, I:525 | 479 | 支援 | GRUB 第 2 版 | 可智慧識別磁碟分割槽和檔案系統，例如 vfat、ext4…（BIOS）
grub-rescue-pc | V:0.06, I:0.59 | 7273 | 支援 | GRUB 第 2 版 | 此爲 GRUB 第 2 版的可引導修復映像（CD 和軟盤）（PC / BIOS 版本）
grml-rescueboot | V:0.1, I:1.1 | 36 | N/A | GRUB 第 2 版 外掛 | grml-rescueboot 增加即用的 Linux ISO 映象到 grub2 啟動選單
syslinux | V:3, I:32 | 325 | 支援 | Isolinux | 可識別 ISO9660 檔案系統。引導 CD 使用此項。
syslinux | V:3, I:32 | 325 | 支援 | Syslinux | 可識別 MSDOS 檔案系統（FAT）。引導軟盤使用此項。
loadlin | V:0.03, I:0.40 | 87 | 支援 | Loadlin | 新系統從 FreeDOS 或 MSDOS 中啓動。
mbr | V:0.3, I:2.9 | 47 | 不支援 | Neil Turton 的 MBR | 此爲取代 MSDOS MBR 的自由軟體。只可識別硬盤分區。

對於 UEFI 系統，GRUB2 首先讀取 ESP 分割槽，使用 "`/boot/efi/EFI/debian/grub.cfg`"裡面 `search.fs_uuid` 指定的 UUID 來確定 GRUB2 選單配置檔案 "`/boot/grub/grub.cfg`" 所在的分割槽。

GRUB2 選單配置檔案的關鍵部分看起來像：

    menuentry 'Debian GNU/Linux' ... {
            load_video
            insmod gzio
            insmod part_gpt
            insmod ext2
            search --no-floppy --fs-uuid --set=root fe3e1db5-6454-46d6-a14c-071208ebe4b1
            echo    'Loading Linux 5.10.0-6-amd64 ...'
            linux   /boot/vmlinuz-5.10.0-6-amd64 root=UUID=fe3e1db5-6454-46d6-a14c-071208ebe4b1 ro quiet
            echo    'Loading initial ramdisk ...'
            initrd  /boot/initrd.img-5.10.0-6-amd64
    }

對於這部分的 `/boot/grub/grub.cfg`，這個選單條目的意義如下。

表格 3.2. `/boot/grub/grub.cfg` 檔案上面部分選單條目意義

設定 | 值
--- | ---
GRUB2 模組載入 | `gzio`, `part_gpt`, `ext2`
使用的根檔案系統分割槽 | 由 `UUID=fe3e1db5-6454-46d6-a14c-071208ebe4b1` 指定的分割槽標識
核心映象檔案在根檔案系統中的路徑 | `/boot/vmlinuz-5.10.0-6-amd64`
使用的核心啟動引數 | "`root=UUID=fe3e1db5-6454-46d6-a14c-071208ebe4b1 ro quiet`"
initrd 映象檔案在根檔案系統中的路徑 | `/boot/initrd.img-5.10.0-6-amd64`

在 Debian 系統 ，"`/boot/grub/grub.cfg`" 是由安裝的 GRUB 軟體包(如： `grub-efi-amd64`)管理，不贊成使用者直接修改這個檔案。應當定製 "`/etc/grub.d/`" 和 "`/etc/default/grub`" 來代替修改配置檔案。配置 GRUB 配置檔案，更新 NVRAM 變數來自動啟動到 Debian：

    # dpkg-reconfigure grub-efi-amd64

| 提示
通過刪除 "`/etc/default/grub`" 裡面 `GRUB_CMDLINE_LINUX_DEFAULT` 的 `quiet` 值 ，你能夠顯示核心啟動日誌資訊。

| 提示
把圖形檔案放到 "`/boot/grub/`" 來增加 GRUB 背景圖。

參見 “`info grub`” 、 grub-install(8)、grub-mkconfig(8)。

### 3.1.3. 第三階段：迷你 Debian 系統

迷你 Debian 系統是啓動流程的第三階段，由引導加載程序啓動。它會在記憶體中運行系統核心和根檔案系統。這是啓動流程的一個可選準備階段。

| 注意
“迷你 Debian 系統”是筆者自創的術語，用於在本文檔中描述啓動流程的第三個階段。這個系統通常被稱爲 initrd 或 initramfs 系統。記憶體中類似的系統在 Debian 安裝程序中使用。

`/init` 程式是記憶體中的根檔案系統上執行的第一個程式。這個程式在使用者空間把核心初始化，並把控制權交給下一階段。迷你 Debian 系統能夠在主引導流程之前新增核心模組或以加密形式掛載根檔案系統，使引導流程更加靈活。

- 如果 initramfs 是由 `initramfs-tools` 建立，則"`/init`" 程式是一個 shell 指令碼程式。

  - 通過給核心添加 “`break=init`" 等啓動參數，你可以中斷這部分啓動流程以獲得 root shell。更多中斷條件請參見 ”`/init`“ 腳本。這個 shell 環境已足夠成熟，你可通過它很好地檢查機器的硬體。

  - 迷你 Debian 系統中可用的指令是精簡過的，且主要由一個稱爲 busybox(1) 的 GNU 工具提供。

- 如果 initramfs 是由 `dracut` 建立，則 "`/init`" 程式是一個二進位制 `systemd` 程式。

  - 迷你 Debian 系統中可用的命令是一個精簡過的 systemd(1) 環境。

| 注意
當在一個只讀的根檔案系統上時，使用 `mount` 指令需要添加 `-n` 選項。

### 3.1.4. 第四階段：常規 Debian 系統

常規 Debian 系統是啟動流程的第四階段，由迷你 Debian 系統啟動。迷你 Debian 系統的核心在此環境下繼續執行。根檔案系統將由記憶體切換到物理儲存裝置上。

init 程序是系統執行的第一個程序（PID=1），它啓動其它各種程序以完成主引導流程。init 程序的預設路徑是 ”`/usr/sbin/init`“，但可通過核心啓動參數修改，例如 ”`init=/path/to/init_program`"。

在 Debian 8 jessie（2015 年釋出）版本後，"`/usr/sbin/init`" 是一個到 "`/lib/systemd/systemd`" 的符號連結。

| 提示
你的系統中實際使用的 init 指令可以使用 “`ps --pid 1 -f`” 命令確認。

表格 3.3. Debian 系統啓動工具列表

軟體包 | 流行度 | 大小 | 說明
--- | --- | --- | ---
`systemd` | V:919, I:979 | 11764 | 基於事件且支援並發的 init(8) 後台行程（可替代 `sysvinit`）
`cloud-init` | V:4.3, I:6.8 | 3240 | 雲實例架構的初始化系統
`systemd-sysv` | V:909, I:980 | 68 | `systemd` 需用的用以代替 `sysvinit` 的手冊頁和符號連結
`init-system-helpers` | V:594, I:987 | 133 | 在 `sysvinit` 和 `systemd` 之間進行轉換的幫助工具
`initscripts` | V:17, I:62 | 197 | 用於初始化和關閉系統的腳本
`sysvinit-core` | V:3.4, I:3.9 | 365 | 類 System V 的 init(8) 工具
`sysv-rc` | V:33, I:66 | 85 | 類 System V 的運行級別修改機制
`sysvinit-utils` | V:726, I:1000 | 100 | 類 System V 的實用工具（startpar(8)，bootlogd(8)，……）
`lsb-base` | V:227, I:332 | 12 | Linux 標準規範 3.2 版的 init 腳本功能
`insserv` | V:40, I:65 | 132 | 利用 LSB init.d 腳本依賴性來組織啓動步驟的工具
`kexec-tools` | V:1.4, I:5.3 | 320 | 用於 kexec(8) 重啟（熱啟動）的 kexec 工具
`systemd-bootchart` | V:0.16, I:0.55 | 131 | 啟動流程效能分析器
`mingetty` | V:0.1, I:2.6 | 36 | 僅包含控制檯的 getty(8)
`mgetty` | V:0.13, I:0.48 | 318 | 可智慧調製解調的 getty(8) 替代品

| 提示
有關啟動流程加速的最新資訊，請參見 Debian 維基：啟動流程加速詞條。

## 3.2. 應急救援系統

| 警告
在沒有一個應急救援系統的情況下，不要執行一個和啟動過程相關的系統管理任務。

應急救援系統能夠讓我們執行有挑戰性的任務，比如：

- 從引導管理器損壞的安裝中啟動系統

- 修復啟動引導器損壞的安裝

- 從損壞的無法啟動的系統中提取資料

- 編輯檔案系統、磁碟分割槽 和 涉及 root 檔案系統的 LVM 卷

典型的，一個應急救援系統用一個 ISO 映象檔案提供，並寫到一個可移動儲存介質，比如：

- USB 快閃記憶體盤 準備作為 節 9.7.2, “直接寫入硬碟”

- CD / DVD 準備作為 節 9.7.7, “直接寫入檔案到 CD/DVD-R/RW”

為了簡化，下面提到的例子用 U 盤作為示例，但是 CD 或 DVD 也能夠很好的使用。

| 提示
你可以按需改變一些 UEFI NVRAM 變數來啟動在 可移動儲存介質上的 任意引導管理器。

### 3.2.1. USB 上的 GRUB UEFI 應急救援系統

"USB 上的 GRUB UEFI 應急救援系統" 插入，開啟系統電源，GRUB UEFI 應急救援系統的選單就能夠啟動。

這個 " USB 上的 GRUB UEFI 應急救援系統" 是事先將 Super Grub2 Disk ISO 映象寫入到 U 盤 來準備。

在安裝其它作業系統等啟動管理器配置損壞的場景，可以這樣修復：

- 啟動 GRUB UEFI 應急救援系統，自動發現已安裝的可啟動系統。

- 從 GRUB 選單啟動已經安裝的 Debian 系統。

- 在 Linux root shell 提示符：

      # dpkg-reconfigure grub-efi-amd64

| 注意
可啟動的 GRUB 應急救援 ISO 映象也能夠通過下面的 "`info grub-mkrescue`" 來生成。它提供了一個命令列的 GRUB shell 提示符，但是不提供自動發現已經安裝的可啟動的系統。

### 3.2.2. USB 上的 Linux 即用救援系統

“Linux 即用應急救援系統 U 盤”插入，開啟系統電源，能夠啟動 Linux 即用應急救援系統。

這個 "USB 上的 Linux 即用應急救援系統" 能夠通過予先將一個基於 Debian 的 Linux 即用 ISO 映象寫入到一個 U 盤 來準備好。這裡是一些這種 Linux 即用映象的列子。

- Debian 即用映象

- Kali Linux 即用映象

- Grml 即用 Linux

這裡是一些 Linux 即用應急管理系統的使用場景：

- 修復由於安裝其它作業系統等原因導致損壞的引導管理器配置：

  - 啟動 Linux 即用救援系統。

  - 掛載無法啟動的 Debian 系統上包含 root 檔案系統的分割槽到 “`/mnt`”。

  - 在 Linux root shell 提示符：

        # chroot /mnt; dpkg-reconfigure grub-efi-amd64

- 修復損壞的 `dpkg` 軟體包：

  - 啟動 Linux 即用救援系統。

  - 掛載已經安裝有損壞 `dpkg` 軟體包的 Debian 系統中，包含 root 檔案系統的分割槽到 "`/mnt`"。

  - 在 Linux root shell 提示符：

        # dpkg --root /mnt -i /mnt/var/cache/apt/archives/dpkg_old_version_amd64.deb

- 執行通常被禁止的操作，比如在安裝好的系統上進行檔案系統操作（參見 節 9.6, “資料儲存技巧”）。

| 警告
你的 Linux 即用系統的 GUI（圖形使用者介面）螢幕在不活動時，可以被鎖屏。

| 提示

- 設定 你的密碼，在你一開始使用 Linux 即用系統時，是一個好的注意。

- 你可以設定你的密碼，例如在 Linux 虛擬控制台的使用者 shell 提示符下用 "`sudo passwd user`"（參見 節 1.1.6, “虛擬控制檯”）。

- 一些 Linux 即用系統可以設定預設的 "使用者/密碼": "Debian Live" = "user/live", "Kali Linux Live" = "kali/kali"

### 3.2.3. 從 GRUB 啟動的 Linux 即用應急救援系統

Linux 即用應急救援系統能夠從 GRUB 選單條目啟動。使用下面的方式來準備這個 GRUB 配置：

- 安裝 `grml-rescueboot` 軟體包。

- 找到一個在它映象裡面有 "`/boot/grub/loopback.cfg`" 的 Linux 即用 ISO 映象。

  - 在 節 3.2.2, “USB 上的 Linux 即用救援系統” 裡面提到的 ISO 映象，在它們的映象裡面有 "`/boot/grub/loopback.cfg`" 。

- 複製這些 Linux 即用 ISO 映象到 "`/boot/grml/`" 目錄。

- 更新 GRUB 選單：

      # dpkg-reconfigure grub-efi-amd64

緊接著開啟系統電源，GRUB 顯示候選 Linux 即用應急救援系統的選單。

## 3.3. Systemd

### 3.3.1. Systemd 初始化

當 Debian 系統啟動，`/usr/sbin/init` 符號連結到的 `/usr/lib/systemd` 作為初始系統程序 (`PID=1`) 啟動，該程序由 root (`UID=0`)所有。參見 systemd(1)。

`systemd` 初始化程序基於單元配置檔案 (參見 systemd.unit(5)) 來並行派生程序，這些單元配置檔案使用宣告樣式來書寫，代替之前的類 SysV 的過程樣式。這些單元配置檔案從下面的一系列路徑來載入 (參見 systemd-system.conf(5)) 。

派生的程序被放在一個單獨的 Linux control groups，在單元后命名，它們屬於一個私有的 systemd 層級結構(參見 cgroups 和 節 4.7.5, “Linux 安全特性”)。

系統模式單元從 systemd.unit(5)描述中的"System Unit Search Path" 載入。主要部分是按照下列優先權順序：

- "`/etc/systemd/system/*`": 管理員建立的系統單元檔案

- "`/run/systemd/system/*`": 執行時單元檔案

- "`/lib/systemd/system/*`": 發行版軟體包管理器安裝的系統單元檔案

他們的相互依賴關係通過"`Wants=`", "`Requires=`", "`Before=`", "`After=`", … 等指示來配置，(參見 systemd.unit(5) 裡的 "MAPPING OF UNIT PROPERTIES TO THEIR INVERSES")。 資源控制也是被定義 (參見 systemd.resource-control(5)).

根據單元配置檔案的字尾來區分它們的型別：

- *.service 描述由 `systemd` 控制和監管的程序.參見 systemd.service(5).

- *.device 描述在 sysfs(5) 裡面作為 udev(7) 裝置樹展示的裝置。參見 systemd.device(5).

- *.mount 描述由 `systemd` 控制和監管的檔案系統掛載點。參見 systemd.mount(5).

- *.automount 描述由 `systemd` 控制和監管的檔案系統自動掛載點。參見 systemd.automount(5).

- *.swap 描述由 `systemd` 控制和監管的 swap 檔案或裝置。參見 systemd.swap(5).

- *.path 描述被 `systemd` 監控的路徑，用於基於路徑的活動。參見 systemd.path(5).

- *.socket 描述被 `systemd` 控制和監管的套接字，用於基於套接字的活動。參見 systemd.socket(5).

- *.timer 描述被 `systemd` 控制和監管的計時器，用於基於時間的活動。參見 systemd.timer(5).

- *.slice 管理 cgroups(7) 的資源。參見 systemd.slice(5).

- *.scope 使用 `systemd` 的匯流排介面來程式化的建立，用以管理一系列系統程序。 參見 systemd.scope(5).

- *.target 把其它單元配置檔案分組，在啟動的時候，來建立同步點。參見systemd.target(5).

系統啟動時（即，init），`systemd` 程序會嘗試啟動"`/lib/systemd/system/default.target`（通常是到"`graphical.target`"的符號連結）。首先，一些特殊的 target 單元（參見 systemd.special(7)），比如 "`local-fs.target`"、"`swap.target`"和"`cryptsetup.target`"會被引入以掛載檔案系統。之後，其它 target 單元也會根據單元依賴關係而被引入。詳細情況，請閱讀 bootup(7)。

`systemd` 提供向後相容的功能。在 "`/etc/init.d/rc[0123456S].d/[KS]name`" 裡面的 SysV 風格的啟動指令碼仍然會被分析；telinit(8) 會被轉換為 systemd 的單元活動請求。

| 注意
模擬的執行級別 2 到 4 全部被符號連結到了相同的“`multi-user.target`”。

### 3.3.2. Systemd 登入

當一個使用者通過 gdm3(8)、sshd(8)等登入到 Debian 系統,`/lib/systemd/system --user` 作為使用者服務管理器程序啟動，並由相應的使用者所有。參見 systemd(1)。

`systemd` 初始化程序基於單元配置檔案 (參見 systemd.unit(5)) 來並行派生程序，這些單元配置檔案使用宣告樣式來書寫，代替之前的類 SysV 的過程樣式。這些單元配置檔案從下面的一系列路徑來載入 (參見 systemd-system.conf(5)) 。

使用者模式單元從 systemd.unit(5)描述中的"User Unit Search Path" 載入。主要部分是按照下列優先權順序：

- "`~/.config/systemd/user/*`": 使用者配置單元檔案

- "`/etc/systemd/user/*`": 管理員建立的使用者單元檔案

- "`/run/systemd/user/*`": 使用者執行時單元檔案

- "`/lib/systemd/user/*`": 發行版軟體包管理器安裝的使用者單元檔案

這些是和 節 3.3.1, “Systemd 初始化” 用同樣的方式管理。

## 3.4. 核心訊息

在控制台上顯示的核心錯誤資訊，能夠通過設定他們的閾值水平來配置。

    # dmesg -n3

表格 3.4. 核心錯誤級別表

錯誤級別值 | 錯誤級別名稱 | 說明
--- | --- | ---
0 | KERN_EMERG | 系統不可用
1 | KERN_ALERT | 行為必須被立即採取
2 | KERN_CRIT | 危險條件
3 | KERN_ERR | 錯誤條件
4 | KERN_WARNING | 警告條件
5 | KERN_NOTICE | 普通但重要的條件
6 | KERN_INFO | 資訊提示
7 | KERN_DEBUG | debug 級別的資訊

## 3.5. 系統訊息

在 `systemd` 下, 核心和系統的資訊都通過日誌服務 `systemd-journald.service` (又名 `journald`)來記錄，放在"`/var/log/journal`"下的不變的二進位制資料，或放在"`/run/log/journal/`"下的變化的二進位制資料.這些二進位制日誌資料，可以通過 journalctl(1) 命令來訪問。例如，你可以顯示從最後一次啟動以來的日誌，按如下所示：

    $ journalctl -b

表格 3.5. 典型的 `journalctl` 命令片段列表

操作 | 命令片段
--- | ---
檢視從最後一次啟動開始的系統服務和核心日誌 | "`journalctl -b --system`"
檢視從最後一次啟動開始的當前使用者的服務日誌 | "`journalctl -b --user`"
檢視從最後一次啟動開始的 "`$unit`" 工作日誌 | "`journalctl -b -u $unit`"
檢視從最後一次啟動開始的 "`$unit`"的工作日誌 ("`tail -f`" 式樣) | "`journalctl -b -u $unit -f`"

在 `systemd` 下，系統日誌工具 rsyslogd(8) 可以被解除安裝。如果安裝了它，它會改變它的行為來讀取易失性二進位制日誌資料（代替在 systemd 之前預設的 "`/dev/log`"）並建立傳統的永久性 ASCII 系統日誌資料。"`/etc/default/rsyslog`" 和 "`/etc/rsyslog.conf`" 能夠自定義日誌檔案和螢幕顯示。參見 rsyslogd(8) 和 rsyslog.conf(5)，也可以參見節 9.3.2, “日誌分析”。

## 3.6. 系統管理

`systemd` 不僅僅提供系統初始化，還用 systemctl(1) 命令提供通用的系統管理操作。

表格 3.6. 典型的 `systemctl` 命令片段列表

操作 | 命令片段
--- | ---
列出所有存在的單元型別 | "`systemctl list-units --type=help`"
列出記憶體中所有 target 單元 | "`systemctl list-units --type=target`"
列出記憶體中所有 service 單元 | "`systemctl list-units --type=service`"
列出記憶體中所有 device 單元 | "`systemctl list-units --type=device`"
列出記憶體中所有 mount 單元 | "`systemctl list-units --type=mount`"
列出記憶體中所有 socket 單元 | "`systemctl list-sockets`"
列出記憶體中所有 timer 單元 | "`systemctl list-timers`"
啟動 "`$unit`" | "`systemctl start $unit`"
停止 "`$unit`" | "`systemctl stop $unit`"
重新載入服務相關的配置 | "`systemctl reload $unit`"
停止和啟動所有 "`$unit`" | "`systemctl restart $unit`"
啟動 "`$unit`" 並停止所有其它的 | "`systemctl isolate $unit`"
轉換到 "`圖形`" (圖形介面系統) | "`systemctl isolate graphical`"
轉換到 "`多使用者`" (命令列系統) | "`systemctl isolate multi-user`"
轉換到 "`應急模式`" (單使用者命令列系統) | "`systemctl isolate rescue`"
向"`$unit`"傳送殺死訊號 | "`systemctl kill $unit`"
檢查"`$unit`"服務是否是活動的 | "`systemctl is-active $unit`"
檢查"`$unit`"服務是否是失敗的 | "`systemctl is-failed $unit`"
檢查"`$unit|$PID|device`"的狀態 | "`systemctl status $unit|$PID|$device`"
顯示"`$unit|$job`"的屬性 | "`systemctl show $unit|$job`"
重設失敗的"`$unit`" | "`systemctl reset-failed $unit"`
列出所有單元服務的依賴性 | "`systemctl list-dependencies --all`"
列出安裝在系統上的單元檔案 | "`systemctl list-unit-files`"
啟用 "`$unit`" (增加符號連結) | "`systemctl enable $unit`"
停用 "`$unit`" (刪除符號連結) | "`systemctl disable $unit`"
取消遮掩 "`$unit`" (刪除到 "`/dev/null`" 的符號連結) | "`systemctl unmask $unit`"
遮掩 "`$unit`" (增加到 "`/dev/null`" 的符號連結) | "`systemctl mask $unit`"
獲取預設的 target 設定 | "`systemctl get-default`"
設定預設 target 為"`graphical`" (圖形系統) | "`systemctl set-default graphical`"
設定預設的 target 為"`multi-user`" (命令列系統) | "`systemctl set-default multi-user`"
顯示工作環境變數 | "`systemctl show-environment`"
設定環境變數 "`variable`" 的值為 "`value`" | "`systemctl set-environment variable=value`"
取消環境變數 "`variable`" 的設定 | "`systemctl unset-environment variable`"
重新載入所有單元檔案和後臺守護程序（daemon） | "`systemctl daemon-reload`"
關閉系統 | "`systemctl poweroff`"
關閉和重啟系統 | "`systemctl reboot`"
掛起系統 | "`systemctl suspend`"
休眠系統 | "`systemctl hibernate`"

這裡, 上面例子中的"`$unit`"，可以是一個單元名（字尾`.service` 和 `.target` 是可選的)，或者，在很多情況下，也可以是匹配的多個單元 (shell 式樣的全域性萬用字元"`*`", "`?`", "`[]`"，通過使用 fnmatch(3) ，來匹配目前在記憶體中的所有單元的基本名稱).

上面列子的系統狀態改變命令，通常是通過"`sudo`"來處理，用以獲得需要的系統管理許可權。

"`systemctl status $unit|$PID|$device`" 的輸出使用有顏色的點("●")來概述單元狀態，讓人看一眼就知道。

- 白色的 "●" 表示一個 "不活動"或"變為不活動中"的狀態。

- 紅色的 "●"表示“失敗”或者“錯誤”狀態。

- 綠色"●"表示“活動”、“重新載入中”或“啟用中”狀態。

## 3.7. 其它系統監控

這裡是 `systemd` 下其它零星的監控命令列表。請閱讀包括 cgroups(7) 在內的相關的 man 手冊頁。

表格 3.7. `systemd` 下其它零星監控命令列表

操作 | 命令片段
--- | ---
顯示每一個初始化步驟所消耗的時間 | "`systemd-analyze time`"
列出所有單元的初始化時間 | "`systemd-analyze blame`"
載入"`$unit`"檔案並檢測錯誤 | "`systemd-analyze verify $unit`"
簡潔的顯示使用者呼叫會話的執行時狀態資訊 | "`loginctl user-status`"
簡潔的顯示呼叫會話的執行時狀態資訊 | "`loginctl session-status`"
跟蹤 cgroups 的啟動過程 | "`systemd-cgls`"
跟蹤 cgroups 的啟動過程 | "`ps xawf -eo pid,user,cgroup,args`"
跟蹤 cgroups 的啟動過程 | 讀取 "`/sys/fs/cgroup/`" 下的 sysfs

## 3.8. 系統配置

### 3.8.1. 主機名

核心維護系統主機名。在啟動的時候，通過 `systemd-hostnamed.service` 啟動的系統單位設定系統的主機名，此主機名儲存在 "`/etc/hostname`"。這個檔案應該只包含系統主機名，而不是全稱域名。

不帶參數執行 hostname(1) 指令可以打印出當前的主機名。

### 3.8.2. 檔案系統

硬碟和網路檔案系統的掛載選項可以在 "`/etc/fstab`" 中設定，參見 fstab(5) 和 節 9.6.7, “通過掛載選項優化檔案系統”。

加密檔案系統的配置設定在“`/etc/crypttab`”中。參見 crypttab(5)

軟 RAID 的配置 mdadm(8) 設定在 "`/etc/mdadm/mdadm.conf`". 參見 mdadm.conf(5).

| 警告
每次啟動的時候，在掛載了所有檔案系統以後，"`/tmp`", "`/var/lock`", 和 "`/var/run`" 中的臨時檔案會被清空。

### 3.8.3. 網路介面初始化

對於使用 `systemd` 的現代 Debian 桌面系統，網路介面通常由兩個服務進行初始化：`lo` 介面通常在“`networking.service`”處理，而其它介面則由“`NetworkManager.service`”處理。

參見 章 5, 網絡設置 來獲取怎樣來配置它們的資訊。

### 3.8.4. 雲系統初始化

雲系統例項可以由 "Debian Official Cloud Images" 或類似的映象啟動。對於這樣的系統例項，主機名、檔案系統、網路、語言環境、SSH 金鑰、使用者和組等個性化資訊，可以使用 `cloud-init` 和 `netplan.io` 軟體包提供的功能來配置，利用多個數據源，放在原始系統映象裡面的檔案和在啟動過程中提供的外部資料。這些軟體包使用 YAML 資料來宣告系統配置。

更多資訊參見 "Cloud Computing with Debian and its descendants", "Cloud-init documentation" 和 節 5.4, “現代雲網絡配置”。

### 3.8.5. 調整 sshd 服務的個性化例子

使用預設安裝，通過 `systemd` 啟動的過程中，在 `network.target` 啟動後，很多網路服務 (參見 章 6, 網路應用)作為後臺守護程序（daemon）啟動。 "`sshd`" 也不列外。讓我們修改為按需啟動"`sshd`" 作為一個定製化的例子。

首先，停用系統安裝的服務單元。

     $ sudo systemctl stop sshd.service
     $ sudo systemctl mask sshd.service

傳統 Unix 服務的按需套接字啟用（on-demand socket activation）系統由 `inetd` (或 `xinetd`)超級服務來提供。在 `systemd` 下, 相同功能能夠通過增加*.socket 和 *.service 單元配置檔案來啟用。

`sshd.socket` 用來定義一個監聽的套接字

    [Unit]
    Description=SSH Socket for Per-Connection Servers

    [Socket]
    ListenStream=22
    Accept=yes

    [Install]
    WantedBy=sockets.target

Debian 使用 “`/etc/libnss-ldap.conf`” 作為 `libnss-ldap` 的配置檔案。

    [Unit]
    Description=SSH Per-Connection Server

    [Service]
    ExecStart=-/usr/sbin/sshd -i
    StandardInput=socket

然後重新載入。

     $ sudo systemctl daemon-reload

## 3.9. udev 系統

從 Linux 核心 2.6 版開始，udev 系統 提供了自動硬體發現和初始化機制。(參見 udev(7)).在核心發現每個裝置的基礎上，udev 系統使用從 sysfs 檔案系統 (參見 節 1.2.12, “procfs 和 sysfs”)的資訊啟動一個使用者程序，使用 modprobe(8) 程式 (參見 節 3.10, “核心模組初始化”)載入支援它所要求的核心模組, 建立相應的裝置節點。

| 提示
如果由於某些理由，"`/lib/modules/kernel-version/modules.dep`"沒有被 depmod(8) 正常生成，模組可能不會被 udev 系統按期望的方式載入。執行"`depmod -a`" 來修復它。 "`/etc/fstab`"裡面的掛載規則,裝置節點不必需是靜態的。你能夠使用 UUID 來掛載裝置，來代替"`/dev/sda`"之類的裝置名. 參見 節 9.6.3, “使用 UUID 存取分割槽”.

由於 udev 系統是一個正在變化的事物，我在其它文件進行了詳細描述，在這裡只提供了最少的資訊。

| 警告
不要嘗試用 udev 規則裡面的 `RUN`（在 udev(7) 提到）長期執行程式，比如說備份指令碼。請建立一個適當的 systemd.service(5) 檔案並激活它來替代。參見 節 10.2.3.2, “掛載事件觸發的備份”。

## 3.10. 核心模組初始化

通過 modprobe(8) 程式新增和刪除核心模組，使我們能夠從使用者程序來調配正在執行的 Linux 核心。udev 系統(參見 節 3.9, “udev 系統”)自動化它的呼叫來幫助核心模組初始化。

下面的非硬體模組和特殊的硬體驅動模組，需要被預先載入，把它們在"`/etc/modules`"檔案裡列出 (參見 modules(5)).

- TUN/TAP 模組提供虛擬的 Point-to-Point 網路裝置 (TUN) 和虛擬的 Ethernet 乙太網路網路裝置 (TAP),

- netfilter 模組提供 netfilter 防火牆能力(iptables(8), 節 5.7, “Netfilter 網路過濾框架”),

- watchdog timer 驅動模組。

modprobe(8) 程式的組態檔案是按 modprobe.conf(5)的說明放在"`/etc/modprobes.d/`" 目錄下，(如果你想避免自動載入某些核心模組，考慮把它們作為黑名單放在"`/etc/modprobes.d/blacklist`" 檔案裡.)

"`/lib/modules/version/modules.dep`" 檔案由 depmod(8) 程式生成，它描述了 modprobe(8) 程式使用的模組依賴性.

| 注意
如果你在啟動時出現模組載入問題，或者 modprobe(8)時出現模組載入問題, "`depmod -a`" 可以通過重構"`modules.dep`"來解決這些問題。

modinfo(8) 程式顯示 Linux 核心模組資訊。

lsmod(8) 程式以好看的格式展示"`/proc/modules`"的內容,顯示當前核心載入了哪些模組。

| 提示
你能夠精確識別你係統上的硬體。 參見節 9.5.3, “硬體識別”. 你可以在啟動時調配硬體來啟用期望的硬體特徵。參見 節 9.5.4, “硬體調配”. 你可以重新編譯核心來增加你的特殊裝置的支援。參見 節 9.10, “核心”.

章 2. Debian 軟體包管理 |  | 章 4. 認證和訪問控制