* [edk2-discuss][edk2-devel] UEFI variables not getting stored in nvram disk
[not found] <3e129930-93a2-01e9-f7a3-f76d19fbe53c@nutanix.com>
@ 2023-09-07 20:24 ` Het Gala
2023-09-07 21:23 ` Laszlo Ersek
0 siblings, 1 reply; 2+ messages in thread
From: Het Gala @ 2023-09-07 20:24 UTC (permalink / raw)
To: devel; +Cc: lersek, Kallol Biswas [C]
[-- Attachment #1.1: Type: text/plain, Size: 7382 bytes --]
-------- Forwarded Message --------
Subject: [edk2-discuss] UEFI variables not getting stored in nvram disk
Date: Mon, 17 Jul 2023 23:24:45 +0530
From: Het Gala <het.gala@nutanix.com>
To: discuss@edk2.groups.io
CC: Kallol Biswas [C] <kallol.biswas@nutanix.com>
Hi edk2 community,
We have a scenario - testcase1, with uefi enabled VM having an Empty
CDROM. PxE boot, EFI internal Shell (already mentioned by default by
UEFI) and CDROM are the boot options. We also have a pflash / nvram disk
by default attached if it is an uefi enabled VM. So, we have a nvram
disk attached to the system.
In testcase1, (opened the UEFI Boot Manager --> changed Boot Order -->
saved Boot Order --> continue --> Guest reboot followed by power cycle
--> again open UEFI Boot Manager) changed Boot Order is not persisted
and falls back to the default Boot Order. Same observation is seen for
other uefi variables (ex. autoboot timeout / Next Boot / Display
resolution changes) too. None of the modified / changed uefi variables
are persisted after guest reboot followed by power cycle.
On the other hand, when we have a similar scenario testcase2, but
instead of an empty CDROM, we have a vdisk (~ 10G) with an guest OS
image (~ 1.7G) mounted on that disk. We observed that, the modified uefi
variables (ex. change in Boot order / change in display resolution) are
persisted after modifying uefi variable value followed by guest reboot
and power cycle. The modified variables are stored inside NvVars file (~
200 MB). This file is inside efi/boot partition, which is made on the
same vdisk where guest OS image is also mounted, because the vdisk is
having space left.
IIUC, if SMM driver enabled while building OVMF binary, and have an
external pflash drive to save the uefi variables (nvram disk), the
modified uefi variables are stored inside the nvram disk, otherwise in
absence of SMM driver stack, the NvVars file gets mounted on the OS disk
if enough space is available.
In testcase2, SMM driver option (-D SMM_REQUIRE) is present in the OVMF
binary file, and also has external nvram disk attached to the VM, even
then the uefi variables are stored on the vdisk instead of nvram disk.
Question is : How can we make Boot Order (and other modified uefi
variables) persistent when a OS vdisk is not mounted to the uefi enabled
VM ?
---------------------------------------------------------------------------------------------------------------------------------------------------
(Attaching references for testcase1 and testcase2 below)
For testcase1 : attaching some debug statements here of the default Boot
order (1.a), the changed boot order (1.b), and the boot order followed
by guest reboot and power cycle (1.c).
(1.a) Here it shows the default initial Boot order
[Bds]OsIndication: 0000000000000000^M
[Bds]=============Begin Load Options Dumping ...=============^M
Driver Options:^M
SysPrep Options:^M
Boot Options:^M
Boot0000: UiApp 0x0109^M
Boot0001: UEFI QEMU DVD-ROM QM00005 0x0001^M
Boot0002: UEFI PXEv4 (MAC:506B8D83F4DB) 0x0001^M
Boot0003: EFI Internal Shell 0x0001^M
PlatformRecovery Options:^M
PlatformRecovery0000: Default PlatformRecovery 0x0001^M
[Bds]=============End Load Options Dumping=============^M
[Bds]BdsWait ...Zzzzzzzzzzzz...^M
[Bds]Exit the waiting!^M
ValidateSetVariable - Variable
(8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootCurrent) returning Success.^M
(1.b) Changed the order from 1->2->3 to 1->3->2 from the UEFI Boot
Manager Menu. To verify whether the Boot order has actually changed or
not after saving the Boot order from uefi GUI, added some debug
statments after
https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Library/BootMaintenanceManagerUiLib/Variable.c#L614
<https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Library/BootMaintenanceManagerUiLib/Variable.c#L614>.
DEBUG((EFI_D_INFO, "Printing the boot Order here.\n"));
for (Index = 0; Index < BootOrderSize / sizeof (UINT16); Index++) {
DEBUG ((
EFI_D_INFO, " BootOption %u: %04x\n",
Index,
BootOrder[Index]
));
}
And the log files printed the changed Boot order, below and that
confirmed that the modified Boot Order has been set
https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Library/BootMaintenanceManagerUiLib/Variable.c#L624
<https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Library/BootMaintenanceManagerUiLib/Variable.c#L624>.
Printing the boot Order here.^M
BootOption 0: 0001^M
BootOption 1: 0003^M
BootOption 2: 0002^M
BootOption 3: 0000^M
(1.c) On Guest reboot followed by power cycle, on reopening the UEFI
Boot Maintainance Manager GUI, found the Boot Order to fall back to the
default order. (Attaching a screenshot of the Boot Order as attachment).
-------------------------------------------------------------------------------------------------------------------------------------------------------
For testcase2 : attaching the partition made by efi/boot on the guest,
with a proof that the modified uefi variables are stored in the NvVars file.
(2.a) On the Guest OS, /boot/efi made a partition of 200MB
[root@localhost <mailto:root@localhost>~]$ lsblk -l
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 12G 0 disk
sda1 8:1 0 200M 0 part /boot/efi
sda2 8:2 0 1G 0 part /boot
sda3 8:3 0 10.8G 0 part
cl-root 253:0 0 9.6G 0 lvm /
cl-swap 253:1 0 1.2G 0 lvm [SWAP]
sr0 11:0 1 1024M 0 rom
(2.b) Inside the /boot/efi partition, there is the NvVars file. After
this, the uefi variables were modified / changed.
[root@localhost <mailto:root@localhost>~]$ ls -al /boot/efi
total 36
drwx------. 3 root root 16384 Dec 31 1969 .
dr-xr-xr-x. 5 root root 4096 Oct 23 2019 ..
drwx------. 4 root root 4096 Oct 23 2019 EFI
-rwx------. 1 root root 11019Jun 915:51 NvVars
(2.c) After guest reboot followed by power cycle, the change in uefi
variables was persistent. And to verify, where the modified variables
were stored, we could see the date change in the NvVars file ->
signifying the latest change in UEFI boot manager menu.
[root@localhost <mailto:root@localhost>~]$ ls -la /boot/efi
total 36
drwx------. 3 root root 16384 Dec 31 1969 .
dr-xr-xr-x. 5 root root 4096 Oct 23 2019 ..
drwx------. 4 root root 4096 Oct 23 2019 EFI
-rwx------. 1 root root 11019Jun 1206:56 NvVars
[root@localhost <mailto:root@localhost>~]$ date
Mon Jun 12 06:58:13 EDT 2023
Thanks,
Het Gala
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#108417): https://edk2.groups.io/g/devel/message/108417
Mute This Topic: https://groups.io/mt/101223763/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
[-- Attachment #1.2: Type: text/html, Size: 63499 bytes --]
[-- Attachment #2: Screenshot 2023-07-13 at 2.23.49 AM.png --]
[-- Type: image/png, Size: 67282 bytes --]
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [edk2-discuss][edk2-devel] UEFI variables not getting stored in nvram disk
2023-09-07 20:24 ` [edk2-discuss][edk2-devel] UEFI variables not getting stored in nvram disk Het Gala
@ 2023-09-07 21:23 ` Laszlo Ersek
0 siblings, 0 replies; 2+ messages in thread
From: Laszlo Ersek @ 2023-09-07 21:23 UTC (permalink / raw)
To: Het Gala, devel; +Cc: Kallol Biswas [C]
On 9/7/23 22:24, Het Gala wrote:
>
>
>
> -------- Forwarded Message --------
> Subject: [edk2-discuss] UEFI variables not getting stored in nvram disk
> Date: Mon, 17 Jul 2023 23:24:45 +0530
> From: Het Gala <het.gala@nutanix.com>
> To: discuss@edk2.groups.io
> CC: Kallol Biswas [C] <kallol.biswas@nutanix.com>
>
>
>
> Hi edk2 community,
>
>
> We have a scenario - testcase1, with uefi enabled VM having an Empty
> CDROM. PxE boot, EFI internal Shell (already mentioned by default by
> UEFI) and CDROM are the boot options. We also have a pflash / nvram disk
> by default attached if it is an uefi enabled VM. So, we have a nvram
> disk attached to the system.
>
>
> In testcase1, (opened the UEFI Boot Manager --> changed Boot Order -->
> saved Boot Order --> continue --> Guest reboot followed by power cycle
> --> again open UEFI Boot Manager) changed Boot Order is not persisted
> and falls back to the default Boot Order. Same observation is seen for
> other uefi variables (ex. autoboot timeout / Next Boot / Display
> resolution changes) too. None of the modified / changed uefi variables
> are persisted after guest reboot followed by power cycle.
>
>
> On the other hand, when we have a similar scenario testcase2, but
> instead of an empty CDROM, we have a vdisk (~ 10G) with an guest OS
> image (~ 1.7G) mounted on that disk. We observed that, the modified uefi
> variables (ex. change in Boot order / change in display resolution) are
> persisted after modifying uefi variable value followed by guest reboot
> and power cycle. The modified variables are stored inside NvVars file (~
> 200 MB). This file is inside efi/boot partition, which is made on the
> same vdisk where guest OS image is also mounted, because the vdisk is
> having space left.
>
>
> IIUC, if SMM driver enabled while building OVMF binary, and have an
> external pflash drive to save the uefi variables (nvram disk), the
> modified uefi variables are stored inside the nvram disk, otherwise in
> absence of SMM driver stack, the NvVars file gets mounted on the OS disk
> if enough space is available.
>
> In testcase2, SMM driver option (-D SMM_REQUIRE) is present in the OVMF
> binary file, and also has external nvram disk attached to the VM, even
> then the uefi variables are stored on the vdisk instead of nvram disk.
>
>
> Question is : How can we make Boot Order (and other modified uefi
> variables) persistent when a OS vdisk is not mounted to the uefi enabled
> VM ?
There are too many disparate things going on in your setup:
- controlling the boot order from within the guest as opposed to via fw_cfg
- using pflash vs. not using pflash
- building with SMM_REQUIRE or not.
Short suggestion:
- always use pflash; if you see an NvVars file, your setup is broken (we
can safely say this in 2023). In fact use *two* pflash chips, one for
code, one for varstore.
- if your QEMU command line includes the "bootorder" property for any
device, then OVMF BDS will filter and reorder the UEFI boot options,
most likely overriding or otherwise masking your earlier in-guest
settings. This is intentional.
- SMM_REQUIRE or not is not relevant for the Boot#### and BootOrder
variables.
Please provide your QEMU and edk2 versions, your edk2 build command, and
the QEMU command line.
Laszlo
>
>
> ---------------------------------------------------------------------------------------------------------------------------------------------------
>
> (Attaching references for testcase1 and testcase2 below)
>
>
> For testcase1 : attaching some debug statements here of the default Boot
> order (1.a), the changed boot order (1.b), and the boot order followed
> by guest reboot and power cycle (1.c).
>
> (1.a) Here it shows the default initial Boot order
>
>
> [Bds]OsIndication: 0000000000000000^M
> [Bds]=============Begin Load Options Dumping ...=============^M
> Driver Options:^M
> SysPrep Options:^M
> Boot Options:^M
> Boot0000: UiApp 0x0109^M
> Boot0001: UEFI QEMU DVD-ROM QM00005 0x0001^M
> Boot0002: UEFI PXEv4 (MAC:506B8D83F4DB) 0x0001^M
> Boot0003: EFI Internal Shell 0x0001^M
> PlatformRecovery Options:^M
> PlatformRecovery0000: Default PlatformRecovery 0x0001^M
> [Bds]=============End Load Options Dumping=============^M
> [Bds]BdsWait ...Zzzzzzzzzzzz...^M
> [Bds]Exit the waiting!^M
> ValidateSetVariable - Variable
> (8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootCurrent) returning Success.^M
>
>
> (1.b) Changed the order from 1->2->3 to 1->3->2 from the UEFI Boot
> Manager Menu. To verify whether the Boot order has actually changed or
> not after saving the Boot order from uefi GUI, added some debug
> statments
> after https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Library/BootMaintenanceManagerUiLib/Variable.c#L614 <https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Library/BootMaintenanceManagerUiLib/Variable.c#L614>.
>
>
> DEBUG((EFI_D_INFO, "Printing the boot Order here.\n"));
>
> for (Index = 0; Index < BootOrderSize / sizeof (UINT16); Index++) {
>
> DEBUG ((
>
> EFI_D_INFO, " BootOption %u: %04x\n",
>
> Index,
>
> BootOrder[Index]
>
> ));
>
> }
>
>
> And the log files printed the changed Boot order, below and that
> confirmed that the modified Boot Order has been
> set https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Library/BootMaintenanceManagerUiLib/Variable.c#L624 <https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Library/BootMaintenanceManagerUiLib/Variable.c#L624>.
>
> Printing the boot Order here.^M
> BootOption 0: 0001^M
> BootOption 1: 0003^M
> BootOption 2: 0002^M
> BootOption 3: 0000^M
>
>
> (1.c) On Guest reboot followed by power cycle, on reopening the UEFI
> Boot Maintainance Manager GUI, found the Boot Order to fall back to the
> default order. (Attaching a screenshot of the Boot Order as attachment).
>
>
> -------------------------------------------------------------------------------------------------------------------------------------------------------
>
> For testcase2 : attaching the partition made by efi/boot on the guest,
> with a proof that the modified uefi variables are stored in the NvVars file.
>
>
> (2.a) On the Guest OS, /boot/efi made a partition of 200MB
>
>
> [root@localhost <mailto:root@localhost> ~]$ lsblk -l
>
> NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
>
> sda 8:0 0 12G 0 disk
>
> sda1 8:1 0 200M 0 part /boot/efi
>
> sda2 8:2 0 1G 0 part /boot
>
> sda3 8:3 0 10.8G 0 part
>
> cl-root 253:0 0 9.6G 0 lvm /
>
> cl-swap 253:1 0 1.2G 0 lvm [SWAP]
>
> sr0 11:0 1 1024M 0 rom
>
>
> (2.b) Inside the /boot/efi partition, there is the NvVars file. After
> this, the uefi variables were modified / changed.
>
>
> [root@localhost <mailto:root@localhost> ~]$ ls -al /boot/efi
>
> total 36
>
> drwx------. 3 root root 16384 Dec 31 1969 .
>
> dr-xr-xr-x. 5 root root 4096 Oct 23 2019 ..
>
> drwx------. 4 root root 4096 Oct 23 2019 EFI
>
> -rwx------. 1 root root 11019 Jun 9 15:51 NvVars
>
>
> (2.c) After guest reboot followed by power cycle, the change in uefi
> variables was persistent. And to verify, where the modified variables
> were stored, we could see the date change in the NvVars file ->
> signifying the latest change in UEFI boot manager menu.
>
>
> [root@localhost <mailto:root@localhost> ~]$ ls -la /boot/efi
>
> total 36
>
> drwx------. 3 root root 16384 Dec 31 1969 .
>
> dr-xr-xr-x. 5 root root 4096 Oct 23 2019 ..
>
> drwx------. 4 root root 4096 Oct 23 2019 EFI
>
> -rwx------. 1 root root 11019 Jun 12 06:56 NvVars
>
>
>
> [root@localhost <mailto:root@localhost> ~]$ date
>
> Mon Jun 12 06:58:13 EDT 2023
>
>
> Thanks,
> Het Gala
>
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#108419): https://edk2.groups.io/g/devel/message/108419
Mute This Topic: https://groups.io/mt/101223763/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/leave/12367111/7686176/1913456212/xyzzy [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2023-09-07 21:23 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <3e129930-93a2-01e9-f7a3-f76d19fbe53c@nutanix.com>
2023-09-07 20:24 ` [edk2-discuss][edk2-devel] UEFI variables not getting stored in nvram disk Het Gala
2023-09-07 21:23 ` Laszlo Ersek
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox