Nowe posty

Autor Wątek: Przekazywanie parametrow z GRUB2 do systemu  (Przeczytany 6158 razy)

berkov

  • Gość
Przekazywanie parametrow z GRUB2 do systemu
« dnia: 2013-08-29, 14:50:51 »
Hey ho!

Co prawda ten watek pasuje rownie dobrze pod GRUB2 ale pomyslalem ze bardziej chodzi o stystem niz o loader wiec wrzucilem go tutaj.

Wiec, here we go...
LINUXY jak kazdy inny OS ma tzw. Environment Variables (np. PATH, HOME, USER etc...), czy moge stworzyc wlasna variable ale juz na poziomie GRUB2?

Chodzi o to ze mam kompa z dwiema kartami graficznymi, ktore jak dzialaja obie to grzeja sie jak glupie a drivery od AMD nie dzialaja, napisalem sobie wiec w shell skrypt sam (moj pierwszy shellowski skrypt!!) ktory albo wlacza jedna albo druga karte, problem w tym ze jesli chce zmienic karte, musze najpierw zmodyfikowac ten skrypt (wywolywany z /etc/rc.local) by odpalal ta druga a nastepnie zrestartowac kompa. To troche malo "fancy" rozwiazanie, TRZA miec wyzsze ambicje:-)
Wiec dodalem nowe menu w GRUB2....
i teraz... co zrobic by w jednym menuentry oprocz boot'u linuxa storzylo mi zmienna o np nazwie "grafika" z wartoscia np "1", i odpowiedniu w drugim menuentry grafika=2?? Czy to wogole wykonalne z pozycji GRUB2?

p.s.
doczytalem ze mozna dopisac cos na koncu linii bootujacej np:
linux   /vmlinuz-xxxx.xxx.xx x.xx grafika=1
a pozniej odpowiednio pocharatac string w /proc/cmdline i dostac ta wartosc by pozniej wrzucic ja do mojego skryptu w /etc/rc.local ale .. hmm.. to tez nie jest zbytnio wysublimowany sposob. Ja bym chcial cos bardziej PROF!

ktos ma jakis pomysl?


btw. jestem na UBUNTU 12.04 - to moj pierwszy unixowy system wiec choc doczytalem juz troche o dzialaniu, komendach i programowaniu w shell to jeszcze duzo mleka musi uplynac, wiec prosze o w miare proste w zrozumieniu odpowiedzi.

dzieki
b

Offline roobal

  • Users
  • Guru
  • *****
  • Wiadomości: 2056
    • Zobacz profil
Przekazywanie parametrow z GRUB2 do systemu
« Odpowiedź #1 dnia: 2013-08-30, 07:19:55 »
Mam taką prośbę, pisz albo po poslu, albo po angielsku, bo takiej mieszanki języków czytać się nie da. Próbowałeś może takiego sposóbu --> http://www.ubuntu-pomoc.org/grafika-amdintel-przelaczanie-grafiki-w-catalyst-control-center/

Próbowałeś dodać swój skrypt do skryptów uruchomieniowych zamiast do rc.local? Możesz pochwalić się tym skryptem?

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3070
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Przekazywanie parametrow z GRUB2 do systemu
« Odpowiedź #2 dnia: 2013-08-30, 10:59:00 »
/proc/cmdline właśnie do tego służy. Można ostatecznie stworzyć dwa initrd ustawiając w nich zmienną środowiskową na jedną z dwóch wartości, ale rozwiązanie z /proc/cmdline jest optymalne.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

berkov

  • Gość
Przekazywanie parametrow z GRUB2 do systemu
« Odpowiedź #3 dnia: 2013-08-31, 11:49:11 »
@Pawel,
dzieki za odpowiedz, napisalem krotki skrypt, ktory przy wywoluaniu z parametrem (nazwa zmiennej) przeszukuje /proc/cmdline i wyrzyca wartosc, ale takie przeszukiwanie stringu wydaje mi sie troche ...hmm "barbarzynskie" jesli wiesz co chce powiedziec:
#!/bin/sh -e
#
# Takes the $1 as argument and searches /proc/cmdline for its value
# ..if found returns that value
# ..if not found returns null
#
# e.g. the string is:
#
# BOOT_IMAGE=/boot/vmlinuz-x.x.x-xx-generic-tuxonice root=UUID=1111-111-11-11-11 ro quiet splash graphparam=IDG
# ... if 'graphparam' is $1 then returned value would be "IDG"
#
#
numspaces=$(cat /proc/cmdline |tr -cd " "|wc -c)
numspaces=`expr $numspaces + 1`

i=1
p=0
while [[ $i -le $numspaces && $p -eq 0 ]]
 do
   string=$(cat /proc/cmdline | cut -d" " -f $i)
   selected=$(echo $string | cut -d "=" -f 1)
       if [ "$selected" == "$1" ]; then
   result=$(echo $string | cut -d "=" -f 2)
   p=1
   fi
   i=`expr $i + 1`
 done

echo $result

Teraz sobie innym skryptem wywoluje  ten skrypt i zaleznie od wartosci zapisanej w /proc/cmdlin (wybranej w grub2 menu) albo wlaczam jedna albo druga karte, a wszystko uruchamiane jest z rc.local.

Nie rozumiem, dlaczego do cmdline dostaje sie tylko jedna linijka z boot'a, nie moge miec swojej wartosci w nastepnej linijce? zawsze dostaje sie tylko linijka zaczynajaca sie z /boot/vmlinuz i to do niej musze dopisywac? to jedno pytanie...

drugie to jak sie dostac do tego Initrd? moze tam nie trzeba ciac stringow by dostac wartosc...

a trzecie to czy jak juz "przemyce" jakos swoja wartosc do systemu to co zrobic aby pojawila sie jako zmienna srodowiskowa taka jak np. $USER? tak bym nie musial za kazdym razem wywolywac skryptu przeszukujacego cmdline...

dzieki.
b

p.s.
jak zrobic zeby kod pojawil sie jako kod? [ code] [ / code]nie dziala bo zamiast kodu pojawia sie pusty szary obszar...

marcinw100

  • Gość
Przekazywanie parametrow z GRUB2 do systemu
« Odpowiedź #4 dnia: 2013-08-31, 14:01:27 »
Można krócej.

 cat /proc/cmdline |tr -s " " "\\n"|grep nazwaZmiennejWGrubie|cut -d "=" -f  2
I mamy wartość z Gruba. Potem kombinowałbym z poleceniem export żeby wstawić to do zmiennej albo po prostu po if-ie w skrypcie.

Offline vanhelzing

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 314
    • Zobacz profil
Przekazywanie parametrow z GRUB2 do systemu
« Odpowiedź #5 dnia: 2013-08-31, 17:46:31 »
Jeszcze krócej:
cat /proc/cmdline | sed -n 's/.*grafika=\\([^ ]*\\).*/\\1/p'