Όταν εκκινείτε το σύστημά σας, θα παρατηρήσετε να εμφανίζεται αρκετό κείμενο. Αν δώσετε προσοχή, θα διαπιστώσετε ότι το κείμενο αυτό είναι πάντα το ίδιο κάθε φορά που εκκινείτε το σύστημα. Η ακολουθία όλων αυτών των ενεργειών ονομάζεται
Αρχικά, ο φορτωτής εκκίνησης φορτώνει στη μνήμη την εικόνα του πυρήνα, όπως έχει οριστεί στο αρχείο παραμετροποίησης του φορτωτή, και στη συνέχεια δίνει εντολή στον επεξεργαστή να εκτελέσει τον πυρήνα. Όταν ο πυρήνας φορτωθεί και εκτελεστεί, αρχικοποιεί όλες τις δομές που σχετίζονται με τον πυρήνα και ξεκινά τη διεργασία
Η διεργασία αυτή φροντίζει όλα τα συστήματα αρχείων (που ορίζονται στο
Τέλος, αφού όλα τα σενάρια εκτελεστούν, το
Το
Αρχικά, το
Όταν όλα τα σενάρια σχετιζόμενα με το
Φυσικά το
Αν θυμάστε την ακολουθία εκκίνησης που περιγράφηκε παραπάνω, θα θυμάστε ότι η πρώτη ενέργεια του
si::sysinit:/sbin/rc sysinit
Η γραμμή αυτή δίνει εντολή στο
Στη συνέχεια, το
rc::bootwait:/sbin/rc boot
Και πάλι το σενάριο
Τώρα το
id:3:initdefault:
Στην περίπτωση αυτή (την οποία οι περισσότεροι χρήστες του Gentoo χρησιμοποιούν), ο αριθμός του
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 και πάλι χρησιμοποιεί το σενάριο
Όταν το
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
Παρατηρήσατε ότι το
Στο Gentoo ορίζονται 7 επίπεδα εκτέλεσης: τρία εσωτερικά και 4 οριζόμενα από το χρήστη. Τα εσωτερικά επίπεδα εκκίνησης ονομάζοναι
Τα οριζόμενα από το χρήστη runlevel είναι αυτά με το συνοδευτικό υποκατάλογο του
Τα σενάρια που ξεκινά η διεργασία
Για να εκκινήσετε, τερματήσετε ή επανεκκινήσετε μια υπηρεσία (και όλες τις εξαρτώμενες από αυτήν υπηρεσίες) χρησιμοποιείστε τα
# /etc/init.d/postfix start
Αν επιθυμείτε να τερματίσετε μια υπηρεσία, αλλά όχι τις υπηρεσίες που εξαρτώνται από αυτήν, μπορείτε να χρησιμοποιήσετε την παράμετρο
# /etc/init.d/postfix pause
Αν θέλετε να δείτε σε ποια κατάσταση είναι μια υπηρεσία (έχει εκκινήσει, τερματίσει, είναι σε παύση, ...) χρησιμοποιήστε την παράμετρο
# /etc/init.d/postfix status
Αν η πληροφορία κατάστασης σας πληροφορεί ότι η υπηρεσία εκτελείται, αλλά γνωρίζετε ότι δεν εκτελείται, μπορείτε να επαναφέρετε την κατάσταση πληροφορίας σε "τερματισμένη" με την παράμετρο
# /etc/init.d/postfix zap
Για να δείτε επίσης ποιες εξαρτήσεις έχει μια υπηρεσία, χρησιμοποιήστε την παράμετρο
# /etc/init.d/postfix ineed
Με παρόμοιο τρόπο, μπορείτε να δείτε ποιες υπηρεσίες απαιτούν μια υπηρεσία (
# /etc/init.d/postfix needsme
Τέλος, μπορείτε να δείτε τις εξαρτήσεις μιας υπηρεσίας που λείπουν:
# /etc/init.d/postfix broken
Το init σύστημα του Gentoo χρησιμοποιεί ένα δέντρο εξαρτήσεων για να αποφασίζει ποιες υπηρεσίες πρέπει να εκκινούν πρώτα. Μια και αυτό είναι μια βαρετή εργασία που δεν είναι επιθυμητό να εκτελούν οι χρήστες, δημιουργήσαμε εργαλεία που διευκολύνουν τη διαχείριση των επιπέδων εκτέλεσης και των σεναρίων του init.
Με το
Έχετε ήδη προσθέσει σενάρια init στο επίπεδο εκτέλεσης "default" κατά τη διάρκεια της εγκατάστασης του Gentoo. Στο σημείο εκείνο, μπορεί να μην είχατε ιδέα για το τι είναι το "default", αλλά τώρα πρέπει να έχετε. Το σενάριο
Για να προσθέσετε ή αφαιρέσετε ένα σενάριο init, απλά δώστε
# rc-update del postfix default
Η εντολή
# rc-update show
Μπορείτε επίσης να εκτελέσετε
Τα σενάρια init μπορούν να είναι ιδιαίτερα περίπλοκα. Γι αυτό λοιπόν δεν είναι επιθυμητό να πρέπει οι χρήστες να επεξεργάζονται το σενάριο init απευθείας, διαδικασία που είναι επιρρεπής σε λάθη. Είναι ωστόσο σημαντικό να μπορούν να παραμετροποιούν μια τέτοια υπηρεσία. Για παράδειγμα, μπορεί να επιθυμείτε να δώσετε περισσότερες παραμέτρους σε μια υπηρεσία.
Ένας δεύτερος λόγος για την ύπαρξη αυτής της παραμετροποίησης εκτός του σεναρίου init είναι για να μπορεί κάποιος να ενημερώνει τα σενάρια init χωρίς το φόβο ότι οι ρυθμίσεις θα χαθούν.
Το Gentoo παρέχει ένα εύκολο τρόπο για την παραμετροποίηση μια υπηρεσίας: κάθε σενάριο init που μπορεί να παραμετροποιηθεί έχει ένα αρχείο στον κατάλογο
APACHE2_OPTS="-D PHP5"
Ένα τέτοιο αρχείο ρυθμίσεων περιέχει μόνο μεταβλητές (όπως το αρχείο
Όχι, η συγγραφή ενός σεναρίου init συνήθως δεν είναι απαραίτητη, μια και το Gentoo παρέχει έτοιμα προς χρήση σενάρια init για όλες τις παρεχόμενες υπηρεσίες. Ωστόσο, υπάρχει περίπτωση να εγκαταστήσατε μια υπηρεσία χωρίς το Portage για την οποία πιθανόν να χρειαστεί να γράψετε ένα σενάριο init.
Μην χρησιμοποιείτε το σενάριο init που παρέχεται με την υπηρεσία αν δεν είναι ρητά γραμμένο για το Gentoo: τα σενάρια init του Gentoo δεν είναι συμβατά με τα σενάρια init από άλλες διανομές!
Παρακάτω εμφανίζεται η βασική δομή ενός σεναρίου init.
#!/sbin/runscript depend() {(Πληροφορίες εξαρτήσεων) } start() {(Εντολές απαραίτητες για την εκκίνηση της υπηρεσίας) } stop() {(Εντολές απαραίτητες για τον τερματισμό της υπηρεσίας) } restart() {(Εντολές απαραίτητες για την επανεκκίνηση της υπηρεσίας) }
Κάθε σενάριο init
Υπάρχουν δύο ειδών εξαρτήσεων που μπορείτε να ορίσετε: οι
Η
Ας δούμε τις πληροφορίες εξαρτήσεων για την υπηρεσία postfix.
depend() { need net use logger dns provide mta }
Όπως βλέπετε, η υπηρεσία postfix:
Σε μερικές περιπτώσεις μπορεί να μην απαιτείτε μια υπηρεσία, αλλά θέλετε η υπηρεσία σας να ξεκινήσει
Ως παράδειγμα θα δούμε τις ρυθμίσεις για την υπηρεσία Portmap:
depend() { need net before inetd before xinetd }
Μπορείτε επίσης να χρησιμοποιήσετε το χαρακτήρα "*" για να λάβετε υπόψη όλες τις υπηρεσίες στο ίδιο επίπεδο εκτέλεσης, παρόλο που αυτό δεν ενδείκνυται.
depend() { before * }
Αν η υπηρεσία σας πρέπει να γράψει σε τοπικούς δίσκους, θα χρειαστεί το
depend() { need localmount after bootmisc }
Εκτός από τη λειτουργικότητα του
start() { ebegin "Starting my_service" start-stop-daemon --start --exec /path/to/my_service \ --pidfile /path/to/my_pidfile eend $? }
Και το
Αν χρειάζεστε περισσότερα παραδείγματα της συνάρτησης
Άλλες συναρτήσεις που μπορείτε να ορίσετε είναι:
Αν και δεν
stop() { ebegin "Stopping my_service" start-stop-daemon --stop --exec /path/to/my_service \ --pidfile /path/to/my_pidfile eend $? }
Αν η υπηρεσία σας τρέχει κάποια άλλα σενάρια (για παράδειγμα, bash, python ή perl), και αυτό το σενάριο αργότερα αλλάζει ονόματα (για παράδειγμα, από
start() { ebegin "Starting my_script" start-stop-daemon --start --exec /path/to/my_script \ --pidfile /path/to/my_pidfile --name foo eend $? }
Ο
# man start-stop-daemon
Η σύνταξη των σεναρίων εκκίνησης του Gentoo είναι βασισμένη στο κέλυφος Bourne Again Shell (bash) οπότε μπορείτε να χρησιμοποιήσετε δομές συμβατές με το bash μέσα στα σενάρια εκκίνησής σας. Ωστόσο, μπορεί να θέλετε τα σενάρια εκκίνησής σας να είναι πιστά στο POSIX. Μελλοντικά συστήματα σεναρίων εκκίνησης μπορεί να επιτρέπουν να δημιουργήσετε συμβολικό δεσμό του
Αν επιθυμείτε το σενάριο σας init να υποστηρίζει περισσότερες επιλογές από αυτές που έχουμε ήδη δει, θα πρέπει να προσθέσετε την επιλογή στην μεταβλητή
opts="${opts} restartdelay" restartdelay() { stop sleep 3# Περιμένετε 3 δευτ. πριν ξαναεκκινήσετε start }
Δε χρειάζεται να κάνετε κάτι προκειμένου να υποστηρίξετε ένα αρχείο ρυθμίσεων στον κατάλογο
Επίσης, αν το σενάριο init παρέχει μια εικονική εξάρτηση (όπως η
Πολλοί χρήστες φορητών Η/Υ γνωρίζουν την κατάσταση: στο σπίτι πρέπει να εκκινούν το
Για παράδειγμα, μπορείτε να δημιουργήσετε ένα δεύτερο επίπεδο εκτέλεσης "default" με το οποίο θα εκκινήσετε και θα έχει άλλα σενάρια init συσχετισμένα με αυτό. Μπορείτε τότε κατά την εκκίνηση να επιλέξετε ποιο επίπεδο εκτέλεσης default θα χρησιμοποιήσετε.
Καταρχήν, δημιουργήστε τον κατάλογο για το επίπεδο εκτέλεσης για το δεύτερο "default" επίπεδο εκτέλεσης. Για παράδειγμα, δημιουργούμε το επίπεδο εκτέλεσης
# mkdir /etc/runlevels/offline
Προσθέστε τα απαραίτητα σενάρια init στα μόλις δημιουργηθέντα επίπεδα εκτέλεσης. Για παράδειγμα, αν θέλετε να έχετε ένα ακριβές αντίγραφο του τρέχοντος
(Αντιγραφή όλων των υπηρεσιών από το 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 |
Αν και το
RC_COLDPLUG="yes"(Μετά, καθορίστε τις υπηρεσίες που δεν θέλετε να ξεκινούν αυτόματα) RC_PLUG_SERVICES="!net.eth0"
Τώρα επεξεργαστείτε το αρχείο ρύθμισης του φορτωτή εκκίνησης και προσθέστε μια νέα εγγραφή για το
title Gentoo Linux Offline Usage root (hd0,0) kernel (hd0,0)/kernel-2.4.25 root=/dev/hda3 softlevel=offline
Voilà, είστε έτοιμοι. Αν επανεκκινήσετε το σύστημά σας και επιλέξτε τη νέα εγγραφή στην εκκίνηση, θα χρησιμοποιηθεί το επίπεδο εκτέλεσης
Η χρησιμοποίηση του