Do czego tak naprawdę służy partycja / boot?


40

Czytam stosunkowo stary tekst na partycjach i systemach plików Linux ( Biblia certyfikacyjna LPIC 1 ). To mówi:

Niektóre wersje programów ładujących systemu Linux nie mają dostępu do jądra znajdującego się poza pierwszymi 1024 cylindrami na dysku. Umieszczając partycję / boot na początku napędu, możesz być pewny, że nie będziesz mieć problemów z dostępem do jądra podczas rozruchu. Ten problem pojawia się najczęściej w przypadku podwójnego rozruchu Linuksa wraz z innym systemem operacyjnym znajdującym się na pierwszej partycji.

Dlaczego moduł ładujący miałby „ nie mieć dostępu do jądra poza pierwszymi 1024 cylindrami na dysku ”?

Co również oznacza „ umieszczenie partycji / boot na początku napędu ”?


To już nie jest prawda, więc czy chcesz powodów historycznych?
muru

tak, ale dlaczego nadal mamy katalog / boot na partycjach Linux?
SRYZDN

6
„Nie jest już prawdą” może się zdarzyć, jeśli odczytanie oświadczenia jest bardzo dosłowne, ale istnieje wiele nowoczesnych układów dysków, których większość programów ładujących nie może odczytać. ZFS niczego nie czyta; btrfs-on-LVM, podobnie. Umieść jądro i initrd na prostej macierzy RAID1 ext3 / ext4 i unikniesz dowolnej liczby problemów.
Charles Duffy

Interfejs API pierwotnie przewidziany przez moduł ładujący rozruchu przez system BIOS w celu pobrania jądra systemu Linux z dysku twardego miał miejsce tylko na 1023 sektory, tj. Początek napędu. /bootPartycja została wyraźnie egzekwowane być w tym obszarze, aby zapewnić, że jądro będzie obciążana.
Thorbjørn Ravn Andersen

Odpowiedzi:


34

Jest to ograniczenie narzucone przez bardzo stary BIOS i bootloader, a nie sam Linux. BIOS będzie mógł uzyskać dostęp tylko do pierwszych 1024 cylindrów dysku (zobacz tutaj, aby uzyskać więcej informacji na temat cylindrów / głowic / sektorów). Ograniczenie to dotyczyłoby programów ładujących, które ze względu na swoją prostą naturę nie miałyby własnych sterowników dysków i korzystałyby z usług BIOSu w celu uzyskania dostępu do dysku.

Oznaczało to, że zarówno bootloader, jak i jądro (ponieważ ładowanie go jest zadaniem bootloadera) musiałyby znajdować się w pierwszych 1024 cylindrach w systemach z tym ograniczeniem. Prostym sposobem na to było utworzenie osobnej /bootpartycji zawierającej jądro i umieszczenie go na początku dysku (zwykle po prostu jako pierwsza partycja). Oznacza to, że fizycznie znajdowałby się w pierwszych 1024 cylindrach, pod warunkiem, że partycja nie byłaby zbyt duża.

Ograniczenie nie jest już problemem, ponieważ dotyczy tylko starych BIOS-ów. Ponadto wiele nowoczesnych programów ładujących (np. GRUB) ma własne sterowniki dysków, więc nie trzeba polegać na usługach BIOS. Współczesne programy ładujące mogą wykorzystywać /bootdo innych celów, ale nie jest już wymagane, aby znajdować się zarówno na osobnej partycji, jak i w pierwszych 1024 cylindrach (chociaż w wielu przypadkach konieczne jest posiadanie /bootosobnej partycji).


5
To prawda, ale jak obecnie napisano, oznacza to, że nowoczesne systemy mogą obejść się bez osobnego /boot. To bardzo często nieprawdziwe - zwłaszcza, że ​​LVM i fantazyjne nowoczesne systemy plików z wbudowaną funkcjonalnością warstwy blokowej zapuszczają korzenie.
Charles Duffy

3
@Charles, nie sądzę, starałem się pisać kursywą „ i ” właśnie z tego powodu.
Graeme

@CharlesDuffy - nowoczesne systemy - nawet te z fantazyjnymi warstwami fs - mogą dość łatwo obejść się bez tego /bootw konwencjonalnym sensie. /bootjest tradycyjnie dedykowany bootloaderowi - ale większość komputerów wyprodukowanych w ciągu ostatnich kilku lat jest wyposażonych w bootloader wbudowany w oprogramowanie układowe - choć z jakiegoś powodu powszechną praktyką jest nadal instalowanie anachronicznych programów ładujących, takich jak grubi przyjaciele, i omijanie jego funkcji na korzyść chyba komplikacja. Programy ładujące oprogramowanie sprzętowe wymagają jednak dedykowanej partycji - ale zwykle nie ma z nią wiele wspólnego /boot.
mikeserv

1
@mikeserv, co? Masz na myśli EFI? EFI wyraźnie obsługuje FAT12, FAT16 i FAT32; jeśli próbujesz załadować jądro z czegoś takiego jak ZFS, nadal istnieje potrzeba prostszego systemu plików, aby go pobrać. To, czy ma to coś wspólnego, /bootzależy wyłącznie od konfiguracji.
Charles Duffy

1
W rzeczywistości nie jest prawdą, że nie jest to już problemem. Czasami spotykam dość nowe maszyny (takie jak 5 lat) z tymi problemami. To prawda, że ​​BIOSy są tam głupim oprogramowaniem, ale nadal istnieją.
Ruslan

23

Historia

/bootzawiera pliki, które nie są używane przez system operacyjny, ale przez program ładujący . Znajdziesz zarówno pliki samego programu ładującego (np. /boot/grub/*Dla Grub), jak i jądra Linux ( /boot/vmlinuz*) oraz często powiązane initrd lub initramfs .

Na komputerze PC ze starszym systemem BIOS (w przeciwieństwie do nowszego UEFI znalezionego na najnowszych komputerach) oprogramowanie w pamięci ROM ładuje pierwsze 512 bajtów dysku rozruchowego do pamięci ( sektor rozruchowy ). Tylko 512 bajtów (z których nie wszystkie zawierają nawet kod: niektóre z nich zawierają dane, takie jak tablica partycji), kod nie może wiele zdziałać - nie może tam być prawdziwy sterownik dysku. Wszystko, co można zrobić w tak ograniczonej przestrzeni, to użyć interfejsu BIOS, aby załadować więcej kodu. Interfejs ten udostępnia polecenie załadowania N-tego sektora na dysk - a rozmiar N jest ograniczony, więc w ten sposób można osiągnąć tylko początek dysku.

Interfejs BIOS-u ewoluował nieco w ciągu ostatnich trzech dekad, ale jego ograniczenia wielkości starały się nadążyć za rozmiarami dysków, powodując, że starsze BIOS-y i programy ładujące zaczęły działać z 32 MB, 512 MB, 2 GB, 8 GB (i być może inne progi, których nie pamiętam). Program ładujący musi mieć możliwość korzystania z interfejsu BIOS, aby załadować wszystkie elementy potrzebne do bezpośredniego dostępu do dysku. Programy ładujące generalnie nie zawierają sterowników dla wszystkich kontrolerów dysków, więc wszystko, co wymaga załadowania jądra Linux (i initrd / initramfs), musi korzystać z interfejsu BIOS, a zatem musi zmieścić się na początku dysku.

Pamiętaj, że jest to ograniczenie systemu BIOS lub programu ładującego, a nie samego Linuxa lub dystrybucji.

Oddziel /bootdzisiaj

W systemie z najnowszym systemem BIOS i niedawnym programem ładującym lub z UEFI ograniczenia rozmiaru nie są już istotne: rozmiary dysków mają teraz dużo czasu na nadrobienie zaległości. Istnieją jednak inne przypadki użycia, w których osobna /bootpartycja jest przydatna. Pozwala to, aby główny system znajdował się na urządzeniu RAID , którego bootloader nie obsługuje, lub na systemie plików, którego bootloader nie obsługuje. Pozwala to systemowi głównemu na zaszyfrowane urządzenie, które Linux może odszyfrować, ale nie bootloader.

Jeśli żadne z tych ograniczeń i przypadków użycia nie dotyczą Ciebie, przechowywanie ich /bootjako osobnej partycji nie jest przydatne. Ale wpływają na wystarczającą liczbę osób, które obsługuje większość dystrybucji.


22

Innym powodem obok wspomnianego problemu z BIOSem jest to, że osobna /bootpartycja pozwala na użycie systemu plików dla /woluminu, którego program ładujący nie rozumie (bez ograniczania się do ładowania listy bloków jak przy lilo).


Czy miałoby to szczególne znaczenie podczas uruchamiania systemu Linux na maszynie wirtualnej?
Tom Russell

1
@TomRussell Nie, ten aspekt nie jest powiązany.
Hauke ​​Laging

18

BOOTING JEST TWARDY

Uruchamianie ... cóż ... to naprawdę najtrudniejsza część. Za każdym razem, gdy komputer się uruchamia, zasadniczo spotyka się na nowo. Zapoznaje się z różnymi częściami i na każdej napotkanej nabiera zdolności. Ale musi podciągać się za swoje własne paski startowe, że tak powiem, od początku za każdym razem.

Przy projektowaniu procesu rozruchu sztuką jest stopniowe uruchamianie maszyny. Twój boot musi być szybki i niezawodny, a za każdym razem muszą to być obie rzeczy w zupełnie nieznanym środowisku . Nie zapuszczę się nawet na rozmowę w trybie rzeczywistym / chronionym (co nie znaczy, że nawet mogłem) , ale przy rozruchu wiele się dzieje. Gdy komputer asymiluje różne elementy za każdym razem, gdy robi to stopniowo. Prawdopodobnie najważniejszym z nich jest przejście od wykonywania kodu pokładowego do wykonywania kodu na dysku, lub innymi słowy - jądra exec. To wtedy oprogramowanie układowe (pozornie) poddaje się systemowi operacyjnemu.

Wiele lat temu tak nie było. Kiedyś BIOS był tak naprawdę podstawowym wejściem / wyjściem - zwykłe programy wywoływały oprogramowanie układowe w celu rysowania ekranu i uzyskiwania dostępu do dysku. Były to tak zwane przerwania - stare kapelusze najlepiej pamiętają je ze względu na dreszczyk zachwytu, który często znajdowali, przypisując IRQ do nowej matrycy kropkowej lub USR.

INT13H

Jest to seria funkcji 13H przerwania ( lub INTmontażu ), które BIOS oferuje jako usługi dostępu do dysku. Są one nadal używane nawet dzisiaj w systemach BIOS w procesie rozruchu, aby przejść z oprogramowania układowego na dysk.

System BIOS sprawdzi kilka pierwszych bajtów każdego znalezionego dysku i wyszuka wzorzec, który rozpoznaje jako główny rekord rozruchowy ( lubMBR ) . Jest to de facto dziesięcioletni standard i zawiera trochę surowego, wykonywalnego pliku binarnego, który jest zapisywany na czele dysku. MBR oznacza dysk BIOS jako bootowalny. Przestanie sprawdzać, kiedy go znajdzie, a więc praktycznie wszystko, co dostajesz, bez sprytnych sztuczek. Kiedy go znajdzie, mapuje go do pamięci i wykonuje (w trybie rzeczywistym, ale wciąż tam nie idę) .

Wykonany MBR prawie na pewno nie jest twoim jądrem systemu - 512 bajtów (daj lub bierz) byłoby w tym dziale całkiem bezużyteczne. Prawdopodobnie jest to program ładujący - program zaprojektowany specjalnie w celu przezwyciężenia jednego z wielu ograniczeń adresacyjnych BIOS-u - szczególnie, że w ogóle nie rozumie żadnego systemu plików.

Kiedy bootloader odczytuje rzeczywiste jądro i wykonuje go w pamięci (jak wszyscy modlimy się za każdym razem) , prawdopodobnie zrobi to, pytając BIOS poprzez INT13Hprzerwanie połączenia. A jeśli tak się nie stanie - wielu bardziej pomysłowych programów ładujących zamontuje systemy plików w konwencjonalnym sensie i wykona kod w inny sposób - wtedy jest bardzo mało prawdopodobne, że bootloader jest tak fantazyjny bez jednego INT13Hlub dwóch. Często bootloadery muszą ładować się same - lub różne ich etapy - ponieważ 512 przydzielonych im bajtów najpierw nie odpowiada nawet ich potrzebom.

KURCZAK I JAJKO

Wszystko to jest okrągłym sposobem omawiania dysku, wiem, ale w tym momencie powinno być całkowicie jasne, że głównym problemem - można by nazwać go kurczakiem i jajkiem - jest dostęp do dysku zawierającego instrukcje programu o tym, jak uzyskać dostęp do dysków . Kluczem do tego problemu jest oprogramowanie układowe - i nadal działa na bardzo różne sposoby, nawet w systemach EFI - i, najsłabsze lub nie, oprogramowanie układowe jest najważniejszym ogniwem w łańcuchu rozruchowym.

Widzisz, gdy jądro się uruchomi i wszystkie jego niezliczone procedury dostępu i kontroli sprzętu się zainicjują, wszystkie te problemy jakby znikają (lub przynajmniej się nieco zmieniają) , ponieważ współczesne systemy operacyjne przejmują pełną kontrolę nad systemem, ale dopóki tego nie zrobią, limity systemu rozciągają się tylko na tyle, na ile pozwala oprogramowanie wewnętrzne. To wiele mówi - BIOS niewiele się zmienił od 8086. INT13HWywołanie to oryginał 8086. Tak, były (niezliczone) rozszerzenia i oczywiście hacki, ale innowacje ...?

LEPIEJ I LEPIEJ

Większość zmian w BIOSie to w najlepszym razie zwykłe bandaże. Kiedyś był to dysk twardy, który musiał być fizycznie zmapowany - do różnych i specyficznych aspektów jego geometrii odwoływano się, gdy dane były na nim przechowywane lub pobierane. Ostatecznie konwencjonalny dysk twardy urósł do rozmiaru, który tego zabraniał. Nawet tylko abstrakcyjna mapa zawierała zbyt wiele informacji, aby BIOS mógł sobie z tym poradzić. Ponieważ może działać tylko w trybie rzeczywistym, BIOS jest ograniczony do 1 MB na rejestr pamięci. Rozszerz mapę cylindra dowolną większą lub spraw, aby dowolna z jej właściwości była większa, niż można by ją rozwiązać za pomocą tak wielu bitów, a BIOS zostanie dosłownie stracony - poza granice.

Bariera ta została napotkana i przełamana wiele razy. Za każdym razem, gdy mapa jest wyodrębniana i kodowana w nowy, sprytniejszy i mniej dokładny sposób. Dlatego w dzisiejszych czasach dosłownie niemożliwe jest, aby BIOS dokładnie odwzorował dysk. Logiczne blokowanie adresowania jest obecnie de facto standardem, chociaż niektóre tłumaczenia cylindra / głowicy / sektora (lub CHS) są nadal konieczne. To, co oprogramowanie układowe na płycie głównej straciło na dokładności / odpowiedzialności, takie rozszerzenia wyodrębniły i dodały obowiązki oprogramowania układowego dysku, aby wypełnić luki.

To jest ta gra w kotka i myszkę, o której mowa w twoim pytaniu. Kiedy BIOS nie rozumie dysku przekraczającego pewien punkt ze względu na jego rozmiar, wtedy wszelkie dane, które możesz chcieć pobrać dla ciebie podczas rozruchu - takie jak bootloader lub jądro - prawdopodobnie lepiej nie znajdować się poza tym punktem. Stąd /bootpochodzi.

MOŻE BYĆ W rzeczywistości LEPSZY

W dzisiejszych czasach takie rzeczy, na szczęście, stały się nieistotne z powodu śmierci BIOS-u. Nadchodziło 30 lat, ale w ostatnich latach został w dużej mierze zastąpiony przez standard UEFI (lub EFI 2.0) . UEFI zapewnia montowanie od pierwszej chwili, inicjuje się w trybie chronionym, zawiera własny bootloader, zapewnia trwałą pamięć zmienną pamięci flash przy ponownym uruchomieniu, jest zalecany do obsługi kilku zetabajtów lub cokolwiek innego na dysk ... i wiele więcej jeszcze. Jest daleki od ideału, ale jest ogromną poprawą w stosunku do swojego poprzednika.

Nawet argumenty za wyspecjalizowanymi programami ładującymi obejmującymi szyfrowanie dysku lub warstwowe systemy plików są bez znaczenia, jeśli weźmiesz pod uwagę, że wszystkie one muszą zostać obsłużone przez jądro systemu operacyjnego, a jeśli masz zapewnione podłączenie przy starcie, zawsze masz jasne wykonano go (szczególnie biorąc pod uwagę, że jądro Linuksa w domyślnej konfiguracji jest programem wykonywalnym EFI we własnym zakresie) .

Oddzielna /bootpartycja prawdopodobnie nie powinna nadmiernie ciebie dotyczyć, a jeśli korzystasz z systemu EFI, prawdopodobnie i tak masz już partycję systemową EFI, ponieważ jest to wymagane do uruchomienia trybu EFI.


8

To, że istnieje /bootkatalog, jest ustalane historycznie, a stamtąd „naprawiane” w Hierarchii Standardów Systemu Plików . Posiadanie takiego standardu pozwala programom (i administratorom) oczekiwać określonych plików w określonych lokalizacjach. W tym przypadku pliki powiązane z procesem rozruchu.

Posiadanie /bootpartycji na początku dysku miało sens dla starszych BIOS-ów, które nie były w stanie indeksować bloków / sektorów w pełnym zakresie dostępnych napędów. Z tego powodu informacje, które powinny zostać załadowane, powinny znajdować się w sektorze, który mógłby zostać zindeksowany, stąd oddzielna partycja (o niskich numerach sektorów), /bootz której BIOS mógłby załadować dodatkowe dane / programy (które z kolei były w stanie zająć się pełnym zakres płyt bez korzystania z BIOS-u).


6

Może być również bardzo uporządkowane posiadanie osobnej partycji / boot. Na moim komputerze mam wiele dystrybucji i kopii zapasowych, każda na osobnych partycjach, ale wszystkie mają tę samą partycję / boot, gdzie znajdują się wszystkie jądra wszystkich systemów operacyjnych. Ponadto wszystkie dystrybucje wskazują moją jedyną kopię pliku lilo.conf, który jest również w katalogu / boot, więc nigdy nie muszę zgadywać, co się dzieje, gdy dodam jądra, dodam dystrybucje, cokolwiek. Oto wycinek z mojego 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

... to tylko moje kopie zapasowe Debiana na dwóch dyskach. Widzisz, jak łatwo jest śledzić jądra? (obecnie wszystkie kopie zapasowe używają tego samego jądra).


5

Chociaż w nowoczesnych systemach dostęp do sektorów pliku można uzyskać z dowolnego miejsca na dysku, nadal sensowne jest ograniczenie materiałów rozruchowych do własnej partycji rozruchowej, po prostu z zasady „nie wkładaj wszystkich jajek do jednego koszyka”.

Załóżmy, że główny system plików jest uszkodzony w taki sposób, że jakiś bootloader niższego poziomu nie jest w stanie poprawnie odczytać następnego etapu. Jeśli zamiast tego materiały bootloadera znajdują się na własnej partycji, jądro może uruchomić się i poprawnie poradzić sobie z uszkodzoną partycją root poprzez fsck. To samo może znajdować się we własnej partycji.

Partycja rozruchowa może dać ci opcje „ratowania”, takie jak zamontowanie alternatywnej partycji root. A co, jeśli uruchomisz wiele systemów operacyjnych na różnych partycjach? Zatem materiały rozruchowe nie należą do żadnego z tych systemów. Rozsądne jest, aby mieć własną partycję. Możesz zastąpić dowolną partycję systemu operacyjnego innym systemem operacyjnym, ale możesz uruchomić pozostałe systemy operacyjne.

A co jeśli chcesz użyć systemu plików na głównej partycji, którego bootloader w ogóle nie rozumie? Lub, powiedzmy, dla których obsługa po stronie programu ładującego jest tylko eksperymentalna? W takich sytuacjach plik czasu rozruchu może być nadal używany, jeśli istnieje mapa sektorów (a moduł ładujący obsługuje taką funkcję: stary dobry moduł ładujący Linuksa LILO używał map sektorów, więc nie musiał rozumieć systemu plików struktura w ogóle). Ale mapy sektorowe są z natury niestabilne. Jeśli system plików zostanie zreorganizowany, sektory poruszają się, dlatego mapy sektorów stają się niepoprawne i muszą zostać zregenerowane, w przeciwnym razie system nie będzie mógł zostać ponownie uruchomiony.

Wreszcie, istnieje zasada organizacyjna, że ​​nawet jeśli nie masz rzeczywistej partycji, nadal dobrym pomysłem jest, aby wszystkie elementy rozruchowe były przynajmniej poniżej /booti nie były rozproszone nigdzie indziej.


5

To nie było ograniczenie dystrybucji Linuksa, ale było to ograniczenie starszych BIOSów. W tamtych czasach, aby Linux mógł się uruchomić, wszystkie pliki związane z uruchamianiem zostały umieszczone na własnej partycji, która stała się pierwszą partycją na dysku twardym, aby upewnić się, że moduł ładujący mieści się w pierwszych 1024 cylindrach. Utwórz partycję mniejszą niż rozmiar znaleziony w 1024 cylindrach (różni się w zależności od dysku twardego) Ale jeśli utworzysz pierwszą partycję, która jest większa niż ta granica, istnieje prawdopodobieństwo, że pliki modułu ładującego rozruchu znajdą się poza 1024 cylindrami, a BIOS nie będzie mógł ich załadować.

Możesz również osiągnąć ten sam efekt, tworząc dwie małe partycje, obie leżące w pierwszych 1024 cylindrach, i umieszczając wszystkie pliki modułu ładującego rozruch na drugiej.


4

Kolejnym powodem, dla którego bootpartition jest obecnie:

  • ładowanie z NFS lub NBD
  • zaszyfrowana partycja root
  • / boot współdzielił między różnymi dystrybucjami
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.