Przejdź to tekstu

Przekazywanie parametrów z gruba/lilo do systemu

Kategoria: Artykuły, etykiety: system

Dodany przez: bercik, 2009-08-02 23:58 (zmodyfikowany: 2009-08-16 12:42)

Wyświetleń: 5594

Jak przy pomocy menu bootloadera wybierać opcje konfiguracyjne systemu?

Nie tak rzadko chcielibyśmy móc wybrać jakieś z ustawień (np. tryb konfiguracji sieci) na etapie startu systemu. Najlepszym miejscem do zrobienia tego wydaje się być menu gruba.

Sprawa jest stosunkowo łatwa w przypadku gdy nie korzystamy z initrd - wszystkie nie rozpoznane przez jądro parametry do niego przekazane ustawiane są jako zmienne środowiskowe (zobacz man 7 bootparam). Następnie możemy zmodyfikować dowolny z skryptów startowych, tak aby reagował na naszą zmienną.

Bardziej skomplikowana sytuacja ma miejsce gdy korzystamy z initrd — zgodnie z tym co napisałem powyżej zmienne są ustawiane, ale właśnie w ramach initrd i nie są przekazywane do uruchamianego zwykłego inita a zatem nie trafią do jego skryptów startowych. Mamy co najmniej dwie metody rozwiązania takiego problemu — zmodyfikowanie initrd, tak aby zmienne te zapisał do jakiegoś pliku, który następnie będziemy wczytywać. W tym celu należy zmodyfikować /usr/share/initrd-tools/init lub /usr/share/initramfs-tools/init (w zależności jakiego narzędzia używamy do budowania initrd) tak aby zapisywał wybrane lub wszystkie zmienne do jakiegoś pliku — np. dodając:

if [ $ro = "r" ]; then
    mount -o remount -o rw /
    env > /mode.env
    mount -o remount -o ro /
else 
    env > /mode.env
fi

przed wykonaniem exec init. Później należy przebudować swój initrd np. mkinitrd -o /boot/nazwa_naszego_obrazu_initrd /lib/modules/katalog_modulow_jadra_dla_ktorego_robimy_initrd

Inną drogą (chyba bardziej praktyczną, bo nie wymuszającą ciągłego pilnowania aby uruchamiany był nasz podrobiony initrd) jest wykorzystanie w skrypcie, który ma zareagować na naszą zmienną kodu odczytującego ją z /proc/cmdline - można to zrealizować w następujący sposób:

nasza_zmienna=`awk '
    BEGIN {
        RS="[ \n]";
        FS="=";
    }
    $1=="nasza_zmienna" {
        print $2
    }' /proc/cmdline`

OSnews Wykop Blip Flaker Kciuk Śledzik Facebook Identi.ca Twitter del.icio.us Google Bookmarks