'自動駕駛人的福音!Lyft公開Level 5部署平臺Flexo細節'
經過一年半的 bootstrapping(一種再抽樣統計方法),Lyft 讓 Level 5 實現區分非常相似,但又不完全相同的兩輛汽車。Level 5 是自動駕駛等級分類的最高級別,可以實現完全自動駕駛,由車輛完成所有駕駛操作,人類駕駛員不需要集中注意力,不限定道路和環境。Lyft 的工程師和操作人員花費大量的時間瞭解每輛車的微妙差異和獨特環境。從雲計算模塊開始,Lyft 構建了一個名為 Flexo 的汽車部署平臺,以確保能自動構建車隊軟件,併為每個自動駕駛汽車(AV)部署相同的環境。如今,每輛汽車都使用相同的磁盤映像,工程師和操作人員都擁有穩定的工作環境。 本文介紹了這款 Level 5 自動駕駛部署平臺的構建過程和技術細節。
▎本文來源:微藍智能
挑戰
在 Level 5 中,硬件團隊會在內部運營自己的 AV 車隊。由於現在 AV 發展仍處於初期階段,因此車隊必須提供兩種截然不同的用例。一個是運營團隊執行諸如班車服務和數據收集等任務的穩定平臺,另一個則是為不斷改進堆棧的軟件工程師的開發平臺。這兩組用戶的要求完全不同:運營團隊需要具有最少選項和高度可預測行為的一站式設備平臺,而工程師需要最大的靈活性,以便他們可以快速迭代。
作者從一個基於 Salt 的簡單配置管理系統開始,該系統根據需要車輛的用戶類型配置車輛。操作方法是首先複製該軟件,在汽車中重新配置高性能計算機(HPC),並從源代碼構建。同樣,工程師可以根據自己的需要提取分支,構建和重新配置 HPC。這種方法因為開發很早,汽車不會被頻繁使用,在早期汽車數量不多的時候能正常工作,可以使用汽車 HPC 來構建軟件堆棧。隨著 AV 車隊擴大規模,軟件堆棧複雜性增加,每當任務類型發生變化時,就會浪費大量時間來重新配置和構建數十輛汽車。顯然,該方法還有待提升!
磁盤交換與網絡傳輸
在研發 Level 5 車輛早期,作者討論了磁盤交換與網絡連接在刪除記錄傳感器數據方面的優缺點。 根據每天每臺車發送數據大小作者選擇了磁盤交換。選擇該方法的原因有很多,包括高速以太網電纜和連接器的機械剛性,以及無法保證車庫中的高速網絡端口。最重要的是,車輛的週轉時間對車隊的生產率至關重要。我們可以在任何地方在 30 秒內更換驅動器,但使用 50 Gbps 以太網連接回收 4TB 的驅動器需要大約 10 分鐘。此外,車庫可以快速建造並移動到任何位置。由於磁盤可以郵寄,因此對高速網絡並不是一項硬性要求。
這就是作者採用一種流程來交換數據驅動器進出汽車的原因。作者採用類似的方法在啟動驅動器上部署軟件。
解決方案
簡而言之,Flexo 構建了引導驅動器。這是一個硬件和軟件解決方案,可以使用完整的軟件刻錄數十個相同的硬盤,從 Linux 引導加載程序到每天構建的自動駕駛汽車軟件的特定版本,併為任務類型設置配置信息。
在高層次上,Flexo 是一個標準的 Ubuntu 18.04 服務器系統,使用以下方法構建:
- 用於構建圖像的 Docker
- 用於刻錄圖像的 systemd 單元
- 用於構建和管理圖像的 Python 腳本
- 把所有模塊連在一起的 BASH
- 用於監控 Telegraf 和 Wavefront
經過一年半的 bootstrapping(一種再抽樣統計方法),Lyft 讓 Level 5 實現區分非常相似,但又不完全相同的兩輛汽車。Level 5 是自動駕駛等級分類的最高級別,可以實現完全自動駕駛,由車輛完成所有駕駛操作,人類駕駛員不需要集中注意力,不限定道路和環境。Lyft 的工程師和操作人員花費大量的時間瞭解每輛車的微妙差異和獨特環境。從雲計算模塊開始,Lyft 構建了一個名為 Flexo 的汽車部署平臺,以確保能自動構建車隊軟件,併為每個自動駕駛汽車(AV)部署相同的環境。如今,每輛汽車都使用相同的磁盤映像,工程師和操作人員都擁有穩定的工作環境。 本文介紹了這款 Level 5 自動駕駛部署平臺的構建過程和技術細節。
▎本文來源:微藍智能
挑戰
在 Level 5 中,硬件團隊會在內部運營自己的 AV 車隊。由於現在 AV 發展仍處於初期階段,因此車隊必須提供兩種截然不同的用例。一個是運營團隊執行諸如班車服務和數據收集等任務的穩定平臺,另一個則是為不斷改進堆棧的軟件工程師的開發平臺。這兩組用戶的要求完全不同:運營團隊需要具有最少選項和高度可預測行為的一站式設備平臺,而工程師需要最大的靈活性,以便他們可以快速迭代。
作者從一個基於 Salt 的簡單配置管理系統開始,該系統根據需要車輛的用戶類型配置車輛。操作方法是首先複製該軟件,在汽車中重新配置高性能計算機(HPC),並從源代碼構建。同樣,工程師可以根據自己的需要提取分支,構建和重新配置 HPC。這種方法因為開發很早,汽車不會被頻繁使用,在早期汽車數量不多的時候能正常工作,可以使用汽車 HPC 來構建軟件堆棧。隨著 AV 車隊擴大規模,軟件堆棧複雜性增加,每當任務類型發生變化時,就會浪費大量時間來重新配置和構建數十輛汽車。顯然,該方法還有待提升!
磁盤交換與網絡傳輸
在研發 Level 5 車輛早期,作者討論了磁盤交換與網絡連接在刪除記錄傳感器數據方面的優缺點。 根據每天每臺車發送數據大小作者選擇了磁盤交換。選擇該方法的原因有很多,包括高速以太網電纜和連接器的機械剛性,以及無法保證車庫中的高速網絡端口。最重要的是,車輛的週轉時間對車隊的生產率至關重要。我們可以在任何地方在 30 秒內更換驅動器,但使用 50 Gbps 以太網連接回收 4TB 的驅動器需要大約 10 分鐘。此外,車庫可以快速建造並移動到任何位置。由於磁盤可以郵寄,因此對高速網絡並不是一項硬性要求。
這就是作者採用一種流程來交換數據驅動器進出汽車的原因。作者採用類似的方法在啟動驅動器上部署軟件。
解決方案
簡而言之,Flexo 構建了引導驅動器。這是一個硬件和軟件解決方案,可以使用完整的軟件刻錄數十個相同的硬盤,從 Linux 引導加載程序到每天構建的自動駕駛汽車軟件的特定版本,併為任務類型設置配置信息。
在高層次上,Flexo 是一個標準的 Ubuntu 18.04 服務器系統,使用以下方法構建:
- 用於構建圖像的 Docker
- 用於刻錄圖像的 systemd 單元
- 用於構建和管理圖像的 Python 腳本
- 把所有模塊連在一起的 BASH
- 用於監控 Telegraf 和 Wavefront
Flexo 示意圖
Flexo 部署平臺將 git 存儲庫中託管的源代碼轉換為可以在 AV 計算機上引導的磁盤映像。其可以分解為以下功能組件:
- 圖像構建器:負責從存儲在 git 存儲庫中的源代碼構建可啟動文件系統
- 圖像刻錄機:採用這些可引導文件系統並將它們刻錄到多個硬盤驅動器上
- 圖像選擇器:選擇要在汽車上啟動的圖像
- 覆蓋根:提供短暫的根文件系統
- 硬件平臺:此係統運行的車輛
圖像構建器
Flexo 的主要任務是構建和管理圖像。圖像只是完整可啟動文件系統的tar壓縮存檔,然後使用圖像刻錄機來刻錄啟動驅動器。這些圖像通常約為 100 多 GB,因為圖像中包括高清(HD)地圖。Lyft 已使用容器多年,因此選擇 Docker 作為構建圖像的自然選擇工具。Docker 定義了一種成熟且靈活的語言和工具鏈,用於構建容器圖像。在用例中,作者只使用 Docker 作為構建映像的工具,而不運行 Docker。因此,作者需要手動安裝引導加載程序(grub),內核及容器內的初始虛擬內存盤。
作者使用幾種不同的 Dockerfiles,具體取決於對圖像的配置。下面是文中使用的 Dockerfiles 的大致內容:
- 從標準的 Ubuntu 16.04 docker 鏡像開始
- 安裝一個 linux 內核和 grub,以便映像可以在裸機上啟動(docker 鏡像沒有內核,因為容器在運行時與主機共享內核)。
- 複製相關軟件存儲庫
- 具體而言,使用 SaltStack 配置文件系統進行所需的配置
- 設置用戶和權限
- 安裝所有需要的 Ubuntu 軟件包
- 安裝和配置 systemd 單元和 udev 規則以查找車輛特定數據(見下文)
- 安裝系統構建依賴項
- 根據設置配置項構建自己的軟件
- 將圖像導出為 tar 文件
現在,發佈經理通常只要批准了新版本的生產用途,就會手動開始構建圖像。作者正在尋找方法將這一過程標準化。由於使用了容器技術,映像構建組件與其運行的主機分離。
車輛特有數據
圖像構建完全與車輛無關,因為從硬件角度來看,同代的所有車輛都是相同的,甚至在運行時也會處理代際差異。但是,作者需要保留一些車輛特有的數據,包括車輛的身份(以便跟蹤記錄的數據和日誌),加密密鑰和證書以及校準參數。由於 Flexo 創建的啟動驅動器都可以安裝到任何車輛中,因此添加了永遠不會以 USB 記憶棒的形式從汽車中移除的本地存儲。
圖像刻錄機
映像刻錄機組件負責將可啟動文件系統構建到多個硬盤驅動器上。該組件需要處理 20 多個硬盤驅動器,這些硬盤驅動器在系統打開時由操作員插入和拔出。
經過一年半的 bootstrapping(一種再抽樣統計方法),Lyft 讓 Level 5 實現區分非常相似,但又不完全相同的兩輛汽車。Level 5 是自動駕駛等級分類的最高級別,可以實現完全自動駕駛,由車輛完成所有駕駛操作,人類駕駛員不需要集中注意力,不限定道路和環境。Lyft 的工程師和操作人員花費大量的時間瞭解每輛車的微妙差異和獨特環境。從雲計算模塊開始,Lyft 構建了一個名為 Flexo 的汽車部署平臺,以確保能自動構建車隊軟件,併為每個自動駕駛汽車(AV)部署相同的環境。如今,每輛汽車都使用相同的磁盤映像,工程師和操作人員都擁有穩定的工作環境。 本文介紹了這款 Level 5 自動駕駛部署平臺的構建過程和技術細節。
▎本文來源:微藍智能
挑戰
在 Level 5 中,硬件團隊會在內部運營自己的 AV 車隊。由於現在 AV 發展仍處於初期階段,因此車隊必須提供兩種截然不同的用例。一個是運營團隊執行諸如班車服務和數據收集等任務的穩定平臺,另一個則是為不斷改進堆棧的軟件工程師的開發平臺。這兩組用戶的要求完全不同:運營團隊需要具有最少選項和高度可預測行為的一站式設備平臺,而工程師需要最大的靈活性,以便他們可以快速迭代。
作者從一個基於 Salt 的簡單配置管理系統開始,該系統根據需要車輛的用戶類型配置車輛。操作方法是首先複製該軟件,在汽車中重新配置高性能計算機(HPC),並從源代碼構建。同樣,工程師可以根據自己的需要提取分支,構建和重新配置 HPC。這種方法因為開發很早,汽車不會被頻繁使用,在早期汽車數量不多的時候能正常工作,可以使用汽車 HPC 來構建軟件堆棧。隨著 AV 車隊擴大規模,軟件堆棧複雜性增加,每當任務類型發生變化時,就會浪費大量時間來重新配置和構建數十輛汽車。顯然,該方法還有待提升!
磁盤交換與網絡傳輸
在研發 Level 5 車輛早期,作者討論了磁盤交換與網絡連接在刪除記錄傳感器數據方面的優缺點。 根據每天每臺車發送數據大小作者選擇了磁盤交換。選擇該方法的原因有很多,包括高速以太網電纜和連接器的機械剛性,以及無法保證車庫中的高速網絡端口。最重要的是,車輛的週轉時間對車隊的生產率至關重要。我們可以在任何地方在 30 秒內更換驅動器,但使用 50 Gbps 以太網連接回收 4TB 的驅動器需要大約 10 分鐘。此外,車庫可以快速建造並移動到任何位置。由於磁盤可以郵寄,因此對高速網絡並不是一項硬性要求。
這就是作者採用一種流程來交換數據驅動器進出汽車的原因。作者採用類似的方法在啟動驅動器上部署軟件。
解決方案
簡而言之,Flexo 構建了引導驅動器。這是一個硬件和軟件解決方案,可以使用完整的軟件刻錄數十個相同的硬盤,從 Linux 引導加載程序到每天構建的自動駕駛汽車軟件的特定版本,併為任務類型設置配置信息。
在高層次上,Flexo 是一個標準的 Ubuntu 18.04 服務器系統,使用以下方法構建:
- 用於構建圖像的 Docker
- 用於刻錄圖像的 systemd 單元
- 用於構建和管理圖像的 Python 腳本
- 把所有模塊連在一起的 BASH
- 用於監控 Telegraf 和 Wavefront
Flexo 示意圖
Flexo 部署平臺將 git 存儲庫中託管的源代碼轉換為可以在 AV 計算機上引導的磁盤映像。其可以分解為以下功能組件:
- 圖像構建器:負責從存儲在 git 存儲庫中的源代碼構建可啟動文件系統
- 圖像刻錄機:採用這些可引導文件系統並將它們刻錄到多個硬盤驅動器上
- 圖像選擇器:選擇要在汽車上啟動的圖像
- 覆蓋根:提供短暫的根文件系統
- 硬件平臺:此係統運行的車輛
圖像構建器
Flexo 的主要任務是構建和管理圖像。圖像只是完整可啟動文件系統的tar壓縮存檔,然後使用圖像刻錄機來刻錄啟動驅動器。這些圖像通常約為 100 多 GB,因為圖像中包括高清(HD)地圖。Lyft 已使用容器多年,因此選擇 Docker 作為構建圖像的自然選擇工具。Docker 定義了一種成熟且靈活的語言和工具鏈,用於構建容器圖像。在用例中,作者只使用 Docker 作為構建映像的工具,而不運行 Docker。因此,作者需要手動安裝引導加載程序(grub),內核及容器內的初始虛擬內存盤。
作者使用幾種不同的 Dockerfiles,具體取決於對圖像的配置。下面是文中使用的 Dockerfiles 的大致內容:
- 從標準的 Ubuntu 16.04 docker 鏡像開始
- 安裝一個 linux 內核和 grub,以便映像可以在裸機上啟動(docker 鏡像沒有內核,因為容器在運行時與主機共享內核)。
- 複製相關軟件存儲庫
- 具體而言,使用 SaltStack 配置文件系統進行所需的配置
- 設置用戶和權限
- 安裝所有需要的 Ubuntu 軟件包
- 安裝和配置 systemd 單元和 udev 規則以查找車輛特定數據(見下文)
- 安裝系統構建依賴項
- 根據設置配置項構建自己的軟件
- 將圖像導出為 tar 文件
現在,發佈經理通常只要批准了新版本的生產用途,就會手動開始構建圖像。作者正在尋找方法將這一過程標準化。由於使用了容器技術,映像構建組件與其運行的主機分離。
車輛特有數據
圖像構建完全與車輛無關,因為從硬件角度來看,同代的所有車輛都是相同的,甚至在運行時也會處理代際差異。但是,作者需要保留一些車輛特有的數據,包括車輛的身份(以便跟蹤記錄的數據和日誌),加密密鑰和證書以及校準參數。由於 Flexo 創建的啟動驅動器都可以安裝到任何車輛中,因此添加了永遠不會以 USB 記憶棒的形式從汽車中移除的本地存儲。
圖像刻錄機
映像刻錄機組件負責將可啟動文件系統構建到多個硬盤驅動器上。該組件需要處理 20 多個硬盤驅動器,這些硬盤驅動器在系統打開時由操作員插入和拔出。
每個硬盤驅動器由唯一的 sync_all_image_to_disk @ sd * systemd 單元管理。鑑於可以隨時添加和刪除硬盤驅動器,作者利用 udev-- Linux 內核使用的通用設備管理器,支持 udev 而不是cron 作業,以便作者可以在插入磁盤後立即啟動圖像刻錄過程。作者使用 udev 規則為每個硬盤驅動器啟動系統作業:
ENV{DEVTYPE}==”disk”, ENV{ID_PART_TABLE_UUID}==”00000000-*”, TAG+=”systemd”, ENV{SYSTEMD_WANTS}+=”sync_all_images_to_disk@$kernel.service”
該規則使用 $ kernel udev 替換 systemd 單元實例到硬盤設備路徑。systemd 單元通過 %i 標識符將設備路徑傳遞給 sync_all_images_to_disk
腳本:
ExecStart=/usr/local/bin/sync_all_images_to_disk /dev/%i
這意味著刻錄過程與構建過程完全分離,是在插入驅動器時啟動的。作者為操作員創建了一種精簡的方式來判斷何時準備就緒,這在下面的硬件部分中有所概述。當作者開發系統時,擦除了Flexo 系統本身的 O / S 驅動器,標記 Flexo 應該使用的硬盤。每個 Flexo 驅動器都有一個以 00000000 開頭的磁盤 GUID。udev 規則使用基於 ID_PART_TABLE_UUID 環境變量的附加過濾器,僅為標記為 Flexo 驅動器的磁盤啟動 sync_all_images_to_disk @作業:
ENV{ID_PART_TABLE_UUID}==”00000000-*”
標記驅動器也有助於解決操作員的操作錯誤。如果錯誤插入非 Flexo 驅動器,則不會覆蓋該驅動器。
圖像選擇器和啟動盤結構
每個 Flexo 硬盤驅動器都支持多個版本的完整軟件堆棧。作者使用 GRUB 作為操作員的主要 UI,以便在任務開始時選擇要引導的映像:
經過一年半的 bootstrapping(一種再抽樣統計方法),Lyft 讓 Level 5 實現區分非常相似,但又不完全相同的兩輛汽車。Level 5 是自動駕駛等級分類的最高級別,可以實現完全自動駕駛,由車輛完成所有駕駛操作,人類駕駛員不需要集中注意力,不限定道路和環境。Lyft 的工程師和操作人員花費大量的時間瞭解每輛車的微妙差異和獨特環境。從雲計算模塊開始,Lyft 構建了一個名為 Flexo 的汽車部署平臺,以確保能自動構建車隊軟件,併為每個自動駕駛汽車(AV)部署相同的環境。如今,每輛汽車都使用相同的磁盤映像,工程師和操作人員都擁有穩定的工作環境。 本文介紹了這款 Level 5 自動駕駛部署平臺的構建過程和技術細節。
▎本文來源:微藍智能
挑戰
在 Level 5 中,硬件團隊會在內部運營自己的 AV 車隊。由於現在 AV 發展仍處於初期階段,因此車隊必須提供兩種截然不同的用例。一個是運營團隊執行諸如班車服務和數據收集等任務的穩定平臺,另一個則是為不斷改進堆棧的軟件工程師的開發平臺。這兩組用戶的要求完全不同:運營團隊需要具有最少選項和高度可預測行為的一站式設備平臺,而工程師需要最大的靈活性,以便他們可以快速迭代。
作者從一個基於 Salt 的簡單配置管理系統開始,該系統根據需要車輛的用戶類型配置車輛。操作方法是首先複製該軟件,在汽車中重新配置高性能計算機(HPC),並從源代碼構建。同樣,工程師可以根據自己的需要提取分支,構建和重新配置 HPC。這種方法因為開發很早,汽車不會被頻繁使用,在早期汽車數量不多的時候能正常工作,可以使用汽車 HPC 來構建軟件堆棧。隨著 AV 車隊擴大規模,軟件堆棧複雜性增加,每當任務類型發生變化時,就會浪費大量時間來重新配置和構建數十輛汽車。顯然,該方法還有待提升!
磁盤交換與網絡傳輸
在研發 Level 5 車輛早期,作者討論了磁盤交換與網絡連接在刪除記錄傳感器數據方面的優缺點。 根據每天每臺車發送數據大小作者選擇了磁盤交換。選擇該方法的原因有很多,包括高速以太網電纜和連接器的機械剛性,以及無法保證車庫中的高速網絡端口。最重要的是,車輛的週轉時間對車隊的生產率至關重要。我們可以在任何地方在 30 秒內更換驅動器,但使用 50 Gbps 以太網連接回收 4TB 的驅動器需要大約 10 分鐘。此外,車庫可以快速建造並移動到任何位置。由於磁盤可以郵寄,因此對高速網絡並不是一項硬性要求。
這就是作者採用一種流程來交換數據驅動器進出汽車的原因。作者採用類似的方法在啟動驅動器上部署軟件。
解決方案
簡而言之,Flexo 構建了引導驅動器。這是一個硬件和軟件解決方案,可以使用完整的軟件刻錄數十個相同的硬盤,從 Linux 引導加載程序到每天構建的自動駕駛汽車軟件的特定版本,併為任務類型設置配置信息。
在高層次上,Flexo 是一個標準的 Ubuntu 18.04 服務器系統,使用以下方法構建:
- 用於構建圖像的 Docker
- 用於刻錄圖像的 systemd 單元
- 用於構建和管理圖像的 Python 腳本
- 把所有模塊連在一起的 BASH
- 用於監控 Telegraf 和 Wavefront
Flexo 示意圖
Flexo 部署平臺將 git 存儲庫中託管的源代碼轉換為可以在 AV 計算機上引導的磁盤映像。其可以分解為以下功能組件:
- 圖像構建器:負責從存儲在 git 存儲庫中的源代碼構建可啟動文件系統
- 圖像刻錄機:採用這些可引導文件系統並將它們刻錄到多個硬盤驅動器上
- 圖像選擇器:選擇要在汽車上啟動的圖像
- 覆蓋根:提供短暫的根文件系統
- 硬件平臺:此係統運行的車輛
圖像構建器
Flexo 的主要任務是構建和管理圖像。圖像只是完整可啟動文件系統的tar壓縮存檔,然後使用圖像刻錄機來刻錄啟動驅動器。這些圖像通常約為 100 多 GB,因為圖像中包括高清(HD)地圖。Lyft 已使用容器多年,因此選擇 Docker 作為構建圖像的自然選擇工具。Docker 定義了一種成熟且靈活的語言和工具鏈,用於構建容器圖像。在用例中,作者只使用 Docker 作為構建映像的工具,而不運行 Docker。因此,作者需要手動安裝引導加載程序(grub),內核及容器內的初始虛擬內存盤。
作者使用幾種不同的 Dockerfiles,具體取決於對圖像的配置。下面是文中使用的 Dockerfiles 的大致內容:
- 從標準的 Ubuntu 16.04 docker 鏡像開始
- 安裝一個 linux 內核和 grub,以便映像可以在裸機上啟動(docker 鏡像沒有內核,因為容器在運行時與主機共享內核)。
- 複製相關軟件存儲庫
- 具體而言,使用 SaltStack 配置文件系統進行所需的配置
- 設置用戶和權限
- 安裝所有需要的 Ubuntu 軟件包
- 安裝和配置 systemd 單元和 udev 規則以查找車輛特定數據(見下文)
- 安裝系統構建依賴項
- 根據設置配置項構建自己的軟件
- 將圖像導出為 tar 文件
現在,發佈經理通常只要批准了新版本的生產用途,就會手動開始構建圖像。作者正在尋找方法將這一過程標準化。由於使用了容器技術,映像構建組件與其運行的主機分離。
車輛特有數據
圖像構建完全與車輛無關,因為從硬件角度來看,同代的所有車輛都是相同的,甚至在運行時也會處理代際差異。但是,作者需要保留一些車輛特有的數據,包括車輛的身份(以便跟蹤記錄的數據和日誌),加密密鑰和證書以及校準參數。由於 Flexo 創建的啟動驅動器都可以安裝到任何車輛中,因此添加了永遠不會以 USB 記憶棒的形式從汽車中移除的本地存儲。
圖像刻錄機
映像刻錄機組件負責將可啟動文件系統構建到多個硬盤驅動器上。該組件需要處理 20 多個硬盤驅動器,這些硬盤驅動器在系統打開時由操作員插入和拔出。
每個硬盤驅動器由唯一的 sync_all_image_to_disk @ sd * systemd 單元管理。鑑於可以隨時添加和刪除硬盤驅動器,作者利用 udev-- Linux 內核使用的通用設備管理器,支持 udev 而不是cron 作業,以便作者可以在插入磁盤後立即啟動圖像刻錄過程。作者使用 udev 規則為每個硬盤驅動器啟動系統作業:
ENV{DEVTYPE}==”disk”, ENV{ID_PART_TABLE_UUID}==”00000000-*”, TAG+=”systemd”, ENV{SYSTEMD_WANTS}+=”sync_all_images_to_disk@$kernel.service”
該規則使用 $ kernel udev 替換 systemd 單元實例到硬盤設備路徑。systemd 單元通過 %i 標識符將設備路徑傳遞給 sync_all_images_to_disk
腳本:
ExecStart=/usr/local/bin/sync_all_images_to_disk /dev/%i
這意味著刻錄過程與構建過程完全分離,是在插入驅動器時啟動的。作者為操作員創建了一種精簡的方式來判斷何時準備就緒,這在下面的硬件部分中有所概述。當作者開發系統時,擦除了Flexo 系統本身的 O / S 驅動器,標記 Flexo 應該使用的硬盤。每個 Flexo 驅動器都有一個以 00000000 開頭的磁盤 GUID。udev 規則使用基於 ID_PART_TABLE_UUID 環境變量的附加過濾器,僅為標記為 Flexo 驅動器的磁盤啟動 sync_all_images_to_disk @作業:
ENV{ID_PART_TABLE_UUID}==”00000000-*”
標記驅動器也有助於解決操作員的操作錯誤。如果錯誤插入非 Flexo 驅動器,則不會覆蓋該驅動器。
圖像選擇器和啟動盤結構
每個 Flexo 硬盤驅動器都支持多個版本的完整軟件堆棧。作者使用 GRUB 作為操作員的主要 UI,以便在任務開始時選擇要引導的映像:
主 GRUB 配置維護硬盤驅動器的每個分區中可用的映像列表。每個映像都提供帶有內核和初始虛擬內存盤配置的輔助 GRUB 引導加載程序。圖像從主引導加載程序鏈式加載,儘可能地分離每個圖像。並且一個映像中的錯誤配置不會影響硬盤驅動器的其他映像。
經過一年半的 bootstrapping(一種再抽樣統計方法),Lyft 讓 Level 5 實現區分非常相似,但又不完全相同的兩輛汽車。Level 5 是自動駕駛等級分類的最高級別,可以實現完全自動駕駛,由車輛完成所有駕駛操作,人類駕駛員不需要集中注意力,不限定道路和環境。Lyft 的工程師和操作人員花費大量的時間瞭解每輛車的微妙差異和獨特環境。從雲計算模塊開始,Lyft 構建了一個名為 Flexo 的汽車部署平臺,以確保能自動構建車隊軟件,併為每個自動駕駛汽車(AV)部署相同的環境。如今,每輛汽車都使用相同的磁盤映像,工程師和操作人員都擁有穩定的工作環境。 本文介紹了這款 Level 5 自動駕駛部署平臺的構建過程和技術細節。
▎本文來源:微藍智能
挑戰
在 Level 5 中,硬件團隊會在內部運營自己的 AV 車隊。由於現在 AV 發展仍處於初期階段,因此車隊必須提供兩種截然不同的用例。一個是運營團隊執行諸如班車服務和數據收集等任務的穩定平臺,另一個則是為不斷改進堆棧的軟件工程師的開發平臺。這兩組用戶的要求完全不同:運營團隊需要具有最少選項和高度可預測行為的一站式設備平臺,而工程師需要最大的靈活性,以便他們可以快速迭代。
作者從一個基於 Salt 的簡單配置管理系統開始,該系統根據需要車輛的用戶類型配置車輛。操作方法是首先複製該軟件,在汽車中重新配置高性能計算機(HPC),並從源代碼構建。同樣,工程師可以根據自己的需要提取分支,構建和重新配置 HPC。這種方法因為開發很早,汽車不會被頻繁使用,在早期汽車數量不多的時候能正常工作,可以使用汽車 HPC 來構建軟件堆棧。隨著 AV 車隊擴大規模,軟件堆棧複雜性增加,每當任務類型發生變化時,就會浪費大量時間來重新配置和構建數十輛汽車。顯然,該方法還有待提升!
磁盤交換與網絡傳輸
在研發 Level 5 車輛早期,作者討論了磁盤交換與網絡連接在刪除記錄傳感器數據方面的優缺點。 根據每天每臺車發送數據大小作者選擇了磁盤交換。選擇該方法的原因有很多,包括高速以太網電纜和連接器的機械剛性,以及無法保證車庫中的高速網絡端口。最重要的是,車輛的週轉時間對車隊的生產率至關重要。我們可以在任何地方在 30 秒內更換驅動器,但使用 50 Gbps 以太網連接回收 4TB 的驅動器需要大約 10 分鐘。此外,車庫可以快速建造並移動到任何位置。由於磁盤可以郵寄,因此對高速網絡並不是一項硬性要求。
這就是作者採用一種流程來交換數據驅動器進出汽車的原因。作者採用類似的方法在啟動驅動器上部署軟件。
解決方案
簡而言之,Flexo 構建了引導驅動器。這是一個硬件和軟件解決方案,可以使用完整的軟件刻錄數十個相同的硬盤,從 Linux 引導加載程序到每天構建的自動駕駛汽車軟件的特定版本,併為任務類型設置配置信息。
在高層次上,Flexo 是一個標準的 Ubuntu 18.04 服務器系統,使用以下方法構建:
- 用於構建圖像的 Docker
- 用於刻錄圖像的 systemd 單元
- 用於構建和管理圖像的 Python 腳本
- 把所有模塊連在一起的 BASH
- 用於監控 Telegraf 和 Wavefront
Flexo 示意圖
Flexo 部署平臺將 git 存儲庫中託管的源代碼轉換為可以在 AV 計算機上引導的磁盤映像。其可以分解為以下功能組件:
- 圖像構建器:負責從存儲在 git 存儲庫中的源代碼構建可啟動文件系統
- 圖像刻錄機:採用這些可引導文件系統並將它們刻錄到多個硬盤驅動器上
- 圖像選擇器:選擇要在汽車上啟動的圖像
- 覆蓋根:提供短暫的根文件系統
- 硬件平臺:此係統運行的車輛
圖像構建器
Flexo 的主要任務是構建和管理圖像。圖像只是完整可啟動文件系統的tar壓縮存檔,然後使用圖像刻錄機來刻錄啟動驅動器。這些圖像通常約為 100 多 GB,因為圖像中包括高清(HD)地圖。Lyft 已使用容器多年,因此選擇 Docker 作為構建圖像的自然選擇工具。Docker 定義了一種成熟且靈活的語言和工具鏈,用於構建容器圖像。在用例中,作者只使用 Docker 作為構建映像的工具,而不運行 Docker。因此,作者需要手動安裝引導加載程序(grub),內核及容器內的初始虛擬內存盤。
作者使用幾種不同的 Dockerfiles,具體取決於對圖像的配置。下面是文中使用的 Dockerfiles 的大致內容:
- 從標準的 Ubuntu 16.04 docker 鏡像開始
- 安裝一個 linux 內核和 grub,以便映像可以在裸機上啟動(docker 鏡像沒有內核,因為容器在運行時與主機共享內核)。
- 複製相關軟件存儲庫
- 具體而言,使用 SaltStack 配置文件系統進行所需的配置
- 設置用戶和權限
- 安裝所有需要的 Ubuntu 軟件包
- 安裝和配置 systemd 單元和 udev 規則以查找車輛特定數據(見下文)
- 安裝系統構建依賴項
- 根據設置配置項構建自己的軟件
- 將圖像導出為 tar 文件
現在,發佈經理通常只要批准了新版本的生產用途,就會手動開始構建圖像。作者正在尋找方法將這一過程標準化。由於使用了容器技術,映像構建組件與其運行的主機分離。
車輛特有數據
圖像構建完全與車輛無關,因為從硬件角度來看,同代的所有車輛都是相同的,甚至在運行時也會處理代際差異。但是,作者需要保留一些車輛特有的數據,包括車輛的身份(以便跟蹤記錄的數據和日誌),加密密鑰和證書以及校準參數。由於 Flexo 創建的啟動驅動器都可以安裝到任何車輛中,因此添加了永遠不會以 USB 記憶棒的形式從汽車中移除的本地存儲。
圖像刻錄機
映像刻錄機組件負責將可啟動文件系統構建到多個硬盤驅動器上。該組件需要處理 20 多個硬盤驅動器,這些硬盤驅動器在系統打開時由操作員插入和拔出。
每個硬盤驅動器由唯一的 sync_all_image_to_disk @ sd * systemd 單元管理。鑑於可以隨時添加和刪除硬盤驅動器,作者利用 udev-- Linux 內核使用的通用設備管理器,支持 udev 而不是cron 作業,以便作者可以在插入磁盤後立即啟動圖像刻錄過程。作者使用 udev 規則為每個硬盤驅動器啟動系統作業:
ENV{DEVTYPE}==”disk”, ENV{ID_PART_TABLE_UUID}==”00000000-*”, TAG+=”systemd”, ENV{SYSTEMD_WANTS}+=”sync_all_images_to_disk@$kernel.service”
該規則使用 $ kernel udev 替換 systemd 單元實例到硬盤設備路徑。systemd 單元通過 %i 標識符將設備路徑傳遞給 sync_all_images_to_disk
腳本:
ExecStart=/usr/local/bin/sync_all_images_to_disk /dev/%i
這意味著刻錄過程與構建過程完全分離,是在插入驅動器時啟動的。作者為操作員創建了一種精簡的方式來判斷何時準備就緒,這在下面的硬件部分中有所概述。當作者開發系統時,擦除了Flexo 系統本身的 O / S 驅動器,標記 Flexo 應該使用的硬盤。每個 Flexo 驅動器都有一個以 00000000 開頭的磁盤 GUID。udev 規則使用基於 ID_PART_TABLE_UUID 環境變量的附加過濾器,僅為標記為 Flexo 驅動器的磁盤啟動 sync_all_images_to_disk @作業:
ENV{ID_PART_TABLE_UUID}==”00000000-*”
標記驅動器也有助於解決操作員的操作錯誤。如果錯誤插入非 Flexo 驅動器,則不會覆蓋該驅動器。
圖像選擇器和啟動盤結構
每個 Flexo 硬盤驅動器都支持多個版本的完整軟件堆棧。作者使用 GRUB 作為操作員的主要 UI,以便在任務開始時選擇要引導的映像:
主 GRUB 配置維護硬盤驅動器的每個分區中可用的映像列表。每個映像都提供帶有內核和初始虛擬內存盤配置的輔助 GRUB 引導加載程序。圖像從主引導加載程序鏈式加載,儘可能地分離每個圖像。並且一個映像中的錯誤配置不會影響硬盤驅動器的其他映像。
從上圖中可以看出,每種分區類型都使用 UUID 前綴來指示它是什麼類型的分區。作者還為文件系統添加了 UUID 前綴。值得注意的是,讓 Flexo 的這部分穩定是非常耗時的。今天的圖像刻錄機流程不到 1000 行 BASH,但是每一行都需要做很多工作才能做到正確,因為這些低級工具的文檔記錄性能很差,相關論壇和博客也不多。
例如,Linux 支持動態安裝文件系統,因為我們在每個驅動器上創建多達 12 個分區,而系統中最多有 24 個驅動器,而為了保持內核始終是最新的,會導致內核和系統級別的大量資源爭用。作者不得不使用大量的讀/寫鎖,並在最終變得穩定之前對 partprobe 進行顯式調用以更新內核的新分區視圖。
防止漂移:overlayroot
作者在設計 Flexo 之前遇到的一個痛點是,每個啟動盤的狀態會隨著時間的推移而漂移,因為啟動盤將留在車內並由連續的任務重用。而要完成本文中的任務,必須要將之前的任務清除,以便之前的任務不會對下一個任務產生影響。為此,作者使用 overlayroot 包在現有圖像的頂部提供可寫層。硬盤驅動器上的覆蓋分區用作在運行時存儲圖像更改的臨時位置。作者使用帶有隨機密碼的 crypt 後端來確保在重新啟動時擦除實時系統期間所做的任何更改。對於所有操作目標圖像,GRUB 配置中的 overlayroot 設置已打開:
overlayroot=”crypt:dev=/dev/disk/by-partuuid/55555555-<DISK_ID>-555555555555,mkfs=1,fstype=ext4,recurse=0"
此功能與操作團隊總是在任務之間重新啟動計算機的指令相結合,大大減少了工程師花在支持運營團隊上的時間。
用kvm測試圖像
在開發 Flexo 系統時,作者很快意識到將硬盤從一個系統移動到另一個系統進行測試會導致迭代週期延長。作者開始利用 kvm 和 OVMF 來加速開發。OVMF提供類似於汽車中的計算機的UEFI bios。此虛擬化測試環境還包括用於汽車標識的本地 USB 驅動器。通過類似於以下的 kvm 命令啟動給定硬盤驅動器的測試環境:
kvm -m 4096 -bios OVMF.fd -drive format=raw,file=/dev/sdk -drive format=raw,file=”car_data.img” — vnc :59
作者可以測試從 BIOS 到 Flexo 系統本身的 AV 軟件堆棧(包括圖形部分)的實際啟動的完整啟動順序。甚至可以包括車輛特定USB記憶棒的虛擬版本(上面的 car_data.img)。並非所有項都能在 VM 中正確啟動,但足以驗證大多數系統設置。
硬件
由於每輛車至少需要一個啟動盤(作者通常會保留多個啟動盤,以便在一個啟動盤在使用時不必等待新的啟動盤),每個 Flexo 系統都是標準的機架式服務器,有 24 個驅動器托架,允許批量交換驅動器,併為每個存放汽車的站點保留了幾個系統。
I / O 吞吐量是最重要的指標。將整個工作集保存在 RAM 中對於高速刻錄磁盤至關重要,因此作者為 Flexo 計算機提供儘可能多的 RAM。由於 Flexo 系統的磁盤刻錄部分是自運行的,作者使用 ledmon 來控制機箱 LED 以指示磁盤狀態。插入磁盤後,LED 會變暗,然後在刻錄過程中開始快速閃爍。最後,亮紅燈表示驅動器已準備好被取出並移動到車輛上。
簡化工作流程以縮短反饋循環
Lyft 所有的汽車和 AV 運營商現在都在使用 Flexo 部署平臺。由於可啟動圖像完全可工作,任務啟動時間大幅減少,開發人員也不再對 O / S 的狀態存疑。穩定的環境使得其在故障排除過程中可以減少變化因素。
下一步
隨著車隊的擴展,Flexo 部署平臺將部署到多個系統。Lyft 正在考慮將圖像構建器組件移動到雲端,以確保所有 Flexo 系統中的圖像都相同。Lyft 還希望擴展 Flexo,使其能夠為特定開發人員構建映像,並在雲中不斷測試映像。在加速開發循環並儘可能快地向開發人員提供反饋方面,Flexo 部署流程將發揮關鍵作用。
原文鏈接:
https://medium.com/lyftlevel5/flexo-a-car-deployment-platform-a8dafc79b4ca
【歡迎大家提供行業新聞熱點,商業合作請聯繫:18562613430】
經過一年半的 bootstrapping(一種再抽樣統計方法),Lyft 讓 Level 5 實現區分非常相似,但又不完全相同的兩輛汽車。Level 5 是自動駕駛等級分類的最高級別,可以實現完全自動駕駛,由車輛完成所有駕駛操作,人類駕駛員不需要集中注意力,不限定道路和環境。Lyft 的工程師和操作人員花費大量的時間瞭解每輛車的微妙差異和獨特環境。從雲計算模塊開始,Lyft 構建了一個名為 Flexo 的汽車部署平臺,以確保能自動構建車隊軟件,併為每個自動駕駛汽車(AV)部署相同的環境。如今,每輛汽車都使用相同的磁盤映像,工程師和操作人員都擁有穩定的工作環境。 本文介紹了這款 Level 5 自動駕駛部署平臺的構建過程和技術細節。
▎本文來源:微藍智能
挑戰
在 Level 5 中,硬件團隊會在內部運營自己的 AV 車隊。由於現在 AV 發展仍處於初期階段,因此車隊必須提供兩種截然不同的用例。一個是運營團隊執行諸如班車服務和數據收集等任務的穩定平臺,另一個則是為不斷改進堆棧的軟件工程師的開發平臺。這兩組用戶的要求完全不同:運營團隊需要具有最少選項和高度可預測行為的一站式設備平臺,而工程師需要最大的靈活性,以便他們可以快速迭代。
作者從一個基於 Salt 的簡單配置管理系統開始,該系統根據需要車輛的用戶類型配置車輛。操作方法是首先複製該軟件,在汽車中重新配置高性能計算機(HPC),並從源代碼構建。同樣,工程師可以根據自己的需要提取分支,構建和重新配置 HPC。這種方法因為開發很早,汽車不會被頻繁使用,在早期汽車數量不多的時候能正常工作,可以使用汽車 HPC 來構建軟件堆棧。隨著 AV 車隊擴大規模,軟件堆棧複雜性增加,每當任務類型發生變化時,就會浪費大量時間來重新配置和構建數十輛汽車。顯然,該方法還有待提升!
磁盤交換與網絡傳輸
在研發 Level 5 車輛早期,作者討論了磁盤交換與網絡連接在刪除記錄傳感器數據方面的優缺點。 根據每天每臺車發送數據大小作者選擇了磁盤交換。選擇該方法的原因有很多,包括高速以太網電纜和連接器的機械剛性,以及無法保證車庫中的高速網絡端口。最重要的是,車輛的週轉時間對車隊的生產率至關重要。我們可以在任何地方在 30 秒內更換驅動器,但使用 50 Gbps 以太網連接回收 4TB 的驅動器需要大約 10 分鐘。此外,車庫可以快速建造並移動到任何位置。由於磁盤可以郵寄,因此對高速網絡並不是一項硬性要求。
這就是作者採用一種流程來交換數據驅動器進出汽車的原因。作者採用類似的方法在啟動驅動器上部署軟件。
解決方案
簡而言之,Flexo 構建了引導驅動器。這是一個硬件和軟件解決方案,可以使用完整的軟件刻錄數十個相同的硬盤,從 Linux 引導加載程序到每天構建的自動駕駛汽車軟件的特定版本,併為任務類型設置配置信息。
在高層次上,Flexo 是一個標準的 Ubuntu 18.04 服務器系統,使用以下方法構建:
- 用於構建圖像的 Docker
- 用於刻錄圖像的 systemd 單元
- 用於構建和管理圖像的 Python 腳本
- 把所有模塊連在一起的 BASH
- 用於監控 Telegraf 和 Wavefront
Flexo 示意圖
Flexo 部署平臺將 git 存儲庫中託管的源代碼轉換為可以在 AV 計算機上引導的磁盤映像。其可以分解為以下功能組件:
- 圖像構建器:負責從存儲在 git 存儲庫中的源代碼構建可啟動文件系統
- 圖像刻錄機:採用這些可引導文件系統並將它們刻錄到多個硬盤驅動器上
- 圖像選擇器:選擇要在汽車上啟動的圖像
- 覆蓋根:提供短暫的根文件系統
- 硬件平臺:此係統運行的車輛
圖像構建器
Flexo 的主要任務是構建和管理圖像。圖像只是完整可啟動文件系統的tar壓縮存檔,然後使用圖像刻錄機來刻錄啟動驅動器。這些圖像通常約為 100 多 GB,因為圖像中包括高清(HD)地圖。Lyft 已使用容器多年,因此選擇 Docker 作為構建圖像的自然選擇工具。Docker 定義了一種成熟且靈活的語言和工具鏈,用於構建容器圖像。在用例中,作者只使用 Docker 作為構建映像的工具,而不運行 Docker。因此,作者需要手動安裝引導加載程序(grub),內核及容器內的初始虛擬內存盤。
作者使用幾種不同的 Dockerfiles,具體取決於對圖像的配置。下面是文中使用的 Dockerfiles 的大致內容:
- 從標準的 Ubuntu 16.04 docker 鏡像開始
- 安裝一個 linux 內核和 grub,以便映像可以在裸機上啟動(docker 鏡像沒有內核,因為容器在運行時與主機共享內核)。
- 複製相關軟件存儲庫
- 具體而言,使用 SaltStack 配置文件系統進行所需的配置
- 設置用戶和權限
- 安裝所有需要的 Ubuntu 軟件包
- 安裝和配置 systemd 單元和 udev 規則以查找車輛特定數據(見下文)
- 安裝系統構建依賴項
- 根據設置配置項構建自己的軟件
- 將圖像導出為 tar 文件
現在,發佈經理通常只要批准了新版本的生產用途,就會手動開始構建圖像。作者正在尋找方法將這一過程標準化。由於使用了容器技術,映像構建組件與其運行的主機分離。
車輛特有數據
圖像構建完全與車輛無關,因為從硬件角度來看,同代的所有車輛都是相同的,甚至在運行時也會處理代際差異。但是,作者需要保留一些車輛特有的數據,包括車輛的身份(以便跟蹤記錄的數據和日誌),加密密鑰和證書以及校準參數。由於 Flexo 創建的啟動驅動器都可以安裝到任何車輛中,因此添加了永遠不會以 USB 記憶棒的形式從汽車中移除的本地存儲。
圖像刻錄機
映像刻錄機組件負責將可啟動文件系統構建到多個硬盤驅動器上。該組件需要處理 20 多個硬盤驅動器,這些硬盤驅動器在系統打開時由操作員插入和拔出。
每個硬盤驅動器由唯一的 sync_all_image_to_disk @ sd * systemd 單元管理。鑑於可以隨時添加和刪除硬盤驅動器,作者利用 udev-- Linux 內核使用的通用設備管理器,支持 udev 而不是cron 作業,以便作者可以在插入磁盤後立即啟動圖像刻錄過程。作者使用 udev 規則為每個硬盤驅動器啟動系統作業:
ENV{DEVTYPE}==”disk”, ENV{ID_PART_TABLE_UUID}==”00000000-*”, TAG+=”systemd”, ENV{SYSTEMD_WANTS}+=”sync_all_images_to_disk@$kernel.service”
該規則使用 $ kernel udev 替換 systemd 單元實例到硬盤設備路徑。systemd 單元通過 %i 標識符將設備路徑傳遞給 sync_all_images_to_disk
腳本:
ExecStart=/usr/local/bin/sync_all_images_to_disk /dev/%i
這意味著刻錄過程與構建過程完全分離,是在插入驅動器時啟動的。作者為操作員創建了一種精簡的方式來判斷何時準備就緒,這在下面的硬件部分中有所概述。當作者開發系統時,擦除了Flexo 系統本身的 O / S 驅動器,標記 Flexo 應該使用的硬盤。每個 Flexo 驅動器都有一個以 00000000 開頭的磁盤 GUID。udev 規則使用基於 ID_PART_TABLE_UUID 環境變量的附加過濾器,僅為標記為 Flexo 驅動器的磁盤啟動 sync_all_images_to_disk @作業:
ENV{ID_PART_TABLE_UUID}==”00000000-*”
標記驅動器也有助於解決操作員的操作錯誤。如果錯誤插入非 Flexo 驅動器,則不會覆蓋該驅動器。
圖像選擇器和啟動盤結構
每個 Flexo 硬盤驅動器都支持多個版本的完整軟件堆棧。作者使用 GRUB 作為操作員的主要 UI,以便在任務開始時選擇要引導的映像:
主 GRUB 配置維護硬盤驅動器的每個分區中可用的映像列表。每個映像都提供帶有內核和初始虛擬內存盤配置的輔助 GRUB 引導加載程序。圖像從主引導加載程序鏈式加載,儘可能地分離每個圖像。並且一個映像中的錯誤配置不會影響硬盤驅動器的其他映像。
從上圖中可以看出,每種分區類型都使用 UUID 前綴來指示它是什麼類型的分區。作者還為文件系統添加了 UUID 前綴。值得注意的是,讓 Flexo 的這部分穩定是非常耗時的。今天的圖像刻錄機流程不到 1000 行 BASH,但是每一行都需要做很多工作才能做到正確,因為這些低級工具的文檔記錄性能很差,相關論壇和博客也不多。
例如,Linux 支持動態安裝文件系統,因為我們在每個驅動器上創建多達 12 個分區,而系統中最多有 24 個驅動器,而為了保持內核始終是最新的,會導致內核和系統級別的大量資源爭用。作者不得不使用大量的讀/寫鎖,並在最終變得穩定之前對 partprobe 進行顯式調用以更新內核的新分區視圖。
防止漂移:overlayroot
作者在設計 Flexo 之前遇到的一個痛點是,每個啟動盤的狀態會隨著時間的推移而漂移,因為啟動盤將留在車內並由連續的任務重用。而要完成本文中的任務,必須要將之前的任務清除,以便之前的任務不會對下一個任務產生影響。為此,作者使用 overlayroot 包在現有圖像的頂部提供可寫層。硬盤驅動器上的覆蓋分區用作在運行時存儲圖像更改的臨時位置。作者使用帶有隨機密碼的 crypt 後端來確保在重新啟動時擦除實時系統期間所做的任何更改。對於所有操作目標圖像,GRUB 配置中的 overlayroot 設置已打開:
overlayroot=”crypt:dev=/dev/disk/by-partuuid/55555555-<DISK_ID>-555555555555,mkfs=1,fstype=ext4,recurse=0"
此功能與操作團隊總是在任務之間重新啟動計算機的指令相結合,大大減少了工程師花在支持運營團隊上的時間。
用kvm測試圖像
在開發 Flexo 系統時,作者很快意識到將硬盤從一個系統移動到另一個系統進行測試會導致迭代週期延長。作者開始利用 kvm 和 OVMF 來加速開發。OVMF提供類似於汽車中的計算機的UEFI bios。此虛擬化測試環境還包括用於汽車標識的本地 USB 驅動器。通過類似於以下的 kvm 命令啟動給定硬盤驅動器的測試環境:
kvm -m 4096 -bios OVMF.fd -drive format=raw,file=/dev/sdk -drive format=raw,file=”car_data.img” — vnc :59
作者可以測試從 BIOS 到 Flexo 系統本身的 AV 軟件堆棧(包括圖形部分)的實際啟動的完整啟動順序。甚至可以包括車輛特定USB記憶棒的虛擬版本(上面的 car_data.img)。並非所有項都能在 VM 中正確啟動,但足以驗證大多數系統設置。
硬件
由於每輛車至少需要一個啟動盤(作者通常會保留多個啟動盤,以便在一個啟動盤在使用時不必等待新的啟動盤),每個 Flexo 系統都是標準的機架式服務器,有 24 個驅動器托架,允許批量交換驅動器,併為每個存放汽車的站點保留了幾個系統。
I / O 吞吐量是最重要的指標。將整個工作集保存在 RAM 中對於高速刻錄磁盤至關重要,因此作者為 Flexo 計算機提供儘可能多的 RAM。由於 Flexo 系統的磁盤刻錄部分是自運行的,作者使用 ledmon 來控制機箱 LED 以指示磁盤狀態。插入磁盤後,LED 會變暗,然後在刻錄過程中開始快速閃爍。最後,亮紅燈表示驅動器已準備好被取出並移動到車輛上。
簡化工作流程以縮短反饋循環
Lyft 所有的汽車和 AV 運營商現在都在使用 Flexo 部署平臺。由於可啟動圖像完全可工作,任務啟動時間大幅減少,開發人員也不再對 O / S 的狀態存疑。穩定的環境使得其在故障排除過程中可以減少變化因素。
下一步
隨著車隊的擴展,Flexo 部署平臺將部署到多個系統。Lyft 正在考慮將圖像構建器組件移動到雲端,以確保所有 Flexo 系統中的圖像都相同。Lyft 還希望擴展 Flexo,使其能夠為特定開發人員構建映像,並在雲中不斷測試映像。在加速開發循環並儘可能快地向開發人員提供反饋方面,Flexo 部署流程將發揮關鍵作用。
原文鏈接:
https://medium.com/lyftlevel5/flexo-a-car-deployment-platform-a8dafc79b4ca