Перенос системы с MBR на UEFI

ff45cf5f010ba4db8136dfe6db065991

Недавно на работе возникла задача перенести рабочие места менеджеров со старых компов на новые. А человеки они такие — они привычны к своему годами выстроенному окружению. Поэтому я решил перенести систему «как есть». Благо везде 10ка, а она довольно либерально относится к таким миграциям с железки на железку, с семеркой такое не проканало бы…Вот только старые системы были установлены в MBR, а материнские платы с процами 11ого поколения MBR не очень то и поддерживают…

Если вкратце — то переносится раздел с виндой, перед ним создается EFI раздел размером в 100 МБ и MSR размером в 16… Последний оказался нужен. Для работы системы он не нужен, но вот обновления нормально на такую «перенесенную» систему без него не встанут совсем…

Будут откатываться на 95%, всякие UpdateAssitant’ы будут ругаться на то, что не могут определить возможно ли установить Windows на этот компьютер, попытки обновиться с CD — тоже.

Загружаемся в окружении восстановления, если активирован recovery в винде (если систему изначально апдейтили с семерки, как в моем случае — скорее всего — нет) или грузимся с winPE, открываем cmd и идем в diskpart

diskpart
lis dis
sel dis 0

смотрим диски в системе и выбираем тот, на котором стоит винда и нужно вкрячить загрузчик, он не обязательно будет номером 0. К примеру если система стояла на HDD, потом добавили SSD и перенесли систему на него — то скорее всего SSD будет иметь номер 1. Но в данном кейсе — перенос системы на другое железо и диск только 1 и он девственно чист — у него номер ноль

list part

Это покажет уже разделы на HDD, опять таки — диск у нас девственно чист, на нем нет ничего, делаем это чтобы, к примеру, не потереть загрузочную флешку или еще какой диск подключенный к системе

Если диск не девственно чист, или к примеру была уже сделана копия загрузочного диска — то мы увидим имеющиеся на нем разделы. В случае полного копирования системы в MBR мы увидим как минимум 2 раздела — на 500 МБ NTFS «Зарезервировано системой» и раздел с виндой.

sel part 1
del part override

Этими командами мы удаляем раздел с номером 1, тот на котором в mbr был загрузчик.

Теперь можно приступить к созданию минимальной разметки для винды

create part efi size=100
sel part 1
format quick fs=fat32 label="EFI"

создаем раздел, выбираем его (имеет смысл сделать lis part чтобы убедиться что выбран свежесозданый раздел или посмотреть его номер, вдруг не 1?) и форматируем в FAT32 с меткой EFI

Далее, по аналогии, создаем MSR, но его форматировать не нужно

create part msr size=16

Все, базовая разметка есть. Теперь переносим раздел, если диск был пуст или не переносим, если диск был склонирован и мы работали с клоном. В последнем случае между разделом MSR и виндой будет не маленький такой зазор почти в 400 МБ — разница в размере раздела EFI и MBR. Можно оставить, можно подвинуть раздел, или можно на стадии создания разметки сделать EFI и MSR пожирнее (для MSR валидны размеры в 16 и 128 МБ, лучше придерживаться этого, иначе могут возникнуть проблемы при установке обновлений, я просто ложил раздел с виндой на целевой диск уже после создания базовой разметки, так как двигать разделы ближе к началу диска — операция не многим отличная по времени при их переносе из копии)

Криво-Ручное создание загрузчика

Далее будет про то как ручками создать хранилище BCD и перенести загрузчик, но не рекомендую, пишу для себя, так как при таком создании загрузчика система снова не будет нормально обновляться… Но теперь на стадии «Проверки Компьютера» она будет ругаться на то, что ей недостаточно места, хотя места может быть хоть несколько терабайт…

lis part
sel part 1
assign letter=Z

Ищем EFI раздел, выбираем, назначаем буковку, это будет нужно для копирования EFI загрузчика

lis part
sel part 3
assign letter=C

Находим раздел с виндой, выбираем, назначем букву.
В моем случае это 3ий раздел и буква C
При работе с полной копией диска, когда удаляли MBR раздел — номер раздела может отличаться, а буква может быть уже назначена. На этом с diskpart все.

exit

Приступаем к копированию загрузчика

mkdir Z:\EFI\Microsoft\Boot
xcopy /s C:\Windows\Boot\EFI\*.* Z:\EFI\Microsoft\Boot

В современных виндах файлы EFI загрузчика существуют в системе, даже если изначально ее ставили в MBR, их мы и копируем на EFI раздел. Если их, по какой-то причине, нет, то забрать их можно с установочного диска, другой инсталяции винды. Пути будут такие же, разве что при копировании с установочного диска путь будет CD:\EFI\Microsoft\Boot, то есть такой же как и целевой путь, но с литерой установочного диска. После копирования идем в раздел куда мы их перенесли

Z:
cd EFI\Microsoft\Boot
bcdedit /createstore BCD
bcdedit /store BCD /create {bootmgr} /d "Windows Boot Manager"
bcdedit /store BCD /create /d "Windows" /application osloader

И в папке куда мы их скопировали создаем новый BCD, в BCD создаем новую EFI запись, в EFI записи — новый загрузчик винды. Последняя команда выдаст GUID созданного загрузчика. Он нам нужен, копируем. В WinPE окружении, в терминале можно просто выделить его мышью и нажать ПКМ.
Далее этот GUID в тексте будет {your-guid}, понадобиться он один раз

bcdedit /store BCD /set {bootmgr} default {your-guid}
bcdedit /store BCD /set {bootmgr} path \EFI\Microsoft\Boot\bootmgfw.efi
bcdedit /store BCD /set {bootmgr} displayorder {default}

Выставляем наш загрузчик дефолтным, указываем путь до него и выставляем в дефолт список установленных систем

bcdedit /store BCD /set {default} device partition=c:
bcdedit /store BCD /set {default} osdevice partition=c:
bcdedit /store BCD /set {default} path \Windows\System32\winload.efi
bcdrdit /store BCD /set {default} systemroot \Windows

Настраиваем собственно default — указываем букву системы, путь для загрузчика который загружается загрузчиком ;) и корень установленной системы. Если побаловаться с этими параметрами и правильно переименовать папки, сменить буковки дисков, то можно грузить винду, к примеру из папки NotANormalWin с диска W:))) Но многое может поломаться… так как множество приложений ожидает systemroot в Windows, а букву в C

Собственно можно перезагружаться. Система загрузиться, некоторые обновления встанут без проблем, но обновления что захотят что либо записать в BCD — пойдут лесом, так как он помечен как отредактированнйый ручками и автоматика с ним работать откажется…

Ручное создание загрузчика

Для начала так же присваиваем буквы разделам EFI и Windows

lis part
sel part 1
assign letter=Z
sel part 3
assign letter=C

Точно так же, разделы могут иметь другие номера, а у винды уже может быть буковка, забыл написать — посмотреть буковки можно в diskpart командой lis vol
Выходим из diskpart командой exit
Идем в EFI раздел и папку boot

Z:
cd EFI\Microsoft\Boot

Если мы криворучным способом до этого создавали BCD, то он там будет. Снимаем с него атрибуты неприкосновенности
attrib BCD -s -h -r
и либо удаляем, либо делаем бекап (уж не знаю зачем, в прочем этот метод работает и на системах, где загрузчик был, да сплыл, и в нем могут быть какие-нить хитрые записи)
ren BCD BCD.bak

Далее копируем то же и туда же, но не ручками, а с помощью виндовой утилиты

bcdboot C:\Windows /l ru-ru /s Z: /f ALL /c

Собственно перезагружаемся, должно работать, если работает, можно удалить бекап BCD, но мне обычно лень, так как нужно опять перезагружаться в WinPE…

Z:
del \EFI\Microsoft\Boot\BCD.bak

Ну и буковки с разделов можно снять…

diskpart
lis disc
sel disk 0
lis vol
lis part
sel part 1
remove letter=Z

Ищем EFI, снимаем буковку. Я точно не помню, но мне кажется, что буковка снимается сама при перезагрузке.

© Habrahabr.ru