Το προφίλ μας στο Google Plus
5

Πώς ξεκινούν τα PC και πώς φορτώνει το Linux

Έχετε αναρωτηθεί τι συμβαίνει όταν πατάτε το κουμπί power-on του υπολογιστή; Σας έχει ποτέ απασχολήσει η διαδικασία boot του Linux; Τι είναι αυτό το systemd για το οποίο έτυχε να διαβάσετε κάπου στο Web; Όσο απλοϊκά ή αδιάφορα κι αν φαίνονται ερωτήματα σαν τα προηγούμενα, υποψιαζόμαστε ότι κάποιοι δεν μπορείτε να δώσετε ικανοποιητικές απαντήσεις. Αλλά για μια στιγμή. Χρειάζεται να σκοτίζεστε με τέτοια θέματα;

Γενικά, όχι, δεν χρειάζεται. Αν όμως θέλετε να λέτε ότι είστε καλός system administrator και πράγματι να είστε καλός system administrator, τότε θεωρούμε πως, ναι, οφείλετε να σκοτίζεστε με τέτοια θέματα — έστω κι αν είναι για μια φορά στο τόσο. Πιθανώς εξάλλου ν’ αντιμετωπίσετε παρόμοια ερωτήματα στο πλαίσιο εξετάσεων για κάποια πιστοποίηση που προσπαθείτε να πάρετε. Κρίμα δεν θα ήταν να δίνατε ελλιπή απάντηση, μόνο και μόνο επειδή το ερώτημα πάντα σας φαινόταν αδιάφορο ή προφανές; Αλλά ας μην αγχωνόμαστε τώρα με εξετάσεις και πιστοποιήσεις. Αντίθετα, ελάτε να συζητήσουμε για το τι συμβαίνει σ’ έναν υπολογιστή με το που τον ανοίγουμε, μετά να μάθουμε και πώς ακριβώς φορτώνει το Linux. Κάπως έτσι θα φτάσουμε στη διεργασία init και θα γνωρίσουμε το systemd, το οποίο όλες οι σύγχρονες διανομές έχουν υιοθετήσει.

Το boot process από κοντά
Ακόμη κι όσοι γνωρίζουν καλά τι συμβαίνει από το power-on ως το περιβάλλον γραφικών ή έστω ως την κονσόλα απλού κειμένου με την προτροπή για login, σπάνια σκέφτονται για τις σχετικές παρασκηνιακές διαδικασίες. Βέβαια εκείνοι που ξέρουν και γνωρίζουν δικαιούνται να μη σκέφτονται κάθε φορά για το τι συμβαίνει. Κέρδισαν αυτό το δικαίωμα από τη στιγμή που αφιέρωσαν χρόνο για να διαβάσουν, να μελετήσουν και να πειραματιστούν με τα PC τους, οπότε ας τους αφήσουμε ήσυχους, εκεί, στον άνετο καναπέ τους ή στον επιβλητικό τους θρόνο ή στην όποια καταλληλότερη μεταφορά μπορείτε να σκεφτείτε, τέλος πάντων. Η αλήθεια είναι ότι μερικές φορές έχουν ένα κάπως μπλαζέ υφάκι, κάπως ενοχλητικό ομολογουμένως. Λοιπόν! Προτείνουμε να μάθουμε κι εμείς για το boot process, αν μη το άλλο για να δούμε τι προκαλεί αυτό το υφάκι.

Η διαδικασία εκκίνησης ενός οποιουδήποτε OS ξεκινά με λειτουργίες που επιτελούνται αρχικά από το BIOS ή το UEFI του υπολογιστή και μετά από τον bootloader. Στη συνέχεια φορτώνει ο πυρήνας (kernel) και, ειδικά στην περίπτωση του Linux, η όλη διαδικασία ολοκληρώνεται με τη βοήθεια της διεργασίας init. Σε γενικές γραμμές, λοιπόν, μπορούμε να μιλάμε για τέσσερα διαφορετικά στάδια: BIOS/UEFI, bootloader, kernel και init.

Στάδιο 1α — BIOS. Το Basic Input/Output System είναι το κλασικό firmware στην πλατφόρμα του PC. Αν κάποια στιγμή χρειάστηκε ν’ αλλάξετε τη σειρά αναζήτησης bootable code στους δίσκους (εσωτερικούς ή εξωτερικούς) του PC σας, τότε έχετε ήδη αλληλεπιδράσει με το BIOS. Πρώτη δουλειά του BIOS με το που ανοίγουμε τον υπολογιστή είναι να εκτελεί μια σειρά από βασικούς διαγνωστικούς ελέγχους, ώστε να διαπιστωθεί αν το hardware βρίσκεται σε μια στοιχειωδώς καλή κατάσταση. Αφού το BIOS δει τους δίσκους, ψάχνει για το λεγόμενο boot block. Το πού ψάχνει σε κάθε δίσκο εξαρτάται από τη λογική διευθέτησης των κατατμήσεών του (MBR ή GPT partitioning). Πιο συγκεκριμένα, αν το partition table του υπό εξέταση δίσκου ακολουθεί τη λογική του MBR, τότε ψάχνει για το Master Boot Record. Αυτό βρίσκεται στον πρώτο τομέα (sector) του δίσκου, συγκεκριμένα στα πρώτα 512 bytes. Το MBR ενδέχεται να περιλαμβάνει κώδικα για το φόρτωμα κάποιου άλλου προγράμματος, κάπου αλλού στο δίσκο. Το τελευταίο αυτό πρόγραμμα είναι εκείνο που τελικά φορτώνει τον bootloader του λειτουργικού συστήματος.

Στάδιο 1β — UEFI. Βελτιωμένος απόγονος του παλιού καλού BIOS είναι το UEFI (Unified Extensible Firmware Interface). Η πλειονότητα των σύγχρονων PCs έχει firmware με UEFI. Η Apple το υιοθέτησε για τους υπολογιστές της χρόνια νωρίτερα, ωστόσο και τα Windows πλέον υποστηρίζουν την εκκίνηση από UEFI. Αν και το GPT partitioning σχεδιάστηκε ώστε να χρησιμοποιείται σε υπολογιστές με UEFI, αξίζει να σημειώσουμε ότι το booting από δίσκους GPT είναι δυνατό ακόμη και σε PCs με το κλασικό BIOS: ο πρώτος τομέας ενός δίσκου GPT είναι δεσμευμένος για κώδικα MBR, ώστε η εκκίνηση να ‘ναι δυνατή και σε υπολογιστή χωρίς UEFI.

Στάδιο 2 — Bootloader. Η αποστολή του bootloader είναι να εκκινεί το λειτουργικό σύστημα, ασχέτως αν πρόκειται για το Linux ή για κάποιο άλλο. Ειδικά στην περίπτωση του Linux, ο bootloader επιτρέπει την επιλογή πυρήνα προς φόρτωμα, ενώ είναι και ικανός να του περνά μια σειρά από παραμέτρους. Ο bootloader που χρησιμοποιείται σήμερα κατά κόρον στον κόσμο του Linux είναι ο GRUB.

Στάδιο 3 — Πυρήνας (kernel). Αφού ο bootloader δώσει στον πυρήνα τις όποιες παραμέτρους για το boot, πρέπει να τον φορτώσει στη μνήμη. Αυτό είναι λίγο δυσκολότερο απ’ όσο ακούγεται. Βλέπετε, αν κι ο πυρήνας διαχειρίζεται το hardware του υπολογιστή, τη στιγμή του boot δεν είναι όλοι οι οδηγοί συσκευών διαθέσιμοι και συνεπώς κάποια υποσυστήματα είναι σαν να μην υπάρχουν. Το πρόβλημα αντιμετωπίζεται προσαρτώντας ένα προσωρινό root filesystem, το οποίο περιλαμβάνει τα αρθρώματα (modules) που χρειάζεται ο πυρήνας προκειμένου να δει το hardware.

Σε παλιότερες εκδόσεις του Linux, το προσωρινό αυτό filesystem αποτελούσε το αρχείο ονόματι initrd (INITial Ram Disk). Με την προσάρτηση του initrd ο πυρήνας αποκτούσε όλους τους απαραίτητους οδηγούς για την επιτυχή ολοκλήρωση της εκκίνησης. Μόλις φόρτωνε ό,τι χρειαζόταν, το initrd αποπροσαρτόταν και γινόταν η προσάρτηση του root filesystem, στον δίσκο της εγκατάστασης. Στις σύγχρονες διανομές Linux, τη θέση του αρχείου initrd έχει πάρει το initramfs. Κι αυτό είναι ένα προσωρινό σύστημα αρχείων, μόνο που τώρα δεν αποτελεί ξεχωριστό αρχείο αλλά είναι ενσωματωμένο στον πυρήνα. Φυσικά, περιλαμβάνει όλους τους απαραίτητους οδηγούς ώστε να είναι δυνατή η προσάρτηση του root filesystem.

Χάρη στο initrd ή στο initramfs, ο πυρήνας αποκτά πρόσβαση στα αρθρώματα που χρειάζεται προκειμένου να δημιουργήσει ένα root device για την προσάρτηση της ριζικής κατάτμησης (root partition). Αρχικά, η προσάρτησή της γίνεται με δικαιώματα ανάγνωσης μόνο (read only mode). Έτσι, το εργαλείο ελέγχου ακεραιότητας κατατμήσεων ονόματι fsck τρέχει με ασφάλεια. Αφού ολοκληρώσει τους ελέγχους του, η ριζική κατάτμηση αποπροσαρτάται και προσαρτάται εκ νέου — αλλά αυτή τη φορά τόσο με δικαιώματα ανάγνωσης όσο και εγγραφής (read-write mode). Χωρίς να χάσει χρόνο, ο πυρήνας αναζητά το πρόγραμμα init και το ενεργοποιεί.

Στάδιο 4 — Init. Το init στο Linux είναι πάντοτε η πρώτη διεργασία που ενεργοποιείται. Αποστολή της είναι η εκκίνηση όλων των απαραίτητων υπηρεσιών του λειτουργικού. Τώρα, το πώς τις ξεκινά εξαρτάται από την υλοποίηση. Ναι, δεν υπάρχει ένα μόνο init στο Linux. Για την ακρίβεια, διατίθενται τρεις βασικές υλοποιήσεις.

  • System V init (sysv). Πρόκειται για το παραδοσιακό σύστημα init στον κόσμο του Linux, το οποίο βασιζόμενο στα λεγόμενα startup scripts ξεκινά/σταματά άλλες διεργασίες με τη σειρά. Η κατάσταση του συστήματος καθορίζεται από τα runlevels, με κάθε runlevel να ξεκινά/σταματά το σύστημα κατά τρόπο διαφορετικό.
  • Upstart. Είναι το σύστημα init που χρησιμοποιούταν σε παλαιότερες εκδόσεις του Ubuntu Linux. Στο upstart έχουμε εργασίες (jobs) και γεγονότα (events), όπου κάθε εργασία ξεκινά κι εκτελεί συγκεκριμένες ενέργειες ανταποκρινόμενη σε γεγονότα.
  • Systemd. Είναι το νέο στάνταρτ για το init στο Linux. Κεντρική ιδέα στο systemd είναι οι στόχοι (goals). Ουσιαστικά, υπάρχουν στόχοι που το systemd προσπαθεί να πετύχει ικανοποιώντας τις εξαρτήσεις (dependencies) κάθε στόχου.

Η συνέχεια
Ως εδώ έχουμε αποκτήσει μια πολύ καλή εικόνα για το πώς ξεκινά ο υπολογιστής μας. Με δεδομένο εξάλλου ότι η πλειονότητα των διανομών Linux έχουν υιοθετήσει το Systemd, αξίζει να εστιάσουμε σ’ αυτό. Όπως θα διαπιστώσετε κι εσείς, το Systemd κάνει πολλά περισσότερα από το να ξεκινά υπηρεσίες του λειτουργικού. Είστε διαχειριστής συστήματος που σέβεται τον εαυτό του, οπότε οφείλετε να μάθετε περισσότερα γι’ αυτό. Δεν θα το μετανιώσετε.

Οι παράμετροι που περνά ο bootloader (GRUB) στον πυρήνα ενός συστήματος με openSUSE, όπως φαίνονται μέσα από το εργαλείο διαχείρισης YaST.

Οι παράμετροι που περνά ο bootloader (GRUB) στον πυρήνα ενός συστήματος με openSUSE, όπως φαίνονται μέσα από το εργαλείο διαχείρισης YaST.

Σας άρεσε το άρθρο; Αν ναι, τι θα λέγατε για ένα tip στο PayPal;

5 Responses to “Πώς ξεκινούν τα PC και πώς φορτώνει το Linux”

  1. hlias | 19/08/2016 at 11:19

    καλημερα σας και μπραβο σας για τη πολυ καλη δουλεια που κανετε.
    Αν μπορει καποιος να μου εξηγησει την παρακατω φραση “Το MBR ενδέχεται να περιλαμβάνει κώδικα για το φόρτωμα κάποιου άλλου προγράμματος, κάπου αλλού στο δίσκο. Το τελευταίο αυτό πρόγραμμα είναι εκείνο που τελικά φορτώνει τον bootloader του λειτουργικού συστήματος.”
    ΑΠΟΡΙΑ
    δηλαδη ο bootloader που ειναι αποθηκευμενος;δεν ειναι στον πρωτο τομεα;(MBR ), η στον πρωτο τομεα ειναι αποθηκεθμενος κωδικας ο οποις ψαχνει για τον bootloader καπου αλλου ;προφανως στον φακελο /boot
    συγνωμη για την φλυαρια μου αλλα τα εχω λιγο μπλεξει.
    ΕΥΧΑΡΙΣΤΩ.

  2. drpaneas | 19/08/2016 at 15:38

    Θα προσπαθήσω να απαντήσω αυτή την ερώτηση με ένα παράδειγμα:

    Έχουμε δύο δίσκους: sda και sdb

    Στον sda έχουμε ubuntu και στον sdb εχουμε opensuse. Αυτό που θες εσύ είναι κατά την εκκίνηση του υπολογιστή σου να μπορείς να επιλέξεις πού θα κάνεις boot: στο ubuntu ή στο opensuse;

    Εχει δύο τρόπους για να το κάνεις αυτό:

    Τρόπος 1
    ——————
    Κάθε δίσκος έχει τον δικό του bootloader που φορτώνει και βλέπει μόνο το δικό του λειτουργικό. Οποτε αν το first boot device στο BIOS είναι ο δίσκος που αντιστοιχεί στο sda, τότε θα φορτώνει αυτόματα ο bootloader που βλέπει μόνο το ubuntu και συνεπώς θα μπεις στο ubuntu.

    Αν θελήσεις να μπουτάρεις σε opensuse, τότε κατά την εκκίνηση του υπολογιστή μπορείς να αλλάξεις το boot order ή να επιλέξεις από ποιον δίσκο θες να ξεκινήσει ο υπολογιστής. Αν λοιπόν επιλέξεις τον 2ο δίσκο, ο οποίος αντιστοιχεί στο sdb, τότε θα φορτώσει ο bootloader που βλέπει μόνο το opensuse κι έτσι θα φορτώσει το opensuse.

    2ο τρόπος
    ——————-
    Αντί να έχεις 2 bootloader (έναν σε κάθε δίσκο), να έχεις μόνο έναν. Έστω για παράδειγμα ότι έχεις τον bootloader στον δίσκο sda και συγκεκριμένα στο partition sda1. Εκεί, μπορείς να κάνεις foreign OS probing, όπου ο bootloader θα ανιχνεύσει ότι υπάρχει 2ο λειτουργικό στον δίσκο sdb και συνεπώς θα καταχωρήσει μία 2η εγγραφή για το opensuse. Έτσι, έχεις μόνον έναν bootloader ο οποίος βλέπει και τα δύο λειτουργικά. Όλα καλά; Σχεδόν… μάλλον όχι…

    Το κλασσικό πρόβλημα με αυτό το σενάριο είναι ότι κάθε φορά που κάνεις αναβάθμιση του kernel, γίνεται rebuild το configuration του grub έτσι ώστε την επόμενη φορά που θα ανοίξεις το PC να μπουτάρεις με τον καινούριο kernel. Έστω λοιπόν ότι κάνεις αναβάθμιση τον πυρήνα του kernel του ubuntu. Τότε, την επόμενη φορά που θα κάνεις επανεκκίνηση θα δεις οτι έχει αλλάξει η γραμμή (παράμετρος) στον grub όσον αφορά στο ubuntu, έτσι ώστε να μπουτάρεις στον καινούριο σου kernel. Δυστυχώς όμως δεν ισχύει το ίδιο και για το 2ο (ή 3ο ή 4ο κ.λπ.) λειτουργικό, που στο παράδειγμά μας ειναι το opensuse. Όταν θα κάνεις λοιπόν αναβάθμιση τον kernel του opensuse, η πληροφορία αυτή ΔΕΝ θα γραφτεί πουθενά. Θα πρέπει έσυ manually να πας και την αλλάξεις, διαφορετικά παρόλο που θα έχεις τον νέο kernel installed στο opensuse, ο bootloader θα σε βάζει διαρκώς στον αρχικό που ξέρει.

    Λύση: Συνδυασμός των δύο τρόπων
    —————————————————————–
    Η καλύτερη μέθοδος για να έχεις παραπάνω από ένα Linux λειτουργικά στον ίδιο bootloader είναι αυτό που λέμε custom rule for boot chain. Η φιλοσοφία είναι ότι το 2ο λειτουργικό που θα εγκαταστήσεις θα έχει τον δικό του bootloader, αλλά εσύ θα τον καλέσεις μέσω του βασικού σου bootloader.

    Δηλαδή έχεις:

    sda – 1ος δίσκος με το ubuntu
    sda1 – swap
    sda2 – bootloader + root fs
    sda3 – home

    sdb – 2ο δίσκος με opensuse
    sdb1 – swap
    sdb2 – bootloader
    sdb3 – root

    Αυτό που θέλουμε να κάνουμε είναι να καλέσουμε τον 2ο bootloader μέσα από τον πρώτο. Έτσι δεν μας ενδιαφέρει να πάμε και να γράψουμε χειροκίνητα κάποιο entry στον 1ο bootloader σχετικά με τον νέο πυρήνα του OpenSUSE, αφού έχει τον δικό του, 2ο bootloader, να ασχολείται αυτόματα με αυτό.

    Συνεπώς πάμε στο /etc/grub.d του πρώτου bootloader και γράφουμε έναν custom rule:

    vi 40_custom

    #!/bin/bash
    exec tail -n +3 $0
    insmod part_msdos
    insmod chain

    menuentry “openSUSE 42.1 64-bit (Leap)” {
    set root=(hd1,2)
    chainloader +1
    }

    Σημείωση: Του λέμε να φορτώσει το partition 2 του δεύτερου δίσκου.
    hd0 –> sda
    hd1 –> sdb
    hd1,2 –> sdb2 (αυτό θέλουμε)

    Έτσι, μπορείς να πας να εγκαταστήσεις ό,τι θέλεις στον δεύτερο δίσκο, αρκεί στο 2ο partition του να γράψεις τον bootlader.

  3. hlias | 25/09/2016 at 12:39

    ΚΑΛΗΜΈΡΑ ΣΑΣ.
    ηθελα να ρωτησω αν τα τέσσερα διαφορετικά στάδια: BIOS/UEFI, bootloader, kernel και init. καταγραφονται σε καποιο αρχειο στο pc μας, οποτε βλεπουμε με ανεση τι
    ακριβως γινεται;
    ΕΥΧΑΡΙΣΤΩ

  4. hlias | 25/09/2016 at 15:27

    OK ΕΥΧΑΡΙΣΤΩ!!!!!!!!

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

Αρχείο δημοσιεύσεων