Запуск 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.