null

Установка Windows руками на внешний диск

Люблю ли я устанавливать Windows? Нет. Однако часто приходится. И проблемы, с которыми я сталкиваюсь, исходят из нестандартных конфигураций. Если всё делать по умолчанию, вЕнда ставится легко и красиво. Вам даже необязательно знать, что у операционной системы есть загрузчик. Но стоит сделать шаг в сторону - инсталлятор начинает ныть: "у меня нет драйвера", "я не вижу дисков", "у тебя неподдерживаемое оборудование" и т. д. Причём в 95% случаев текст ошибки вообще не соотносится с проблемой. В моём нынешнем случае, графический инсталлятор вообще не предлагал ни единого устройства куда бы можно было поставить Windows, но прекрасно их видел и предлагал поискать на их файловых системах драйверы. Волей-неволей приходится разбираться и делать всё самому.

Немного о конфигурации.

  • Чего я иметь: одна машина с единственным диском, загрузкой в режиме UEFI, linux на борту; внешний диск.
  • Чего я хотеть: поставить Windows 10 на внешний диск, иметь возможность с него загрузиться.

Это не будет Live система, просто вЕнда для одной конкретной машины, но на внешнем носителе. Еще мне понадобится установочная флешка. Создать её можно простым способом:

dd if=path/to/win-image.iso of=/dev/sdb bs=64M status=progress #где /dev/sdb - это флешка.

В этом случае получится с неё загрузиться, но не получиться её смонтировать, чтобы получить доступ к файлу install.wim что в нашем случае критически важно. Поэтому можно предварительно скопировать файл sources/install.wim из iso-образа на ещё один носитель, либо подготовить флешку способом от моего коллеги.
Следующий шаг - разметить диск в соответствии с докой от microsoft. Обычно я использую для этого gdisk, но сейчас приведу пример конфигурации в diskpart. Загружаемся с флешки, подтверждаем языковые настройки, выбираем Repair Your computer, Troubleshoot и затем Command Prompt.
Запускаем diskpart и выполняем следующее:

REM вывести список дисков и выбрать нужный (в моём случае второй)
list disk
select disk 2
REM обнулить конфигурацию, записать GPT-метку на диск
clean
convert gpt
REM создать ESP раздел, назначить букву E, форматировать в fat
create partition efi size=256
assign letter=E
format fs=fat label=ESP quick
REM создать MSR раздел (не нуждается в монтировании/форматировании)
create partition msr size=16
REM создать раздел под Windows, назначить букву D, форматировать в ntfs
create partition primary
assign letter=D
format fs=ntfs label=WIN10 quick

Ок, диск готов. Выводим список разделов и выходим из diskpart:

list volume

Volume ###  Ltr  Label        Fs     Type        Size     Status     Info
----------  ---  -----------  -----  ----------  -------  ---------  --------
Volume 0     C                RAW    Removable   7552 MB  Healthy
Volume 1     D   WIN10        NTFS   Partition    128 MB  Healthy
Volume 3     E   ESP          FAT32  Partition    256 MB  Healthy    Hidden

exit

Ориентируемся в разделах:
D: - раздел ОС, сюда ляжет директория Windows
E: - ESP (EFI System Partition), сюда лягут файлы загрузчика.
C: - флешка

Теперь нужно найти архив с образами для установки. Он лежит по адресу C:\Sources\install.wim Внутри архива образов несколько, поэтому сначала выводим их список:

dism /Get-WimInfo /WimFile:C:\Sources\install.wim
... (часть вывода опущена)
Index : 5
Name : Windows 10 Pro
Description : Windows 10 Pro
Size : 14,275,707,207 bytes
...


Глазками находим нужный образ (в моём случае 5), и используем его индекс чтобы распаковать на раздел ОС:

dism /Apply-Image /ImageFile:install.wim /Index:5 /ApplyDir:D:\

Теперь остаётся загрузчик. Можно сразу перейти к следующему незелёному пункту, т.к. здесь автор просто решил излить собственное негодование (Прим. автора).
Раньше я руками копировал нужные файлы:

E:
mkdir efi\microsoft
cd efi\microsoft
robocopy D:\Windows\Boot\EFI boot /E
robocopy D:\Windows\Boot\Fonts boot\fonts /E

И использовал bcdedit для создания файла конфигурации загрузчика. Но тут я встретил следующую проблему. Забегая вперёд, bcdedit находит загрузочный раздел по его типу, подразумевая что он в компьютере один. У меня диска два, EFI раздела тоже два, что повлекло следующий диалог:
bcdedit: Не могу однозначно определить загрузочный раздел.
Я: Серьёзно? Ну тогда дай мне выбрать.
bcdedit: Нет.
Я: ... (фейспалм, валерьянка, гугл)
Поэтому я ненавижу implicit конфигурации. Впрочем, решение нашлось быстро, нужно всего лишь "замаскировать" прочие EFI-разделы, временно изменив их ID в том же самом diskpart:

select disk 0
select partition 1
detail partition

На что должны увидеть тип партиции за которой и цепляется diskpart:
Partition 1
Type : c12a7328-f81f-11d2-ba4b-00a0c93ec93b
...

Изменяем последний байт:
set id=c12a7328-f81f-11d2-ba4b-00a0c93ec930
Дальше есть замечательная статья с одной лишь поправкой: Для UEFI системы вторичным загрузчиком должен быть winload.efi (а не .exe), т.е. соответствующая строчка конфига преобразуется так:
bcdedit /set {default} path \Windows\System32\winload.efi

Остаётся поменять partiton type нужного раздела обратно и добавить загрузчик \efi\microsoft\boot\bootmgfw.efi в меню загрузки нашей машинки.
Всё было так, пока я не узнал про bcdboot.

bcdboot помимо прочего умеет:

  • использовать тот загрузочный раздел, который ему укажут
  • копировать нужные файлы на загрузочный раздел
  • создавать файл конфигурации BCD
  • добавлять соответствующую запись в NVRAM машинки (т.е. добавлять Windows в загрузочное меню)

То, что надо!
Следует заметить, что если явно указать утилите загрузочный раздел (ключ /s <буква_раздела>) , она положит загрузчик в виде файла \efi\boot\bootx64.efi , который по умолчанию ожидает увидеть firmware компьютера и будет его исполнять. Загрузочная запись в таком случае в NVRAM добавлена не будет (во всяком случае не должна, но у меня всё равно добавилась ¯\_(ツ)_/¯)
Итак, я выполняю следующую команду:

bcdboot D:\Windows /s E:

Остаётся перезагрузиться с внешнего диска и лицезреть работу sysprep. Дальнейшие действия (включая создание пользователя и прочие начальные настройки) от обычной установки никак не отличаются.