RFC-0175:ELF 執行器 stdio 轉送預設值

RFC-0175:ELF Runner stdio 轉送預設值
狀態已接受
區域
  • 元件架構
說明

根據預設,將 stdout/stderr 轉送至 LogSink,改善元件開發人員體驗。

問題
  • 110
變更
作者
審查人員
提交日期 (年/月)2022-06-03
審查日期 (年/月)2022-07-06

摘要

將「ELF Runner」變更為預設值,將 stdout 和 stderr 轉送至 LogSink (如有)。

提振精神

這個 RFC 以 RFC-0069 為基礎建構,後者會指定 ELF 執行元件的功能,以便支援將 stdout 和 stderr 轉送到 fuchsia.logger.LogSink 的功能。自實作這項功能後,我們發現在許多情況下,元件在從元件 v1 遷移至 v2 時,會缺少重要的記錄訊息,因為其 stdout/stderr 訊息會在轉換過程中自動捨棄。LogSink

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_toforward_stderr_to 欄位,ELF 執行元件就會嘗試為未指定的串流設定轉送。在這個設定中,任何無法將 stdio 串流轉送至 LogSink 的作業都會靜音,而且元件仍會啟動。

實作

我們將放寬將 stdio 轉送至 LogSink 的行為,讓在要求轉送但不具備 LogSink 的元件時,仍會保持啟動狀態。

如果在元件資訊清單中未指定任何值,ELF 執行元件會假設其預設值為 forward_stdout_to: "log"forward_stderr_to: "log"

ELF 執行元件仍會為已要求的已啟動元件提供 stdout 和/或 stderr 控點,以在初始化轉送發生錯誤時要求或預設為轉寄。

效能

這項變更應該不會造成太大的效能差異。

人體工學

擁有實用的預設行為應減少元件開發人員需要做出的決策次數,進而提升符合人體工學的品質。

在完成這項變更的實作後,我們會刪除 sdk/lib/syslog/elf_stdio.shard.cml,並將其用戶端切換至主要系統記錄檔資料分割,而 ELF 元件的行為也會相同。

回溯相容性

未使用預設 stdio 轉送設定的元件而沒有 LogSink 時,當元件管理員嘗試在其命名空間中開啟 LogSink 時,會在 元件管理員的記錄檔中產生轉送錯誤。在新預設設定中,我們會為沒有 LogSink 的平台元件資訊清單加入明確的 forward_std{out,err}_to: "none" 欄位。日後,您可以使用更複雜的命名空間探測功能,判斷元件是否應具備 LogSink 是否可用,以消除這些錯誤訊息。

安全性考量

這項設計不會透過授予任何其他功能來提高元件的權限,而是只有在其資訊清單要求 LogSink 並轉送該能力時,才會啟用轉送。

隱私權注意事項

這會導致系統將額外的記錄訊息寫入系統記錄,其中可能包含使用者產生的資料。記錄管道已有用於稽核及清除隱私機密資料的控制項,因此您不必在這裡進行任何變更。

測試

stdio 轉送功能目前已有整合測試,並進一步涵蓋預設情境。

說明文件

元件開發人員指南中需要更新的部分,通常即可移除必須設定 stdio 轉送的警告。這表示這項變更可降低開發或遷移元件的認知複雜度。

缺點、替代方案和未知

缺點:增加「魔術」

這項變更會新增啟動 ELF 元件的行為,不需要指定資訊清單中的任何內容,這點與大多數元件功能不同。不過,此行為變更不會增加元件的權限。

在本 RFC 中建議的行為,會在元件架構設計原則 (明確性、最低權限) 與開發人員對現有 POSIX 類似系統中的開發人員期望之間做出不良影響 (stdio 是全面性的必備功能)。

替代方法:合理化跑者

如果將測試執行器變更為實際使用 ELF 執行元件做為基礎實作,我們可以讓 ELF 執行元件和測試執行器以類似的方式運作。目前 ELF 和測試執行器會共用 Rust 程式庫中的實作程式碼,而是允許執行者委派給其他執行元件以分享實作程式碼。

基於許多其他原因,這個策略很吸引人。比起變更 ELF 執行元件的預設值,這遠比變更大上許多,作者認為我們仍希望這個 RFC 的行為做為 ELF 執行元件中的預設值,以確保一致的開發人員體驗。

先前的圖片和參考資料

這個 RFC 建議使用 RFC-0069 中所述的功能。