Pendrive multiboot z GRUB2 i obrazami ISO różnych dystrybucji Linux

Spis treści

Obrazy ISO różnych dystrybucji Linux, szczególnie te live, bywają niezastąpione w sytuacjach kryzysowych. Dzięki takiej płytce CD/DVD czy pendrive (może być też i karta SD) można wybrnąć nawet z najgorszych opresji bez potrzeby rezygnowania przy tym z graficznego środowiska pracy podłączonego do internetu. Zwykle jednak użytkownicy są stawiani przed wyborem systemu, który mogą sobie wgrać na zewnętrzny nośnik, by w późniejszym czasie przeprowadzać ewentualne prace naprawcze. Chodzi generalnie o fakt, że taki obraz ISO czy IMG przy wgrywaniu konsumuje całe urządzenie bez względu na jego rozmiar, i tak mając 32G pamięci na flash możemy wgrać w zasadzie tylko jeden obraz, np. Debiana, a by wgrać obraz Ubuntu, to już trzeba albo osobnego pendrive albo nadpisać ten poprzednio wgrany obraz. Takie rozwiązanie jest mało praktyczne i też generuje koszty. Na szczęście można stworzyć boot'owalny pendrive (w oparciu o GRUB/GRUB2), na którym można umieścić dowolną ilość obrazów ISO i w fazie rozruchu wybrać sobie ten system, który nas interesuje, a wszystko dzięki projektowi GLIM (GRUB Live ISO Multiboot).

Czym jest GLIM

GLIM to w zasadzie kawałek prostego skryptu shell'owego (bash), który ma za zadanie umożliwić nam wykorzystanie odpowiednio sformatowanego wcześniej nośnika (pendrive lub karta SD) pod zapis wielu obrazów ISO udostępnianych przez szereg dystrybucji Linux (m.in. debian i ubuntu ), oraz narzędzi typu clonezilla czy gparted . Pełna lista wpieranych obrazów znajduje się poniżej:

antergos, antix, arch, bodhi, centos, clonezilla, debian, elementary,
fedora, gparted, grml, ipxe, kali, linuxmint, manjaro, netrunner,
peppermint, porteus, rhel, sabayon, supergrub2disk, sysrescd, tails,
ubuntu, void, xubuntu

Zatem jak widać jest ich całkiem sporo. Dodatkowo, nie jesteśmy limitowani przez jedną wersję obrazu, którą możemy trzymać na pendrive. Możemy ich mieć kilka, a podczas fazy boot będziemy w stanie wybrać sobie tę wersję, która nam odpowiada, co przydaje się w przypadku obrazów testowych czy niestabilnych takich dystrybucji jak Debian, gdzie często te obrazy potrafią zawierać błędy uniemożliwiające start/instalację systemu.

Bootloader GRUB/GRUB2

Sam skrypt działa w oparciu o bootloader GRUB/GRUB2, a konkretnie wołany jest grub-install . Wymagane zatem jest posiadanie w systemie pakietu grub2 (lub też grub-legacy ). Problem możemy napotkać w sytuacji, gdy korzystamy z innego bootloader'a do rozruchu naszego Linux'a. Dla przykładu, ja odpalam swojego Debiana przy pomocy syslinux/extlinux , a przy instalacji pakietu grub2 pojawia się informacja o próbie zainstalowania tego bootloder'a w MBR dysku (i na partycji /boot/ ). Niemniej jednak, nie musimy instalować GRUB'a na dysku, by móc korzystać z narzędzi dostarczanych w zainstalowanych w systemie pakietach.

Konfiguracja

Bootloader GRUB wymaga pliku konfiguracyjnego ( grub.cfg ). Nie musimy na szczęście pisać go sami, bo jest on dostarczany przez projekt GLIM. Podczas instalacji GRUB'a na pendrive czy karcie SD, ta konfiguracja zostanie automatycznie wgrana w stosowne miejsce na nośniku.

Sudo

Niektóre polecenia w skrypcie są wołane przy pomocy sudo . Można albo nieco ten skrypt przerobić sobie, albo też dopisać poniższą linijkę do konfiguracji sudo (za pomocą visudo ) , przynajmniej na czas wykonania się samego skryptu:

...
Host_Alias HOSTY = localhost, morfikownia, morfikownia.mhouse
...
morfik      HOSTY = (root) NOPASSWD: /usr/sbin/grub-install

Zmienna $PATH

W moim Debianie zmienna $PATH dla zwykłego użytkownika jest ustawiona w poniższy sposób:

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/games

Biorąc teraz pod uwagę fakt, że grub-install znajduje się w /sbin/ , to skrypt GLIM będzie miał problem ze znalezieniem tego polecenia. Można albo wyeksportować w terminalu zmienną $PATH tak, by uwzględniała /sbin/ , albo też zatroszczyć się o eksport tej zmiennej w samym skrypcie:

export PATH=$PATH:/usr/sbin

Przygotowanie nośnika pod GLIM

Możemy teraz przejść do przygotowania naszego pendrive albo karty SD pod GLIM. Przede wszystkim, na takim nośniku trzeba utworzyć tablicę partycji (zalecane MBR/MS-DOS) oraz tylko jedną partycję sformatowaną jakimś systemem plików. Teoretycznie można wykorzystać dowolny system plików, np. FAT32 czy EXT4 , a nawet NTFS ale trzeba pamiętać o fakcie, że wybór innego systemu plików niż FAT32 może generować problemy z uruchamianiem obrazów ISO. Dlatego też lepiej pozostać przy tej bezpiecznej opcji, nie zapominając przy tym, że FAT32 ma ograniczenie co do wielkości obsługiwanych plików i jest to 4 GiB, przez co większych obrazów nie będziemy w stanie wgrać na pendrive/kartę SD. Na szczęście obrazy live zwykle trzymają się poniżej 3 GiB i nie musimy się tym limitem zbytnio przejmować. Dodatkowo, trzeba ustawić etykietę systemu plików na GLIM , w przeciwnym razie szukana partycja nie zostanie odnaleziona przez skrypt.

Wszystkie te wyżej wymienione rzeczy bez problemu można sobie wyklikać w gparted , zatem nie ma co tutaj opisywać tego procesu. Poniżej znajduje się fotka odpowiednio przygotowanego nośnika:

pendrive-karta-sd-multiboot-iso-linux-gparted

Instalacja GRUB'a

Zostało nam już w zasadzie zainstalowanie bootloader'a na pendrive, a tym zadaniem zajmie się już sam skrypt glim.sh . Montujemy zatem system plików nośnika, który przygotowaliśmy sobie wcześniej, w dowolnym miejscu i uruchamiamy skrypt. Jeśli nośnik został przygotowany poprawnie, to cały proces instalacji GRUB'a powinien się dokonać bez większych problemów, jedynie trzeba potwierdzić przeprowadzenie operacji, zatem warto też zweryfikować co tam na ekranie się pojawi.

Wersja z EFI/UEFI

Jeśli mamy na wyposażeniu komputer z EFI/UEFI (lub zamierzamy używać naszego pendrive na tego typu maszynach), to przydałoby się stworzyć nośnik, który będzie uruchamiany w natywnym trybie EFI, a nie w trybie kompatybilności BIOS za sprawą modułu CSM (Compatibility Support Module), co może prowadzić do szeregu problemów. By stworzyć pendrive, który będzie zawierał niezbędne elementy, trzeba doinstalować sobie w systemie pierw pakiet grub-efi-amd64-bin , a później przy instalacji GLIM odpowiedzieć twierdząco na poniższe pytanie:

$ ./glim.sh
Found partition with label 'GLIM' : /dev/sdc1
Found block device where to install GRUB2 : /dev/sdc
Found mount point for filesystem : /media/morfik/GLIM
Install for EFI in addition to standard BIOS? (Y/n) y

W przypadku, gdy nie będziemy posiadać w systemie wspomnianego wyżej pakietu, to instalator nam wyrzuci poniższe ostrzeżenie o braku katalogu /usr/lib/grub/x86_64-efi/ :

WARNING: no /usr/lib/grub/x86_64-efi dir (grub2-efi-x64-modules rpm missing?)

Gdy jesteśmy gotowi do instalacji GLIM'a, to również twierdząco odpowiadamy na poniższe pytanie:

Ready to install GLIM. Continue? (Y/n) y
Running grub-install --target=i386-pc --boot-directory=/media/morfik/GLIM/boot /dev/sdc (with sudo) ...
Installing for i386-pc platform.
Installation finished. No error reported.
Running grub-install --target=x86_64-efi --efi-directory=/media/morfik/GLIM --removable --boot-directory=/media/morfik/GLIM/boot /dev/sdc (with sudo) ...
Installing for x86_64-efi platform.
Installation finished. No error reported.
Running rsync -rpt --delete --exclude=i386-pc --exclude=x86_64-efi --exclude=fonts --exclude=icons/originals ./grub2/ /media/morfik/GLIM/boot/grub ...
GLIM installed! Time to populate the boot/iso directory.

Obrazy ISO z dystrybucjami Linux

Po zainstalowaniu bootloader'a na pendrive można przejść do wgrywania obrazów ISO. W tym celu tworzymy pierw folder pod konkretną dystrybucję w katalogu boot/iso/ na nośniku, np. /media/morfik/GLIM/boot/iso/debian/ i w tym katalogu umieszczamy obrazy charakterystyczne dla tej dystrybucji Linux. Jeśli chcielibyśmy wgrać obraz gparted , to tworzymy katalog /media/morfik/GLIM/boot/iso/gparted/ i to w nim umieszczamy stosowny plik.

Nazwa pliku nie ma zbytnio znaczenia, tj. powinna ona pasować do konkretnego wyrażenia regularnego (można podejrzeć w plikach inc-*.cfg w katalogu boot/grub/) i w zasadzie oryginalne nazwy obrazów pobranych ze stron projektów będą w 100% zgodne, wliczając w to nowsze wersje obrazów (inne numerki). Zatem nie musimy w zasadzie nic robić, za wyjątkiem wgrania pobranego z sieci obrazu na nasz pendrive czy kartę SD.

Test multiboot

Menu GRUB, które zostanie nam zaprezentowane podczas fazy boot, jest generowane w locie w oparciu o konfigurację dostarczoną przez projekt GLIM. Każda dystrybucja, której katalog stworzyliśmy w boot/iso/ będzie miała swoją pozycję w menu, a jeśli dodatkowo umieścimy w takim katalogu choć jeden obraz, to będzie go można wybrać w submenu. Poniżej jest poglądowa fotka zaczerpnięta z git'a projektu GLIM prezentująca menu:

pendrive-karta-sd-multiboot-iso-linux-grub-menu

Oczywiście w zależności od tego co sobie wgramy na pendrive/kartę SD, to inne pozycje w menu zobaczymy ale najważniejszy jest fakt, że wystarczy nam już tylko jedno urządzenie, by w wygodny sposób przechowywać obrazy udostępniane przez rozmaite dystrybucje Linux i uruchamiać dowolny system, który nam odpowiada i gdy zajdzie taka potrzeba.

Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.