Devlink Flash¶
devlink-flash API 允許更新裝置韌體。它取代了舊的 ethtool-flash 機制,並且在核心中執行快閃記憶體更新時不需要獲取任何網路鎖。使用示例
$ devlink dev flash pci/0000:05:00.0 file flash-boot.bin
請注意,檔名是相對於韌體載入路徑的相對路徑(通常是 /lib/firmware/)。驅動程式可以傳送狀態更新,以告知使用者空間更新操作的進度。
覆蓋掩碼¶
devlink-flash 命令允許選擇性地指定一個掩碼,指示裝置在更新時應如何處理快閃記憶體元件的子節。此掩碼指示允許被覆蓋的節集。
名稱 |
描述 |
|
表示裝置應使用所提供的映像中的設定覆蓋正在更新的元件中的設定。 |
|
表示裝置應使用所提供的映像中的識別符號覆蓋正在更新的元件中的識別符號。這包括 MAC 地址、序列 ID 和類似的裝置識別符號。 |
可以組合並同時請求多個覆蓋位。如果未提供任何位,則預期裝置僅更新正在更新的元件中的韌體二進位制檔案。設定和識別符號預計在更新後保留。裝置可能不支援所有組合,此類裝置的驅動程式必須拒絕任何無法忠實實現的組合。
韌體載入¶
需要韌體才能執行的裝置通常將其儲存在板上的非易失性儲存器中,例如快閃記憶體。有些裝置只在板上儲存基本韌體,驅動程式在探測期間從磁碟載入其餘部分。devlink-info 允許使用者查詢韌體資訊(已載入的元件和版本)。
在其他情況下,裝置既可以將映像儲存在板上,也可以從磁碟載入,或者從磁碟自動刷寫新映像。fw_load_policy devlink 引數可用於控制此行為(Documentation/networking/devlink/devlink-params.rst)。
磁碟上的韌體檔案通常儲存在 /lib/firmware/ 中。
韌體版本管理¶
驅動程式應實現 devlink-flash 和 devlink-info 功能,這兩者共同允許實現獨立於供應商的自動化韌體更新工具。
devlink-info 暴露了 driver 名稱和三個版本組(fixed、running、stored)。
driver 屬性和 fixed 組標識特定的裝置設計,例如用於查詢適用的韌體更新。這就是 serial_number 不屬於 fixed 版本的原因(儘管它是固定的)——fixed 版本應該標識設計,而不是單個裝置。
running 和 stored 韌體版本標識裝置上正在執行的韌體,以及在重啟或裝置重置後將啟用的韌體。
韌體更新代理應能夠遵循此簡單演算法來更新韌體內容,無論裝置供應商如何
# Get unique HW design identifier
$hw_id = devlink-dev-info['fixed']
# Find out which FW flash we want to use for this NIC
$want_flash_vers = some-db-backed.lookup($hw_id, 'flash')
# Update flash if necessary
if $want_flash_vers != devlink-dev-info['stored']:
$file = some-db-backed.download($hw_id, 'flash')
devlink-dev-flash($file)
# Find out the expected overall firmware versions
$want_fw_vers = some-db-backed.lookup($hw_id, 'all')
# Update on-disk file if necessary
if $want_fw_vers != devlink-dev-info['running']:
$file = some-db-backed.download($hw_id, 'disk')
write($file, '/lib/firmware/')
# Try device reset, if available
if $want_fw_vers != devlink-dev-info['running']:
devlink-reset()
# Reboot, if reset wasn't enough
if $want_fw_vers != devlink-dev-info['running']:
reboot()
請注意,此虛擬碼中對 devlink-dev-info 的每次引用都應從核心中獲取最新資訊。
為了方便識別韌體檔案,一些供應商在韌體版本中添加了 bundle_id 資訊。這個元版本涵蓋了多個元件版本,可用於例如韌體檔名中(所有元件版本可能會相當長)。