Odkrywamy Gruba nowej generacji 19


Od Redakcji: artykuł pochodzi z marcowego wydania Linux Magazine. Kompletną listę artykułów możecie znaleźć na stronach miesięcznika.

Grub pojawił się wiele lat temu jako alternatywa dla popularnego menedżera startu Lilo (Linux Loader) i stał się standardowym narzędziem służącym do ładowania i uruchamiania systemów linuksowych. Wielu użytkowników kojarzy Gruba z menu uruchomieniowym, które pojawia się podczas startu komputera, jednak nawet jeśli nie korzystamy z menu, Grub wciąż wykonuje swoją pracę – znajduje jądro i ładuje je, przekazując kontrolę systemowi operacyjnemu.

Standardowy GNU Grub opiera się na oryginalnym Grubie (ang. Grand Unified Loader) napisanym przez Ericha Stefana Boleyna. Grub dobrze służył społeczności przez ostatnie lata, dało się jednak zauważyć oznaki starości. W kodzie pojawiło sie sporo komplikacji w związku z implementacją nowych funkcji. Wciąż brakowało jednak obsługi pewnych specyficznych opcji niezbędnych w nowej generacji komputerów.

W ramach projektu o wdzięcznej nazwie Pupa (ang. Preliminary Universal Programming Architecture for GNU Grub) [1] zaistniała inicjatywa badawcza (sponsorowana przez japońską Agencję Promocji Technologii Informacyjnych), której celem było przeprojektowanie i tchnięcie nowego życia w Gruba. Programiści GNU podjęli inicjatywę i wydali nową wersję Gruba opartą na Pupie.

Grub 2 [2] zaczyna się pojawiać w nowych wersjach głównych dystrybucji Linuksa (jeżeli jeszcze nie ma go w tej, której używamy, na pewno ujrzymy go w jej kolejnym wydaniu). Według projektu GNU Grub 2 został przepisany od zera, by można było przebudować kod pod kątem modularności i przenośności.

Jakie cele przyświecają Grubowi 2?

  • Obsługa skryptów.
  • Graficzny interfejs, który zastąpi menu tekstowe.
  • Dynamiczne ładowanie modułów, by rozszerzanie zestawu funkcji możliwe było również w czasie działania programu, a nie tylko jego kompilacji.
  • Przenośność.
  • Internacjonalizacja, w tym obsługa znaków spoza zestawu ASCII.
  • Zarządzanie pamięcią z prawdziwego zdarzenia.
  • Modułowa architektura.
  • Instalacja międzyplatformowa.
  • Tryb ratunkowy dla systemów, których nie daje się uruchomić.
  • Poprawki poprzednich błędów projektowych.

Rezultatem jest prostsza struktura o modułowej budowie, a w menu – znaki narodowe. Dodajmy do tego ekran graficzny, którego wygląd możemy w łatwy sposób modyfikować.

Grub 2 w Ubuntu

Pierwsze próby udostępnienia Gruba 2 napotkały spore trudności. Na przykład W Ubuntu 9.10 Karmic Koala pojawił się Grub w wersji 1.97 beta 4 [3] i wielu użytkowników zgłosiło problemy, również z uruchamianiem systemu. Na wiki Ubuntu znajdziemy rozwiązania wielu takich przypadków. Jeden z nich dotyczy zabezpieczenia hasłem: błąd polegał na ominięciu blokady – wystarczyło odgadnąć pierwszą literę hasła [4]. Programiści naprawili go już i wydali nową wersję. Ponieważ to poważna luka w zabezpieczeniach, warto zawsze zwracać uwagę na poprawki związane z bezpieczeństwem.

Ubuntu 9.10 pozwala na pełną migrację na Gruba 2. Mimo to można się spodziewać utrudnień, zwłaszcza w przypadku aktualizacji z Ubuntu 9.04 [5]. Tak czy inaczej, jeżeli chcemy zainstalować Gruba 2 na poprzedniej wersji Ubuntu (lub na innej dystrybucji z Aptem), wydajemy w terminalu następujące polecenie:

sudo apt-get install grub2

Następnie instalujemy pakiet grub-pc, który zależy od grub-common. W tym momencie mamy już wszystkie wymagane pliki. Podczas instalacji pojawia się okno informujące nas, że zainstalowany jest Grub Legacy, czyli poprzednia wersja programu. Zatwierdzamy wprowadzone zmiany przyciskiem OK, zaś w kolejnym oknie naciskamy Yes, by dodać wpis do menu, w którym możemy przetestować Gruba.

Następnie skrypt instalacyjny rozpoznaje opcje startowe w bieżącej konfiguracji gruba i wyświetla je do edycji. W ten sposób w systemie zainstalowane zostają dwa menadżery startu, choć po uruchomieniu komputera ujrzymy tylko stare menu z nową pozycją: Grub 2.

Po wybraniu tej opcji przechodzimy do nowego menu Gruba 2. Jeżeli wszystko działa, jak należy, możemy otworzyć terminal i wydać polecenie:

sudo upgrade-from-grub-legacy

System prosi nas o wybranie urządzenia, z którego będziemy uruchamiali system. Wybieramy je spacją. Uwaga: pomyłka w tym miejscu może mieć nieprzyjemne skutki – po uruchomieniu systemu ujrzymy Error 15 (nie odnaleziono urządzenia startowego). W tej sytuacji powinniśmy uruchomić system live, zamontować główną partycję w mnt, a następnie użyć poniższych poleceń, by zamontować system plików /dev i przejść do systemu chroot:

sudo mount --bind /dev /mnt/dev

sudo chroot /mnt

Kolejnym krokiem jest użycie polecenia dpkg-reconfigure grub-pc, dzięki któremu przechodzimy do procedury konfiguracji Gruba 2. Po wybraniu właściwej pozycji opuszczamy środowisko chroot kombinacją [Ctrl]+[D], po czym odmontowujemy system plików i restartujemy komputer.


Rysunek 1: Ubuntu 9.10 było pierwszą znaną dystrybucją promującą Gruba 2.

Nowa struktura

W poprzedniej wersji Gruba, jeżeli chcieliśmy dodać do menu nowy spis lub zmienić istniejący, musieliśmy otworzyć w edytorze plik /boot/grub/menu.lst i zmodyfikować go. W Grubie 2 nie jest to już niezbędne.

Choć w katalogu /boot/grub nadal znajdziemy plik grub.cfg, zawiera on jedynie konfigurację utworzoną poleceniem update-grub. Programiści nie zalecają ręcznej modyfikacji tego pliku.

Grub 2 wykonuje wiele kroków automatycznie. Istnieją skrypty pomocnicze, które przeszukują partycję pod kątem znanych systemów operacyjnych i tworzą odpowiednie wpisy bez potrzeby interakcji ze strony użytkowników. W wielu przypadkach sprawdza się to znakomicie (na przykład Windows + Linux).

W nowej wersji zmieniła się także struktura plików i katalogów (Tabela 1). W Debianie i Ubuntu możemy użyć /etc/grub/default, by zdefiniować opcje ogólne programu. Da się na przykład w razie konieczności wyłączyć opcję, która wymaga, byśmy podali identyfikator UUID partycji, z której uruchamiamy system (GRUB_DISABLE_LINUX_UUID=true). Oznacza to, że możemy nadal używać znajomych nazw urządzeń.

UUID

UUID to uniwersalny, unikalny identyfikator (ang. Universally Unique Identifier). Składa się z szesnastu bajtów – zwykle pięć grup liczb szesnastkowych. Ze względu na ogromną liczbę kombinacji, prawdopodobieństwo wystąpienia dwóch takich samych UUID-ów jest praktycznie zerowe, co eliminuje się potrzebę centralnego ich przydzielania.

/boot/grub/grub.cfg	Centralny plik konfiguracyjny Gruba 2, tworzony automatycznie

/etc/default/grub	Opcje ogólne (bez pozycji menu)

/etc/grub.d	Katalog ze skryptami pomocniczymi służącymi do identyfikacji partycji i znajdujących się na nich systemów operacyjnych. Możemy zresztą tworzyć własne skrypty, służące do dodawania kolejnych pozycji w menu w razie potrzeby.

Tabela 1: Plik i katalogi

Większość opcji nie zainteresuje użytkowników. Może oprócz jednej: gdy przytrzymamy klawisz [Shift], ujrzymy menu, którego nie zobaczylibyśmy normalnie. Dzięki temu możemy ręcznie zmodyfikować konfigurację, zwłaszcza jeśli natrafimy na błąd.

Dodawanie wpisu w menu

Instalatory Linuksa zwykle tworzą nowy wpis w menu przy instalacji systemu, czasem jednak coś pójdzie nie tak. Bywa, że część naszej konfiguracji umknęła mechanizmowi wykrywającemu (egzotyczny system operacyjny?) albo musimy dodać szczególny parametr konfiguracyjny.
Zanim jednak zaczniemy wprowadzać zmiany do konfiguracji Gruba 2, musimy poznać mechanizm działania programu. Kiedy Grub jest uruchamiany, wywołuje wszystkie skrypty w katalogu /etc/grub.d/ (zakładając, że ustawiliśmy wcześniej właściwe prawa dostępu poleceniem sudo chmod u+x nazwa_skryptu. Skrypty systemowe będą miały odpowiednie praw ustawione domyślnie.

Liczby w nazwie pliku zapewniają właściwą kolejność uruchamiania. Na Listingu 1 widzimy zawartość przykładowego skryptu startowego. Uruchamia on płytę ratunkową z dysku twardego.

echo "Zmodyfikowany wpis do uruchomienia płyty ratunkowej w formie obrazu" >&2

cat << EOF

menuentry "Uruchamianie płyty ratunkowej" {

        set root=(hd0,10)

        linux   /sysrcd/rescuecd subdir=sysrcd setkmap=de

        initrd  /sysrcd/initram.igz

}

EOF

Listing 1: Własny skrypt startowy

Opcja set root=(hd0,10) jako główną ustawia dziesiątą partycję na pierwszym dysku twardym. W nowej wersji partycje liczymy od 1 zamiast od 0, jak poprzednio. Polecenia linux i initrd pozwalają zdefiniować ścieżki do jądra i początkowego dysku RAM; dwa parametry przekazywane są do jądra. Poprzednia wersja, Grub Legacy, korzystała ze słowa kluczowego root; nowa korzysta ze zmiennej. Kompletną listę poleceń Gruba 2 możemy znaleźć na stronie [6].

Wizualne usprawnienia

Kiedy uruchamiamy komputer, zwykle pojawia się dwukolorowe menu. Dodanie koloru wymaga wykonania kilku czynności. Jako tła możemy użyć obrazków w formacie PNG lub TGA. W Ubuntu wystarczy skopiować obrazki do folderu /usr/share/images/grub/. Pakiet z obrazkami instalujemy na dysk poleceniem sudo apt-get install grub2-splashimages.
Teraz wystarczy jedynie poinstruować Gruba, z których obrazów ma korzystać. W tym celu użyjemy innego pliku startowego w /etc/grub.d/; w Debianie i Ubuntu plik ten nosi nazwę 05_debian_theme. Szukamy wiersza 16., tak jak to widzimy na Listingu 2. Teraz modyfikujemy ścieżkę i nazwę pliku, by odpowiadała naszemu systemowi. Nie zapomnijmy na koniec wydać polecenia update-grub. Rezultat możemy obejrzeć na Rysunku 2.


Rysunek 2: Dodajemy obrazek tła do menu.

#!/bin/bash -e

source /usr/lib/grub/grub-mkconfig_lib

set_mono_theme()

{

  cat << EOF

set menu_color_normal=white/black

set menu_color_highlight=black/white

EOF

}

# sprawdzamy dostępne tła

use_bg=false

if [ "$GRUB_TERMINAL_OUTPUT" = "gfxterm" ] ; then

  for i in {/boot/grub,/usr/share/images/desktop-base}/moreblue-orbit-grub.{png,tga} ; do

    if is_path_readable_by_grub $i ; then

      bg=$i

Listing 2: Wybór obrazka

Wnioski

Grub 2 zawiera wiele nowych, użytecznych funkcji, choć najprawdopodobniej użytkownicy nie zwrócą uwagi na większość z nich. Trudno jednak pominąć graficzne menu, które znacznie zwiększa estetyczne walory pulpitu, mimo że sam proces uruchamiania systemu przebiega zasadniczo w ten sam sposób.

Tak czy inaczej prace nad Grubem 2 wciąż trwają. Struktury kontrolne i modułowa budowa sprawiają, że konfiguracja jest bardziej elastyczna. Warto więc śledzić rozwój tego programu.

INFO

Autor: Andreas Bohle

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

19 komentarzy do “Odkrywamy Gruba nowej generacji

  • Scofield1

    Bardzo dobry artykuł, ale przydałaby się instrukcja jak dodać do menu jeden wpis, który po jego wybraniu przeniesie nas do gruba innego systemu, w którym można wybierać kolejne wpisy dotyczące tego konkretnego systemu.

  • sylkis

    wywal z pliku konfiguraycjnego z lista systemow wpisy memtestowe 😉 nie pamietam juz dokladnie jak sie ow pliczek nazywal (pewnie grub.conf albo cos w tym stylu, w kazdym razie troche inaczje niz we wczesniejszych wersjach), a sam pliczek znajduje sie…w katalogu z grubem 🙂

  • jimmy

    Wszystko fajnie, tylko jak zrobić, żeby po każdej aktualizacji jądra, jak dodaje nowe wpisy usuwało stare? Bo po roku ma się długaśną listę która nie mieści się na ekranie, a usuwanie wpisów samemu jest mało przyjemne.

  • djinsekt

    A może mi ktoś powiedzieć bo już od bardzo dawna szukam informacji na ten temat jak zmienić nazwy wpisów wyświetlanych przy starcie programu bo denerwują mnie obecne,gdyż są zbyt długie i nieczytelne jak dla mnie. Pozdrawiam

  • QkiZ

    Grub2 daje rade na kompie z dwoma systemami i jednym dyskiem. Gorzej jak masz dwa dyski, różnego typu. grub2 potrafi się ładować 10 sekund. osobiście polecam burg’a.

  • amrek

    GRUB kojarzy mi się z grubiaństwem i żadne upiększanie go rysunkami nic nie da. Jestem na początku drogi z Ubuntu 9.10 +KDE. Gdy zainstalowałem Linuxa razem z WinXP, miałem w menu wypisane dwa systemy do wyboru. Jednak po kliknięciu na Ubuntu i tak pojawiał się GRUB, co było denerwujące, bo od razu powinien pojawiać się ekran logowania. Teraz mam Ubuntu na osobnej partycji, a lista w GRUB zajmuje już 1/2 ekranu. GRUB powinien zawierać ogólne nazwy dostępnych systemów(tak jak tworzy to Windows), a wybór starszych kerneli i memtestów powinien być dostępny podczas logowania. Byłoby przejrzyście i mniej klikania. Proste? Proste.

  • mlody969

    mnie w grubie denerwuje to, że lista robi się coraz dłuższa. miałem 2 systemy do wyboru, XP i Ubuntu a na liście 15 opcji do wyboru. szkoda też że trzeba się nagimnastykować aby gruba do końca wywalić

  • majsza

    Odinstalowanie starych kerneli poprzez Synaptic nazywasz gimnastyką? Mam rozumieć, że po osinstalowaniu starych kerneli pozostał Ci ten sam grub, co miałeś? hmmm…

  • mlody969

    Ja nie mówie o kernelach. Kumpel kiedyś instalował Linuxa, obok windowsa. Później zrezygnował i został na samej windzie. Nestety, cały czas przy rozruchu, mimo formata mu linuxowe nazwy śmigają.

    A co do innych kerneli: myśle że to powinno być domyślnie. Załóżmy mam na dysku windows i ubuntu. Powinien wyświetlać tylko dwie pozycje, a wybór kernela powinien być dodatkową opcją a nie domyślną.

  • cru5h

    mlody96

    Aby usunąć gruba na stałe jeśli jest w MBR dysku, wystarczy uruchomić instalator windy i przy opcjach uruchamiania wybrać naprawę (klawisz R) i następnie wykonać polecenie w konsoli:

    fixmbr

  • fredzio

    Co do wpisów w Gubie,to jeśli chcemy aby nam wyświetlał tylko to co chcemy,bez mem:test itd to
    -Wchodzimy po kolei:
    +system plików
    +boot
    +grub(z prawami roota-właściwości,otwórz jako administrator)
    +otwieramy pliczek <> np.programem :gedit(jest on chyba domyślnym)i zaczynamy kasować to czego nie chcemy aby nam pokazywał GRUB przy rozruchu,jest tam nawet widoczny Windows jeśli go mamy.Jest to chyba najprostszy przewodnik dla początkujących użytkowników Ubuntu.Mam nadzieję że mogłem pomóc.
    siemka…

  • Sw

    Aby zredukować listę tego co jest w grubie, nalezy usunąć stare kernele. Usunięcie kerneli w odpowiedni sposób spowoduje także aktualizację GRUBa 2.
    Tu jak usunąć kernele w bezpiecznie:

    http://simpledistro.pl/usuwanie-starych-kerneli-z-ubuntu/

    Co więcej, radzę zajrzeć do /etc/fefaults/grub

    i zmienić wartość tej linii na false

    #GRUB_DISABLE_LINUX_RECOVERY=”true”

    a następnie uruchomić update-grub, jeżeli chcemy wyłączyć dodatkowe wpisy w liście menu GRUBa 2

    pozdrawiam
    S.Wojnowski
    http://wojnowski.net.pl

  • sdcf

    grub2 totalny syf po kiego to wszystko ?
    mnie wystarczało lilo

    gnoją tego linuchga ciągle, non stop zmiany do dupy, zupełnie zbyteczne

    chyba MS im płaci za psucie linucha