Linux-Kernel

更新 HP BIOS(打包為 rpm)

  • November 3, 2020

所以,我正在嘗試更新我的 HP Z230 工作站的 BIOS(不要問為什麼..)。

它是一舉兩得:“xwbios”核心模組作為名為 hp-lxbios-mod..src.rpm 的源 rpm 和執行實際更新的“lxbios”應用程序 rpm hp-lxbios..rpm。

這是下載 rpm 文件 sp97093.tgz 的連結,該文件位於該頁面的 BIOS 選項卡下。解壓後,在 lxbios 文件夾下,您將找到兩個 rpm 和描述 rpm 安裝過程的自述文件。

我在 Arch 上,我已經放棄嘗試使用一些 rpm 工具,我正在嘗試手動安裝軟體(或至少編譯它)(可能稍後建構一個 PKGBUILD)。

核心模組

我已經解壓了 hp-lxbios-mod..src.rpm,其中包含 rpm .spec 文件和另一個帶有實際內容的 .tz:

hp-lxbios-mod/mymod.c
hp-lxbios-mod/mymod.mod.c
hp-lxbios-mod/xwbios.c
hp-lxbios-mod/xwbios.mod.c
hp-lxbios-mod/xwbios.h
hp-lxbios-mod/Makefile
hp-lxbios-mod/mkit

Makefile 看起來 (…) 簡單明了

#obj-m := mymod.o
obj-m := xwbios.o

clean:
   rm -f *.o *.ko

install:
   mkdir -p /opt/hp/hp-lxbios/xwkernel
   cp xwbios.ko /opt/hp/hp-lxbios/xwkernel/

mkit是一個 bash 腳本,它找到核心原始碼並啟動 make

#!/bin/bash

if [ -d /lib/modules/`uname -r`/build ]; then
   ksrc=/lib/modules/`uname -r`/build
elif [ -d /lib/modules/`uname -r`/source ]; then
   ksrc=/lib/modules/`uname -r`/source
else
   echo "*** mkit: Error - unable to define kernel source location"
   exit -1
fi
echo "Kernel source dir is $ksrc"
# Setup kernel build of xwkernel module
rm -f $ksrc/xwkernel
ln -s /opt/hp/hp-lxbios/xwkernel $ksrc/xwkernel 
make -C $ksrc M=$PWD modules 

使啟動正常,但我立即遇到編譯錯誤

Kernel source dir is /lib/modules/5.3.6-arch1-1-ARCH/build
make: Entering directory '/usr/lib/modules/5.3.6-arch1-1-ARCH/build'
 CC [M]  /home/gls/Downloads/bios_iupdate/lxbios/hp-lxbios-mod/xwbios.o
/home/gls/Downloads/bios_iupdate/lxbios/hp-lxbios-mod/xwbios.c:125:23: error: initialization of ‘long int (*)(struct file *, unsigned int,  long unsigned int ’ from incompatible pointer type ‘int (*)(struct inode *, struct file *, unsigned int,  long unsigned int)’ [-Werror=incompatible-pointer-types]
 125 |     .unlocked_ioctl = xwbios_ioctl,
     |                       ^~~~~~~~~~~~
/home/gls/Downloads/bios_iupdate/lxbios/hp-lxbios-mod/xwbios.c:125:23: note: (near initialization for ‘xwbios_fops.unlocked_ioctl’)
/home/gls/Downloads/bios_iupdate/lxbios/hp-lxbios-mod/xwbios.c: In function ‘xwbios_exit’:
/home/gls/Downloads/bios_iupdate/lxbios/hp-lxbios-mod/xwbios.c:666:5: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]
 666 |     if (pReqPwdBuffer)
     |     ^~
/home/gls/Downloads/bios_iupdate/lxbios/hp-lxbios-mod/xwbios.c:668:2: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the ‘if’
 668 |  if (pRepsetGetInfo != NULL)
     |  ^~
cc1: some warnings being treated as errors
make[1]: *** [scripts/Makefile.build:281: /home/gls/Downloads/bios_iupdate/lxbios/hp-lxbios-mod/xwbios.o] Error 1
make: *** [Makefile:1626: _module_/home/gls/Downloads/bios_iupdate/lxbios/hp-lxbios-mod] Error 2
make: Leaving directory '/usr/lib/modules/5.3.6-arch1-1-ARCH/build'

我真的不知道如何解決。我在想有一些兼容性問題,也許我可能會在那裡放一個失去的標誌?

實際刷入bios

快來了..

當我看到它需要一個自定義核心模組以及它有多舊時,我沒有費心嘗試讓它與現代核心一起編譯。

我決定嘗試通過 FreeDOS USB 驅動器安裝它,結果證明這也是浪費時間。

取而代之的是,在不必要地組裝了一張啟動盤之後,我最終使用了系統設置實用程序中的選項。

  1. 提取壓縮包:tar xvf sp100126.tgz
  2. 將快閃記憶體映像(例如DOS Flash/J61_0396.bin)放在 FAT 格式的 USB 驅動器的根目錄下。(我實際上將整個DOS Flash/目錄複製到了拇指驅動器的根目錄,所以我不確定是否flshuefi.cpu還需要其他類似的文件。)
  3. 引導進入系統設置實用程序(F10在引導時,或ESC首先獲取菜單)。
  4. 轉到File->Flash System ROM
  5. 選擇 USB 驅動器。至少在 Z620 上,USB 驅動器必須插入黑色 USB 2.0 埠之一。假設您可以在內部硬碟驅動器上使用 FAT 格式的分區,如果這樣更方便的話。
  6. 喝杯咖啡,回來找 截屏

引用自:https://unix.stackexchange.com/questions/547326