平台无关的固件更新#

注意

已弃用功能:从 nvfwupd 2.0.5 版本开始,不再支持使用包含多个目标的 JSON 文件为多个系统更新指定 targets 子选项。

nvfwupd 2.0.0 及更高版本支持通过 YAML 配置文件进行输入和平台无关的固件更新。您可以自定义更新方法和用于更新的 Redfish URI。

配置参数#

该工具支持各种配置参数,其中 BMC_IPRF_USERNAMERF_PASSWORD 始终是必需的。以下 YAML 文件示例解释了每个参数

# Define target platform as one of HGX / DGX / GH / NVOS / GH200
TargetPlatform: 'GH'
# Disable Sanitize Log, disabling Sanitize Log leads to print system IP and user credential to the logs and screen
SANITIZE_LOG: False

# Provide full path of firmware file(s) to be used for firmware update. Value is a list
FWUpdateFilePath:
- "../packages/ nvfw_Grace-CPU-P5041_0003_240124.1.0_prod-signed.fwpkg"

# Define URI for MultipartHttpPushUri (Optional override).
# Default value is taken from UpdateService
MultipartHttpPushUri: '/redfish/v1/UpdateService/update-multipart'

# HttpPushUri for PLDM Firmware Update (Optional override).
# Default value "/redfish/v1/UpdateService"
HttpPushUri: '/redfish/v1/UpdateService'

# Change if TaskServiceUri is different from default value below
# Task id will always be taken from update response in update_fw or
# from –i input in show_update_progress
TaskServiceUri: '/redfish/v1/TaskService/Tasks/'

# Define differnt update methods.
# Valid values {'MultipartHttpPushUri', 'HttpPushUri', 'NVOSRest'}
FwUpdateMethod: "MultipartHttpPushUri"

# Optional Parameter used with MultipartHttpPushUri update method
# used to define dict of parameters for multipart FW update
MultipartOptions:
- ForceUpdate: True

# Target IP address. BMC IP/NVOS Rest service IP/localhost for port forwarding
BMC_IP: "1.1.1.1"
RF_USERNAME: "user"
RF_PASSWORD: "password"
# Target port config if port forwarding is used.
TUNNEL_TCP_PORT: "14443"

# List of update targets. replaces -s/--special option input file. Value is list of target URIs
# Use UpdateParametersTargets: {} for DGX empty JSON value used for full DGX update
# Use UpdateParametersTargets: [] for Oberon empty list used for BMC update
# Remove this parameter for GH full update
UpdateParametersTargets:
- "/redfish/v1/UpdateService/FirmwareInventory/CPLDMB_0"

# Config for reset BMC parameters. Value is a dict.
# Use ResetType: 'ResetAll' for DGX
# Use ResetToDefaultsType: 'ResetAll' for MGX or HGX
BMCResetParameters:
   ResetType: 'ResetAll'

# Multi target input. Value is list of dicts.
Targets:
- BMC_IP: "1.1.1.1"
  RF_USERNAME: "user"
  RF_PASSWORD: "password"
  TUNNEL_TCP_PORT: "14443"
- BMC_IP: "2.2.2.2"
  RF_USERNAME: "user"
  RF_PASSWORD: "password"
  TUNNEL_TCP_PORT: "14444"

使用配置文件运行 nvfwupd#

要使用该工具并更新支持 MultipartHttpPushUri 或 HttpPushUri 的平台,但该平台未被工具自动识别,或者提供的平台是不受支持的错误,可以使用配置文件来提供输入并自定义行为。

请记住以下几点

  • 在未知平台上对 show_version 的支持是有限的。

    如果配置文件中没有 TargetPlatform 参数,show_version 将不会将固件清单与 PLDM 软件包内容进行匹配。软件包版本最新列将分别显示 N/A

  • 不支持 make_upd_targets 命令,因为生成的 JSON 文件不能与配置文件一起使用。

  • 配置文件将更新目标作为配置参数,并且由于该工具应该与工具未知的平台一起使用,因此您必须在提供目标列表作为输入之前识别和验证目标列表。

示例

$ cat config.yaml

TargetPlatform: 'GH'
FWUpdateFilePath:
- "../../packages/nvfw_P4764_0000_240103.1.2_dbg-signed.fwpkg"
MultipartHttpPushUri: '/redfish/v1/UpdateService/update-multipart'
FwUpdateMethod: "MultipartHttpPushUri"
BMC_IP: "1.1.1.1"
RF_USERNAME: "****"
RF_PASSWORD: "******"
UpdateParametersTargets:
- "/redfish/v1/Chassis/5B247A_Baseboard_0"
BMCResetParameters:
ResetToDefaultsType: 'ResetAll'
$ nvfwupd -c config.yaml update_fw

Updating ip address: ip=1.1.1.1
FW package: ['../../packages/nvfw_P4764_0000_240103.1.2_dbg-signed.fwpkg']
Ok to proceed with firmware update? <Y/N>
y
{
   "@odata.id": "/redfish/v1/TaskService/Tasks/5B247A_5",
   "@odata.type": "#Task.v1_4_3.Task",
   "Id": "5B247A_5",
   "TaskState": "Running",
   "TaskStatus": "OK"
}
FW update started, Task Id: 5B247A_5
Wait for Firmware Update to Start...
TaskState: Running
PercentComplete: 20
TaskStatus: OK
TaskState: Running
PercentComplete: 40
TaskStatus: OK
TaskState: Completed
PercentComplete: 100
TaskStatus: OK
Firmware update successful!
Overall Time Taken: 0:08:15
Update successful. Perform activation steps for new firmware to take effect.
---------------------------------------------------------------------------------------
Error Code: 0
$ nvfwupd -c oberon_config.yaml perform_factory_reset

BMC IP: ip=1.1.1.1
Factory Reset request successful
Task State:
{
   "@Message.ExtendedInfo": [
      {
         "@odata.type": "#Message.v1_1_1.Message",
         "Message": "The request completed successfully.",
         "MessageArgs": [],
         "MessageId": "Base.1.15.0.Success",
         "MessageSeverity": "OK",
         "Resolution": "None"
      }
   ]
}
---------------------------------------------------------------------------------------
$ nvfwupd -c config.yaml show_update_progress -i 0

Task Info for Id: 0
StartTime: 2024-01-20T02:46:15+00:00
TaskState: Completed
PercentComplete: 100
TaskStatus: OK
EndTime: 2024-01-20T02:46:17+00:00
Overall Time Taken: 0:00:02
Overall Task Status: {
   "@odata.id": "/redfish/v1/TaskService/Tasks/0",
   "@odata.type": "#Task.v1_4_3.Task",
   "EndTime": "2024-01-20T02:46:17+00:00",
   "Id": "0",
   "Messages": [
      {
            "@odata.type": "#Message.v1_0_0.Message",
            "Message": "The task with id 0 has started.",
            "MessageArgs": [
               "0"
            ],
            "MessageId": "TaskEvent.1.0.1.TaskStarted",
            "Resolution": "None.",
            "Severity": "OK"
      },
      {
            "@odata.type": "#Message.v1_0_0.Message",
            "Message": "The task with id 0 has changed to progress 100 percent complete.",
            "MessageArgs": [
               "0",
               "100"
            ],
            "MessageId": "TaskEvent.1.0.1.TaskProgressChanged",
            "Resolution": "None.",
            "Severity": "OK"
      },
      {
            "@odata.type": "#Message.v1_0_0.Message",
            "Message": "The task with id 0 has Completed.",
            "MessageArgs": [
               "0"
            ],
            "MessageId": "TaskEvent.1.0.1.TaskCompletedOK",
            "Resolution": "None.",
            "Severity": "OK"
      }
   ],
   "Name": "Task 0",
  "Payload": {
      "HttpHeaders": [
            "Host: 1.1.1.1",
            "User-Agent: python-requests/2.28.2",
            "Accept-Encoding: gzip, deflate",
            "Accept: */*",
            "Connection: keep-alive",
            "Content-Length: 109023143"
      ],
      "HttpOperation": "POST",
      "JsonBody": "null",
      "TargetUri": "/redfish/v1/UpdateService/update-multipart"
   },
   "PercentComplete": 100,
   "StartTime": "2024-01-20T02:46:15+00:00",
   "TaskMonitor": "/redfish/v1/TaskService/Tasks/0/Monitor",
   "TaskState": "Completed",
   "TaskStatus": "OK"
}
Update is successful.
---------------------------------------------------------------------------------------