RFC-0175:ELF Runner stdio 轉送預設值 | |
---|---|
狀態 | 已接受 |
區域 |
|
說明 | 預設將 stdout/stderr 轉送至 LogSink,改善元件開發人員體驗。 |
問題 | |
Gerrit 變更 | |
作者 | |
審查人員 | |
提交日期 (年-月-日) | 2022-06-03 |
審查日期 (年-月-日) | 2022-07-06 |
摘要
變更 ELF runner 的預設值,以便將 stdout 和 stderr 轉送至 LogSink (如果可用)。
提振精神
這個 RFC 以 RFC-0069 為基礎,該 RFC 指定了 ELF 執行元件的功能,以便支援將 stdout 和 stderr 轉送至 fuchsia.logger.LogSink
。自從實作這項功能以來,我們發現在許多情況下,元件雖然有 LogSink
,但在從元件 v1 遷移至 v2 時,會遺漏重要的記錄訊息,因為在遷移過程中,stdout/stderr 訊息會遭到靜默捨棄。
Fuchsia 的測試執行程式預設會擷取及顯示 stdout 和 stderr,而使用者經常會因 ELF 執行元件 (需要明確轉寄) 的不同行為而感到困惑。
如果程式碼只在未經常執行的失敗模式中使用 stdio,就會導致未設定的 stdout 或 stderr 出現意外,導致實際當機報告缺少重要資訊。舉例來說,ZX_ASSERT
巨集會將失敗的斷言回報至 stderr,而 HLCPP FIDL 繫結會將某些類型的剖析錯誤回報至 stderr。
相關人員
導師:hjfreyer@google.com
審查者:
- geb@google.com (元件架構)
- yaneury@google.com (RFC-0069 作者)
諮詢對象:hjfreyer@google.com、abdulla@google.com、miguelfrde@google.com、surajmalhotra@google.com、wez@google.com、shayba@google.com
社交化:這個 RFC 是元件架構團隊在電子郵件和離線討論後的成果。
設計
如果 ELF 元件作者在 program
區段中未指定 forward_stdout_to
或 forward_stderr_to
欄位,ELF 執行元件會嘗試為未指定的串流設定轉送。在這個設定中,如果無法將 stdio 串流轉送至 LogSink,系統會保持靜默,元件仍會啟動。
實作
我們會放寬將 stdio 轉送至 LogSink 的行為,這樣一來,如果元件要求轉送但沒有 LogSink,還是會啟動。
如果元件資訊清單中未指定 forward_stdout_to: "log"
和 forward_stderr_to: "log"
,ELF 執行元件會假設預設值為 forward_stdout_to: "log"
和 forward_stderr_to: "log"
。
如果初始化轉送作業時發生錯誤,ELF 執行元件仍會將 stdout 和/或 stderr 句柄提供給要求或預設為轉送的已啟動元件。
成效
我們認為這項變更不會對成效造成太大差異。
人體工學
提供實用的預設行為,可減少元件開發人員需要做出的決策數量,進而改善人因工程。
我們會在完成這項變更的實作後刪除 sdk/lib/syslog/elf_stdio.shard.cml
,並將其用戶端切換至主要 syslog 分片,後者會對 ELF 元件執行相同的行為。
回溯相容性
如果元件沒有 LogSink,且使用預設 stdio 轉送設定,當元件嘗試在其命名空間中開啟 LogSink 時,就會在元件管理服務工具的記錄中產生路由錯誤。在新的預設值初始推出時,我們會在平台元件資訊清單中加入明確的 forward_std{out,err}_to: "none"
欄位,但不會加入 LogSink。日後,您可以使用更精密的命名空間探查功能,判斷元件是否應提供 LogSink,藉此消除這些錯誤訊息。
安全性考量
這項設計不會透過授予元件任何額外功能來提高元件的權限,只有在元件資訊清單要求 LogSink 且已將該能力導向時,才會啟用轉送功能。
隱私權注意事項
這會導致系統記錄寫入額外的記錄訊息,其中可能包含使用者產生的資料。記錄管道已設有控制項,可稽核及清除隱私權敏感資料,因此不需要進行任何變更。
測試
我們已針對 stdio 轉送功能進行整合測試,並將擴展至涵蓋預設情境。
說明文件
您需要更新多個元件開發人員指南,通常是為了移除必須設定 stdio 轉送的警告。這表示這項變更將降低開發或遷移元件的認知複雜度。
缺點、替代方案和未知事項
缺點:增加「魔法」
這項變更會為啟動 ELF 元件新增行為,且不像多數元件功能那樣,要求元件在資訊清單中指定任何內容。不過,這種行為變更並不會增加元件所授予的權限。
本 RFC 中提出的行為,是試圖在元件架構設計原則 (明確性、最小權限) 和現有類 POSIX 系統中開發人員的期望 (stdio 是普遍且實用的功能) 之間取得平衡。
替代做法:合理化執行緒
如果我們將測試執行工具變更為實際使用 ELF 執行元件做為基礎實作,就能讓 ELF 執行元件和測試執行工具的行為更為相似。目前 ELF 和測試執行工具會共用 Rust 程式庫的實作程式碼,但其實可以讓執行工具將實作工作委派給其他執行工具,藉此共用實作程式碼。
這也是許多其他原因值得追求的方向。這項工作比變更 ELF 執行元件的預設值更為龐大,而作者認為我們仍希望將此 RFC 的行為設為 ELF 執行元件的預設值,以確保統一的開發人員體驗。
既有技術與參考資料
本 RFC 提出 RFC-0069 所述功能的擴充功能。