Ручна установка Windows 7/8/8.1/10 в систему з завантажувача GRUB2

Напевно майже у кожного користувача ОС Linux і Windows, а я маю на увазі саме тих, у кого, в силу ряду причин, встановлені обидві системи, час від часу виникало питання: «А чи не можна, чорт візьми, придумати спосіб, з допомогою якого можна було б встановлювати ці системи в довільному порядку? Без псування налаштувань завантажувача?» Адже якщо ставимо спочатку Windows а потім Linux все добре — линуксовый завантажувач (наприклад GRUB) зазвичай підхоплює bootmgr. Якщо ставити в зворотному порядку то на жаль. Навіть з використанням GPT + EFI. У випадку з EFI немає небезпеки перезапису MBR, зате таки є один нюанс, який особисто мені не подобається — інсталятор Windows в режимі EFI хоч і не перезаписує сектора диска своїм кодом, але зате перевизначає NVRAM, підсовуючи туди шлях до свого завантажувачу. Так що функціонал GBUB все одно доводиться відновлювати. У налаштуваннях штатного установника немає опцій для кастомізації процесу установки завантажувача. А що якщо… не використовувати стандартний інсталятор?! Ну, або майже не використовувати…



І такий спосіб є. І він заснований на технології установки Windows, яку ми маємо в її дистрибутивах починаючи з «сімки». Спосіб працює для випадку Windows версій 7/8/8.1/10, як у випадку з MBR + BIOS системи, так у випадку з EFI + GPT. Встановити систему можна як в розділ HDD, так і на VHD. При цьому функціонал установника потрібен нам взагалі-то для запуску програми установки BCD-сховища конфігурації завантажувача. Замість інсталяційного диска можна використовувати завантажувальний носій на основі WinPE. Якби утилітам bcdedit.exe і BootICE була *nix альтернатива, весь процес розгортання системи можна було б взагалі виконати в середовищі Linux.



Припустимо, у вас є комп'ютер з встановленим на HDD завантажувача GRUB2 і вільним розділом, відформатованому в NTFS. Встановлювати будемо Windows 7 Ultimate SP1. Для цього будуть потрібні:

  1. Інсталяційний диск з віндою
  2. Чистий флешка об'ємом >= 4 Gb
  3. Архіватор 7-zip відповідної розрядності
  4. Утиліта BootICE, бажана, але зовсім не обов'язкова, можна обійтися і bcdedit.exe, що входять в дистрибутив вінди


1. Створюємо завантажувальну флешку

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

Монтуємо інсталяційний образ з віндою, припустимо він лежить у нас у /home/$USER/install з назвою win7-setup.iso

$ mkdir ~/iso
 
$ sudo mount -t udf ~/install/win7-setup.iso ~/iso
 


Вставляємо флешку в USB-порт. Припустимо, вона отримала ім'я пристрою /dev/sdb. Виконаємо її розмітку у форматі MBR

$ sudo fdisk /dev/sdb
 


Создем на флешці один єдиний розділ. Після чого форматуємо її в FAT
$ sudo mkfs.vfat /dev/sdb1
 


Копіюємо вміст дистрибутива вінди на флешку
$ mkdir /tmp/flash
 
$ sudo mount /dev/sdb1 /tmp/flash -o uid=1000,gid=100,fmask=113,dmask=002
 
$ cp -rv ~/iso/* /tmp/flash/
 


Скопіюємо конфіги EFI-завантажувача на рівень вище

$ cp -rv ~/tmp/flash/efi/microsoft/* ~/tmp/flash/efi/
 


Тепер нам потрібен EFI-завантажувач вінди. Його доведеться видряпати з дистрибутива. Це легко зробити за допомогою архіватора 7-zip, який є в репозиторії extra/p7zip. Весь вміст дистрибутива вінди стисло в образ wim-формату знаходиться на інсталяційному DVD в файл source/install.wim. Зазвичай цей образ має наступну структуру:



В каталогах з іменами у вигляді цифр 1-4 знаходяться різні редакції вінди. Щоб вибрати потрібну треба подивитися всередину файлу з ім'ям [1].xml. Распакуем його в /tmp

$ cd /tmp
 
$ 7z e ~/iso/sources/install.wim \[1\].xml
 


і подивимося з допомогою якого-небудь браузера, бо в текстовому редакторі він виглядає жахливо, а спеціального редактора xml у мене в наявності не виявилося. Кожну редакцію вінди описують структурою виду



де нода EDITIONID вказує на редакцію. Параметр INDEX — якраз номер каталогу, в якому валяється потрібна редакції. Отже, мені потрібна Ultimate, а це індекс 4. Відповідно выковыриваем завантажувач звідти

$ 7z e ~/iso/sources/install.wim 4/Windows/Boot/EFI/bootmgfw.efi
 


Оки, тепер перенесемо отриманий файл на флешку

$ mv bootmgfwm.efi /tmp/flash/efi/boot/bootx64.efi
 


Порядок, тепер у нас в наявності завантажувальна флешка для установки вінди. Тепер додамо на неї необхідні для установки утиліти — виндозную версію архіватора 7-zip і утиліту BootICE. Архіватор качаємо з офіційного сайту і розпаковуємо на флешку в каталог utils

$ mkdir -p /tmp/flash/utils/7-Zip/
 
$ cd /tmp/flash/utils/7-Zip/
 
$ 7z x ~/downloads/7z1602-x64.exe
 


Туди ж кладемо і bootice

$ cp ~/install/BOOTICEx64.exe /tmp/flash/utils
 


Уф, все, отмонтовуємо флешку
$ cd ~
 
$ sudo umount /tmp/flash/
 


Перезавантажуємося. Якщо у вас система з EFI і знімні диски стоять в пріоритеті завантаження, то комп'ютер завантажиться в установку вінди автоматом. Якщо ж з'явилося таки меню GRUB, нічого страшного, тиснемо «З» і в консолі набиваємо команду exit. Вас вивалить в меню EFI, де вибираємо завантаження з флешки. Якщо ж ваша система BIOS, то тут трохи складніше, бо ми не стали морочитися з налаштуванням MBR на флешці. Тоді в консолі GRUB даємо команду ls — з'явиться список всіх дисків і розділів. Знаходимо нашу флешку, вона з'являється у вигляді (hdX, msdosY), де X, Y — номер диска і розділу відповідно. Тепер пишемо в консолі команди

grub> set root=hdX,Y
 
grub> ntldr /bootmgr
 
grub> boot
 


Почнеться завантаження інсталятора вінди. Він то завантажиться, але він нам і не потрібен — ми все будемо робити руками. Щоб стало зрозуміло, що до чого, доведеться розглянути деяку теорію

2. Про розгортання Windows з WIM-образа і примхливому вдачу Sysprep

Починаючи з сімки установка Windows полягає в наступних етапах

  1. Розмітка диска у відповідності з архітектурою системи ініціалізації обладнання. Якщо BIOS — установник розмічає диск в MBR. При наявності активної EFI — розмітка буде GPT.
  2. Розпакування образу install.wim в обраний для установки розділ
  3. Встановлення завантажувача і перезавантаження
  4. Ініціалізація обладнання. Ребут
  5. Локалізація, введення ключа, закінчення налаштування системи


Це стандартний шлях. У нас же диск вже розмічений. І нам не потрібна автоматична установка завантажувача — ми поставимо його вручну. Розмітка диска повинна задовольняти наступним вимогам:

  • Якщо система з EFI на диску повинен бути присутнім FAT-розділ з типом 0xEF. Якщо у нас вже встановлений лінукс з EFI-завантажувачем, то такий розділ вже існує
  • Якщо система BIOS, розділ, в якому розташовується завантажувач, а це наш NTFS-розділ повинен бути активним. Це дуже важливо! Чому, буде пояснено нижче.


Таким чином, перед розпакуванням системи ми повинні переконатися в тому, що перераховані вимоги виконані. Після того, як ми распакуем все файл системи і встановимо завантажувач, система перезавантажитися. Після перезавантаження запуститься утиліта Sysprep, серед іншого настроює устаткування і перевіряє конфігурацію системи. Так от, якщо в режимі EFI Sysprep не знайде завантажувач і його конфігурацію в EFI-розподіл по шляху EFI/microsof/boot, а в системі з BIOS каталог \Boot і bootmgr будуть лежати в неактивному розділі, то Sysprep завершиться з помилкою sysprep generalize error, а в лог, розташований за адресою \Windows\Panther\sysperr.log виплюне щось схоже на

2015-03-11 16:55:42, Error [0x0e00b3] TOOL Sysprep_Specialize_Bcd: There was an error opening the system store. Status=[0xC0000098]
 
2015-03-11 16:55:42, Error [0x0f0082] SYSPRP LaunchDll:Failure occurred while executing 'c:\Windows\System32\spbcd.dll,Sysprep_Specialize_Bcd', returned error code 1006
 
2015-03-11 16:55:42, Error [0x060435] IBS Callback_Specialize: An error occurred while either deciding if we need to specialize or while specializing; dwRet = 0x3ee
 


і ніякі танці з бубном нам вже не допоможуть. Вінда вимагає, щоб загручик лежав у завантажувальному розділі і крапка. У випадку з BIOS просто робимо активним розділ NTFS в якому лежить вінда і туди ж кладемо і завантажувач. Вантажиться будемо все одно з допомогою GRUB, а йому все одно, який розділ буде активним. У випадку з EFI завантажувач доведеться покласти поруч з GRUB в EFI-розділі.

3. Розпакування системи

Отже, визначимося, куди ми хочемо ставити вінду. Можна поставити в NTFS-розділ, а можна і в VHD-диск. Це вже як вам хочеться. Я буду показувати процес на прикладі з віртуальною машиною EFI, яка має наступну розмітку

The protective MBR's 0xEE partition is oversized! Auto-repairing.
 

 
Partition table scan:
 
MBR: protective
 
BSD: not present
 
APM: not present
 
GPT: present
 

 
Found valid GPT with protective MBR; using GPT.
 

 
Command (? for help): p
 
Disk /dev/loop1: 104857600 sectors, 50.0 GiB
 
Logical sector size: 512 bytes
 
Disk identifier (GUID): 0D217C93-6699-435A-9BBB-61DFAA6F30B7
 
Partition table holds up to 128 entries
 
First usable sector is 34, last usable sector is 104857566
 
Partitions will be aligned on 2048-sector boundaries
 
Total free space is 4029 sectors (2.0 MiB)
 

 
Number Start (sector) End (sector) Size Code Name
 
1 2048 206847 100.0 MiB EF00 EFI system partition
 
2 206848 104855551 49.9 GiB 0700 Basic data partition
 


На цьому диску немає лінукса, встановлений тільки GRUB в розділ EFI. Якщо ми ставимо систему безпосередньо в NTFS-розділ, то завантажується з флешки, чекаємо запуску програми установки і натискаємо Shift + F10, щоб викликати консоль. Запускаємо утиліту diskpart і дивимося список підключених томів

X:\sources> diskpart
 
DISKPART> list vol
 




Бачимо, що флешка (об'ємом 8 Гб) підключена як диск C:, а розділ для установки зовсім не змонтований. Непорядок. Робимо так

DISKPART> sel vol 3
 
DISKPART> remove
 
DISKPART> assign letter=E
 
DISKPART> sel vol 1
 
DISKPART> assign letter=C
 
DISKPART> list vol
 
DISKPART> sel vol 2
 
DISKPART> assign letter=F
 


Ось тепер порядок, диск на який будемо ставити вінду став диск C:, флешка — диском E:, а EFI-розділ — диском F:



Якщо ж ми хочемо поставити систему на VHD, то робимо так

DISKPART> sel vol 3
 
DISKPART> remove
 
DISKPART> assign letter=E
 
DISKPART> sel vol 1
 
DISKPART> assign letter=G
 
DISKPART> exit
 


Для порядку створюємо каталог з образами
X:\sources> md G:\vhd
 
X:\sources> diskpart
 


Створюємо віртуальний диск, створюємо на ньому розмітку GPT і розділ NTFS і монтуємо його до C:

DISKPART> create vdisk file="G:\vhd\win7.vhd" maximum=25600 type=fixed
 
DISKPART> attach vdisk
 
DISKPART> clean
 
DISKPART> convert gpt
 
DISKPART> create part primary
 
DISKPART> format fs=ntfs quick
 
DISKPART> assign letter=C
 


EFI-розділ монтуємо до F:

DISKPART> sel vol 2
 
DISKPART> assign letter=F
 


Отримуємо таку картину



Дуже важливо! Переконуємося в тому, що EFI-розділ відформатований саме в FAT, а не в FAT32. Інакше Sysprep не пробачить нам цієї помилки. Якщо на компі вже є лінукс, то налаштування будуть вірні.

Тепер розпаковуємо дистрибутив на диск C:

X:\sources> E:
 
E:\> utils\7-Zip\7zFM.exe
 


Відкриється GUI архіватора 7-zip. У ньому відкриваємо каталог E:\sources, знаходимо там файл install.wim



Правою кнопкою на файлі викликаємо іконку контекстного меню і переходимо по 7-zip -> Відкрити архів. З'явиться вміст образу.



Ліземо в папку 4 — там лежить Ultimate



Виділяємо всі Ctrl + A і тиснемо кнопку «Вилучити». З'явиться вікно, де нам запропонують вказати шлях розпакування



Вказуємо корінь диска C: і тиснемо ОК.



Ну і тепер, як кажуть: «Відкиньтеся на спинку крісла і...»

4. Установка і настройка завантажувача

Отже, після деякого часу очікування розпакування закінчена. І ось тут, ось у цьому місці вінда зазвичай робить бяку, а саме псує MBR або перенастроює NVRAM. Але ми не дамо їй цього зробити — ми встановимо завантажувач вручну.

У випадку з EFI, переходимо на розділ EFI, змонтований до F: і створюємо необхідні шляхи і копіюємо файли завантажувача

E:\> F:
 
F:\> mkdir EFI\microsoft\boot
 
F:\> xcopy C:\Windows\Boot\EFI\* F:\EFI\microsoft\boot /s /e
 
F:\> mkdir EFI\microsoft\boot\Fonts
 
F:\> xcopy C:\Windows\Boot\Fonts\* F:\EFI\microsoft\boot\Fonts\ /s /e
 
F:\> copy C:\Windows\System32\config\BCD-Template F:\EFI\microsoft\boot\BCD
 


Відмінно, завантажувач скопійований. Тепер налаштуємо його

F:\> E:\utils\BOOTICEx64.exe
 


Відкриваємо файл F:\EFI\Microsoft\Boot\BCD. У разі встановлення на розділ, його параметри задаються так



Якщо ж ми встановлювали систему на VHD, то налаштування будуть такими



Важливо! Ім'я вторинного завантажувача для EFI-системи winload.efi, для BIOS-системи — winload.exe.

У випадку, якщо ми встановлюємо BIOS-систему встановлення завантажувача буде виглядати так:

F:\> mkdir C:\Boot
 
F:\> xcopy C:\Windows\Boot\PCAT\* C:\Boot /s /e
 
F:\> mkdir C:\Boot\Fonts
 
F:\> xcopy C:\Windows\Boot\Fonts\* C:\Boot\Fonts /s /e
 
F:\> copy C:\Boot\bootmgr C:\bootmgr
 
F:\> copy C:\Windows\System32\config\BCD-Template C:\Boot\BCD
 


Важливо! Розділ, змонтований до C: (там де розміщений завантажувач) зобов'язаний бути активним! Переконайтеся в цьому перед перезавантаженням!

Налаштування виконуємо так само точно, використовуючи BootICE.

Ну, ніби все. Закриваємо всі вікна і йдемо в ребут. Флешку можна витягнути з компа.

5. Схрестімо пальці так вознесем молитви тобі, о Великий і Жахливий Sysprep...!

GRUB у нас ще не налаштований пункту для вінди в меню немає. Як тільки з'явиться меню GRUB тиснемо «C». В консолі набираємо

grub> set root=hdX,Y
 
grub> chainloader /EFI/Microsoft/Boot/bootmgfw.efi
 
grub> boot
 


X, Y — відповідно диск і розділ, де лежить завантажувач. Це у випадку EFI. У випадку з BIOS робимо так

grub> set root=hdX,Y
 
grub> ntldr /bootmgr
 
grub> boot
 


X, Y — диск розділ NTFS. Там де розпакована вінда і лежить її завантажувач.

В режимі EFI замість логотипу вінди я побачив чорний екран, так як не знайшов в дистрибутиві билиотеки bootres.dll, яку треба помістити в папку EFI\Mictosoft\Boot\Resourses. У випадку з BIOS все в порядку — знайома емблема «сімки». А потім в обох випадках побачимо це



Це працює Sysprep. На 57% моргне екран — налаштовується відяха. І якщо ми все зробили вірно, то напис «Застосування параметрів системи» повисить досить довго, потім система повідомить, що установка буде продовжена після перезавантаження. Якщо ми десь напартачили з установкою завантажувача — неправильний EFI розділ або неактивний NTFS, то тоді буде помилка :( Але ми молодці і у нас все вийде, і після чергового перезавантаження ми побачимо це



а потім, нарешті ось це



Далі все як при звичайній, штатної установки.

6. Налаштовуємо GRUB

Звернули увагу на те, що кожен раз ми вантажимо систему з консолі GRUB руками. Це дуже добре — значить ні MBR ні NVRAM не перезаписані підступним майкрософтом. Настав час вантажиться в арч і додати в меню GRUB новий пункт

menuentry 'Windows 7 Ultimate SP1 (EFI)' {
 

 
set root=hdX,Y
 
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
 
}
 


у разі EFI. Або

menuentry 'Windows 7 Ultimate SP1' {
 

 
set root=hdX,Y
 
ntldr /bootmgr
 
}
 


у разі BIOS. Застосовуємо налаштування GRUB і перезавантажуємося і видем систему в пункті меню завантаження



після вибору якого отримуємо завантажену Windows



Висновок

Випереджаючи гнів професійних win-адмінів, скажу відразу — я знаю про DISM. Саме інформація про цій системі і привела мене до описаного рішенням. Мета була одна — з'ясувати скільки потрібно можливостей власне Windows, для інсталяції Windows.

Виявилося ось що — для установки Windows її середовище необхідна тільки для одного — налаштування BCD-сховища. Всі. Решту можна зробити з середовища будь-якої іншої операційної системи.

Якщо написати аналог bcdedit.exe під Linux, то встановити Windows можна буде з лінуксового Live-носія.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.