A cosa serve veramente la partizione / boot?


40

Sto leggendo un testo relativamente vecchio su partizioni e file system Linux (la Bibbia di certificazione LPIC 1 ). Dice:

Alcune versioni dei caricatori di avvio di Linux non possono accedere a un kernel esterno ai primi 1024 cilindri su un disco. Inserendo la partizione / boot all'inizio dell'unità, si può essere certi di non avere problemi quando si accede al kernel all'avvio. Questo problema si presenta più spesso in caso di doppio avvio di Linux insieme a un altro sistema operativo che si trova sulla prima partizione.

Perché un boot loader non avrebbe " nessun accesso al kernel al di fuori dei primi 1024 cilindri su un disco "?

Inoltre, cosa significa " inserire la partizione / boot all'inizio dell'unità "?


Questo non è più vero, quindi vuoi ragioni storiche?
muru,

sì, ma perché abbiamo ancora la directory / boot nelle partizioni Linux?
SRYZDN

6
"Non è più vero" potrebbe essere il caso se si legge letteralmente il reclamo, ma ci sono molti layout di disco moderni che la maggior parte dei bootloader non riesce a leggere. ZFS non è leggibile da quasi nulla; btrfs-on-LVM, allo stesso modo. Metti il ​​tuo kernel e initrd su un semplice RAID3 ext3 / ext4 e viene evitato qualsiasi numero di mal di testa.
Charles Duffy,

L'API originariamente fornita dal boot loader dal BIOS per ottenere il kernel Linux dal disco fisso aveva spazio solo per 1023 settori, ovvero l'inizio dell'unità. La /bootpartizione è stata esplicitamente forzata a trovarsi in quell'area per garantire che il kernel fosse caricabile.
Thorbjørn Ravn Andersen,

Risposte:


34

Questa è una limitazione imposta dall'avere un BIOS e un bootloader molto vecchi anziché Linux stesso. Il BIOS sarebbe in grado di accedere solo ai primi 1024 cilindri del disco (vedere qui per ulteriori informazioni su quali cilindri / testine / settori sono). Questa limitazione si estenderebbe ai bootloader che, per loro semplice natura, non avrebbero i propri driver di disco e utilizzerebbero i servizi BIOS per accedere al disco.

Ciò significava che sia il bootloader che il kernel (poiché è compito del bootloader caricarlo) avrebbero dovuto trovarsi nei primi 1024 cilindri su sistemi con questa limitazione. Un modo semplice per farlo è stato quello di creare una /bootpartizione separata contenente il kernel e metterlo all'inizio del disco (di solito semplicemente trasformandolo nella prima partizione). Ciò significa che risiederebbe fisicamente nei primi 1024 cilindri, a condizione che la partizione non fosse troppo grande.

La limitazione non è più un problema perché si applica solo ai vecchi BIOS. Inoltre, molti bootloader moderni (ad esempio GRUB) hanno i propri driver di disco e quindi non devono fare affidamento sui servizi BIOS. I bootloader moderni possono essere utilizzati /bootper altri scopi, ma non è più necessario trovarsi sia su una partizione separata che all'interno dei primi 1024 cilindri (anche se ci sono molti casi in cui è necessario avere /bootsu una partizione separata).


5
Questo è vero, ma come attualmente scritto implica che i sistemi moderni possono fare a meno di un separato /boot. Questo è molto spesso falso, in particolare perché LVM e i moderni filesystem moderni con funzionalità block-layer incorporate entrano in root.
Charles Duffy,

3
@Charles, non credo, sono stato attento a mettere il mio " e " in corsivo per questo motivo esatto.
Graeme,

@CharlesDuffy - i sistemi moderni - anche quelli con fantastici livelli fs - possono facilmente farne a meno /bootin senso convenzionale. /bootè tradizionalmente dedicato a un bootloader, ma la maggior parte dei computer prodotti negli ultimi anni include un bootloader integrato nel firmware, anche se, per qualsiasi motivo, la pratica comune è ancora quella di installare bootloader anacronistici come grube gli amici e bypassare la sua funzionalità a favore di complicazione, immagino. I bootloader del firmware richiedono una partizione dedicata, ma di solito non hanno molto a che fare con /boot.
Mikeserv,

1
@mikeserv, eh? Ti riferisci a EFI? EFI supporta esplicitamente FAT12, FAT16 e FAT32; se si tenta di caricare un kernel da qualcosa come ZFS, è comunque necessario un file system più semplice per estrarlo. Il fatto che abbia o meno qualcosa a che fare con /bootè puramente specifico della configurazione.
Charles Duffy,

1
In realtà non è vero che questo non è più un problema. A volte mi imbatto in macchine abbastanza nuove (come 5 anni) con questi problemi. Certo, i BIOS sono stupidi pezzi di firmware lì, ma esistono ancora.
Ruslan,

23

La storia

/bootcontiene file che non sono utilizzati dal sistema operativo, ma dal suo bootloader . Troverai sia i file del bootloader stesso (come /boot/grub/*per Grub) sia il kernel Linux ( /boot/vmlinuz*) e spesso un initrd o initramfs associato .

Su un PC con BIOS legacy (a differenza della più recente UEFI trovata sui computer più recenti), il software nella ROM carica in memoria i primi 512 byte del disco di avvio (il settore di avvio ). Con solo 512 byte (non tutti contengono nemmeno codice: alcuni contengono dati come la tabella delle partizioni), il codice non può fare molto - non può esserci un vero driver del disco. Tutto ciò che può essere fatto in uno spazio così limitato è usare un'interfaccia BIOS per caricare più codice. Questa interfaccia fornisce un comando per caricare l'ennesimo settore sul disco e la dimensione di N è limitata, quindi solo l'inizio del disco può essere raggiunto in questo modo.

L'interfaccia del BIOS si è evoluta un po ' nei tre decenni o giù di lì, ma i suoi limiti di dimensioni hanno faticato a tenere il passo con le dimensioni del disco, causando BIOS e bootloader meno recenti a 32 MB, 512 MB, 2 GB, 8 GB (e forse altre soglie che non ricordo). Il bootloader deve essere in grado di utilizzare l'interfaccia del BIOS per caricare tutti i pezzi necessari per accedere direttamente all'unità disco. I bootloader generalmente non contengono driver per tutti i controller del disco in circolazione, quindi tutto fino al caricamento del kernel Linux (e initrd / initramfs) deve usare l'interfaccia del BIOS e quindi deve adattarsi all'inizio del disco.

Si noti che questa è una limitazione del BIOS o del bootloader, non di Linux stesso o di una distribuzione.

Separati /bootoggi

Su un sistema con un BIOS recente e un bootloader recente o con UEFI, i limiti di dimensione non sono più rilevanti: le dimensioni del disco ora hanno molto tempo da recuperare. Tuttavia, ci sono altri casi d'uso che rendono /bootutile una partizione separata . Consente al sistema principale di trovarsi su un dispositivo RAID non supportato dal bootloader o su un tipo di file system che il bootloader non supporta. Consente al sistema principale di essere su un dispositivo crittografato, che Linux può decrittografare ma non il bootloader.

Se nessuna di queste limitazioni e casi d'uso si applicano a te, mantenere /bootcome una partizione separata non è utile. Ma colpiscono abbastanza persone che la maggior parte della distribuzione lo supporta.


22

Un altro motivo oltre al menzionato problema del BIOS è che una /bootpartizione separata consente l'uso di un file system per il /volume che il boot loader non comprende (senza essere limitato al caricamento dell'elenco di blocchi come con lilo).


Ciò avrebbe particolare rilevanza quando si avvia Linux all'interno di una macchina virtuale?
Tom Russell

1
@TomRussell No, quell'aspetto non è correlato.
Hauke ​​Laging

18

L'avvio è difficile

L'avvio ... beh ... è davvero la parte più difficile. Ogni volta che un computer si avvia sostanzialmente si incontra di nuovo. Si acquisisce con le sue varie parti, e per ognuna incontra si guadagna capacità. Ma deve tirarsi su dai propri bootstrap, per così dire, da quello quadrato ogni volta.

Quando si progetta un processo di avvio, il trucco è portare la macchina in più fasi. Il tuo avvio deve essere veloce e affidabile e ogni volta deve trovarsi in un ambiente completamente sconosciuto . Non mi avventurerò nemmeno in una conversazione in modalità reale / protetta (il che non vuol dire che potrei anche) , ma c'è molto da fare all'avvio. Mentre il computer assimila i suoi vari componenti ogni volta che lo fa in passaggi graduali. Probabilmente il più cruciale di questi è il passaggio dall'esecuzione del codice integrato all'esecuzione del codice su disco o, in altre parole, dall'esecutivo del kernel. Questo è quando il firmware (apparentemente) si arrende al sistema operativo.

Molti anni fa non era così. In passato il BIOS era davvero il Basic In / Out - i programmi regolari effettuavano chiamate al firmware per cose come disegnare lo schermo e accedere al disco. Questi erano chiamati interruzioni : i vecchi cappelli potevano ricordarli meglio per il brivido di gioia che spesso trovavano nell'assegnare IRQ per la loro nuova matrice di punti o USR.

INT13h

È la serie di funzioni 13H di interrupt ( o INTnel linguaggio in assembly ) che il BIOS offre come servizi per l'accesso al disco. Questi sono ancora utilizzati ancora oggi per i sistemi BIOS nel processo di avvio per passare dal firmware al disco.

Un sistema BIOS controlla i primi byte di ciascun disco che trova e cerca un modello che riconosce come Master Boot Record ( oMBR ) . Questo è uno standard de facto vecchio di decenni e include un po 'di binario eseguibile non elaborato che è scritto sulla testa del disco. L'MBR contrassegna un disco BIOS come avviabile. Smetterà di controllare quando ne trova uno, e così praticamente uno è tutto ciò che ottieni senza un inganno intelligente. Quando ne trova uno, lo mappa in memoria ed lo esegue (in modalità Reale, ma non ci vado ancora) .

L'MBR eseguito non è quasi sicuramente il kernel di sistema - 512 byte (dare o avere) sarebbero abbastanza inutili in quel reparto. Questo è probabilmente un bootloader - un programma progettato specificamente per superare una delle molte limitazioni di indirizzamento del BIOS - in particolare che non comprende affatto alcun tipo di file system.

Quando il bootloader legge nel kernel attuale e lo esegue è nella memoria (come tutti noi pregare lo farà ogni volta) , sarà probabilmente farlo chiedendo il BIOS tramite una INT13Hchiamata di interrupt. E se non lo fa - molti bootloader più elaborati monteranno i file system in senso convenzionale ed eseguiranno il codice in un altro modo - allora è molto poco probabile che il bootloader sia così sofisticato senza uno INT13Ho due. Spesso i bootloader devono caricare a catena se stessi - o varie fasi di se stessi - perché i 512 byte inizialmente allocati non soddisfano nemmeno le loro esigenze.

POLLO E UOVA

Tutto questo è un modo indiretto di discutere del disco, lo so, ma a questo punto dovrebbe essere abbondantemente chiaro che il problema principale - si potrebbe chiamarlo un tipo di gallina e uovo - sta accedendo al disco che contiene le istruzioni del programma su come accedere ai dischi . La chiave di questo problema è il firmware - e continua ad essere in modi molto diversi anche sui sistemi EFI - e, il più debole o no, il firmware è l'anello più importante nella catena di avvio.

Vedete, una volta eseguito il kernel, e tutte le sue miriadi di routine per l'accesso e il controllo dell'hardware avviato, tutti questi problemi scompaiono (o almeno cambiano in qualche modo) , perché i moderni sistemi operativi assumono il pieno controllo di un sistema, ma fino a quando non lo faranno i limiti del sistema si estenderanno solo nella misura consentita dal firmware. Questo dice molto: il BIOS non è cambiato molto INT13Hdall'8086. La chiamata è un originale 8086. Sì, ci sono state (una miriade) estensioni e hack ovviamente, ma innovazioni ...?

DI MEGLIO IN MEGLIO

La maggior parte delle modifiche al BIOS sono state semplicemente delle bende. In passato era un hard disk che doveva essere mappato fisicamente - vari aspetti specifici della sua geometria venivano indicati quando i dati venivano archiviati o recuperati da esso. Alla fine il disco rigido convenzionale è cresciuto fino a raggiungere una dimensione tale da proibirlo. Anche solo la mappa astratta era troppa informazione per un BIOS da gestire. Poiché può funzionare solo in modalità reale, il BIOS è limitato a 1 MB per registro di memoria. Gonfia la mappa del cilindro più grande di quella, o ingrandisci una delle sue proprietà di quante possano essere affrontate in così tanti bit, e il BIOS è letteralmente perso - fuori dai limiti.

Questa barriera è stata superata e superata molte volte. Ogni volta che la mappa viene astratta e codificata in un modo più nuovo, intelligente e meno preciso. E così in questi giorni è letteralmente impossibile per un BIOS mappare con precisione un'unità. Logical Block Addressing è di fatto lo standard di fatto, sebbene siano ancora necessarie alcune traduzioni di cilindri / testate / settori (o CHS) . Ciò che il firmware della scheda madre ha perso in termini di accuratezza / responsabilità, tali estensioni sono state astratte e aggiunte alle responsabilità del firmware del disco per colmare le lacune.

È questo gioco gatto e topo a cui fa riferimento la tua domanda. Quando il BIOS non riesce a capire un disco oltre un certo punto a causa delle sue dimensioni, allora tutti i dati che potresti voler recuperare all'avvio - come un bootloader o un kernel - probabilmente farebbero meglio a non trovarsi oltre quel punto. Questo è da dove /bootviene.

FORSE REALMENTE MEGLIO

In questi giorni, per fortuna, queste cose sono rese irrilevanti dalla fine del BIOS. Sono passati 30 anni, ma è stato ampiamente sostituito negli ultimi anni dallo standard UEFI (o EFI 2.0) . UEFI fornisce un mount dal primo minuto, si inizializza in modalità protetta, incorpora il proprio bootloader, fornisce archiviazione variabile con memoria flash persistente al riavvio, è specificato per gestire alcuni ennesimi zetabyte o qualunque cosa per disco ... e molto altro altro. È tutt'altro che perfetto, ma è un grande miglioramento rispetto al suo predecessore.

Anche gli argomenti per bootloader specializzati che coinvolgono la crittografia del disco o i file system a livelli falliscono se si considera che tutti questi devono essere comunque gestiti dal kernel del sistema operativo e se viene fornito un mount all'avvio, si ha sempre un chiaro- sparato per eseguirlo (soprattutto considerando che il kernel Linux, nella sua configurazione predefinita, è un eseguibile EFI tutto suo) .

Quindi una /bootpartizione separata probabilmente non dovrebbe preoccuparti eccessivamente e, se ti trovi in ​​un sistema EFI, probabilmente avrai già un analogo nella partizione del sistema EFI, poiché questo è un requisito per l'avvio della modalità EFI.


8

Che una /bootdirectory sia storicamente determinata e da lì "riparata" nel Filesystem Hierarchy Standard . Avere un tale standard consente ai programmi (e amministratori di sistema) di aspettarsi determinati file in determinate posizioni. In questo caso, i file associati al processo di avvio.

Avere una /bootpartizione all'inizio di un disco aveva senso per i BIOS più vecchi che non erano in grado di indicizzare blocchi / settori nell'intera gamma di unità disponibili. Per questo motivo le informazioni che dovrebbero essere caricate dovrebbero essere su un settore che potrebbe essere indicizzato, quindi una partizione separata (con numeri di settore bassi) per la /bootquale il BIOS potrebbe caricare dati / programmi aggiuntivi (che a loro volta erano in grado di indirizzare l'intero gamma di dischi senza utilizzare il BIOS).


6

Può anche essere molto ordinato avere una partizione separata / avvio. Sulla mia macchina, ho molte distro e backup, ognuno nelle proprie partizioni, ma tutti condividono la stessa partizione / boot, che è dove risiedono tutti i kernel per tutti i sistemi operativi. Inoltre, tutte le distribuzioni indicano la mia unica copia di lilo.conf che è anche in / boot, quindi non devo mai indovinare cosa diavolo succede quando aggiungo i kernel, aggiungo distro, qualunque cosa. Ecco un ritaglio dal mio lilo.conf:

image  = /boot/vmlinuz-3.16.0-4-686-pae
initrd = /boot/initrd.img-3.16.0-4-686-pae
root   = "LABEL=y5--5-Debian1"
label  = y5:D1:16.0-4

image  = /boot/vmlinuz-3.16.0-4-686-pae
initrd = /boot/initrd.img-3.16.0-4-686-pae
root   = "LABEL=y8--5-Debian2"
label  = y8:D2:16.0-4

image  = /boot/vmlinuz-3.16.0-4-686-pae
initrd = /boot/initrd.img-3.16.0-4-686-pae
root   = "LABEL=y11-5-Debian3"
label  = y11:D3:16.0-4

image  = /boot/vmlinuz-3.16.0-4-686-pae
initrd = /boot/initrd.img-3.16.0-4-686-pae
root   = "LABEL=w5--5-Debian1"
label  = w5:D1:16.0-4

... sono solo i miei backup Debian su due dischi. Vedi quanto è facile tenere traccia dei kernel? (in questo momento, tutti i backup utilizzano lo stesso kernel).


5

Anche se sui sistemi moderni, è possibile accedere ai settori di un file ovunque su un disco, ha comunque senso limitare i materiali di avvio alla propria partizione di avvio, semplicemente dal principio di "non mettere tutte le uova nello stesso paniere".

Supponiamo che il filesystem principale sia corrotto in modo tale che alcuni bootloader di livello inferiore non siano in grado di leggere correttamente lo stadio successivo. Se invece i materiali del bootloader sono nella propria partizione, il kernel può venire fuori e gestire correttamente la partizione root corrotta tramite fsck. Quello stesso può essere nella sua stessa partizione.

La partizione di avvio può darti opzioni per il "salvataggio", come montare una partizione di root alternativa. Inoltre, cosa succede se si esegue l'avvio multiplo di sistemi operativi diversi in partizioni diverse? Quindi i materiali di avvio non appartengono a nessuno di questi sistemi. È ragionevole che abbia una propria partizione. È possibile sostituire una delle partizioni del sistema operativo con un sistema operativo diverso, ma essere in grado di avviare i restanti sistemi operativi.

Inoltre, cosa succede se si desidera utilizzare un filesystem per la partizione principale che il bootloader non comprende affatto? O, per esempio, per il quale il supporto lato bootloader è solo sperimentale? In situazioni del genere, è ancora possibile utilizzare un file di avvio se esiste una mappa settoriale (e il boot loader supporta una cosa del genere: il buon vecchio boot loader Linux LILO utilizzava le mappe settoriali e quindi non doveva comprendere il filesystem struttura a tutti). Ma le mappe settoriali sono intrinsecamente traballanti. Se il filesystem viene riorganizzato, i settori si spostano e quindi le mappe dei settori diventano errate e devono essere rigenerate, altrimenti il ​​sistema non può riavviarsi.

Infine, esiste il principio organizzativo secondo cui anche se non si dispone di una partizione effettiva, è comunque una buona idea che tutte le cose di avvio siano almeno sotto /boote non sparse da nessun'altra parte.


5

Questa non era una limitazione della distribuzione Linux, ma era una limitazione dei BIOS più vecchi. A quei tempi, per garantire che Linux potesse avviarsi, tutti i file relativi all'avvio venivano collocati nella propria partizione che era stata creata come prima partizione sul disco rigido per garantire che il caricatore di avvio rientrasse nei primi 1024 cilindri. Crea una partizione più piccola di qualsiasi dimensione trovata in 1024 cilindri (varia da disco rigido a disco rigido). Ma se si crea una prima partizione più grande di questo limite, è possibile che i file del caricatore di avvio si trovino all'esterno dei cilindri 1024 e che il BIOS non sia in grado di caricarli.

Puoi anche ottenere lo stesso effetto creando due piccole partizioni, entrambe comprese nei primi 1024 cilindri e inserendo tutti i file del boot loader nel secondo.


4

Un altro motivo per il bootpartition in questi giorni sono:

  • avvio da NFS o NBD
  • partizione root crittografata
  • / boot condiviso tra diverse distribuzioni
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.