Το Gentoo χρησιμοποιεί μια ειδική μορφή σεναρίων του init η οποία, ανάμεσα στα άλλα χαρακτηριστικά, επιτρέπει αποφάσεις που καθοδηγούν εξαρτήσεις και εικονικά σενάρια του init. Το παρών κεφάλαιο εξηγεί όλες αυτές τις πτυχές και εξηγεί πώς να ασχοληθείτε με αυτά τα σενάρια. 2 2011-03-02
Επίπεδα Εκτέλεσης Εκκίνηση του Συστήματος

Όταν εκκινείτε το σύστημά σας, θα παρατηρήσετε να εμφανίζεται αρκετό κείμενο. Αν δώσετε προσοχή, θα διαπιστώσετε ότι το κείμενο αυτό είναι πάντα το ίδιο κάθε φορά που εκκινείτε το σύστημα. Η ακολουθία όλων αυτών των ενεργειών ονομάζεται ακολουθία εκκίνησης και είναι (λίγο ή πολύ) στατιστικά καθορισμένη.

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

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

Τέλος, αφού όλα τα σενάρια εκτελεστούν, το init ενεργοποιεί όλα τα τερματικά (στις περισσότερες περιπτώσεις μόνο τις εικονικές κονσόλες που είναι κρυμμένες με τα Alt-F1, Alt-F2, κτλ.) συνδέοντάς τα με μια ειδική διεργασία με όνομα agetty. Η διεργασία αυτή θα φροντίσει να μπορείτε να συνδεθείτε μέσω των τερματικών αυτών εκτελώντας το login.

Σενάρια του Init

Το init δεν εκτελεί απλά τα σενάρια στον κατάλογο /etc/init.d με τυχαία σειρά. Επίσης, δεν εκτελεί όλα τα σενάρια στο /etc/init.d, παρά μόνο αυτά που του δίνεται εντολή να εκτελέσει. Μετά αποφασίζει ποια σενάρια να εκτελέσει ελέγχοντας τον κατάλογο /etc/runlevels.

Αρχικά, το init εκτελεί όλα τα σενάρια από τον κατάλογο /etc/init.d που έχουν συμβολικό σύνδεσμο στον κατάλογο /etc/runlevels/boot. Συνήθως, ξεκινά τα σενάρια σε αλφαβητική σειρά, αλλά ορισμένα από αυτά έχουν πληροφορίες εξαρτήσεων μέσα τους, πληροφορώντας το σύστημα ότι κάποιο άλλο σενάριο πρέπει να εκτελεστεί προτού εκτελεστούν πρώτα τα ίδια.

Όταν όλα τα σενάρια σχετιζόμενα με το /etc/runlevels/boot εκτελεστούν, το init συνεχίζει με την εκτέλεση των σεναρίων για τα οποία υπάρχει ένας συμβολικός σύνδεσμος στο /etc/runlevels/default προς αυτά. Και πάλι θα χρησιμοποιήσει αλφαβητική σειρά προκειμένου να επιλέξει ποια σενάρια θα εκτελέσει πρώτα, εκτός αν ένα σενάριο έχει πληροφορίες εξάρτησης και στην περίπτωση αυτή η σειρά αλλάζει ώστε να υπάρξει μια σωστή σειρά εκκίνησης.

Πώς Δουλεύει το Init

Φυσικά το init δεν αποφασίζει για όλα αυτά από μόνο του. Χρειάζεται ένα αρχείο ρυθμίσεων που καθορίζει ποιες ενέργειες πρέπει να γίνουν. Το αρχείο αυτό είναι το /etc/inittab.

Αν θυμάστε την ακολουθία εκκίνησης που περιγράφηκε παραπάνω, θα θυμάστε ότι η πρώτη ενέργεια του init είναι να προσαρτήσει όλα τα συστήματα αρχείων. Αυτό ορίζεται στην εξής γραμμή από το αρχείο /etc/inittab:

si::sysinit:/sbin/rc sysinit

Η γραμμή αυτή δίνει εντολή στο init να εκτελέσει το /sbin/rc sysinit για να φέρει το σύστημα σε μια αρχική κατάσταση. Το σενάριο /sbin/rc φροντίζει για την αρχικοποίηση του συστήματος, οπότε μπορεί να σκεφθεί κανείς ότι το init δεν κάνει και πολλά - αναθέτει την εργασία της αρχικοποίησης του συστήματος σε μια άλλη διεργασία.

Στη συνέχεια, το init εκτελεί όλα τα σενάρια που είχαν συμβολικούς συνδέσμους στον κατάλογο /etc/runlevels/boot. Αυτό ορίζεται στην ακόλουθη γραμμή:

rc::bootwait:/sbin/rc boot

Και πάλι το σενάριο rc αναλαμβάνει τις απαραίτητες εργασίες. Σημειώστε ότι η επιλογή που δίνεται στο rc (boot) είναι η ίδια με το όνομα του υποκαταλόγου από τον κατάλογο /etc/runlevels που χρησιμοποιείται.

Τώρα το init ελέγχει το αρχείο ρυθμίσεών του για να δει ποιο runlevel θα πρέπει να εκτελέσει. Για να το κάνει αυτό, διαβάζει την ακόλουθη γραμμή από το αρχείο /etc/inittab:

id:3:initdefault:

Στην περίπτωση αυτή (την οποία οι περισσότεροι χρήστες του Gentoo χρησιμοποιούν), ο αριθμός του επιπέδου εκτέλεσης είναι 3. Χρησιμοποιώντας αυτή την πληροφορία, το init ελέγχει τι πρέπει να εκτελέσει για να εκκινήσει το επίπεδο εκτέλεσης 3:

l0:0:wait:/sbin/rc shutdown
l1:S1:wait:/sbin/rc single
l2:2:wait:/sbin/rc nonetwork
l3:3:wait:/sbin/rc default
l4:4:wait:/sbin/rc default
l5:5:wait:/sbin/rc default
l6:6:wait:/sbin/rc reboot

Η γραμμή που ορίζει το επίπεδο 3 και πάλι χρησιμοποιεί το σενάριο rc για να ξεκινήσει τις υπηρεσίες (τώρα με την παράμετρο default). Σημειώστε πάλι ότι η παράμετρος του rc είναι η ίδια με τον υποκατάλογο από το /etc/runlevels.

Όταν το rc τελειώσει, το init αποφασίζει για ποιες εικονικές κονσόλες θα πρέπει να ενεργοποιήσει και τι εντολές θα εκτελέσει σε καθεμία από αυτές:

c1:12345:respawn:/sbin/agetty 38400 tty1 linux
c2:12345:respawn:/sbin/agetty 38400 tty2 linux
c3:12345:respawn:/sbin/agetty 38400 tty3 linux
c4:12345:respawn:/sbin/agetty 38400 tty4 linux
c5:12345:respawn:/sbin/agetty 38400 tty5 linux
c6:12345:respawn:/sbin/agetty 38400 tty6 linux
Τι είναι ένα Επίπεδο Εκτέλεσης;

Παρατηρήσατε ότι το init χρησιμοποιεί κάποιους αριθμούς για να αποφασίζει ποιο επίπεδο εκτέλεσης θα πρέπει να ενεργοποιήσει. Το επίπεδο εκτέλεσης είναι μια κατάσταση στην οποία το σύστημά σας εκτελείται και περιέχει μια συλλογή από σενάρια (σενάρια επιπέδου εκτέλεσης ή σενάρια του init) που πρέπει να εκτελούνται όταν εισάγετε ή αφήνετε ένα επίπεδο εκτέλεσης.

Στο Gentoo ορίζονται 7 επίπεδα εκτέλεσης: τρία εσωτερικά και 4 οριζόμενα από το χρήστη. Τα εσωτερικά επίπεδα εκκίνησης ονομάζοναι sysinit, shutdown και reboot και εκτελούν αυτό που υποννοεί το όνομά τους: αρχικοποιούν το σύστημα, το κλείνουν και το επανεκκινούν.

Τα οριζόμενα από το χρήστη runlevel είναι αυτά με το συνοδευτικό υποκατάλογο του /etc/runlevels: boot, default, nonetwork και single. Το επίπεδο εκτέλεσης boot ξεκινά όλες τις απαραίτητες για το σύστημα υπηρεσίες που χρησιμοποιούν τα άλλα επίπεδα εκκίνησης. Τα υπόλοιπα τρία επίπεδα εκκίνησης διαφοροποιούνται στο ποιες υπηρεσίες ξεκινούν: Το default χρησιμοποιείται για όλες τις καθημερινές εργασίες, το nonetwork χρησιμοποιείται στην περίπτωση που δεν απαιτείται σύνδεση δικτύου και το single χρησιμοποιείται όταν θέλετε να επιδιορθώσετε το σύστημά σας.

Η Εργασία με τα Σενάρια του Init

Τα σενάρια που ξεκινά η διεργασία rc ονομάζονται σενάρια του init. Κάθε σενάριο στον κατάλογο /etc/init.d μπορεί να εκτελεστεί με τις παραμέτρους start, stop, restart, pause, zap, status, ineed, iuse, needsme, usesme ή broken.

Για να εκκινήσετε, τερματήσετε ή επανεκκινήσετε μια υπηρεσία (και όλες τις εξαρτώμενες από αυτήν υπηρεσίες) χρησιμοποιείστε τα start, stop και restart:

# /etc/init.d/postfix start
Μόνο οι υπηρεσίες που χρειάζονται τη συγκεκριμένη υπηρεσία τερματίζουν ή εκκινούν. Οι άλλες υπηρεσίες (αυτές που χρησιμοποιούν την υπηρεσία αλλά δεν την χρειάζονται) μένουν ανέπαφες.

Αν επιθυμείτε να τερματίσετε μια υπηρεσία, αλλά όχι τις υπηρεσίες που εξαρτώνται από αυτήν, μπορείτε να χρησιμοποιήσετε την παράμετρο pause:

# /etc/init.d/postfix pause

Αν θέλετε να δείτε σε ποια κατάσταση είναι μια υπηρεσία (έχει εκκινήσει, τερματίσει, είναι σε παύση, ...) χρησιμοποιήστε την παράμετρο status:

# /etc/init.d/postfix status

Αν η πληροφορία κατάστασης σας πληροφορεί ότι η υπηρεσία εκτελείται, αλλά γνωρίζετε ότι δεν εκτελείται, μπορείτε να επαναφέρετε την κατάσταση πληροφορίας σε "τερματισμένη" με την παράμετρο zap:

# /etc/init.d/postfix zap

Για να δείτε επίσης ποιες εξαρτήσεις έχει μια υπηρεσία, χρησιμοποιήστε την παράμετρο iuse ή ineed. Με την ineed βλέπετε τις υπηρεσίες που είναι πραγματικά απαραίτητες για τη σωστή λειτουργία της υπηρεσίας. Η iuse από την άλλη δείχνει τις υπηρεσίες που μπορεί να χρησιμοποιεί η προκειμένη υπηρεσία, αλλά δεν είναι απαραίτητες για τη σωστή λειτουργία της τελευταίας.

# /etc/init.d/postfix ineed

Με παρόμοιο τρόπο, μπορείτε να δείτε ποιες υπηρεσίες απαιτούν μια υπηρεσία (needsme) ή ποιες μπορεί να τις χρησιμοποιούν (usesme):

# /etc/init.d/postfix needsme

Τέλος, μπορείτε να δείτε τις εξαρτήσεις μιας υπηρεσίας που λείπουν:

# /etc/init.d/postfix broken
Η Εργασία με το rc-update Τι είναι το rc-update;

Το init σύστημα του Gentoo χρησιμοποιεί ένα δέντρο εξαρτήσεων για να αποφασίζει ποιες υπηρεσίες πρέπει να εκκινούν πρώτα. Μια και αυτό είναι μια βαρετή εργασία που δεν είναι επιθυμητό να εκτελούν οι χρήστες, δημιουργήσαμε εργαλεία που διευκολύνουν τη διαχείριση των επιπέδων εκτέλεσης και των σεναρίων του init.

Με το rc-update μπορείτε να προσθέσετε ή αφαιρέσετε σενάρια init σε ένα runlevel. Το εργαλείο rc-update στη συνέχεια θα ζητήσει από το σενάριο depscan.sh να ξαναχτίσει το δέντρο εξαρτήσεων.

Προσθήκη και Αφαίρεση Υπηρεσιών

Έχετε ήδη προσθέσει σενάρια init στο επίπεδο εκτέλεσης "default" κατά τη διάρκεια της εγκατάστασης του Gentoo. Στο σημείο εκείνο, μπορεί να μην είχατε ιδέα για το τι είναι το "default", αλλά τώρα πρέπει να έχετε. Το σενάριο rc-update απαιτεί μια παράμετρο που ορίζει την ενέργεια: add (προσθήκη), del (διαγραφή) ή show (εμφάνιση).

Για να προσθέσετε ή αφαιρέσετε ένα σενάριο init, απλά δώστε rc-update με την add ή del παράμετρο, ακολουθούμενο από το σενάριο init και το επίπεδο εκτέλεσης. Για παράδειγμα:

# rc-update del postfix default

Η εντολή rc-update show εμφανίζει όλα τα διαθέσιμα σενάρια init καθώς και το επίπεδο εκτέλεσης στο οποίο εκτελούνται:

# rc-update show

Μπορείτε επίσης να εκτελέσετε rc-update show (χωρίς το -v) για να δείτε μόνο τα ενεργοποιημένα σενάρια init και τα επίπεδα εκτέλεσης.

Παραμετροποίηση των Υπηρεσιών Γιατί η Ανάγκη για Επιπλέον Παραμετροποίηση;

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

Ένας δεύτερος λόγος για την ύπαρξη αυτής της παραμετροποίησης εκτός του σεναρίου init είναι για να μπορεί κάποιος να ενημερώνει τα σενάρια init χωρίς το φόβο ότι οι ρυθμίσεις θα χαθούν.

Ο Κατάλογος /etc/conf.d

Το Gentoo παρέχει ένα εύκολο τρόπο για την παραμετροποίηση μια υπηρεσίας: κάθε σενάριο init που μπορεί να παραμετροποιηθεί έχει ένα αρχείο στον κατάλογο /etc/conf.d. Για παράδειγμα, το σενάριο init apache2 (που ονομάζεται /etc/init.d/apache2) έχει ένα αρχείο ρυθμίσεων με όνομα /etc/conf.d/apache2, που περιέχει τις επιλογές που πιθανόν να χρειάζεται ο διακομιστής Apache 2 κατά την εκκίνησή του:

APACHE2_OPTS="-D PHP5"

Ένα τέτοιο αρχείο ρυθμίσεων περιέχει μόνο μεταβλητές (όπως το αρχείο /etc/make.conf), καθιστώντας εύκολη την παραμετροποίηση μιας υπηρεσίας. Επίσης, επιτρέπει να παρέχουμε περισσότερες πληροφορίες σχετικά με τις μεταβλητές (με τη μορφή σχολίων).

Συγγραφή Σεναρίων Init Πρέπει να Κάνω;

Όχι, η συγγραφή ενός σεναρίου init συνήθως δεν είναι απαραίτητη, μια και το Gentoo παρέχει έτοιμα προς χρήση σενάρια init για όλες τις παρεχόμενες υπηρεσίες. Ωστόσο, υπάρχει περίπτωση να εγκαταστήσατε μια υπηρεσία χωρίς το Portage για την οποία πιθανόν να χρειαστεί να γράψετε ένα σενάριο init.

Μην χρησιμοποιείτε το σενάριο init που παρέχεται με την υπηρεσία αν δεν είναι ρητά γραμμένο για το Gentoo: τα σενάρια init του Gentoo δεν είναι συμβατά με τα σενάρια init από άλλες διανομές!

Δομή

Παρακάτω εμφανίζεται η βασική δομή ενός σεναρίου init.

#!/sbin/runscript

depend() {
  (Πληροφορίες εξαρτήσεων)
}

start() {
  (Εντολές απαραίτητες για την εκκίνηση της υπηρεσίας)
}

stop() {
  (Εντολές απαραίτητες για τον τερματισμό της υπηρεσίας)
}

restart() {
  (Εντολές απαραίτητες για την επανεκκίνηση της υπηρεσίας)
}

Κάθε σενάριο init απαιτεί τον ορισμό της συνάρτησης start(). Όλα τα υπόλοιπα τμήματα είναι προαιρετικά.

Εξαρτήσεις

Υπάρχουν δύο ειδών εξαρτήσεων που μπορείτε να ορίσετε: οι use και need. Όπως είδαμε προηγουμένως, η εξάρτηση need είναι πιο αυστηρή από την use. Ακολουθώντας αυτό τον τύπο εξάρτησης, εισάγετε την υπηρεσία από την οποία εξαρτάται η υπηρεσία σας, ή την εικονική εξάρτηση.

Η εικονική εξάρτηση είναι μια εξάρτηση που παρέχει μια υπηρεσία, αλλά αυτή δεν παρέχεται αποκλειστικά από αυτή την υπηρεσία και μόνο. Το σενάριο init μπορεί να εξαρτάται από τον καταγραφέα ημερολογίου (logger) του συστήματος, αλλά υπάρχουν διαθέσιμα αρκετά συστήματα καταγραφέων (metalogd, syslog-ng, sysklogd, ...). Έτσι ενώ δεν μπορείτε να χρειάζεστε καθένα από αυτά (κανένα σωστό σύστημα δεν έχει όλους τους παραπάνω καταγραφείς ημερολογίου εγκατεστημένους να εκτελούνται), σιγουρέψαμε το γεγονός όλες αυτές οι υπηρεσίες να παρέχουν μια εικονική εξάρτηση.

Ας δούμε τις πληροφορίες εξαρτήσεων για την υπηρεσία postfix.

depend() {
  need net
  use logger dns
  provide mta
}

Όπως βλέπετε, η υπηρεσία postfix:

  • απαιτεί την εικονική εξάρτηση net (η οποία παρέχεται για παράδειγμα από το /etc/init.d/net.eth0)
  • χρησιμοποιεί την (εικονική) εξάρτηση logger (η οποία παρέχεται για παράδειγμα από το /etc/init.d/syslog-ng)
  • χρησιμοποιεί την (εικονική) εξάρτηση dns (η οποία παρέχεται για παράδειγμα από το /etc/init.d/named)
  • παρέχει την (εικονική εξάρτηση) mta (η οποία είναι κοινή για όλους τους διακομιστές ταχυδρομείου)
Έλεγχος της Σειράς

Σε μερικές περιπτώσεις μπορεί να μην απαιτείτε μια υπηρεσία, αλλά θέλετε η υπηρεσία σας να ξεκινήσει πρινμετά) από μια άλλη υπηρεσία εάν υπάρχει στο σύστημα (προσέξτε το υποθετικό - αυτό δεν αποτελεί πλέον εξάρτηση) και να εκτελεστεί στο ίδιο επίπεδο εκτέλεσης (προσέξτε το υποθετικό - μόνο υπηρεσίες του ίδιου επιπέδου εκτέλεσης εμπλέκονται). Μπορείτε να παρέχετε αυτές τις πληροφορίες χρησιμοποιώντας τις ρυθμίσεις before ή after.

Ως παράδειγμα θα δούμε τις ρυθμίσεις για την υπηρεσία Portmap:

depend() {
  need net
  before inetd
  before xinetd
}

Μπορείτε επίσης να χρησιμοποιήσετε το χαρακτήρα "*" για να λάβετε υπόψη όλες τις υπηρεσίες στο ίδιο επίπεδο εκτέλεσης, παρόλο που αυτό δεν ενδείκνυται.

depend() {
  before *
}

Αν η υπηρεσία σας πρέπει να γράψει σε τοπικούς δίσκους, θα χρειαστεί το localmount. Αν τοποθετήσει οτιδήποτε στο /var/run όπως ένα αρχείο pid, τότε θα πρέπει να ξεκινήσει μετά το bootmisc:

depend() {
  need localmount
  after bootmisc
}
Καθιερωμένες Συναρτήσεις

Εκτός από τη λειτουργικότητα του depend(), πρέπει επίσης να ορίσετε τη συνάρτηση start(). Αυτή περιέχει όλες τις απαραίτητες εντολές για την εκκίνηση της υπηρεσίας. Προτείνεται να χρησιμοποιείτε τις συναρτήσεις ebegin και eend για να πληροφορείτε το χρήστη σχετικά με το τι συμβαίνει:

start() {
  ebegin "Starting my_service"
  start-stop-daemon --start --exec /path/to/my_service \
    --pidfile /path/to/my_pidfile
  eend $?
}

Και το --exec και το --pidfile πρέπει να χρησιμοποιηθούν στις συναρτήσεις για εκκίνηση και τερματισμό. Αν η υπηρεσία δεν δημιουργεί ένα αρχείο pid, τότε χρησιμοποιήστε το --make-pidfile αν είναι δυνατό, αν και θα 'πρεπε να το τεστάρετε για να είστε σίγουροι. Αλλιώς, μην χρησιμοποιήτε αρχεία pid. Μπορείτε επίσης να προσθέσετε το --quiet στις επιλογές του start-stop-daemon, αλλά αυτό δεν προτείνεται εκτός αν η υπηρεσία είναι υπερβολικά λεπτομερής. Η χρήση του --quiet ίσως εμποδίσει την απασφαλμάτωση αν η υπηρεσία αποτύχει να εκκινήσει.

Σιγουρευτείτε ότι το --exec όντως καλεί μία υπηρεσία και όχι μόνο ένα σενάριο φλοιού το οποίο τρέχει υπηρεσίες και τερματίζει -- αυτό είναι αυτό που υποτίθεται ότι πρέπει να κάνει το σενάριο init.

Αν χρειάζεστε περισσότερα παραδείγματα της συνάρτησης start(), διαβάστε τον πηγαίο κώδικα των διαθέσιμων σεναρίων init στον κατάλογο /etc/init.d.

Άλλες συναρτήσεις που μπορείτε να ορίσετε είναι: stop() και restart(). Δεν είναι υποχρεωτικό να οριστούν! Το init σύστημά μας είναι αρκετά έξυπνο ώστε να συμπληρώσει τις συναρτήσεις αυτές από μόνο του αν χρησιμοποιήσετε το start-stop-daemon.

Αν και δεν πρέπει να δημιουργήσετε μία συνάρτηση stop(), εδώ είναι ένα παράδειγμα:

stop() {
  ebegin "Stopping my_service"
  start-stop-daemon --stop --exec /path/to/my_service \
    --pidfile /path/to/my_pidfile
  eend $?
}

Αν η υπηρεσία σας τρέχει κάποια άλλα σενάρια (για παράδειγμα, bash, python ή perl), και αυτό το σενάριο αργότερα αλλάζει ονόματα (για παράδειγμα, από foo.py σε foo), τότε θα χρειαστεί να προσθέσετε το --name στον start-stop-daemon. Πρέπει να καθορίσετε το νέο όνομα στο οποίο θα αλλάξει το σενάριό σας. Σε αυτό το παράδειγμα, μια υπηρεσία ξεκινά το foo.py, το οποίο αλλάζει όνομα σε foo:

start() {
  ebegin "Starting my_script"
  start-stop-daemon --start --exec /path/to/my_script \
    --pidfile /path/to/my_pidfile --name foo
  eend $?
}

Ο start-stop-daemon έχει μια εξαιρετική σελίδα man διαθέσιμη αν χρειάζεστε περισσότερες πληροφορίες:

# man start-stop-daemon

Η σύνταξη των σεναρίων εκκίνησης του Gentoo είναι βασισμένη στο κέλυφος Bourne Again Shell (bash) οπότε μπορείτε να χρησιμοποιήσετε δομές συμβατές με το bash μέσα στα σενάρια εκκίνησής σας. Ωστόσο, μπορεί να θέλετε τα σενάρια εκκίνησής σας να είναι πιστά στο POSIX. Μελλοντικά συστήματα σεναρίων εκκίνησης μπορεί να επιτρέπουν να δημιουργήσετε συμβολικό δεσμό του /bin/sh σε άλλα κελύφη πέρα από το bash. Τα σενάρια εκκίνησης που βασίζονται μόνο σε χαρακτηριστικά του bash δεν θα λειτουργούν σε εκείνα τα συστήματα.

Προσθήκη Προσαρμοσμένων Επιλογών

Αν επιθυμείτε το σενάριο σας init να υποστηρίζει περισσότερες επιλογές από αυτές που έχουμε ήδη δει, θα πρέπει να προσθέσετε την επιλογή στην μεταβλητή opts και να δημιουργήσετε μια συνάρτηση με ίδιο όνομα. Για παράδειγμα, για να υποστηρίζετε μια επιλογή με το όνομα restartdelay:

opts="${opts} restartdelay"

restartdelay() {
  stop
  sleep 3    # Περιμένετε 3 δευτ. πριν ξαναεκκινήσετε
  start
}
Μεταβλητές Ρύθμισης Υπηρεσίας

Δε χρειάζεται να κάνετε κάτι προκειμένου να υποστηρίξετε ένα αρχείο ρυθμίσεων στον κατάλογο /etc/conf.d: αν εκτελεστεί το σενάριο σας init, αναζητώνται τα παρακάτω αρχεία για ανάγνωση (οι μεταβλητές είναι διαθέσιμες προς χρησιμοποίηση):

  • /etc/conf.d/<your init script>
  • /etc/conf.d/basic
  • /etc/rc.conf

Επίσης, αν το σενάριο init παρέχει μια εικονική εξάρτηση (όπως η net), το αρχείο που σχετίζεται με την εξάρτηση αυτή (όπως το /etc/conf.d/net) επίσης θα αναγνωσθεί.

Αλλαγή της Συμπεριφοράς του Επιπέδου Εκτέλεσης Ποιος Ίσως Κερδίσει Από Αυτό;

Πολλοί χρήστες φορητών Η/Υ γνωρίζουν την κατάσταση: στο σπίτι πρέπει να εκκινούν το net.eth0, ενώ δεν πρέπει να εκκινούν την net.eth0 όσο είναι στο δρόμο (εφόσον δεν υπάρχει διαθέσιμο δίκτυο). Με το Gentoo μπορείτε να αλλάξετε τη συμπεριφορά του επιπέδου εκτέλεσης όπως επιθυμείτε.

Για παράδειγμα, μπορείτε να δημιουργήσετε ένα δεύτερο επίπεδο εκτέλεσης "default" με το οποίο θα εκκινήσετε και θα έχει άλλα σενάρια init συσχετισμένα με αυτό. Μπορείτε τότε κατά την εκκίνηση να επιλέξετε ποιο επίπεδο εκτέλεσης default θα χρησιμοποιήσετε.

Χρησιμοποίηση του softlevel

Καταρχήν, δημιουργήστε τον κατάλογο για το επίπεδο εκτέλεσης για το δεύτερο "default" επίπεδο εκτέλεσης. Για παράδειγμα, δημιουργούμε το επίπεδο εκτέλεσηςoffline:

# mkdir /etc/runlevels/offline

Προσθέστε τα απαραίτητα σενάρια init στα μόλις δημιουργηθέντα επίπεδα εκτέλεσης. Για παράδειγμα, αν θέλετε να έχετε ένα ακριβές αντίγραφο του τρέχοντος default επιπέδου εκτέλεσης αλλά χωρίς το net.eth0:

(Αντιγραφή όλων των υπηρεσιών από το default επίπεδο εκτέλεσης στο offline
επίπεδο εκτέλεσης)
# cd /etc/runlevels/default
# for service in *; do rc-update add $service offline; done
(Αφαίρεση ανεπιθύμητων υπηρεσιών από το επίπεδο εκτέλεσης offline)
# rc-update del net.eth0 offline
(Εμφάνιση των ενεργών υπηρεσιών για το επίπεδο εκτέλεσης offline)
# rc-update show offline
(Τμήμα δείγματος εξόδου)
               acpid | offline
          domainname | offline
               local | offline
            net.eth0 |

Αν και το net.eth0 έχει αφαιρεθεί από το επίπεδο εκτέλεσης offline, το udev ακόμα θα προσπαθήσει να αρχίσει οποιαδήποτε συσκευή εντοπίσει και να αρχίσει τις κατάλληλες υπηρεσίες. Γι αυτό, πρέπει να προσθέσετε κάθε υπηρεσία δικτύου που δεν θέλετε να ξεκινάει (καθώς επίσης υπηρεσίες από οποιαδήποτε άλλη συσκευή που μπορεί να αρχίσει από το udev) στο /etc/conf.d/rc όπως φαίνεται.

RC_COLDPLUG="yes"
(Μετά, καθορίστε τις υπηρεσίες που δεν θέλετε να ξεκινούν αυτόματα)
RC_PLUG_SERVICES="!net.eth0"
Για περισσότερες πληροφορίες στις υπηρεσίες αρχικοποίησης συσκευών, δείτε τα σχόλια μέσα στο αρχείο /etc/conf.d/rc.

Τώρα επεξεργαστείτε το αρχείο ρύθμισης του φορτωτή εκκίνησης και προσθέστε μια νέα εγγραφή για το offline επίπεδο εκτέλεσης. Για παράδειγμα, στο αρχείο /boot/grub/grub.conf:

title Gentoo Linux Offline Usage
  root (hd0,0)
  kernel (hd0,0)/kernel-2.4.25 root=/dev/hda3 softlevel=offline

Voilà, είστε έτοιμοι. Αν επανεκκινήσετε το σύστημά σας και επιλέξτε τη νέα εγγραφή στην εκκίνηση, θα χρησιμοποιηθεί το επίπεδο εκτέλεσης offline αντί του default.

Χρησιμοποίηση του bootlevel

Η χρησιμοποίηση του bootlevel είναι ανάλογη εκείνης του softlevel. Η μόνη διαφορά είναι ότι εδώ ορίζετε ένα δεύτερο επίπεδο εκτέλεσης "boot" αντί για ένα δεύτερο επίπεδο εκτέλεσης "default".