Запуск Windows Server 2012R2 из VHDX файла с USB диска через UEFI

Я решил сделать дисковый массив на платформе Intel Atom D410PT (подробные характеристики тут). Это материнская плата с пассивным охлаждением процессора, два слота памяти (максимум 4Gb), один слот PCI (который я использовал для контроллера SATA SiliconImage 3512 - 2x1.5Gb/s), 2 SATA (3.0Gb/s) разъема, LAN 100mb/s, и многочисленными USB 2.0 портами (в том числе и на самой материнской плате).

Теперь немного о "железе". Сама плата поместилась легко в корпус NaviPower PIX-1001 230W:

Перво-наперво был убран DVD-Rom, и поставлена максимальная память (4Gb), далее была найдена имитация корзинки для жестких дисков (снят со старого компьютера древних лет), и туда с некоторой доработкой напильником были втиснуты 4 жестких диска по 2Тб.

После этого я установил PCI SATA контроллер SiliconImage 3512, и подключил все диски на блок питания. Теоретически этого должно было хватить для питания системы с 4 дисками, но сильно впритык. Так что я оставил систему включенной и занялся другими делами. Буквально через несколько часов штатный блок питания сломался. Не хватило мощей. Тогда пришлось найти новый блок питания, лучше прежнего. Им оказался Zalman ZM-400LE (характеристики тут). Этот блок питания оказался идеальным и недорогим решением моей проблемы. 400Вт более чем достаточно для такого файлового сервера, как у меня. Тем более, что он очень экономный и практически бесшумный.

Осталась единственная проблема - крепеж блока питания к корпусу. Тут помогла дрель и шуруповёрт. В итоге получилась такая конструкция (красными точками я пометил конструктивные изменения корпуса):

Также для повышения надежности крепления, я приделал блок питания с другой стороны парочкой проводов (чтобы хвост не болтался).

Для уменьшения занимаемого места и улучшения проветриваемости корпуса, пришлось отрезать лишние кабели на блоке питания. Оставил только самое необходимое.

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

На дно корпуса положил радиатор, чтобы лучше охлаждать диски и было место для прокладки SATA кабелей. Подключил USB разъем на материнскую плату, чтобы можно было оставить USB диск внутри корпуса. Получилось достаточно солидно. Для удобства вытаскивания корзинки с дисками, я приделал ручку из проволоки:

Соответственно, т.к. было решено использовать 4 диска для создания RAID5 массива, то логично вырисовалось решение вынести операционную систему на внешний USB носитель (в моем случае USB HDD Seagate Freeagent GoFlex). Так как установка и настройка системы "с нуля" является зачастую долгим и кропотливым занятием, то я решил что система будет лежать на внешнем диске в контейнере VHDX, а так как материнка поддерживает UEFI, то соответственно и загрузка должна идти используя UEFI.

Я решил сделать так: вначале установить систему как обычно на SATA диск, а затем перенести ее в контейнер VHDX и затем на внешний носитель USB HDD.

Установку системы пропущу, т.к. это банальная операция, не требующая особых знаний.

Важное дополнение: перед переносом системы на внешний диск, надо обязательно отключить файл подкачки и систему гибернации!

Далее требуется перенести систему в VHDX контейнер. Для этого была скачана программа Disk2VHD 2.01 (подробнее тут). Интерфейс ее примитивен. Нужно только выбрать диск для переноса, файл VHDX и запустить процесс.

После этого на рабочей системе (можно на Windows 7 x64, но тогда будут проблемы с работой с VHDX. Лучше брать Windows Server 2012 или Windows 8 x64), надо подготовить USB диск к загрузке. В общих словах надо очистить диск от информации, создать 2 раздела, один из которых будет EFI (fat32, 300Mb, 4kb), а второй будет основной (NTFS, 1Tb, 64kb) для размещения нашего VHDX контейнера.

Подключаем диск к компьютеру, запускаем diskpart.exe.

Смотрим список дисков:

DISKPART> list disk

Диск ### Состояние Размер Свободно Дин GPT

-------- ------------- ------- ------- --- ---

Диск 0 В сети 1863 Gбайт 1024 Kбайт

Диск 1 В сети 931 Gбайт 0 байт

Диск 2 В сети 931 Gбайт 0 байт *

* Диск 3 В сети 1397 Gбайт 0 байт *

Диск 5 В сети 931 Gбайт 0 байт *

Выбираем диск, с которым будем работать. Обычно это делается по размеру.

Внимание! если ошибетесь, то можете полностью стереть систему и данные с компьютеа

DISKPART> select disk 3

Выбран диск 3.

Далее надо очистить диск от всей информации:

DISKPART> clean

DiskPart: очистка диска выполнена успешно.

Далее конвертируем диск в GPT диск:

DISKPART> convert gpt

DiskPart: выбранный диск успешно преобразован к формату GPT.

Далее создаем первый раздел, где будет храниться EFI загрузчик. Мы его будем делать размером в 300мб, и размером страйпа 4kb (обычно надо тестировать, какой размер страйпа будет быстрее работать, но я делаю страйпы максимально большие, т.к. размеры файлов в наше время обычно больше 4 или даже 64 кбайт.):

DISKPART> create partition efi size=300

DiskPart: указанный раздел успешно создан.

Теперь его надо отформатировать в формате FAT32 (только такой формат поддерживает технология UEFI):

DISKPART> format fs=fat32 quick unit=4k

Завершено (в процентах): 100

Программа DiskPart успешно отформатировала том.

Теперь надо присвоить этому разделу букву диска, чтобы работать с ним (в нашем случае это будет буква Y):

DISKPART> assign letter=y

DiskPart: назначение имени диска или точки подключения выполнено успешно.

Теперь надо разметить оставшуюся часть диска, где будет лежать файл rayserv.vhdx. Для начала создадим раздел:

DISKPART> create partition primary

DiskPart: указанный раздел успешно создан.

Теперь отформатируем его в NTFS с размером страйпа в 64kb:

DISKPART> format fs=ntfs quick unit=64k

Завершено (в процентах): 100

Программа DiskPart успешно отформатировала том.

Теперь присвоим разделу букву Z:

DISKPART> assign letter=z

DiskPart: назначение имени диска или точки подключения выполнено успешно.

Теперь можно закрывать diskpart.exe:

DISKPART> exit

Завершение работы DiskPart...

Теперь можно копировать rayserv.vhdx на диск Z.

Дальше надо произвести некоторые подготовительные действия. Надо подключить виртуальный диск к системе.

В данном случае на экране видно, что т.к. я работаю в Windows 7 x64, то соответственно моя система не поддерживает работу с файлами VHDX. Поэтому я заранее сделал не один файл-образ системы в VHDX, а два одинаковых образа системы, только один в формат VHD, а другой - VHDX. В текущий момент файл VHD лежит на диске D:, а файл VHDX уже лежит на USB диске с буквой Z:. Диск подключаем под буквой H:.

Теперь надо сделать EFI раздел загрузочным.

Скачиваем файл bootsect.exe на диск D: из аттача внизу страницы, или берем тут. Запускаем с параметрами:

D:\>bootsect.exe /nt60 y: /force

Target volumes will be updated with BOOTMGR compatible bootcode.

Y: (\Device\HarddiskVolume53)

Successfully updated FAT32 filesystem bootcode.

Bootcode was successfully updated on all targeted volumes.

Для того, чтобы скопировать загрузочные файлы на раздел EFI, заходим в папку H:\Windows\System32 и запускаем команду:

H:\Windows\System32>bcdboot.exe H:\Windows /s Y: /f uefi

Boot files successfully created.

Теперь надо создать указать системе, что грузиться надо с VHDX файла. Для этого из папки H:\Windows\System32 запускаем:

H:\Windows\System32>bcdedit /store Y:\EFI\Microsoft\Boot\BCD /copy {default} /d "vhd boot (locate)"

The entry was successfully copied to {64d49e0f-ba36-11e3-8de2-1c6f653f47df}.

Ключ /store указывает путь, с каким файлом BCD нам надо работать.

Полученный код {64d49e0f-ba36-11e3-8de2-1c6f653f47df} запоминаем, или копируем с экрана.

Этой командой мы скопировали запись для загрузки по-умолчанию, и назвали ее "vhd boot (locate)".

Теперь присвоим этому номеру номер по-умолчанию:

H:\Windows\System32>bcdedit /store Y:\EFI\Microsoft\Boot\BCD /default {64d49e0f-ba36-11e3-8de2-1c6f653f47df}

Операция успешно завершена.

Теперь надо системе для этой записи указать, что грузиться надо с определенного диска и определенного файла.

H:\Windows\System32>bcdedit /store Y:\EFI\Microsoft\Boot\BCD /set {default} device vhd=[locate]\rayserv.vhdx

Операция успешно завершена.

H:\Windows\System32>bcdedit /store Y:\EFI\Microsoft\Boot\BCD /set {default} osdevice vhd=[locate]\rayserv.vhdx

Операция успешно завершена.

Кстати, параметр [locate] очень полезен. Он говорит операционной системе, что при загрузке файл надо искать на всех дисках по-порядку.

Теперь надо включить автоопределение устройств при загрузку (это требуется для некоторых систем).

H:\Windows\System32>bcdedit /store Y:\EFI\Microsoft\Boot\BCD /set {default} detecthal on

Операция успешно завершена.

И напоследок надо отключить автозапуск консоли восстановления в случае проблем:

H:\Windows\System32>bcdedit /store Y:\EFI\Microsoft\Boot\BCD /set {default} bootstatuspolicy ignoreallfailures

Операция успешно завершена.

Отключаем виртуальный диск от системы:

Практически готово. Теперь на конечной системе надо отключить все диски, кроме нашего, и включить UEFI загрузку в BIOS для USB носителей. Также возможно надо увеличить таймаут поиска USB устройств, т.к. с холодного запуска система может не увидеть внешний жесткий диск.

После этого загружаемся с USB диска. При первой загрузке сервер у меня не запустился. Пришлось нажать F8 и выбрать безопасную загрузку. Тут сервер заработал, и после перезагрузки все стало работать как надо. Осталось только убрать таймаут в меню загрузки и все будет готово. Это можно на запущенной системе сделать через утилиту msconfig.