Jak Linux / xBSD uruchomił się przed GRUB?

23

Według Wikipedii , GRUB został wydany w 1995 roku. W tym momencie Linux i xBSD istniały przez kilka lat. Wiem, że wczesne wersje Uniksa były związane ze sprzętem w latach 70. i 80., ale Linux i xBSD mogły swobodnie dystrybuować i instalować. Co nasuwa pytanie, jak wtedy ładowałbyś Linuksa? Czy dystrybucje były dostarczane z własnymi implementacjami programów ładujących?

Sergiy Kolodyazhnyy
źródło
32
Umm ... Nie było cię, kiedy LILO był jedynym programem ładującym Linuksa? I nigdy nie korzystałem z LILO ani Gruba na moich systemach BSD. Który jesteś zainteresowany? Zobacz np biosboot(8).
Kusalananda
8
@Kusalananda Niestety, bardziej zależało mi na zabawkach i rysowaniu Żółwi Ninja niż na rurach, egzekucjach i pociskach :) Interesuje mnie ogólna historia, a nie konkretny bootloader. Z połączonej strony widzę, że OpenBSD ma biosbootdwie architektury: i386 i amd64. Czy to oznacza, że ​​OpenBSD musiał specjalnie ukierunkować się na architekturę zamiast mieć jedno narzędzie ujednolicające?
Sergiy Kolodyazhnyy
1
Program ładujący pierwszego etapu byłby inny dla każdej architektury (tylko i386 i amd64 i tak mają BIOS „bios”). Spójrz na NetBSD, jeśli interesujesz się bardziej egzotycznymi architekturami niż standardowy komputer bagienny.
Kusalananda
3
@Kusalananda Nie sądzę, że LILO był kiedykolwiek jedynym programem ładującym Linuksa. O ile wiem, moduł ładujący wbudowany w obrazy jądra jest wcześniejszy niż LILO, a do czasu, gdy wsparcie dla wbudowanego modułu ładującego zostało przerwane, w okolicy było co najmniej kilka innych programów ładujących.
kasperd
2
LILO był domyślnym programem ładującym dla wielu dystrybucji aż do początku 2000 roku
phuclv

Odpowiedzi:

51

Pierwsza dystrybucja Linuksa, której użyłem w latach 90. ( Slackware 3.0IIRC), używała LILO jako bootloadera. I wiele dystrybucji używanych LILOprzez lata, nawet gdy GRUBstawało się „domyślnym” bootloaderem.

Co więcej, we wczesnych latach Linuksa powszechne było uruchamianie Linuksa z innego systemu operacyjnego (np. DOS lub Windows) zamiast polegać na bootloaderze / podwójnym uruchamianiu. Na przykład był loadlin .

Nie zapomnij o Syslinux , który jest prostszym programem ładującym często używanym do dystrybucji USB z instalacją / odzyskiem. Lub Isolinux (z tego samego projektu) używany przez wiele dystrybucji „Live”.

Należy pamiętać, że dziś GRUBmożna go używać do ładowania wielu systemów operacyjnych, choć LILObył bardziej ograniczony i specjalnie ukierunkowany na Linuksa (tj. LInux LOader), z pewną obsługą podwójnego uruchamiania systemu Windows.
GRUBjest bardzo przydatny do uruchamiania podwójnego / wielokrotnego ze względu na wiele konfigurowalnych opcji, możliwości skryptów itp.
Jeśli chcesz mieć tylko jeden system operacyjny na swoim komputerze, „dowolny” (tj. którykolwiek bootloader jest domyślny dla twojej dystrybucji Linux / BSD) powinien być wystarczającym.

Pan Shunz
źródło
5
@ MrShunz: w tym czasie nie było UEFI. Ładowanie systemu Windows polegało tylko na dodaniu wpisu np. other=/dev/hda1Z table=/dev/hdado lilo.conf, a Lilo po prostu przeniósł kontrolę do sektora rozruchowego na hda1, wiedząc, że tablica partycji będzie na hda.
ninjalj
2
Kiedyś byłeś w stanie uzyskać NTLDR do ładowania LILO; patrz jaeger.morpheus.net/linux/ntldr.php ; Odkryłem to samo niezależnie, w ciągu dnia.
Roger Lipscombe
2
Minusem podejścia LILO jest to, że psuje się, jeśli położenie dysku plików do załadowania zmienia się. W szczególności oznacza to, że po każdej aktualizacji jądra LILO musiał zostać ponownie zapisany w lokalizacji rozruchowej (MBR lub sektor rozruchowy partycji).
płyn do płukania
1
@plugwash: GRUB ma ten sam problem z plikiem drugiego etapu. Różnica polega na tym, że 1) „drugim etapem” LILO było jądro, więc były to aktualizacje jądra, a nie aktualizacje LILO, które coś zepsuły; oraz 2) Aktualizacje GRUB obejmują automatyczne ponowne zapisanie lokalizacji drugiego etapu do MBR (z drugim etapem następnie ładowanie jądra Linux, z pełną znajomością systemu plików, więc lokalizacja jądra nie ma znaczenia). ;-)
DevSolar
1
Grub IIRC będzie, jeśli to możliwe, przechowywać „etap 1.5”, który rozumie system plików między MBR a pierwszą partycją i będzie uciekał się do przechowywania odwołania do określonych sektorów systemu plików, jeśli nie ma miejsca na etapie 1.5 (lub jeśli instaluje się w sektor rozruchowy partycji zamiast MBR)
plugwash
28

LILO był de facto standardem do uruchamiania Linuksa na komputerach PC przed Grubem, od bardzo wczesnego etapu (korzystała z niego MCC, jedna z pierwszych dystrybucji Linuksa). Różne inne programy ładujące były używane jednocześnie. Loadlin był dość powszechny; uruchomił Linux z DOS, a nawet był używany w niektórych konfiguracjach umsdosdo hostowania środowiska Linux w systemie plików DOS ... Inna typowa konfiguracja w ogóle nie wymagała bootloadera: jądro mogło się uruchomić z dyskietki i większość Użytkownicy Linuksa trzymali dobrze znaną parę dyskietek „bootujących i rootujących”, jedną zawierającą jądro, a drugą podstawowy system plików root do celów ratunkowych.

Istnieje wiele sposobów wykorzystania programów ładujących innych systemów operacyjnych do uruchamiania Linuksa; na przykład menedżer rozruchu systemu OS / 2 lub NTLDR systemu Windows NT.

Inne systemy miały własne programy ładujące:

  • SILO w SPARC (stacje robocze Sun i inne);
  • PALO na PA-RISC (stacje robocze HP);
  • YaBoot i Quik na PowerPC;
  • aBoot i MILO na Alpha ...

Nawet dzisiaj Grub nie jest jedynym bootloaderem, jaki zobaczysz. Chociaż rozruch jądra bezpośrednio z dyskietki nie jest już bardzo przydatny (nie sprawdziłem, czy nadal jest to możliwe, zakładając, że można zbudować jądro wystarczająco małe, aby zmieściło się na dyskietce), może ono uruchamiać się bezpośrednio z EFI (co w rzeczywistości jest jego własny mały system operacyjny zaprojektowany do ładowania innych systemów operacyjnych, podobnie jak Grub). Na wielu mniejszych systemach (systemy wbudowane, komputery jednopłytkowe ...) znajdziesz U-Boot . (Jest też warstwa EFI dla U-Boota ).

Stephen Kitt
źródło
Architektura PowerPC jest również interesująca, ponieważ niektóre płyty główne miały kompletny BIOS firmy Turing - Openfirmware (w zasadzie język programowania Forth z niektórymi preinstalowanymi funkcjami). To pozwoliło na uruchomienie bezpośrednio z BIOS-u bez bootloadera, jeśli wiesz, jak skonfigurować BIOS
slebetman
Hej, po prostu ciekawy, NTLDR może bezpośrednio ładować jądro Linuksa? Słyszałem, że NTLDR może ładować łańcuch grub4dos, a następnie ładować jądro Linuksa.
炸鱼 薯条 德里克
@slebetman: Dokładniej, OpenFirmware został opracowany przez Sun dla SPARC, a następnie przyjęty przez sojusz PowerPC (IBM, Apple, Motorola) dla architektury referencyjnej PowerPC, a konkretnie przez Apple dla komputerów Macintosh opartych na PowerPC. Jednym z potężnych aspektów było to, że proste sterowniki mogły być przechowywane w układach ROM na kartach rozszerzeń lub w jakimś wyznaczonym obszarze rozruchowym dysku twardego, a ponieważ zostały zapisane w kodzie bajtowym względem znanego określonego ABI, działałyby niezależnie od tego, który procesor architektura i system operacyjny, które próbujesz uruchomić.
Jörg W Mittag
Np. Możesz mieć adapter RAID, który ma sterownik OpenFirmware w układzie ROM, następnie środowisko OpenFirmware może użyć tego sterownika do uzyskania dostępu do RAID, wewnątrz RAID, może istnieć inny sterownik dla formatu tablicy partycji, który pozwoliłby środowisku OFW aby znaleźć partycje, na początku każdej partycji byłby sterownik OFW dla systemu plików, który pozwoliłby systemowi OFW znaleźć jądro, a jądro miałoby mały bootloader zapisany w kodzie bajtowym OFW na początku.
Jörg W Mittag
GRUB może działać w podobny sposób, ale różnica polega na tym, że wszystkie te sterowniki muszą być napisane specjalnie dla GRUB, podczas gdy pięknem OFW było to, że urządzenie przyniosło ze sobą sterowniki, co oznacza, że ​​nawet urządzenia, które jeszcze tego nie zrobiły istnienie, gdy środowisko OFW zostało napisane, działałoby po prostu „magicznie”. UEFI może również działać w podobny sposób, ale jego „przenośny format kodu bajtowego” jest zasadniczo podzbiorem DOS, co jest głównym powodem, dla którego Itaniums nadal potrzebuje emulatora x86.
Jörg W Mittag
12

W jądrze w połowie wersji 2.6 jądro x86 można było uruchomić bezpośrednio, jeśli zostało skopiowane na dyskietkę (jakby to był obraz dysku).

W rzeczywistości był to oryginalny sposób uruchamiania Linuksa.

Jeśli spojrzysz dzisiaj na nagłówek jądra x86, zobaczysz komunikat o błędzie, który mówi, że uruchamianie z dyskietek nie działa.

Jozuego
źródło
2
Z drugiej strony jądro x86 można teraz uruchomić bezpośrednio, jeśli zostanie ono dostarczone do oprogramowania układowego UEFI. Więc przed jądrem jest jeszcze dołączony
skrót
@grawity: Czy na pewno nie masz na myśli x64?
Joshua
1
@Joshua: Nie jestem pewien, co przez to rozumiesz. EFI nie wykonuje tej części jako kodu.
grawity
2
@Joshua co? Jest to „DEC BP”, „POP DX” w trybie 16-bitowym (EBP / EDX w trybie 32-bitowym). Ale i tak nie należy go wykonywać; Pliki binarne EFI to pliki PE (co oczywiście nie ma znaczenia, jeśli jest zapisane w sektorze rozruchowym ...).
Stephen Kitt
1
@Joshua OK, ale to nie jest niezdefiniowane zachowanie x86 ;-). (Myślę o „niezdefiniowanym zachowaniu x86” jako o kodach, których zachowanie nie jest zdefiniowane, a nie niezdefiniowane zachowanie platformy.)
Stephen Kitt
5

Zacząłem od Linuksa pod koniec lat 90. i jak wspomniano, lilobył domyślny. Jeśli chcesz podwójnego rozruchu z systemem DOS, możesz uruchomić goły rozruch bez ładowania rzeczy do HIMEM lub ładowania sterowników CD itp. I używania loadlin. W przypadku podwójnego uruchamiania Win95, możesz najpierw uruchomić dysk z DOS, a następnie zainstalować program „95”, a moduł ładujący „95” pozwoli ci nadal uruchamiać jądro DOS, a następnie będziesz mógł go użyć loadlin.

W przypadku podwójnego uruchamiania za pomocą NT4 sztuczka polegała na zapisaniu LILO na /partycji, a następnie usunięciu pierwszych 512 bajtów za pomocą dd( dd if=/dev/sda2 of=/path/to/file bs=512 count=1) i umieszczeniu pliku wynikowego w miejscu, w którym ntldrmożna go zobaczyć, i można go użyć z modułu ładującego WinNT. Problem z robieniem tego polega na tym, że po aktualizacji jądra musiałeś pamiętać o powtórzeniu wszystkich kroków przed ponownym uruchomieniem, w przeciwnym razie będziesz miał problemy z powrotem do systemu Linux. Ten sam proces działał z Win2k.

Dzięki LILO przy każdej aktualizacji jądra trzeba pamiętać o aktualizacji LILO.

Za loadlinkażdym razem, gdy jądro jest aktualizowane, trzeba pamiętać o skopiowaniu jądra na partycję DOS.

Inną opcją wskazaną w innych odpowiedziach było zapisanie jądra bezpośrednio na dyskietce, dd if=/path/to/vmlinuz of=/dev/fd0ALE urządzenie root musiało być poprawnie ustawione w jądrze, albo w czasie kompilacji, albo za pomocą rdevnarzędzia.

Kiedy się GRUBpojawił, było wiele radości, ponieważ nie trzeba już było pamiętać o aktualizacji LILO, aktualizacji LILO i ponownym usunięciu informacji o rozruchu itp. Nigdy więcej nie opuszcza systemu Linux, ponieważ zapomniałeś zaktualizować moduł ładujący informacje ...

ivanivan
źródło
Wygląda na to, że to była cała praca i duża szansa na pozostawienie maszyny bez rozruchu, ale zdecydowanie doświadczenie edukacyjne
Sergiy Kolodyazhnyy
@SergiyKolodyazhnyy tak, i nie było tak wielu informacji w Internecie, ani wielkich wyszukiwarek, aby je znaleźć, gdyby tam były. Było kilka dystrybucji ratunkowych pojedynczej dyskietki, które miały wystarczająco dużo Linuksa, aby uruchomić i naprawić LILO itp. Przeszliśmy długą drogę!
ivanivan
Uruchamianie make installdziałałoby /sbin/lilo, więc tak naprawdę nie musiałeś ręcznie niczego aktualizować (i tak może być nadal, jeśli masz lilozainstalowany). To może być kwestia opinii, ale grubwręcz przeciwnie, nie pamiętam dużo radości . I lilo(przynajmniej w wersji z 1999 roku) może dobrze podwójnego rozruchu systemu Windows, bez potrzeby loadlin.
mosvy
0

A przed LILO i GRUB-em trzeba było uruchomić go z wiersza poleceń za pomocą niestandardowego programu ładującego.

Jako przykład Amiga miała dostępnego Linuksa. Trzeba było użyć narzędzia wiersza polecenia o nazwie amiboot, aby załadować ELF jądra do pamięci i przejść do niego.

Oto wideo osoby używającej amiboot z wiersza poleceń, aby uruchomić system Linux na Amiga 600 . Jego skrypt StartInstall wywołuje plik wykonywalny amiboot. Możesz obserwować konfigurację pamięci amiboot, ustalić pożądany adres ładowania i przekazać parametry do jądra około 0:55.

BoredBsee
źródło