Появляется такая задача не часто, но все-же, нужно преобразовать уже установленную систему, загружаемую в BIOS (или UEFI режиме) в UEFI режим (в BIOS соответственно).
Кому интересно, читаем далее:

К счастью, Windows 7 и старше, изначально готовы грузится в любом из режимов, нужно только изменить структуру разделов и загрузчик.
Для этого нам понадобится:
  • Установочный диск с Windows (или любой другой рабочий установочный носитель).
  • systemrescuecd
  • Новый диск, на который мы будем мигрировать (конвертацией займетесь сами, если диска нет)


Загрузимся с systemrescuecd и просмотрим наши диски:
fdisk -l

fdisk -l


У вас ситуация может немного отличаться, в моем случае, /dev/sda это исходный диск, а /dev/sdb на который будем переносить систему.
Начнем создавать разделы (используем gdisk для разметки в gpt, а fdisk для mbr):
gdisk /dev/sdb

Создание разделов в gdisk






Немного сожмем нашу исходную ФС на разделе /dev/sda2 (чтобы она точно влезла в новый раздел).
ntfsresize -s 126G -f /dev/sda2

Клонируем раздел, и расширяем его на все доступное пространство:
partclone.ntfs -b -I -s /dev/sda2 -o /dev/sdb4
ntfsresize -f /dev/sdb4

Теперь загрузимся с Windows установочного носителя в режиме UEFI, выберем восстановление системы, и запустим командную строку.
Утилита diskpart нам поможет найти наши диски:
diskpart


Будьте внимательны, выбрав не тот диск, можно сделать очень больно и обидно.
В моем случае, новый диск имеет цифру 1. Его выбираем, выбираем второй раздел и форматируем его в FAT32 (для системного раздела UEFI), в конце назначаем ему букву диска S:
format quick fs=fat32 label="EFI"
assign letter="S"

Сложнее с разделами, куда установлена Windows. После клонирования, метки тома у них одинаковые (можно было и в Linux их поменять). Но нам опять поможет diskpart, мы просто выберем том, и посмотрим его детальные параметры.
Выбираем диск с копией Windows


Интересный нам раздел с буквой E, на него нужно установить загрузочные файлы:
bcdboot E:\Windows /s s: /f UEFI

Затем, проверим, что конфигурация загрузчика верна, и если это не так, пропишем правильные данные (в моем случае, загрузка указывала на неверный том, и я его переопределил, в примере идентификатор, начинающийся на 586).
Корректировка BCD



Вот и все, после перезапуска, система должна загрузиться.

Из UEFI в BIOS


В обратную сторону все примерно также (помним про типы разметки), но нужно создать один загрузочный раздел с NTFS (метров 100) и раздел для самой системы. Сделать активным загрузочный раздел, а затем установить на него загрузчик и загрузочную информацию (загрузочный раздел у нас с буквой S):
bcdboot E:\Windows /s s: /f BIOS
bootsect /nt60 s: /mbr

Дальше правим загрузочную конфигурацию, и все.

Комментарии (31)


  1. a553
    24.02.2016 21:57

    Вместо systemrescuecd можно использовать любую другую утилиту для клонирования разделов. Я использовал AOMEI backupper.


    1. creker
      24.02.2016 22:09
      +1

      Если я правильно понял, то AOMEI сможет вообще все сам сделать. Сам переводил windows server с MBR на GPT. Делается в один клик на живой системе


  1. lovecraft
    24.02.2016 22:00

    Bootrec /RebuildBcd сможет автоматом скорректировать загрузочную запись?


    1. MagicGTS
      24.02.2016 22:26
      +3

      Как правило, может. Но не редки ситуации, когда он запарывает BCD совсем.
      С учетом не высокой сложности задачи, предпочитаю делать руками, контролируя все этапы.


  1. tehnolog
    24.02.2016 22:27
    +1

    Прошу прощения за глупый вопрос не по теме. Я слышал об UEFI лет 6-7 назад и говорил своим товарищам, что он в будущем заменит биос. На меня тогда смотрели как на чудака. А как с этим обстоит дело сейчас? Я отошел от железок и не в курсе, насколько широко представлена эта технология на новых компьютерах?


    1. MagicGTS
      24.02.2016 22:42
      +2

      Распространяется в добровольно-принудительном порядке. Я бы не сказал, что UEFI невероятно лучше, чем BIOS. Задумка хорошая, а вот с реализацией не все гладко (тут, на Хабре, один товарищь очерь подробно разобрал многие проблемы)


      1. MTonly
        24.02.2016 23:15

        Есть ли в UEFI возможность выбора порядка приоритетов видеовыходов? (Например, чтобы из имеющихся DP, HDMI, DVI выходом по умолчанию был не DVI, а DP.) Спасибо.


        1. MagicGTS
          24.02.2016 23:19

          Все зависит от реализации самого UEFI, в каждом конкретном случае.
          Обычно этого нет. Но если сильно захотеть, можно написать efi скрипт (надо впихнуть его до загрузки вашей ОС). И уже в скрипте, выставлять нужные переменные (какие нужны, смотреть опять индивидуально).
          В целом, UEFI предоставляет возможности, схожие с *nix shell.


          1. CodeRush
            25.02.2016 00:33

            Только не сам UEFI, а его shell. Диспетчер BDS позволяет запускать пользовательские приложения вместо загрузчиков, все остальное — это уже сам UEFI Shell реализует, от UEFI там только сервисы и прямой доступ к еще не выгруженным драйверам и протоколам.


        1. CodeRush
          25.02.2016 00:30

          Если коротко, то да, но только если производитель вашей платформы предоставляет соответсвующий драйвер. В произвольной реализации UEFI — скорее всего нет.


    1. creker
      24.02.2016 22:53

      По сути, заменил. Материнки все с UEFI идут давным давно. В телефонах уже этот UEFI поселился.


      1. lostinfuture
        25.02.2016 10:46

        Как мне сказал один французский товарищ, UEFI в массы пошло в принтерах :-)


    1. CodeRush
      25.02.2016 00:31
      +1

      Только она теперь и представлена, по больше части. Исключения крайне редки — хромобуки с coreboot, да машины Apple с EFI 1.10, все остальное — UEFI 2.1+ начиная с систем на чипсете P67.


    1. kay
      25.02.2016 11:38

      Реализация UEFI сильно хромает. Видимо производители не могут осилить спецификацию http://www.uefi.org/sites/default/files/resources/UEFI%20Spec%202_6.pdf

      На хабре даже серия статей была про то какие производители рукозады. https://habrahabr.ru/post/266935/

      Например мой HP даже при включении SecureBoot позволяет грузить неподписанные ядра. :facepalm:


  1. kay
    25.02.2016 11:25

    Вот только вчера такой же вопрос опубликовал: https://toster.ru/q/295662
    Только я пытаюсь сделать это без переноса расзделов, а сразу на одном диске.


    1. MagicGTS
      25.02.2016 11:28

      Надеюсь статья вам помогла, если есть не очевидный нюанс, то я внесу его в статью.


      1. kay
        25.02.2016 11:43

        Я не был в курсе этих команд (/? про это молчал, man'ов в винде тоже нет, печаль). Попробую, вдруг получится без переноса разделов.

        bcdboot E:\Windows /s s: /f BIOS
        bootsect /nt60 s: /mbr

        P.S. Большинство туториалов на эту тему в интернете убоги и написаны школьниками. Не смог найти ни одного толкового. И часто вместо туториала предлагают просмотреть youtube видео. В 90% случаев предлагают скачать специальную графическую утилиту, да еще и платно. Мне после мира Linux это кажется дикостью :)


      1. kay
        25.02.2016 11:55
        +1

        Еще парочка дикостей (простите, накипело):

        1) Windows 7 не имеет встроенной возможности создавать загрузочную флэшку. Только запись на CD/DVD, только хардкор.
        2) Windows 8 имеет такую возможность, но всё еще нет варианта "создать образ". Например создал ISO'шник или IMG, перетащил куда надо и записал.
        3) Почему нельзя параметры загрузки заключить в текстовый файл? Почему BCD всё хранит в бинарном формате? Или я что-то не понимаю?


        1. Pugnator
          25.02.2016 12:02
          +2

          bcd это обычный файл реестра, это удобная нативная база данных, зачем им изобретать новый велосипед?


          1. kay
            25.02.2016 12:13
            +3

            Занятно… Значит в Linux его легко можно отредактировать с помощью hivexregedit. И почему так мало информации об этом. Вот что только что откопал:

            hivexregedit --export BCD '\' > BCD.reg

            И редактируй сколько душе угодно. Затем:

            hivexregedit --merge BCD BCD.reg

            Класс!


      1. kay
        25.02.2016 14:23

        Нет, не получается. Делаю следующим образом:

        Конвертирую MBR->GPT. Само собой система после этого не грузится. Но разделы в норме, можно примонтировать, всё читается (ntfs boot + ntfs windows).

        Перезагружаюсь в recovery, там делаю следующее:

        $ diskpart
        select disk 0 # тот, что с GPT
        select partition 1 # тот, что первый с NTFS boot, partition 2 это C:\Windows
        assign letter=S
        exit

        Затем:

        $ bcdboot C:\Windows /s s: /f BIOS
        Boot files successfully created
        $ bootsect /nt60 s: /mbr
        Target volumes will be updated with BOOTMGR compatible bootcode
        
        S: <\Device\HarddiskVolume1>
        
        Successfully updated NTFS filesystem bootcode
        
        \??\PhysicalDrive0
        
        Bootcode is only updated on MBR partitioned disks. A different
        partitioning scheme is used on this disk.
        Bootcode was successfully updated on all targeted volumes.

        Преезагружаюсь, результат тот же — при загрузке "Missing operating system"


        1. alexrus
          25.02.2016 15:24

          Дак неудивительно, что не получается. Раз вы мигрируете на UEFI, то команда должна быть такой:
          bcdboot E:\Windows /s s: /f UEFI

          Самом собой, имена дисков смотрите в diskpart.


          1. kay
            25.02.2016 15:53

            Да кто сказал, что я мигрирую на UEFI? Я хочу использовать раздел GPT + Legacy boot.


            1. alexrus
              25.02.2016 16:00

              Я в последнем вашем комментарии прочитал.
              «Конвертирую MBR->GPT.»

              А что касается вашего вопроса, почему вы уверены, что в легаси можно загрузиться с GPT раздела?


              1. kay
                25.02.2016 17:21

                А почему нет? При использовании grub само собой.


                1. MagicGTS
                  25.02.2016 17:50

                  Windows, при обнаружении валидной MBR (а у HybridGPT она валидная), проверять наличие gpt уже не будет.
                  Если же у он находит Protective MBR (специально сформированную заглушку, а HybridGPT кроме раздела заглушки, имеет еще и другие разделы, что не по стандарту, и соответствует валидной MBR), то ищет gpt.
                  Но это все ерунда, когда выясняется, что код загрузчика Windows, загружаясь в режиме MBR, полностью игнорит существование gpt. Естественно его не находит, и выпадает в осадок.
                  Костыль: разместить загрузочный раздел на флешке или эмулировать его в памяти (должен быть с разметкой MBR).


                  1. kay
                    25.02.2016 18:08

                    Я вот про костыль можно подробнее?


                    1. MagicGTS
                      25.02.2016 18:23

                      Сам такое не делал, но может прокатить. Идея такая:
                      GRUB4DOS умеет затягивать в память образы дисков (простые, линейные) и эмулировать из него рамдиск, который на уровне BIOS будет восприниматься вполне себе нормальным диском. А уже раз есть такой диск, который MBR, то на нем и размещайте загрузочные данные от Windows.
                      Тут только я не вполне уверен, в какой момент загружается код, умеющий работать с gpt
                      Идея растет из того, что можно грузить Windows с GPT, если раздел загрузки находится на флешке (тот самый раздел на 100 мегов). Его можно сделать по этой статье.

                      Пример для floppy с DOS
                      title MS-DOS
                      find --set-root --ignore-floppies /boot_ntfs
                      map /boot/win98.ima (fd0) 
                      map --hook 
                      chainloader (fd0)+1 
                      rootnoverify (fd0) 
                      map --floppies=1


        1. MagicGTS
          25.02.2016 15:44

          Видимо вас сбила столка концовка статьи, теперь я ее отделил, чтобы больше никого не путать.


          1. kay
            25.02.2016 15:54

            Нет, никто не смутил. Как я описал выше. Я хочу использовать GPT раздел + Legacy boot.


            1. MagicGTS
              25.02.2016 15:59

              Это называется HybridGPT. Windows такое очень "любит" и воспринимает как обычный mbr.