OpenCore not detected: bootloader isn't installed or NVRAM isn't native

Dec 10, 2010
Gigabyte Z390 Aorus Elite
RX 580
Mobile Phone
  1. iOS
To obtain the current OpenCore version, we can use the following command:
nvram 4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102:opencore-version
But sometimes Opencore version (even Opencore itself) cannot be detected and the request for this variable returns an error whose appearance is different depending on the method used for this task.

Trying from Terminal:
nvram: Error getting variable - '4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102:opencore-version': (iokit/common) data was not found
Trying from Hackintool:
OpenCore version x.x.x is available - you have 0.0.0. Would you like to download a newer version?
Trying from OpenCore Configurator (even with working NVRAM):
The bootloader looks like it is not installed or your NVRAM isn't native.

The key that handles the exposure of UEFI variables to the operating system by OpenCore is Misc -> Security -> ExposeSensitiveData
By default, OpenCore does not announce its presence to the operating system. If ExposeSensitiveData is set to zero, this is the normal behaviour.
Note: this is the reason why the EFI partition that contains the current booting OpenCore is not visible in the picker, and instead EFI partitions with other OpenCore installations can be displayed.

ExposeSensitiveData (Number)

From Configuration.pdf file:
Description: Sensitive data exposure bitmask (sum) to operating system.
0x01 — Expose the printable booter path as an UEFI variable.
0x02 — Expose the OpenCore version as an UEFI variable.
0x04 — Expose the OpenCore version in the OpenCore picker menu title.
0x08 — Expose OEM information as a set of UEFI variables.

Values that ExposeSensitiveData can have and what they mean:
  • ExposeSensitiveData=0 -> OpenCore related UEFI variables are not exposed to macOS
  • ExposeSensitiveData=1 -> Expose booter path as UEFI variable
  • ExposeSensitiveData=3 -> Expose booter path and OpenCore version as UEFI variables
  • ExposeSensitiveData=6 -> Expose OpenCore version as UEFI variable and OpenCore version in the picker
  • ExposeSensitiveData=7 -> Expose booter path and OpenCore version as UEFI variables and OpenCore version in the picker
  • ExposeSensitiveData=15 -> Expose booter path and OpenCore version as UEFI variables, OpenCore version in the picker and OEM information as a set of UEFI variables.

Native NVRAM

In the current version of OpenCore (assuming we have native NVRAM that works fine) the OpenCore not detected (or the OpenCore version not detected) error is usually related to ExposeSensitiveData=0.
With values 3, 6, 7 or 15 in ExposeSensitiveData this error should not happen.

Emulated NVRAM

For emulated NVRAM to work, in addition to the value assigned to ExposeSensitiveData you have to act on 3 keys from Misc -> Security:
  • LegacyEnable (Boolean)
    Description: Allows for NVRAM to be stored on nvram.plist for systems without working NVRAM. Enables loading a file named nvram.plist (with NVRAM variables) from the EFI volume root.
  • LegacyOverwrite (Boolean)
    Description: Permits overwriting firmware variables in the nvram.plist file.
    Note: Only variables accessible from the operating system will be overwritten.
  • LegacySchema (Dictionary)
    Description: Allows assigning nvram variables on systems without working NVRAM. These variables are written to the NVRAM.plist file.
You also have to check a key in PlatformInfo:
  • WriteFlash (Boolean)
    Description: Enables writing to flash memory for all added variables. When WriteFlash=False, the variable is written to RAM, not CMOS, and not preserved across the reboots. This is the difference between volatile and non-volatile variables.

1. If we have Native NVRAM working, we shouldn't use any values for Emulated NVRAM, right?

Yes, if we have native NVRAM then we must forget the settings of emulated NVRAM.

2. If I want, can I remove these entries at the LegacySchema and its content? 7C436110-AB2A-4BBB-A880-FE41995C9F82 and 8BE4DF61-93CA-11D2-AA0D-00E098032B8C.

It is clear that LegacySchema is a set of NVRAM variables and that OpenCore compares these to the variables present in nvram.plist so in theory it would not be necessary when we have native NVRAM.
But in the OpenCore documentation I have not found anything that says that we can delete LegacySchema when there is native NVRAM.
If we have LegacyEnable=False and LegacyOverwrite=False it seems logical to think that LegacySchema is not used by OpenCore. And this is true, at least on my system, which has native NVRAM and boots perfectly without those 2 LegacySchema entries.
Summary: we can delete the 2 LegacySchema entries if we have native NVRAM.
What is always recommended is to have WriteFlash=True.

Note: ResetNVRAM must be done at first boot each time OpenCore is updated to a different version.
Last edited: