Πώς να χρησιμοποιήσετε την εντολή Init στο Linux

Το Init είναι ο γονέας όλων των διαδικασιών. Ο πρωταρχικός του ρόλος είναι να δημιουργήσει διαδικασίες από ένα σενάριο που είναι αποθηκευμένο στο αρχείο / etc / inittab (βλ. Inittab (5)). Αυτό το αρχείο έχει συνήθως καταχωρήσεις που προκαλούν init να spawn getty σε κάθε γραμμή που οι χρήστες μπορούν να συνδεθούν. Επίσης ελέγχει τις αυτόνομες διαδικασίες που απαιτούνται από οποιοδήποτε συγκεκριμένο σύστημα.

Ρυθμίσεις

Ένα επίπεδο εκτέλεσης είναι μια διαμόρφωση λογισμικού του συστήματος που επιτρέπει να υπάρχει μόνο μια επιλεγμένη ομάδα διαδικασιών. Οι διαδικασίες που δημιουργήθηκαν από το init για κάθε ένα από αυτά τα επίπεδα καθορίζονται στο αρχείο / etc / inittab . Το Init μπορεί να είναι σε ένα από τα οκτώ επίπεδα εκτέλεσης: 0-6 και S ή s . Το επίπεδο εκτέλεσης μεταβάλλεται έχοντας έναν προχωρημένο τελενίτη που τρέχει ο χρήστης, ο οποίος στέλνει τα κατάλληλα σήματα στην init , λέγοντάς του ποιο επίπεδο εκτέλεσης πρέπει να αλλάξει.

Τα επίπεδα λειτουργίας 0 , 1 και 6 διατηρούνται. Το Runlevel 0 χρησιμοποιείται για να σταματήσει το σύστημα, το επίπεδο εκτέλεσης 6 χρησιμοποιείται για την επανεκκίνηση του συστήματος και το επίπεδο εκτέλεσης 1 χρησιμοποιείται για να καταστεί το σύστημα κάτω σε λειτουργία ενός χρήστη. Το Runlevel S δεν προορίζεται για άμεση χρήση, αλλά περισσότερο για τα σενάρια που εκτελούνται κατά την είσοδο στο επίπεδο εκτέλεσης 1. Για περισσότερες πληροφορίες σχετικά με αυτό, ανατρέξτε στις σελίδες τερματισμού (8) και inittab (5).

Τα επίπεδα εκτέλεσης 7-9 ισχύουν επίσης, αν και δεν έχουν τεκμηριωθεί. Αυτό συμβαίνει επειδή οι "παραδοσιακές" παραλλαγές του Unix δεν τις χρησιμοποιούν. Σε περίπτωση που είστε περίεργοι, τα επίπεδα εκτέλεσης S και s είναι στην πραγματικότητα τα ίδια. Εσωτερικά είναι ψευδώνυμα για το ίδιο επίπεδο εκτέλεσης.

Εκκίνηση

Μετά την εισαγωγή του init ως το τελευταίο βήμα της ακολουθίας εκκίνησης του πυρήνα, αναζητά το αρχείο / etc / inittab για να διαπιστώσει αν υπάρχει μια καταχώρηση του τύπου initdefault (βλ. Inittab (5)). Η αρχική είσοδος καθορίζει το αρχικό επίπεδο εκτέλεσης του συστήματος. Εάν δεν υπάρχει τέτοια καταχώρηση (ή όχι / etc / inittab καθόλου), πρέπει να εισαχθεί ένα επίπεδο εκτέλεσης στην κονσόλα συστήματος.

Το Runlevel S ή s φέρνει το σύστημα σε λειτουργία ενός χρήστη και δεν απαιτεί αρχείο / etc / inittab . Στη λειτουργία ενός χρήστη, ανοίγει ένα ριζικό κέλυφος στο / dev / κονσόλα .

Κατά την είσοδο σε λειτουργία ενός χρήστη, το init διαβάζει τις καταστάσεις ioctl (2) της κονσόλας από το /etc/ioctl.save . Εάν αυτό το αρχείο δεν υπάρχει, το init αρχικοποιεί τη γραμμή με 9600 baud και με CLOCAL ρυθμίσεις. Όταν το init αφήνει τη λειτουργία ενός χρήστη, αποθηκεύει τις ρυθμίσεις του ioctl της κονσόλας σε αυτό το αρχείο, ώστε να μπορεί να τις επαναχρησιμοποιήσει για την επόμενη συνεδρία ενός χρήστη.

Όταν εισέρχεστε σε μια λειτουργία πολλαπλών χρηστών για πρώτη φορά, η init εκτελεί τις καταχωρίσεις εκκίνησης και bootwait για να επιτρέψει την εγκατάσταση συστημάτων αρχείων πριν να μπορέσουν οι χρήστες να συνδεθούν. Στη συνέχεια επεξεργάζονται όλες οι καταχωρήσεις που ταιριάζουν με το επίπεδο εκτέλεσης.

Κατά την εκκίνηση μιας νέας διαδικασίας, το init ελέγχει πρώτα αν υπάρχει το αρχείο / etc / initscript . Αν το κάνει, χρησιμοποιεί αυτό το σενάριο για να ξεκινήσει τη διαδικασία.

Κάθε φορά που ένα παιδί τερματίζει, το init καταγράφει το γεγονός και τον λόγο για τον οποίο πέθανε στο / var / run / utmp και / var / log / wtmp , υπό την προϋπόθεση ότι υπάρχουν αυτά τα αρχεία.

Αλλαγή επιπέδων λειτουργίας

Αφού έχει δημιουργήσει όλες τις διαδικασίες που ορίζονται, η init περιμένει μια από τις απογόνους της διαδικασίες να πεθάνει, ένα σήμα powerfail ή μέχρι να σηματοδοτηθεί από το telinit για να αλλάξει το επίπεδο εκτέλεσης του συστήματος. Όταν συμβαίνει μία από τις παραπάνω τρεις συνθήκες, επανεξετάζει το αρχείο / etc / inittab . Μπορείτε να προσθέσετε νέες καταχωρήσεις σε αυτό το αρχείο ανά πάσα στιγμή. Ωστόσο, το init εξακολουθεί να περιμένει να εμφανιστεί μία από τις τρεις παραπάνω συνθήκες. Για να παράσχει μια άμεση απάντηση, η εντολή telinit Q ή q μπορεί να ξυπνήσει init για να επανεξετάσει το αρχείο / etc / inittab .

Εάν το init δεν είναι σε κατάσταση ενός χρήστη και λαμβάνει ένα σήμα powerfail (SIGPWR), διαβάζει το αρχείο / etc / powerstatus . Στη συνέχεια ξεκινά μια εντολή που βασίζεται στα περιεχόμενα αυτού του αρχείου:

ΑΠΟΤΥΓΧΑΝΩ)

Η ισχύς αποτυγχάνει, η UPS παρέχει την ισχύ. Εκτελέστε τις εγγραφές powerwait και powerfail .

ΕΝΤΑΞΕΙ)

Η ισχύς έχει αποκατασταθεί, εκτελέστε τις καταχωρήσεις powerokwait .

ΧΑΜΗΛΟΣ)

Η ισχύς αποτυγχάνει και το UPS έχει χαμηλή μπαταρία. Εκτελέστε τις καταχωρήσεις powerfailnow .

Αν το / etc / powerstatus δεν υπάρχει ή περιέχει κάτι άλλο από τα γράμματα F , O ή L , το init θα συμπεριφερθεί σαν να έχει διαβάσει το γράμμα F.

Η χρήση των SIGPWR και / etc / powerstatus αποθαρρύνεται. Κάποιος που επιθυμεί να αλληλεπιδράσει με το init θα πρέπει να χρησιμοποιήσει το κανάλι ελέγχου / dev / initctl - δείτε τον πηγαίο κώδικα του πακέτου sysvinit για περισσότερες τεκμηρίωση γι 'αυτό.

Όταν ζητείται από το init να αλλάξει το επίπεδο εκτέλεσης, αποστέλλει το προειδοποιητικό σήμα SIGTERM σε όλες τις διαδικασίες που δεν έχουν καθοριστεί στο νέο επίπεδο εκτέλεσης. Στη συνέχεια περιμένει 5 δευτερόλεπτα πριν τερματίσει βίαια αυτές τις διαδικασίες μέσω του σήματος SIGKILL . Σημειώστε ότι το init υποθέτει ότι όλες αυτές οι διαδικασίες (και οι απόγονοί τους) παραμένουν στην ίδια ομάδα διαδικασιών που αρχικά δημιούργησαν αρχικά για αυτούς. Εάν κάποια διαδικασία αλλάξει τη συσχέτιση της ομάδας διεργασιών της, δεν θα λάβει αυτά τα σήματα. Τέτοιες διαδικασίες πρέπει να τερματιστούν χωριστά.

Telinit

/ sbin / telinit συνδέεται με / sbin / init . Παίρνει ένα επιχείρημα ενός χαρακτήρα και σηματοδοτεί την init για να εκτελέσει την κατάλληλη ενέργεια. Τα ακόλουθα επιχειρήματα χρησιμεύουν ως οδηγίες προς τελενίτη :

0 , 1 , 2 , 3 , 4 , 5 ή 6

πείτε στο init να μεταβεί στο καθορισμένο επίπεδο εκτέλεσης.

α , β , γ

πείτε στο init να επεξεργαστεί μόνο εκείνες τις καταχωρίσεις αρχείων / etc / inittab που έχουν επίπεδο εκτέλεσης a , b ή c .

Q ή q

πείτε στο init να επανεξετάσει το αρχείο / etc / inittab .

S ή s

πείτε στο init να μεταβείτε στη λειτουργία ενός χρήστη.

U ή u

πείτε στο init να επανεξετάσει τον εαυτό του (διατηρώντας την κατάσταση). Δεν γίνεται επανεξέταση του αρχείου / etc / inittab . Το επίπεδο εκτέλεσης πρέπει να είναι ένα από τα Ss12345 , διαφορετικά το αίτημα θα σιωπηλά αγνοείται.

Το telinit μπορεί επίσης να πει την init για πόσο διάστημα πρέπει να περιμένει μεταξύ της αποστολής των σημάτων SIGTERM και SIGKILL. Η προεπιλογή είναι 5 δευτερόλεπτα, αλλά αυτό μπορεί να αλλάξει με την επιλογή -t sec .

Το telinit μπορεί να χρησιμοποιηθεί μόνο από χρήστες με τα κατάλληλα προνόμια.

Ο δυαδικός έλεγχος init αν είναι init ή telinit εξετάζοντας το αναγνωριστικό της διαδικασίας . το πραγματικό αναγνωριστικό διαδικασίας του init είναι πάντα 1 . Από αυτό προκύπτει ότι αντί να ονομάζουμε telinit, μπορεί κανείς απλώς να χρησιμοποιήσει init αντί ως συντόμευση.