Przekazywanie parametrów z gruba/lilo do systemu
Kategoria: Artykuły, etykiety: system
Dodany: 2009-08-02 23:58
(zmodyfikowany: 2009-08-16 12:42)
Przez: bercik
Wyświetleń: 8745
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`