Вопрос или проблема
Я не могу заставить Windows изменить порядок загрузки UEFI
так, чтобы PXE
загружался первым изнутри Windows. Я пытаюсь автоматизировать систему так, чтобы она всегда загружалась по PXE
, чтобы я мог контролировать параметры загрузки. Я пробовал bcdedit
:
bcdedit /set {fwbootmgr} DEFAULT <uuid сетевого интерфейса>
Есть ли что-то похожее на efibootmgr
для Windows?
Удаление {GUID} загрузчика для сети из {fwbootmgr}/”display order” (отображаемый порядок в NVRAM) и повторное добавление его в качестве первого в конечном итоге изменит порядок загрузки NVRAM.
Порядок загрузки в NVRAM представляет собой список целых чисел, но Windows отображает его как список GUID (в конечном итоге для поддержания аналогии с “отображаемым порядком” для {bootmgr}).
Предлагаемое решение не испытано и не гарантируется его работа. Я предполагаю, что UEFI повторно сканирует оборудование при холодном запуске, поэтому список загрузочных устройств обновляется (и удаление сети из порядка загрузки безопасно, так как она появится снова при следующем запуске).
Похоже, что Windows ограничивает доступ к NVRAM для пользователей по какой-то причине (возможно, по той же причине, что и запрещение цепной загрузки Linux/других загрузчиков на UEFI).
В BCD есть только две сопоставленные переменные NVRAM для {fwbootmgr} – “отображаемый порядок” (порядок загрузки) и “таймаут”. Однако вы можете установить переменную bootnext (которая не имеет сопоставления в BCD).
Вы можете попробовать Visual BCD Editor 0.9.0.1 для просмотра полного BCD, а также для изменения каждого элемента и объекта BCD.
Dell предоставляет утилиту под названием Dell Command Configure, которая поможет вам настроить порядок загрузки всех клиентских систем из Windows и во время развертывания ОС через последовательность задач SCCM.
http://en.community.dell.com/techcenter/enterprise-client/w/wiki/7532.dell-command-configure
используйте bcdedit /set {fwbootmgr} bootsequence {GUID}
для установки однократной загрузки.
https://github.com/chengxuncc/booToLinux
Я только что опубликовал ответ на этот вопрос на другом сервере: Как остановить установку Windows 10 от изменения настроек загрузки BIOS?
Думаю, мы можем закрыть этот вопрос как дубликат, поскольку на тот есть рабочий ответ (прошу прощения, что не нашел этот вопрос первым).
Я также опубликовал ответ, основанный на powershell/bcdedit, на Как остановить установку Windows 10 от изменения настроек загрузки BIOS?, чтобы дополнить ответ aggieNick02 на C++. Вот он:
Я разработал этот сценарий powershell, который работает для меня. Он не идеален, потому что он просто “глупо” перемещает первую не-Windows загрузку на верхнюю позицию. Это работает для моих целей, и, возможно, есть способ сделать его умнее, который я не нашел.
Он выглядит длинным, но в основном состоит из комментариев и отформатирован для лучшего понимания. Его можно переписать на 5 или 6 строк.
https://github.com/mmseng/bcdedit-revert-uefi-gpt-boot-order
# Этот скрипт ищет первый не-Windows Boot Manager вход в порядке загрузки UEFI/GPT и перемещает его на верх
# Чтобы предотвратить захват верхней позиции в порядке загрузки новыми установленными Windows на моих тестовых ВМ с изображением UEFI/GPT
# от mmseng
# https://github.com/mmseng/bcdedit-revert-uefi-gpt-boot-order
# Заметки:
# - Использовать это на обычных рабочих машинах, которые разворачиваются, не имеет большого смысла. Основное использование - для машин, которые многократно образуются, или может быть полезно для лабораторных машин.
# - Насколько я вижу, bcdedit не предоставляет способа извлечь дружелюбные названия устройств в общем порядке загрузки UEFI. Поэтому этот скрипт просто перемещает первый элемент, который он идентифицирует в списке, который НЕ является "{bootmgr}" (иначе "Windows Boot Manager"). Пользователь должен убедиться, что порядок загрузки будет существовать в состоянии, в котором достигается желаемый результат.
# - В моем случае, мои тестовые UEFI ВМ первоначально имеют порядок загрузки 1) "EFI Network", 2) что угодно еще. Когда Windows устанавливается с GPT-разделением, он изменяет порядок загрузки на 1) "Windows Boot Manager", 2) "EFI Network", 3) что угодно еще. В этом состоянии этот скрипт можно использовать для изменения порядка загрузки на 1) "EFI Network", 2) "Windows Boot Manager", 3) что угодно еще.
# - Эта функциональность полагается на совершенно документированную функцию bcdedit для изменения записи "{fwbootmgr}" GPT, которая содержит общий список загрузочных устройств UEFI.
# - Насколько я вижу, bcdedit действительно предназначен только для редактирования собственные записи "{bootmgr}" Windows, которые представляют одно из "загрузочных устройств" в общем списке UEFI.
# - Вот некоторые источники:
# - https://www.cnet.com/forums/discussions/bugged-bcdedit-349276/
# - https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/bcd-system-store-settings-for-uefi
# - https://www.boyans.net/DownloadVisualBCD.html
# - https://serverfault.com/questions/813695/how-do-i-stop-windows-10-install-from-modifying-bios-boot-settings
# - https://serverfault.com/questions/714337/changing-uefi-boot-order-from-windows
# Прочитать текущий порядок загрузки
echo "Чтение текущего порядка загрузки..."
$bcdOutput = cmd /c bcdedit /enum "{fwbootmgr}"
echo $bcdOutput
# Удалить как можно больше ненужных символов
echo "Удаление лишних символов из вывода порядка загрузки..."
$bcdOutput = $bcdOutput -replace '\s+',''
$bcdOutput = $bcdOutput -replace '`t',''
$bcdOutput = $bcdOutput -replace '`n',''
$bcdOutput = $bcdOutput -replace '`r',''
$bcdOutput = $bcdOutput.trim()
$bcdOutput = $bcdOutput.trimEnd()
$bcdOutput = $bcdOutput.trimStart()
$bcdOutput = $bcdOutput -replace ' ',''
echo $bcdOutput
# Определите надежный регулярное выражение для захвата UUID не-Windows Boot Manager устройств в списке порядка загрузки
# Это сложно, потому что, похоже, Powershell интерпретирует регулярные выражения довольно нестандартным образом (вкуси .NET)
# https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expressions
# Даже тогда, тестировщики регулярных выражений .NET, которые я использовал, не совпадали с поведением того, что я получал из различных команд Powershell, которые принимают строковые выражения
# Тем не менее, это, похоже, работает, хотя я не могу воспроизвести результаты в любом тестировщике регулярных выражений
$regex = [regex]'^{([\-a-z0-9]+)+}'
echo "Определено регулярное выражение как: $regex"
# Сохранить совпадения
echo "Сохранение строк, соответствующих регулярному выражению..."
$foundMatches = $bcdOutput -match $regex
# Захватить первое совпадение
# Если Windows Boot Manager (иначе "{bootmgr}") был первым в списке, это должно быть второе
# Это означает, что, вероятно, это был первый, прежде чем Windows захватила первую позицию
# Вероятно, это было мое устройство загрузки "EFI Network"
$secondBootEntry = $foundMatches[0]
echo "Первое совпадение: $secondBootEntry"
# Переместить его на первую позицию
echo "Запуск этой команды:"
echo "cmd /c bcdedit $bcdParams /set `"{fwbootmgr}`" displayorder $secondBootEntry /addfirst"
cmd /c bcdedit $bcdParams /set "{fwbootmgr}" displayorder $secondBootEntry /addfirst
bcdedit /set {fwbootmgr} default <uuid_сетевого_интерфейса>
Чтобы сделать запись первой в списке:
bcdedit /set {fwbootmgr} displayorder <uuid_сетевого_интерфейса> /addfirst
Настройки системного хранилища BCD для UEFI / Другие настройки
Ответ или решение
К изменению порядка загрузки UEFI из Windows
Изменение порядка загрузки UEFI напрямую из Windows может представлять собой сложную задачу, особенно когда требуется установить загрузку по сети (PXE) в качестве приоритетного варианта. Несмотря на ограниченные возможности стандартных инструментов Windows, таких как bcdedit
, существует ряд методик и инструментов, которые могут помочь в решении данной задачи.
Основные рекомендации
-
Использование
bcdedit
: Это встроенный в Windows инструмент, который позволяет управлять загрузочной конфигурацией операционной системы. Для изменения порядка загрузки можно использовать следующую команду:bcdedit /set {fwbootmgr} displayorder <uuid_вашего_сетевого_адаптера> /addfirst
Эта команда устанавливает ваш сетевой адаптер (PXE) первым в списке, который отображается в настройках UEFI.
-
Настройка на один раз (
bootsequence
): Если необходимо выполнить единовременную загрузку с сетевого адаптера, можно воспользоваться следующей командой:bcdedit /set {fwbootmgr} bootsequence <uuid_вашего_сетевого_адаптера>
Эта команда позволяет установить заданный сетевой адаптер как приоритетный для последующей загрузки.
-
Использование сторонних утилит: Если стандартные средства не позволяют добиться желаемого результата, вы можете рассмотреть возможность использования сторонних утилит. Например:
-
Visual BCD Editor: Этот графический инструмент позволяет более наглядно управлять параметрами Boot Configuration Data (BCD), что может быть полезно для изменения порядка загрузки.
-
Dell Command Configure: Если ваши устройства Dell, это специализированная утилита, которая позволяет конфигурировать порядок загрузки для всех клиентских систем непосредственно из Windows.
-
-
Создание скрипта: Если необходимо автоматизировать процесс, разработка PowerShell-скрипта, который будет управлять порядком загрузки, может быть полезным решением. Пример такого скрипта приведён ниже:
# Это пример скрипта, перемещающего первое устройство, не являющееся Windows Boot Manager, на первое место в порядке загрузки. # Дополнительно вы можете адаптировать его под свои нужды $bcdOutput = cmd /c bcdedit /enum "{fwbootmgr}" # Обработка и переход к следующему шагу
Учтите, что данный скрипт может потребовать доработки в зависимости от вашей конфигурации.
Заключение
Устанавливая PXE загрузку в UEFI через Windows, следует учесть, что система Windows имеет определённые ограничения по доступу к NVRAM и управлению порядком загрузки. Использование комбинаций bcdedit
, сторонних утилит и скриптов может значительно упростить эту задачу. Важно следить за тем, чтобы изменения были безопасными, и при необходимости возвращать порядок загрузки к исходным настройкам.
Эти подходы помогут вам добиться необходимого контроля над процессом загрузки системы и настроить его в соответствии с вашими требованиями.