10 авг. 2021 г.

Установка Windows Server 2019 на программный RAID-1

Что делать, если нужно поставить ОС на зеркало, но чипсетного программного RAID нет, а установить дополнительный дополнительный контроллер не позволяет бюджет? В данной статье мы рассмотрим процедуру организации загрузки Windows Server 2019 с программного зеркала, а так же особенности восстановления.

Стоит заранее оговориться, что такая конфигурация хоть и позволяет немного сэкономить на контроллере, повысив отказоустойчивость в сравнении с установкой ОС на одиночный накопитель, но в итоге из-за человеческого фактора может привести к снижению отказоустойчивости из-за роста вероятности допустить ошибку.

В Windows есть два механизма создания программных массивов — на основе динамических дисков и на основе Storage Spaces. При этом только первый из них позволяет зеркалировать раздел с системой. Краткое описание процедуры при загрузке через UEFI:

  1. Установить ОС на одиночный диск.
  2. Создать на втором диске идентичные разделы.
  3. Преобразовать оба диска в динамические.
  4. Зазеркалировать системный раздел первого диска на второй диск.
  5. Обеспечить возможность загрузки с любого из дисков — настроить дополнительный пункт в загрузочном меню и скопировать конфигурацию бутменеджера, т. е. по сути скопировать содержимое EFI-раздела с первого диска на второй.
Устанавливать будем Windows Server 2019 Standard с GUI, так как всё описанное ниже подходит и для Windows 10.
На пустом диске инсталлятор автоматически создаст дополнительный раздел восстановления размером 500 МБ в начале диска. Нам он не нужен, поэтому после запуска инсталлятора запускаем консоль через Shift-F10, запускаем diskpart, создаём три раздела:
  • EFI 260 МиБ
  • MSR 16 МиБ
  • системный раздел — в данном случае, для примера, на всё оставшееся пространство

После установки увидим в disk manager'е следующую картину:

Запускаем diskpart (примечание: diskpart понимает сокращённые названия команд) и смотрим таблицу разделов на диске 0:
DISKPART> sel dis 0

Disk 0 is now the selected disk.

DISKPART> lis par

  Partition ###  Type              Size     Offset
  -------------  ----------------  -------  -------
  Partition 1    System             260 MB  1024 KB
  Partition 2    Reserved            16 MB   261 MB
  Partition 3    Primary             99 GB   277 MB
Выберем диск 1 и инициализируем его (создадим таблицу разделов GPT). При этом будет автоматически создан раздел MSR размером 15 МиБ, который мы удалим, используя дополнительный параметр override:
DISKPART> con gpt

DiskPart successfully converted the selected disk to GPT format.

DISKPART> lis par

  Partition ###  Type              Size     Offset
  -------------  ----------------  -------  -------
  Partition 1    Reserved            15 MB    17 KB
  
DISKPART> sel par 1

Partition 1 is now the selected partition.

DISKPART> delete par override

DiskPart successfully deleted the selected partition.
Создаём те же разделы, что и на диске 0:
DISKPART> crea par efi size=260

DiskPart succeeded in creating the specified partition.

DISKPART> crea par msr size=16

DiskPart succeeded in creating the specified partition.

не создавать!: DISKPART> crea par pri

DiskPart succeeded in creating the specified partition.

DISKPART> lis par

  Partition ###  Type              Size     Offset
  -------------  ----------------  -------  -------
  Partition 1    System             260 MB  1024 KB
  Partition 2    Reserved            16 MB   261 MB
* Partition 3    Primary             99 GB   277 MB
Преобразуем оба диска в динамические:
DISKPART> sel dis 0

Disk 0 is now the selected disk.

DISKPART> con dyn

DiskPart successfully converted the selected disk to dynamic format.

DISKPART> sel dis 1

Disk 1 is now the selected disk.

DISKPART> con dyn

DiskPart successfully converted the selected disk to dynamic format.
Зеркалируем системный раздел. В данном случае он смонтирован на C:
DISKPART> sel vol C

Volume 3 is the selected volume.

DISKPART> add disk=1

DiskPart succeeded in adding a mirror to the volume.
Начнётся процесс синхронизации зеркала:

Перейдём к дублированию загрузчика. Загрузчик сейчас находится на разделе EFI на диска 0. Аналогичный раздел на диске 1 пуст. Отформатируем его в FAT, назначим букву S (secondary), а разделу EFI на диске 0 — букву P (primary):
DISKPART> sel dis 1

Disk 1 is now the selected disk.

DISKPART> lis dis

  Disk ###  Status         Size     Free     Dyn  Gpt
  --------  -------------  -------  -------  ---  ---
  Disk 0    Online          100 GB      0 B   *    *
* Disk 1    Online          100 GB      0 B   *    *

DISKPART> lis par

  Partition ###  Type              Size     Offset
  -------------  ----------------  -------  -------
  Partition 1    System             260 MB  1024 KB
  Partition 4    Dynamic Reserved  1024 KB   261 MB
  Partition 2    Reserved            15 MB   262 MB
  Partition 3    Dynamic Data        99 GB   277 MB
  Partition 5    Dynamic Data      1007 KB    99 GB

DISKPART> sel par 1

Partition 1 is now the selected partition.

DISKPART> assign letter = S

DiskPart successfully assigned the drive letter or mount point.

DISKPART> format fs=FAT32 quick

  100 percent completed

DiskPart successfully formatted the volume.

DISKPART> sel dis 0

Disk 0 is now the selected disk.

DISKPART> lis par

  Partition ###  Type              Size     Offset
  -------------  ----------------  -------  -------
  Partition 1    System             260 MB  1024 KB
  Partition 4    Dynamic Reserved  1024 KB   261 MB
  Partition 2    Reserved            15 MB   262 MB
  Partition 3    Dynamic Data        99 GB   277 MB
  Partition 5    Dynamic Data      1007 KB    99 GB

DISKPART> sel par 1

Partition 1 is now the selected partition.

DISKPART> assign letter=P

DiskPart successfully assigned the drive letter or mount point.
Посмотрим на конфигурацию загрузчика. Примечание: запуск bcdedit с некоторыми параметрами в консоли PowerShell приводит к ошибкам, поэтому для работы с bcdedit следует запустить cmd.
bcdedit /enum

Windows Boot Manager
--------------------
identifier              {bootmgr}
device                  partition=P:
path                    \EFI\Microsoft\Boot\bootmgfw.efi
description             Windows Boot Manager
locale                  en-US
inherit                 {globalsettings}
bootshutdowndisabled    Yes
default                 {current}
resumeobject            {4e02bc8d-f967-11eb-bb60-dc5f81ee32a9}
displayorder            {current}
                        {4e02bc92-f967-11eb-bb60-dc5f81ee32a9}
toolsdisplayorder       {memdiag}
timeout                 30

Windows Boot Loader
-------------------
identifier              {current}
device                  partition=C:
path                    \Windows\system32\winload.efi
description             Windows Server
locale                  en-US
inherit                 {bootloadersettings}
recoverysequence        {4e02bc8f-f967-11eb-bb60-dc5f81ee32a9}
displaymessageoverride  Recovery
recoveryenabled         Yes
isolatedcontext         Yes
allowedinmemorysettings 0x15000075
osdevice                partition=C:
systemroot              \Windows
resumeobject            {4e02bc8d-f967-11eb-bb60-dc5f81ee32a9}
nx                      OptOut

Windows Boot Loader
-------------------
identifier              {4e02bc92-f967-11eb-bb60-dc5f81ee32a9}
device                  partition=C:
path                    \Windows\system32\winload.efi
description             Windows Server - secondary plex
locale                  en-US
inherit                 {bootloadersettings}
recoverysequence        {4e02bc8f-f967-11eb-bb60-dc5f81ee32a9}
displaymessageoverride  Recovery
recoveryenabled         Yes
isolatedcontext         Yes
allowedinmemorysettings 0x15000075
osdevice                partition=C:
systemroot              \Windows
resumeobject            {4e02bc8d-f967-11eb-bb60-dc5f81ee32a9}
nx                      OptOut
Когда мы зеркалировали системный раздел, то ОС автоматически добавила дополнительный пункт загрузки Windows Server - secondary plex. Теперь осталось скопировать всю конфигурацию загрузчика на раздел EFI диска 1. Для этого сначала создадим дубль конфигурации, получим его GUID, который затем используем, чтобы изменить букву раздела с P на S:
bcdedit /copy {bootmgr} /d "Windows Boot Manager Cloned"
The entry was successfully copied to {4e02bc94-f967-11eb-bb60-dc5f81ee32a9}.

bcdedit /set {4e02bc94-f967-11eb-bb60-dc5f81ee32a9} device partition=s:
Теперь экспортируем конфигурацию в BCD2, скопируем всё содержимое EFI-раздела на диске 0 (раздел P) на диск 1 (раздел S). Потом переименуем его на разделе S из BCD2 в BCD:
P:
bcdedit /export P:\EFI\Microsoft\Boot\BCD2
robocopy p:\ s:\ /e /r:0
Rename s:\EFI\Microsoft\Boot\BCD2 BCD
Del P:\EFI\Microsoft\Boot\BCD2
Перезагрузимся и заглянем в BIOS:

Помимо основного пункта (Windows Boot Manager), созданного при установке ОС, у нас теперь появился пункт Windows Boot Manager Cloned для загрузки со второго диска.

Временное отключение одного из дисков

Проверим конфигурацию в действии, отключив диск 0. Пункт Windows Boot Manager ничего не загрузит, воспользуемся Windows Boot Manager Cloned (или запустим boot manager через EFI Shell). Boot manager отобразит те же два пункта с загрузчиками. Первый запустить не получится, используем второй — Windows Server - secondary plex.

ОС загружается. Диск 1 теперь стал диском 0, система сообщает о потере отказоустойчивости на зеркальном томе сообщает и о потере соответствующего диска.


Допустим, что диск исправен, его просто случайно отключили, а потом вставили обратно. Тут нас подстерегает первая опасность — нужно помнить про то, что состояние системы при загрузке с этого диска будет неактуальным и выбрать пункт «Windows Server - secondary plex». После загрузки ОС мы увидим, что зеркало развалилось:

Для восстановления отказоустойчивости нужно удалить неиспользуемый раздел (в данном случае том E) и заново сделать зеркало тома C:
sel vol C
add disk=0

Замена диска на новый

Другой, более вероятный сценарий — первый диск вышел из строя, и мы заменили его на новый. В этом случае нужно повторить процедуру, выполненную после установки системы. Добавляется два нюанса:
Желательно иметь под рукой размеры разделов до преобразования дисков в динамические, чтобы не пришлось вычислять заново правильный размер раздела MSR.
Придётся править загрузчик, удалив исправив пункт, ссылающийся на уже недоступный раздел. В данном примере это {default}, так как мы заменили первый диск:
bcdedit /enum

Windows Boot Manager
--------------------
identifier              {bootmgr}
device                  unknown
path                    \EFI\Microsoft\Boot\bootmgfw.efi
description             Windows Boot Manager
locale                  en-US
inherit                 {globalsettings}
bootshutdowndisabled    Yes
default                 {default}
resumeobject            {4e02bc8d-f967-11eb-bb60-dc5f81ee32a9}
displayorder            {default}
                        {current}
                        {3df44507-f920-11eb-9dd3-080027bb0bb1}
toolsdisplayorder       {memdiag}
timeout                 30

Windows Boot Loader
-------------------
identifier              {default}
device                  unknown
path                    \Windows\system32\winload.efi
description             Windows Server
locale                  en-US
inherit                 {bootloadersettings}
recoverysequence        {4e02bc8f-f967-11eb-bb60-dc5f81ee32a9}
displaymessageoverride  Recovery
recoveryenabled         Yes
isolatedcontext         Yes
allowedinmemorysettings 0x15000075
osdevice                unknown
systemroot              \Windows
resumeobject            {4e02bc8d-f967-11eb-bb60-dc5f81ee32a9}
nx                      OptOut

Windows Boot Loader
-------------------
identifier              {current}
device                  partition=C:
path                    \Windows\system32\winload.efi
description             Windows Server - secondary plex
locale                  en-US
inherit                 {bootloadersettings}
recoverysequence        {4e02bc8f-f967-11eb-bb60-dc5f81ee32a9}
displaymessageoverride  Recovery
recoveryenabled         Yes
isolatedcontext         Yes
allowedinmemorysettings 0x15000075
osdevice                partition=C:
systemroot              \Windows
resumeobject            {4e02bc8d-f967-11eb-bb60-dc5f81ee32a9}
nx                      OptOut

Windows Boot Loader
-------------------
identifier              {3df44507-f920-11eb-9dd3-080027bb0bb1}
device                  partition=C:
path                    \Windows\system32\winload.efi
description             Windows Server - secondary plex - secondary plex
locale                  en-US
inherit                 {bootloadersettings}
recoverysequence        {4e02bc8f-f967-11eb-bb60-dc5f81ee32a9}
displaymessageoverride  Recovery
recoveryenabled         Yes
isolatedcontext         Yes
allowedinmemorysettings 0x15000075
osdevice                partition=C:
systemroot              \Windows
resumeobject            {4e02bc8d-f967-11eb-bb60-dc5f81ee32a9}
nx                      OptOut
The system cannot find the file specified.

**********
bcdedit /delete {default}
bcdedit /set {bootmgr} device partition=p:
Затем можно продолжить процедуру — скопировать раздел EFI.

Заключение

Механизм загрузки Windows с программного зеркала достаточно хорошо отработан. Практически он не менялся со времён выхода Windows Server 2008. Как видите, поддержание работоспособности требует большего количества действий и понимания работы загрузчика — на любом этапе можно ошибиться и потерять если не данные, то ценное время.

Следующая статья будет посвящена установке и настройке Linux на программном RAID-1.

2 комментария:

  1. Здравствуйте
    "Придётся править загрузчик, удалив исправив пункт, ссылающийся на уже недоступный раздел. В данном примере это {default}, так как мы заменили первый диск".
    Можете расписать как это сделать? Завис на этом моменте. Когда копирую EFI на новый вставленный диск, говорит: "Не удается найти указанный файл"

    ОтветитьУдалить
    Ответы
    1. Добрый день.
      Смутно помню, там нужно GUID'ы сравнивать. На этой неделе воспроизведу ещё раз всё это в ВМ

      Удалить