Linux-Kernel
更新 HP BIOS(打包為 rpm)
所以,我正在嘗試更新我的 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 驅動器安裝它,結果證明這也是浪費時間。
取而代之的是,在不必要地組裝了一張啟動盤之後,我最終使用了系統設置實用程序中的選項。
- 提取壓縮包:
tar xvf sp100126.tgz
- 將快閃記憶體映像(例如
DOS Flash/J61_0396.bin
)放在 FAT 格式的 USB 驅動器的根目錄下。(我實際上將整個DOS Flash/
目錄複製到了拇指驅動器的根目錄,所以我不確定是否flshuefi.cpu
還需要其他類似的文件。)- 引導進入系統設置實用程序(
F10
在引導時,或ESC
首先獲取菜單)。- 轉到
File
->Flash System ROM
- 選擇 USB 驅動器。至少在 Z620 上,USB 驅動器必須插入黑色 USB 2.0 埠之一。假設您可以在內部硬碟驅動器上使用 FAT 格式的分區,如果這樣更方便的話。
- 喝杯咖啡,回來找