Strona 1 z 1

Skrypt przywracający grub

: 15 sierpnia 2013, 11:04
autor: mike26
Witam.
Ostatnio zabrałem się za pisanie skryptów do rzeczy które często muszę ponownie wykonywać na linuxie. Jedną z tych rzeczy jest przywracanie gruba.

Kod: Zaznacz cały

#!/bin/bash
while [ 1 ]
do
clear
echo "********************************************************"
echo "***********      Witam, co chcesz zrobić ?    ***********"
echo "********************************************************"
echo "1) Wyświetl partycję znajdujące się na dysku"
echo "2) Zamontuj katalogi systemowe"
echo "3) Jeśli katalog /boot znajduję się na innej partycji, wskaż ją"
echo "4) Zainstaluj i odśwież grub"
echo "5) Odmontuj katalogi"
echo "6) Błędy podczas instalacji grub"
echo "7) Restart systemu"
echo "8) Wyjdź"
echo -n "numer: "
read numer
case "$numer" in
    "1")
        fdisk -l
        echo "Aby kontynuować wciśnij dowolny klawisz"    
        read
        continue;;
    "2")
        echo -n "Wskaż partycję na której znajduję się /(system).
Podaj tylko numer partycji np. sda1, sda2, sda3...
numer: "
        read system
        mount /dev/$system /mnt
        mount --bind /dev /mnt/dev
        mount --bind /proc /mnt/proc
        mount --bind /sys /mnt/sys
        
        if [ -a /mnt/dev && /mnt/proc && /mnt/sys ];
        then
            echo "Katalogi zostały zamontowane" 
        else
            echo "Wystąpił błąd podczas montowania katalogów"
        fi
        read
        continue;;
        
    "3")
        echo -n "Wskaż partycję na której znajduję się /boot: "
        read boot
        mount /dev/$boot /mnt/boot
        if [ -a /mnt/boot ];
        then
            echo "Katalog /boot został zamontowany" 
        else
            echo "Wystąpił błąd podczas montowania katalogu /boot"
        fi
        read
        continue;;
    "4")    
        chroot /mnt
        grub-install /dev/sda
        update-grub
        echo "Aby kontynuować wciśnij dowolny klawisz"
        read
        continue;;
        
    "5")
        echo "exit"
        umount /mnt/dev        
        umount /mnt/proc
        umount /mnt/sys
        umount /mnt/boot
        echo "Aby kontynuować wciśnij dowolny klawisz"
        read
        continue;;
    "6")
        echo "Błędy podczas instalacji grub"
        echo "a - użycie opcji --recheck w celu ponownego wyszukania urządzeń startowych 'zawierających system operacyjny'"
        echo "b - aktualizacja numeru partycji UUID w celu uniknięcia ewentualnych problemów"
        echo -n "numer: "
        read podprogram
        case "$podprogram" in
    "a")
        grub-install –-recheck /dev/sda
        echo "Aby kontynuować wciśnij dowolny klawisz"
        read
        continue;;
    "b")
        update-grub
        echo "Aby kontynuować wciśnij dowolny klawisz"
        read
        continue;;
    *)
        echo "Podałeś/łaś zły numer"
        read
    esac;;
    "7")
        reboot
        echo "Restart systemu"
        read
    "8")    
        echo "Dowidzenia ;) "
        exit;;    

    *) 
        echo "Podałeś/łaś zły numer"
        read
esac
done
Napisałem sobie taki skrypt z tym że wyrzuca mi kilka błędów
  1. W 34 linijce w sprawdzaniu if wyrzuca mi błąd ']' nie wiem dlaczego. Wyświetla się powiadomienie, że coś poszło nie tak z montowaniem katalogów, chociaż wszystkie są.
  2. Mam również problem z 5 punktem. Muszę wyjść z chroot gdy wpiszę polecenie exit skrypt się zamknie. Tymczasowo wpisałem echo "exit" ale nie sprawdzałem programu.

: 15 sierpnia 2013, 21:10
autor: maxdawid
Co do linii 34:

Kod: Zaznacz cały

 if [ -a /mnt/dev ] && [ -a /mnt/proc ] && [ -a /mnt/sys ];

Co do pkt 5.
Możesz wykonać pojedyncze polecenia, bez wchodzenia do "środka":

Kod: Zaznacz cały

 chroot [OPCJA] NOWY-KATALOG-ROOT [POLECENIE [ARGUMENTY]...]
Daj znać czy pomogło.

: 15 sierpnia 2013, 22:45
autor: mike26
Przepraszam ale nie zrozumiałem podpowiedzi co do punktu 5.
Co do pkt 5.
Możesz wykonać pojedyncze polecenia, bez wchodzenia do "środka":

Kod: Zaznacz cały

chroot [OPCJA] NOWY-KATALOG-ROOT [POLECENIE [ARGUMENTY]...]

: 15 sierpnia 2013, 22:52
autor: maxdawid
Nie musisz przechodzić do powłoki poprzez chroot w punkcie 4.

Możesz wykonać te polecenia w ten sposób

Kod: Zaznacz cały

chroot /mnt grub-install /dev/sda
chroot /mnt update-grub 

: 17 sierpnia 2013, 11:02
autor: mike26
Działa zarówno pętla if jak i chroot w ptk. 5.
W wolnej chwili "dopieszczam skrypt" jak skończę to go wystawię może komuś się przyda.

Edycja:
Katalogi są poprawnie montowane i odmontowywane. Jednak podczas instalacji oraz aktualizacji, grub wykrywa jedynie Linuksa.

Pojawia się błąd jakoby /dev/sda nie był w ogóle zamontowany. Co jest dość dziwne, ponieważ gdyby nie był zamontowany grub nie mógłby się zainstalować na /dev/sda.

Wydaje mi się, że z poleceniami

Kod: Zaznacz cały

chroot /mnt/grub grub-install /dev/sda
jest coś nie tak.

Podejrzewam, że instaluję gruba dla płytki livecd a nie dla zainstalowanego systemu.

Chyba muszę normalnie wejść w

Kod: Zaznacz cały

chroot /mnt/grub
żeby poprawnie zainstalować gruba z tym, że jak z niego wyjść? Gdy wpiszę:

Kod: Zaznacz cały

exit
zamknę cały skrypt.

Kod: Zaznacz cały

#!/bin/bash
while [ 1 ]
do
clear
echo "********************************************************"
echo "***********      Witam, co chcesz zrobić ?   ***********"
echo "********************************************************"
echo "1) Wyświetl partycję znajdujące się na dysku"
echo "2) Zamontuj katalogi systemowe"
echo "3) Jeśli katalog /boot znajduję się na innej partycji, wskaż ją"
echo "4) Zainstaluj i odśwież grub"
echo "5) Odmontuj katalogi"
echo "6) Błędy podczas instalacji grub"
echo "7) Restart systemu"
echo "8) Zamknij skrypt"
echo -n "numer: "
read numer
case "$numer" in
    "1")
        fdisk -l
        echo "Aby kontynuować wciśnij dowolny klawisz"    
        read
        continue;;

    "2")
        echo -n "Wskaż partycję na której znajduję się /(system).
Podaj tylko numer partycji np. sda1, sda2, sda3...
numer: "
        read system
        mkdir /mnt/grub
        mount /dev/$system /mnt/grub
        mount --bind /dev /mnt/grub/dev
        mount --bind /proc /mnt/grub/proc
        mount --bind /sys /mnt/grub/sys
        
        if [ -a /mnt/grub/dev ] && [ -a /mnt/grub/proc ] && [ -a /mnt/grub/sys ];
        then
            echo "Katalogi zostały zamontowane" 
        else
            echo "Wystąpił błąd podczas montowania katalogów"
        fi
        echo "Aby kontynuować wciśnij dowolny klawisz"
        read
        continue;;
        
    "3")
        echo -n "Wskaż partycję na której znajduję się /boot: "
        read boot
        mount /dev/$boot /mnt/grub/boot
        if [ -a /mnt/grub/boot ];
        then
            echo "Katalog /boot został zamontowany" 
        else
            echo "Wystąpił błąd podczas montowania katalogu /boot"
        fi
        read
        echo "Aby kontynuować wciśnij dowolny klawisz"
        continue;;

    "4")    
        chroot /mnt/grub grub-install /dev/sda
        chroot /mnt/grub update-grub
        echo "Aby kontynuować wciśnij dowolny klawisz"
        read
        continue;;
        
    "5")
        umount /mnt/grub/dev        
        umount /mnt/grub/proc
        umount /mnt/grub/sys
        umount /mnt/grub/boot
        umount /mnt/grub
        rmdir /mnt/grub        
        if [ -a /mnt/grub/dev ] && [ -a /mnt/grub/proc ] && [ -a /mnt/grub/sys ] && [ -a /mnt/grub/boot ] && [ -a /mnt/grub ];
        then
            echo "Wystąpił błąd podczas odmontowania katalogów"
        else
            echo "Katalogi zostały odmontowane"
        fi
        echo "Aby kontynuować wciśnij dowolny klawisz"
        read
        continue;;

    "6")
        echo "Błędy podczas instalacji grub"
        echo "a - użycie opcji --recheck w celu ponownego wyszukania urządzeń startowych 'zawierających system operacyjny'"
        echo "b - aktualizacja numeru partycji UUID w celu uniknięcia ewentualnych problemów"
        echo -n "numer: "
        read podprogram
        case "$podprogram" in

    "a")
        chroot grub-install –-recheck /dev/sda
        echo "Aby kontynuować wciśnij dowolny klawisz"
        read
        continue;;

    "b")
        chroot update-grub
        echo "Aby kontynuować wciśnij dowolny klawisz"
        read
        continue;;
    *)
        echo "Podałeś/łaś zły numer"
        read
        esac;;

    "7")
        while [ 1 ]
        do
        echo -n "Czy napewno chcesz ponownie uruchomic system ? Y/n: "
        read odpowiedz
        if [ $odpowiedz == Y ] || [ $odpowiedz == y ];
        then
            reboot
            break        
        elif [ $odpowiedz == N ] || [ $odpowiedz == n ];
        then
            break
        else
            continue        
        fi
        done
        continue;;
        
    "8")    
        echo "Dowidzenia :) "
        exit;;  

    *) 
        echo "Podałeś/łaś zły numer"
        read
        continue;;
esac
done