我已经搜索了大约 8 个小时,我想澄清一下我尚未完全弄清楚的要点。
TL;DR 版本:如何从 CLI 访问(读取和写入)所有 BIOS 设置,例如启用/禁用虚拟化、启用/禁用 GPU 的涡轮频率、设置日志显示时间等?
以下是故事内容:
首先,我们有旧的 BIOS,例如这个:
现在,我们有了新一代的 BIOS,例如这个:
我们称它们为 UEFI BIOS,对吗?
然后我阅读(并测试)了以下文章:
- www.pixelbeat.org/docs/bios/
- stackoverflow.com/questions/6259124/apis-for-querying-and-setting-bios-properties(以及回复中提到的所有链接)
- unix.stackexchange.com/questions/126132/how-to-dump-bios-data-to-a-file
- stackoverflow.com/questions/34537435/where-does-dmidecode-get-the-smbios-table
- zh.wikipedia.org/wiki/System_Management_BIOS
- www.linux-mag.com/id/7768/
- www-pc.uni-regensburg.de/hardware/techdok/bios_dmi_20.pdf(至第 17 页)
- www.geeklab.info/2010/05/backup-your-cmos-from-linux/
- www.bioscentral.com/misc/cmosmap.htm
- smackerelofopinion.blogspot.com.tr/2010/09/digging-into-bios-cmos-memory.html
之后,我多次更改了 BIOS 设置(例如虚拟化、启用/禁用 IGD turbo、更改 USB 设置等),并在每次启动时转储以下文件/命令的全部内容。
- 解码
- 生物解码
- 处理器ID
- /dev/mem
- /dev/nvram
结果如何?我把转储结果与 Meld 进行了并排比较,结果一目了然!什么都没有改变!这到底是怎么回事?
以下是我的问题列表。我是一名电子工程师,因此您可以毫不犹豫地详细了解或参考技术资料。
- 我们在主板(我的意思是芯片)的哪个部分存储了所有的 BIOS 设置(对于旧版本)?
- 我们需要什么样的硬件来保留 UEFI BIOS 的设置和界面?UEFI BIOS 硬件与旧版本有何不同?
- 有没有办法通过 Linux 中的任何类型的驱动程序或文件来访问该硬件?
- 可以从操作系统更改这些配置吗?
非常感谢您的回复。
答案1
操作系统没有通用的方法来访问系统 BIOS。只有制造商提供详细信息并且制定了如何做到这一点的标准,才有可能做到这一点。事实并非如此,而且我认为这不是一个好主意。
一些制造商已经为自己的系统创建了软件,至少是针对 Windows 的。该软件必须针对特定版本的 BIOS 进行设计。
问题在于 BIOS 是每个制造商的专有产品。通常设置存储在 CMOS 中,但对此没有要求。制造商可以自由地将设置存储在他们选择的任何位置和方式中。没有关于这些详细信息的文档。
这会带来安全隐患。如果合法软件可以访问 BIOS,那么恶意软件也无能为力。这将为恶意软件开辟一个全新的可能世界,恶意软件的创造者将充分利用这一世界。当然,可以开发防护措施,但这些措施可能会被规避,而且会被规避
答案2
您所说的 BIOS 至少有 3 种不同的含义:
- 系统设置实用程序(通常被错误地称为 BIOS 或 CMOS 设置)
- BIOS(即基本的引导加载程序和标准化 API)
- (U)EFI 固件(即启动硬件抽象的更现代版本)
后两者提供了一组定义良好的 API,而前者则没有。这意味着,没有一种与供应商无关的通用方法来操作设置实用程序提供的所有设置。
至于设置的存储位置:大多数供应商使用电池供电的静态 RAM(古代术语为“CMOS-RAM”),这就是为什么主板上的 CR2032 电池坏了就会很麻烦的原因。
答案3
我很惊讶没有人提到smbios-token-ctl
。
BIOS 确实可以从操作系统内部进行修改。
示例:我的 BIOS 有一个设置可以启用/禁用集成网络摄像头。我可以从 Linux 中更改该设置:
# apt install smbios-utils
# smbios-token-ctl | grep -i camera
Token: 0x0285 - Camera (Enable)
Desc: To enable Camera
Token: 0x0286 - Camera (Disable)
# smbios-token-ctl -i 0x0285
================================================================================
Token: 0x0285 - Camera (Enable)
value: bool = true
Desc: To enable Camera
# smbios-token-ctl -i 0x0286 --activate
Original Value
token: 0x0286
type: bool
value: false
Activating token...
New value
type: bool
value: true
# smbios-token-ctl -i 0x0285
================================================================================
Token: 0x0285 - Camera (Enable)
value: bool = false
Desc: To enable Camera
Desc: To disable Camera
然后我可以重新启动,进入 BIOS,并检查相机设置是否已更改。
注意:需要重新启动才能应用更改。
答案4
在 HPE 服务器上,您可以使用名为 conrep 的实用程序更改设置。它是 hp-scripting-tools RPM 的一部分。用法如下所述:
h20566.www2.hpe.com/hpsc/doc/public/display?sp4ts.oid=5249594&docLocale=en_US&docId=emr_na-c05182235
这很简单。使用 -s(保存)参数可以保存配置,例如:
conrep -s -f BL460Gen8.dat
使用 -l(加载)参数可以加载配置:
conrep -l -f BL460Gen8.dat
dat 文件实际上是 XML 代码。因此,如果您想要启用/禁用超线程设置,请找到相应的行并修改值。请参阅 G6 及更新版本的示例:
<Section name="Intel_Hyperthreading" helptext="Toggles hyperthreading on Intel based G6 and greater systems">Enabled</Section>