È possibile avviare Windows 8.1 senza il proprio bootmanager?


10

Ho cercato di creare un modo più semplice di installare Windows e Linux con doppio avvio sul mio laptop, non necessariamente in questo ordine. Quello che generalmente dobbiamo fare è installare prima Windows, quindi installare Linux e consentire a GRUB di gestire Windows.

Quindi, quello che sto cercando di ottenere è di trovare un modo per aggirare quel fastidioso processo di installazione (Windows) e basta usare un'immagine per copiare direttamente nel mio disco. Questo mi permetterebbe anche di mantenere il mio boot manager (GRUB). (non che non posso ripristinarlo in seguito, ma è la politica di Microsoft a monopolizzare, in questo caso negando l'esistenza di altri boot manager nel sistema).

Ho prima ottenuto una copia legale di Windows 8.1, quindi ho proceduto a installarlo su una macchina virtuale utilizzando VirtualBox. Quindi, ho creato una partizione NTFS sul mio disco rigido partizionato con GPT e copiato il contenuto della partizione Windows dall'immagine .vdi alla partizione appena creata.

Certo, non funziona ancora. Non so come sostituire bootmgr. Dà

File: \Boot\BCD
Status: 0xc000000e
Info: The Boot Configuration Data for your PC is missing or contains errors.

perché non riesce a trovare quel file dall'altra partizione che viene utilizzata per l'avvio, il ripristino del sistema, ecc.

Ora, ho letto che bootmgr alla fine esegue winload.exe per avviare Windows. Non ho idea di cosa fare dopo.

Penso che dovrebbe funzionare in teoria perché ho tutti i file necessari per eseguire Windows. Penso anche che non dovrei essere l'unico a pensarci, e quindi potrei mancare qualcosa di molto essenziale qui. Forse è già fatto?

Non ho idea di come funzioni l'avvio. Quello che sono riuscito a capire è che quando si esegue il dual-boot di Windows e Linux, si mette il bootloader di Windows su Linux. Quindi, quello che sto cercando di ottenere è in qualche modo sbarazzarsi del bootloader di Windows.

MODIFICARE

Ho visto i file binari bootmgr e \Boot\BCD. bootmgr legge il file BCD ed elenca le opzioni, tra le quali è possibile scegliere di avviarsi.

Quindi informazioni come l'esecuzione winload.exe risiede nel file BCD. Ora, penso bootmgr stesso viene eseguito da syslinux usando il chain.c32 modulo. Quello che sto cercando di fare è in qualche modo eseguire il bootloader di Windows, ad es. winload.exe direttamente da syslinux (se possibile), o modificare bootmgr in modo che venga eseguito winload.exe stesso (il cui percorso sarà direttamente nel bootmgr eseguibile) senza cercare BCD o altro.

L'ibernazione (che richiede una procedura diversa) non mi riguarda in questa fase.

Modifica la tua domanda per dirci il tipo di firmware e (se EFI) se   hai abilitato il modulo di supporto di compatibilità nel firmware   impostare

Il mio firmware è EFI (con CSM abilitato) e di solito avvio in Arch Linux utilizzando GRUB. L'ho scoperto bootmgr esegue System32\winload.exe su sistemi legacy e System32\winload.efi su EFI.

io ho 0.0 idea su cosa fare da qui. Negli ultimi 10 giorni, ho cercato di apportare modifiche a BCD e penso che sto per raggiungere il successo. Ma questo è irrilevante, perché quello che voglio fare è ignorare del tutto il Boot Manager di Windows.

Se hai qualche idea se c'è un modo per eseguirlo winload.efi dalla shell EFI (solo una supposizione), o qualche altra modifica a GRUB in modo che avvii Windows in modalità EFI senza il chainloader.

Qualsiasi consiglio è benvenuto.

appendice

I seguenti post sul forum potrebbero fornire utili indicazioni:

http://reboot.pro/topic/19371-chainload-directly-to-winloadexe/

1.

Al momento grub4dos può eseguire il chainload di un bootloader (come NTLDR o   BOOTMGR) perché può fungere da sostituto del codice contenuto in   un "bootsector" "normale" (ad esempio qualcosa come 300 byte di codice macchina).

Questo codice imposta semplicemente alcuni parametri e quindi chiama il caricatore.

Anche questo è (non era) affatto facile da capire e replicare con   codice diverso

Un caricatore di sistema NT come BOOTMGR ha più o meno in un unico .exe a   sistema operativo "modalità reale" (non del tutto diverso dal DOS) e   strutture / strumenti per analizzare sia gli hive del Registro di sistema che del Registro di sistema, lo è   non qualcosa che può essere riscritto da zero facilmente.

I bravi ragazzi @ReactOS stanno lavorando alla scrittura di FREELDR (che mira   essere un sostituto per il molto più semplice NTLDR) da ANNI (e   credetemi, ci sono alcuni programmatori ReactOS davvero buoni   e bravo ragazzi)

esso sembra (ma non è documentato chiaramente) a cui sono riusciti   avviare sperimentalmente un Server 2003 con NTLDR.

2.

Con l'introduzione del supporto per (U) EFI, BootMgr aiuta ad astrarre   la differenza tra BIOS e (U) EFI. Ad esempio, qui ci sono due   sequenze:

BIOS (PCAT) -> BootMgr { BootMgr stub -> embedded BootMgr.exe } -> WinLoad.exe -> Windows
64-bit (U)EFI -> BootMgFw.efi -> BootMgr.efi -> WinLoad.efi -> Windows

WinLoad si aspetta che un certo ambiente (inclusa l'API) sia presente.   BootMgr si occupa di questo, quindi [quasi] lo farà lo stesso programma WinLoad   lavorare in entrambi gli ambienti.

Infatti, (U) EFI definisce un metodo per l'archiviazione e il recupero dell'avvio   parametri, quindi il BCD di BootMgr copre lo stesso scopo, indipendentemente da   BIOS / (U) EFI.

Ma oltre le differenze di BIOS e (U) EFI, BootMgr ti permette di fare un "boot"   scelta ", mentre WinLoad avvia un particolare sistema operativo   sa come fare il boot

A seconda della quantità di ambiente che WinLoad si aspetta di essere presente,   potrebbe essere possibile invocare direttamente WinLoad. Michael Brown's   wimboot richiama direttamente BootMgr PE [1], quindi potrebbe richiamare WinLoad   direttamente, tranne che WinLoad probabilmente vuole più di un ambiente.   Potresti provarlo!

[1] Da non confondere con BootMgr che GRUB4DOS e Syslinux '   chain.c32 può richiamare. Quel BootMgr include uno stub che sa come   richiamare il BootMgr PE incorporato.


1
Non hai ancora fornito abbastanza informazioni. modificare la tua domanda per dire ai rispondenti se questa macchina ha un firmware EFI o un vecchio firmware in stile PC / AT. Al momento stai parlando di programmi bootstrap MBR su dischi partizionati EFI, che è ( a meno che non si stia utilizzando uno dei miei programmi o di H. Peter Anvin) senza senso e verosimile non il modo in cui la macchina si avvia .
JdeBP

La politica che descrivi non esce da Microsoft impedisce a chiunque di utilizzare due sistemi di avvio
Ramhound

@JdeBP Hai ragione. Ad un certo punto, stavo effettivamente usando entrambi. Stavo usando syslinux con il pc al metodo. Quindi ho installato GRUB su una partizione EFI. Quindi il mio portatile supporta entrambi, ma ho avuto lo stesso risultato ogni volta. Cercherò di informarmi nel frattempo. D'altra parte, capisci cosa sto cercando di ottenere? Dimenticando quello che ho descritto prima, forse puoi darmi un consiglio se è fattibile o no.
osolmaz

Non ho chiesto il tipo di firmware pigramente. Questo è un dato vitale, che devi fornire. Senza di esso, le persone non possono nemmeno iniziare una risposta adeguata. modificare la tua domanda per dirci il tipo di firmware e (se EFI) se hai abilitato il modulo di supporto di compatibilità nel firmware setup utilità.
JdeBP

@JdeBP Ho modificato la domanda.
osolmaz

Risposte:


5

Per rispondere alla tua domanda originale, no. Windows non può essere caricato senza passare attraverso il proprio bootloader (nel caso di installazioni UEFI, bootmgfw.efi). Questo perché Windows si aspetta che il bootmanager sia lì E a chiamare winload.efi. Se ciò non accade, Windows si bloccherà fino a quando non risolvi il problema. Ci sono molte ragioni per questo (pratico e ignorante). Principalmente, è perché Microsoft ha scritto il bootmanager per gestire tutto (caricamento del sistema operativo, caricamento dell'ambiente di recupero, pseudo ambiente pre-os ed ecc.). L'unico modo per ottenere attualmente una parvenza di sanità mentale consiste nel concatenare il carico usando Grub-efi.


Prima di accettare questo come risposta, devo chiedere: è che il compito sarebbe noioso difficile da raggiungere, soprattutto a causa della quantità di hacking di basso livello richiesto per ingannare qualsiasi programma coinvolto nel processo; l'inganno è che Windows penserebbe ancora che sia stato avviato con il proprio bootmanager, mentre in realtà era qualcos'altro ... E credo che ogni versione di Windows richiederebbe uno sforzo separato. Ma questo non rende il compito impossibile, proprio davvero difficile vero?
osolmaz

3
Non direi che è del tutto impossibile (in programmazione), ma dovresti decodificare le chiamate che bootmgfw.efi fa al sistema operativo Windows. La quantità di hacking di basso livello coinvolto in una combinazione con la necessità di decodificare le chiamate di protocollo di boot di basso livello a un caricatore del sistema operativo è proibitivamente dispendiosa in termini di tempo. Dovresti non solo ingannare Windows facendogli credere che bootmgfw.efi fosse lì, ma anche che il BCD esista e che sia stato creato con i propri strumenti e così via.
ChrisR.

2

È necessario aggiungere il bootloader di Windows EFI all'elenco delle opzioni di avvio nel firmware UEFI. In questo modo, sarai in grado di scegliere se:

  1. GRUB2 dovrebbe essere caricato o
  2. il Bootloader di Windows dovrebbe essere caricato

A questo punto dovrebbero essere visibili anche opzioni aggiuntive come l'unità DVD, dischi rigidi esterni per l'avvio di rete. Il bootloader UEFI risiede solitamente sul \EFI ( /boot/efi/ ) partizione. Poiché hai appena copiato l'immagine del disco rigido di Windows senza installare correttamente Windows, la partizione EFI del computer corrente potrebbe non contenere il bootloader appropriato. Quindi è necessario

  1. Copia il bootloader nella partizione EFI
  2. Aggiungi Windows come opzione di avvio insieme a GRUB2

Dovresti quindi essere in grado di scegliere quale sistema operativo viene avviato cambiando semplicemente l'ordine di avvio nel BIOS. Sul mio portatile, premendo F12 visualizza un menu per selezionare quale bootloader caricare.

Per questi passaggi, userò efibootmgr e segui i passi da questo tutorial :

Dovrai copiare il file corrispondente bootmgfw.efi alla partizione EFI a \EFI\Microsoft\Boot\bootmgfw.efi, o /boot/efi/Microsoft/Boot/bootmgfw.efi quando usi Linux:

# mkdir -p /boot/efi/EFI/Microsoft
# cp -r Microsoft /boot/efi/EFI/Microsoft

dove Microsoft è una cartella contenente i file EFI originali per la versione di Windows.

Quindi è necessario aggiungere il .efi file nelle voci di avvio UEFI utilizzando:

# efibootmgr -c -d /dev/sda -p 1 -l \\EFI\\Microsoft\\Boot\\bootmgfw.efi -L "Windows Boot Manager"

dove ovviamente devi cambiare /dev/sda e -p 1 ai valori corretti per il dispositivo del disco e il numero di partizione.

Nota questo se hai un laptop Lenovo:

Si noti inoltre che almeno un produttore (Lenovo) spedisce prodotti con un bug noto che fa sì che il sistema rifiuti di avviarsi a meno che il nome del caricatore di avvio sia "Windows Boot Manager" o "Red Hat Enterprise Linux".

Avviare il PC dovrebbe quindi mostrare qualcosa di simile (se si tengono premuti i tasti corrispondenti durante il processo di avvio):

Windows Boot Manager
ubuntu
USB CD
USB FDD
ATAPI CD
ATA HDD2

(etc.)

e bcdedit su Windows mostra questo:

C:\WINDOWS\system32>bcdedit /enum firmware

Firmware Boot Manager
---------------------
identifier              {fwbootmgr}
displayorder            {bootmgr}
                        {bb086763-b111-11e2-bf8e-806e6f6e6963}
                        {8e7fb978-8bc8-11e2-bf2f-806e6f6e6963}
timeout                 0

Windows Boot Manager
--------------------
identifier              {bootmgr}
device                  partition=\Device\HarddiskVolume2
path                    \EFI\Microsoft\Boot\bootmgfw.efi
description             Windows Boot Manager
locale                  en-US
inherit                 {globalsettings}
integrityservices       Enable
default                 {current}
resumeobject            {ec215a09-8bc4-11e2-bf2b-0024d7eb75a4}
displayorder            {current}
toolsdisplayorder       {memdiag}
timeout                 2

(...)

Firmware Application (101fffff)
-------------------------------
identifier              {bb086763-b111-11e2-bf8e-806e6f6e6963}
device                  partition=\Device\HarddiskVolume2
path                    \EFI\ubuntu\grubx64.efi
description             ubuntu

1
Molto ben spiegato, grazie. Pochi giorni fa, sono riuscito a fare la stessa cosa, ma ancora utilizzando una partizione separata per il boot manager EFI di Windows e attraverso il chainloading con GRUB. Ora ho imparato che potrei usare anche il mio EPS originale. Inoltre, invece di usare bcdedit, ho usato hivex per correggere il BCD; Intendo scrivere una raccolta di strumenti gratuiti per poter manipolare i file BCD in Linux. Ma quello che sto cercando di ottenere è qualcosa di diverso. Se bootmgfw.efi esegue in qualche modo winload.efi, perché non sarei in grado di eseguire winload.efi direttamente da GRUB?
osolmaz

Oh, capisco. Quindi vuoi saltare il Boot Manager di Windows (bootmgfw.efi) e caricare il Bootloader di Windows (winload.efi) direttamente leggendo il BCD System Store? (Seguendo le definizioni di Qui .) È interessante, non ho mai sentito parlare di qualcuno che lo faccia. Qual è la tua motivazione, perché è necessario caricare direttamente winload.efi? Inoltre, hai una copia completa del \EFI\Boot\Microsoft cartella per test (ci sono un paio di file in là)?
jmiserez

Bene, se dovessi raggiungere questo obiettivo, non avrei nemmeno bisogno di leggere il BCD, potrei semplicemente aggiungere una voce in GRUB per la partizione. (Sto escludendo ibernazione e ripristino del sistema qui) La mia motivazione è che sarebbe molto più facile installare Windows senza preoccuparsi di doverlo risolvere in seguito. Utile per amministratori di sistema, installazioni batch e così via (e per me ^^). Per quanto riguarda il motivo per cui caricare direttamente winload.efi: occuparsi di file di registro di Windows specifici chiusi (binari) è molto più noioso rispetto ai file di configurazione di solo testo come GRUB. È solo più facile eliminare l'uomo medio.
osolmaz

1
Capisco cosa intendi, sì sarebbe molto utile. Mi chiedo se 1) ci siano delle variabili che bootmgfw.efi passa su winload.efi quando viene lanciato, e 2) se potrebbe esserci un problema con l'avvio sicuro e una sorta di catena di certificati necessaria. Hai scoperto cosa? inherit {bootloadersettings} nel negozio BCD significa davvero?
jmiserez

1
3) Da quando ho usato hivex, posso indovinare a quale oggetto corrisponde. C'è un oggetto di impostazioni "globale" nell'alveare e ogni altro oggetto ha un riferimento ad esso. Quello che posso dire è che solo due oggetti sono sufficienti per l'avvio in windows: 1: l'oggetto Boot Manager di Windows con la costante uuid {9dea862c-5cdd-4e70-acc1-f32b344d4795} 2: l'oggetto che contiene le informazioni sulla partizione e il percorso del bootloader per la tua vera radice di Windows. La parte più difficile era capire la struttura dei dati binari che specificava la partizione. Questo è stato fatto principalmente da wodny: bitbucket.org/wodny/libbcd/src .
osolmaz

0

È possibile eseguire installazioni in qualsiasi ordine, ad esempio Installazione di GNU / Linux e quindi di Windows o viceversa.

Basta fare quanto segue dopo aver installato tutti i sistemi operativi.

  1. Prendi il "Boot Repair Disk" da qui. http://sourceforge.net/projects/boot-repair-cd/

  2. Crea una USB Pen Drive avviabile dal vivo (Istruzioni su pendrivelinux.com)

  3. O masterizza il file ISO su un CD.

  4. Avvia questo e segui le istruzioni sullo schermo. Avrai un GRUB reinstallato contenente tutti i sistemi operativi installati.

Ti auguro il meglio.


1
Ne sono consapevole, quello che voglio è qualcosa di diverso. Sto chiedendo se Windows può essere avviato direttamente senza chainloading.
osolmaz
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.