Από το ημιτελές θέμα "Μάθε grub! (απαραίτητη η γονική συναίνεση)"
Ημερομηνία σχολίου: 23/4/2014
Μάθε grub! (απαραίτητη η γονική συναίνεση)
Σημείωση: οι αλλαγές παραμέτρων στον boot manager μπορεί να θέσουν τον υπολογιστή σας σε κατάσταση "μη εκκίνησης"! Δοκιμάστε με δική σας ευθύνη μόνο εφόσον κατανοήσατε τη λειτουργία του! Αν έχετε απορίες ρωτήστε πριν τις δοκιμές σας.
Αναρωτηθήκατε ποτέ για το ποιό είναι το πρώτο "πρόγραμμα" που τρέχει στον υπολογιστή σας;
Κάποτε, προσπαθώντας να απαντήσω στην παιδική ερώτηση:
"Πως λειτουργεί ο ηλεκτρονικός υπολογιστής;"
έκανα πολύ αναλυτικές σκέψεις, μέχρι που μπερδεύτηκα!
Ας τα πάρουμε από την αρχή:
Ο υπολογιστής αποτελείται από ηλεκτρονικά κυκλώματα (hardware), προγράμματα ρύθμισης υλικού που βρίσκονται μέσα στα κυκλώματα (firmware), προγράμματα διαχείρισης του υπολογιστή ("λειτουργικό σύστημα", "operating system software") και προγράμματα εφαρμογών χρήστη ("applications software").
Διαδικαστικά, μπορούμε να το δούμε και έτσι:
- βάζουμε τον υπολογιστή "στην πρίζα" (power on)
- τα κυκλώματα τροφοδοσίας δίνουν τάση στα υπόλοιπα κυκλώματα/υποσυστήματα
- κάθε υποσύστημα αρχικοποιείται από το δικό του firmware
- το firmware της κεντρικής πλακέτας (BIOS) ανιχνεύει και ρυθμίζει τα περιφερειακά υποσυστήματα
- το BIOS σύμφωνα με τις ρυθμίσεις του αναζητά περιφερειακά με δυνατότητα εκκίνησης ("boot")
- το BIOS δείχνει στον επεξεργαστή τον κώδικας εκκίνησης (συνήθως σε ένα "boot sector")
- τρέχει το πρόγραμμα διαχείρησης εκκίνησης ("boot manager") που βρίσκεται στο σύστημα αρχείων
- φορτώνεται το λειτουργικό σύστημα
- ...
Ας το δούμε από άλλη γωνία:
Επί τη ευκαιρία κυκλοφορίας του Ubuntu 14.04 ... (
http://www.ubuntu.com/download/desktop)
... αρκετοί θα θελήσουν να δοκιμάσουν το νέο Ubuntu, μια παραλλαγή του (Xubuntu, Lubuntu, Ubuntu-Gnome) ή ένα παράγωγο (Linux Mint, LXLE, ...). Η δοκιμή γίνεται τρέχοντας μια έκδοση "Live" χωρίς να πειράξουμε κάτι στον υπολογιστή μας αφού το λειτουργικό θα τρέξει μόνο στη μνήμη RAM.
Παλαιότερα καίγαμε δισκάκι για δημιουργία ενός
Live-CD, μετά προγραμματίζαμε στικάκι ως
Live-USB ενώ τώρα χρησιμοποιούμε
Live-ISO αφού απλά
boot-άρουμε απ' ευθείας το .iso μέσω του boot manager GNU/GRUB v.2 ("grub2")! Αυτό γίνεται εντελώς χειροκίνητα μέσα από τερματικό του grub2 ή τοποθετώντας μιά νέα επιλογή στο μενού του:
Σχεδόν όλα τα ?-Ubuntu και τα παράγωγά τους που φτιάχτηκαν από το 2009 και μετά μπορούν να εκκινήσουν απ' ευθείας μέσω grub2 με τις παρακάτω εντολές, αλλάζοντας μόνο το όνομα του αρχείου .iso στον ορισμό της μεταβλητής "isoname":
Κώδικας: Επιλογή όλων
set isoname="trusty-desktop-i386.iso"
loopback loop $isoname
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=/$isoname quiet splash --
initrd (loop)/casper/initrd.lz
boot
Η αντίστοιχη καταχώρηση στο μενού του grub2 θα είναι:
Κώδικας: Επιλογή όλων
menuentry 'Boot from .iso' {
set isoname="trusty-desktop-i386.iso"
loopback loop $isoname
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=/$isoname quiet splash --
initrd (loop)/casper/initrd.lz
}
Σε περίπτωση που δεν έχετε τοποθετήσει το αρχείο .iso στο "/" αλλά σε άλλο φάκελο, λ.χ. "/ISO/", συμπληρώστε το:
Κώδικας: Επιλογή όλων
set isoname="/ISO/trusty-desktop-i386.iso"
Για να δημιουργήσετε την επιπλέον επιλογή στο μενού του grub2, θα αλλάξετε το αρχείο
/etc/grub.d/40_custom με τον απλό επεξεργαστή κειμένου:
για Ubuntu, Gnome-Ubuntu και αρκετά παράγωγα:
για Lubuntu:
για Xubuntu
Παράδειγμα περιεχομένων αρχείου /etc/grub.d/40_custom πριν την προσθήκη:
Κώδικας: Επιλογή όλων
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
Στο τέλος των υπαρχόντων στοιχείων θα προσθέσουμε τη νέα εντολή menuentry.
Αποθηκεύουμε το αρχείο, ενημερώνουμε το grub:
και επανεκκινούμε το σύστημα:
Σας προτείνω τη δημιουργία του φακέλου
/ISO/ όπου θα βάζετε όλα τα αρχεία .iso και με την παρακάτω επιλογή μενού "γενικής χρήσης" θα πληκτρολογήσετε το όνομα του αρχείου αφού πρώτα δείτε όλα το ευρετήριο στην οθόνη σας. Μπορείτε να αλλάξετε τα ονόματα των αρχείων σε μικρότερα για την ευκολία σας (λ.χ. από mint-16-cinnamon-i386.iso σε mint16cin.iso και από trusty-desktop-i386.iso σε U1404.iso).
Η εγγραφή της επιλογής "γενικής χρήσης" στο μενού του grub είναι:
Κώδικας: Επιλογή όλων
menuentry 'Boot from /ISO/xyz.iso file' {
set pager=1
echo
ls /ISO/
echo
echo -n 'Which /ISO/.iso file? '
read isofile
echo
loopback loop /ISO/$isofile
echo 'Loading Linux kernel ...'
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=/ISO/$isofile quiet splash --
echo 'Loading initial ramdisk ...'
initrd (loop)/casper/initrd.lz
echo 'Booting ...'
echo
}
Θα την τοποθετήσετε στο τέλος εντός του αρχείου /etc/grub.d/40_custom
Οι εντολές εκκίνησης του .iso όπως φαίνονται στο menu του grub2 πατώντας "e" (
Edit):
Ετσι εμφανίζονται όλα τα αρχεία .iso που είναι στον φάκελο /ISO/:
Πληκτρολογούμε το όνομα αρχείου και πατάμε το <enter>. Το Live-ISO ξεκινά ...
Αν αργότερα θέλετε να επαναφέρετε το σύστημα στην προηγούμενη κατάσταση, χωρίς την επιπλέον επιλογή στο μενού του grub2, θα ανοίξετε το ίδιο αρχείο για διόρθωση (λ.χ. gksudo gedit /etc/grub.d/40_custom) και θα αφαιρέσετε τις γραμμές που προσθέσατε από "menuentry" μέχρι και το "}" στο κάτω μέρος. Μετά εκτελείτε "sudo update-grub".
Λίγα λόγια για το GNU/GRUB v.2 ("grub2")
O boot manager grub2 αποτελείται από δύο τμήματα, αυτό που τοποθετείται στο MBR (περίπου 500 bytes) και από το βασικό του μέρος που τυπικά αποθηκεύεται στο φάκελο /boot/grub/ του τμήματος δίσκου που γίνεται η εκκίνηση. Η τοποθέτηση του grub2 στο MBR και το /boot/grub/ γίνεται κατά την εγκατάσταση ενός λειτουργικού linux ή χειροκίνητα με την εντολή grub-install. Η ρύθμιση του grub2 (εμφάνιση, μενού, συμπεριφορά) γίνεται με αλλαγή προσδιοριστικών αρχείων στο φάκελο /etc/grub.d/ και εκτέλεση της εντολής update-grub. Το αποτέλεσμα των ρυθμίσεων υπάρχει στο αρχείο /boot/grub/grub.cfg το οποίο μπορούμε να "πειράξουμε" προσωρινά έως να γίνει το επόμενο update-grub.
Τι γίνεται κατά την εκκίνηση του υπολογιστή
Με την τροφοδότηση του υπολογιστή, τα επιμέρους υποσυστήματα αρχικοποιούνται από το δικό τους firmware, μετά αναλαμβάνει το BIOS που κάνει τις βασικές ρυθμίσεις και ανάλογα με τις αποθηκευμένες επιλογές, ψάχνει για περιφερειακά με δυνατότητα εκκίνησης (αποθηκευτικά μέσα ή δίκτυο) και τις περισσότερες περιπτώσεις δείχνει στην CPU τον αρχικό κώδικα εκκίνησης που βρίσκεται στο MBR κάποιου αποθηκευτικού μέσου. Ο λίγος κώδικας του MBR, δείχνει την συνέχεια του κώδικα εκκίνησης που βρίσκεται στο σύστημα αρχείων και αποτελεί το μεγαλύτερο μέρος του boot manager. Ακολουθεί η εκκίνηση του λειτουργικού συστήματος.
Πιθανά σφάλματα κατά την εκκίνηση
Αν δεν βρεθεί σωστός κώδικας στο MBR, θα εμφανιστεί κάποιο μήνυμα του τύπου "No system disk".
Μετά την εκτέλεση του κώδικα στο MBR αν δεν βρεθεί η συνέχεια του κώδικα (συνήθως στο φάκελο /boot/grub/) ο grub2 δημιουργεί ένα ελάχιστο περιβάλλον εργασίας και μας δίνει το τερματικό για να συνεχίσουμε χειροκίνητα. Εμφανίζεται το prompt: "grub rescue>".
Αν φορτωθεί ο grub2 και δημιουργηθεί μετά κάποιο πρόβλημα (λ.χ. λάθος στο /boot/grub/grub.cfg), θα έχουμε εκτεταμμένο περιβάλλον εργασίας σε τερματικό με prompt: "grub>". Το ίδιο περιβάλλον εργασίας έχουμε αν πατήσουμε "c" στο μενού του grub2.
Προσπάθεια εκκίνησης από "grub rescue>"
Εδώ υπάρχουν λιγοστές εντολές:
ls
set
unset
normal
Σκοπός μας είναι να δείξουμε το "κύριο μέρος" του grub2 και να συνεχίσουμε τη ροή εκτέλεσής του.
Προσπάθεια εκκίνησης από "grub>"
...
Γενική προσέγγιση επιτυχούς boot linux με τις ελάχιστες εντολές από το περιβλάλλον του grub
Αν υποθέσουμε ότι όλοι οι υπολογιστές είναι σχετικά συμβατοί, για την εκκίνηση κάθε linux αρκούν οι εντολές:
Σημείωση: το "/kernel" στην εντολή "linux /kernel" μπορεί να είναι απλά το "/vmlinuz" ή ένα συγκεκριμένο αρχείο kernel όπως "/linux-image-4.4.0-24-generic"
Σε περίπτωση προβλήματος εκκίνησης λόγω ασυμβατότητας της κάρτας γραφικών, συμπληρώνουμε δίπλα στο kernel την παράμετρο "nomodeset":
Κώδικας: Επιλογή όλων
linux /kernel nomodeset
initrd /initrd.img
Για πιο "ειδικό hardware", προσθέτουμε αντίστοιχες "ειδικές" και δυσεύρετες ρυθμίσεις! Βοηθός μας πάλι το internet ...
συνεχίζεται ...
____ ____ ____ ____ ____ ____ ____ ____
Επιπλέον παραθέτω μερικές χρήσιμες εντολές bash για να βρούμε τις ονομασίες των partitions (UUID) ώστε να είναι επιτυχημένη η προσπάθεια boot σε συστήματα με πολλούς δίσκους ή με προσθήκες/αλλαγές στα αφαιρούμενα αποθηκευτικά μέσα:
Ποιό partition τρέχω και έχει το root?
Το ίδιο σε μεταβλητή:
Κώδικας: Επιλογή όλων
MySystemPartition=$(df -h / --output=source | tail -1)
echo $MySystemPartition
Ποιο UUID έχει ένα συγκεκριμένο partition;
Το ίδιο σε μεταβλητή:
Κώδικας: Επιλογή όλων
MySystemPartitionUUID=$(sudo blkid /dev/sda5 -o value -s UUID)
echo $MySystemPartitionUUID
Συνδυάζοντας τα παραπάνω για να πάρω σε μεταβλητή το UUID του τρέχοντος συστήματος:
Κώδικας: Επιλογή όλων
MySystemPartitionUUID=$(sudo blkid $(df -h / --output=source | tail -1) -o value -s UUID)
echo $MySystemPartitionUUID
Για να δώσουμε και το password στην ίδια εντολή (...μειωμένη ασφάλεια συστήματος λόγω προβολής του στο bash history)
Κώδικας: Επιλογή όλων
MySystemPartitionUUID=$(echo password | sudo -S blkid $(df -h / --output=source | tail -1) -o value -s UUID)
echo $MySystemPartitionUUID
Σημείωση: αντί UUID (filesystem) μπορούμε να ζητήσουμε το PARTUUID (partition σε GPT) που δεν αλλάζει μετά από format.