---
title: "systemd 正式加入 Rust 支援：只限獨立程式、仍用 Meson 建構"
url: https://sammy.hk/systemd-rust-support-code-meson-build/
author: Ethan
published: 2026-10-25T14:47:00+08:00
modified: 2026-10-25T11:45:19+08:00
description: "systemd 專案於 2026 年 10 月 23 日合併了一個由 Christian Brauner 提交的提交（770c053），標題為「meson: add -Drust= for programs written in Rust」，正式為以 Rust 撰寫的程式加入可選支援，但強調「其他一切不變」。[1] 範…"
categories: ["開放源碼"]
tags: [linux, Meson, Rust, systemd, "建構系統"]
source: https://sammy.hk
---
systemd 專案於 2026 年 10 月 23 日合併了一個由 Christian Brauner 提交的提交（`770c053`），標題為「meson: add -Drust= for programs written in Rust」，正式為以 Rust 撰寫的程式加入可選支援，但強調「其他一切不變」。\[1\]

## 範圍與限制

提交訊息明確界定了適用範圍：\[1\]

- `libsystemd-shared`、`libsystemd` 以及 NSS 與 PAM 模組**繼續以 C 撰寫**；以 Rust 寫的程式會像 C 程式一樣，動態連結 `libsystemd-shared`
- Rust 程式只取得 `core`：**不使用 `std`、不使用 `alloc` crate，亦沒有外部 crate**
- 選項是 Meson feature，**預設為 auto**
- 需要 **rustc 1.85 或以上**與 **bindgen 0.71.1 或以上**（正是 Debian 13 所附帶的版本）；1.85 是最低支援 Rust 版本（MSRV），並會傳給 bindgen，令產生的綁定永不需要比手寫程式更新的編譯器
- **bindgen 0.72.0 會被拒絕**，因為它產生的程式碼無法編譯
- 使用 auto 時，若找到工具鏈便會使用；`-Drust=enabled` 則在找不到時明確報錯
- 需要 **Meson 1.4.0** 以支援 rust 模組的 `bindgen()` 整合；專案維持原本的 Meson 下限，而 `-Drust=auto` 在較舊 Meson 上會靜默關閉
- **暫不支援交叉編譯**，因為 bindgen 需要被告知目標平台

官方指出，`HAVE_RUST` 會告訴 unit、man page 與測試是否有建構 Rust 程式。\[1\]

## 為何要探測 libclang

提交訊息解釋，bindgen 在執行時載入 libclang，因此「找到執行檔」並不能證明可以產生綁定。專案會在 configure 階段以 `tools/bindgen-probe.h` 執行一次，報告 libclang 版本（並顯示於摘要），該檔案包含 bindgen = 22 時會處理錯誤的構造；因此壞掉的組合會被拒絕，或令 Rust 支援被停用，而不是在稍後建構時才失敗。\[1\]

## 程式碼規範

提交訊息列出了多項專案層級的 rustc 參數與 lint 規則：\[1\]

- lint 集沿用內核的一套：unsafe 操作需要 unsafe 區塊；每個 unsafe 區塊需要 SAFETY 註解，每個 unsafe 函數需要 Safety 章節（透過 clippy 的 `undocumented_unsafe_blocks` 等強制）；公開項目需要文件；指標轉型 lint 令原始指標處理保持明確
- **所有建構類型都啟用溢位檢查**：官方解釋 rustc 的預設取決於最佳化等級，而 Meson 總是傳 `overflow-checks=no`，但 Rust 程式不應在 C 程式會檢查的地方靜默回繞
- 全部以 **`panic=abort`** 建構：官方指 unwinding 本來就無法跨越事件迴圈的 C frame，而且在沒有 `std` 的情況下亦沒有 unwinder
- Meson 傳遞相對於建構目錄的來源路徑，因此 `file!()` 與 journal 中的 `CODE_FILE=` 會顯示該路徑；專案會像 C 的 `PROJECT_FILE` 一樣重映射前綴
- `rustfmt.toml` 與 `.clippy.toml` 分別承載格式與 lint 設定；rustfmt 使用預設值但採用專案慣用的行長，clippy 取得 MSRV；整個專案使用 **edition 2021**，`.editorconfig` 亦認識 `*.rs`

## 首個 Rust 組件

據媒體報道，這個改動的起點是一個以 Rust 撰寫的新組件 **systemd-keyring-setup**，用於在開機過程中向內核的 dm-verity／fs-verity／BPF keyring 配置 keyring 並登記 X.509 憑證；報道亦指建構不使用 Cargo，而是經 Meson 以 C linkage 建構，而核心的 systemd 函式庫程式碼因未解決的阻礙，暫時仍未有 Rust 支援。\[1\]\[2\]

## 參考資料

\[1\] [systemd 官方儲存庫 — 提交 770c053：meson: add -Drust= for programs written in Rust（2026 年 10 月 23 日）](https://github.com/systemd/systemd/commit/770c05374e78cf17b373ba866c240eec75188017)

\[2\] [systemd 官方儲存庫](https://github.com/systemd/systemd)

### 相關文章：

1. [mold 3.0 發布：高速連結器完成 Rust 重寫](https://sammy.hk/mold-3-0-%e7%99%bc%e5%b8%83%ef%bc%9a%e9%ab%98%e9%80%9f%e9%80%a3%e7%b5%90%e5%99%a8%e5%ae%8c%e6%88%90-rust-%e9%87%8d%e5%af%ab/ "mold 3.0 發布：高速連結器完成 Rust 重寫")
2. [難以預先安裝 Linux 在套裝電腦上嗎？](https://sammy.hk/difficult-preinstallation-brandmade-computer/ "難以預先安裝 Linux 在套裝電腦上嗎？")
3. [換硬碟的好幫手 – SystemRescueCd](https://sammy.hk/harddisk-replacement-with-systemrescuecd/ "換硬碟的好幫手 – SystemRescueCd")
4. [香港Linux軟件庫嚴重短缺](https://sammy.hk/shortage-of-linux-mirrors-in-hong-kong/ "香港Linux軟件庫嚴重短缺")
