Κεφάλαιο 18: Διαχείριση Πακέτων στο Slackware Ένα πακέτο λογισμικού (software package) είναι ένα σύνολο από σχετικά προγράμματα που είναι έτοιμα για εγκατάσταση. Όταν κατεβάζετε ένα αρχείου πηγαίου κώδικα, πρέπει να το ρυθμίσετε, να το μεταγλωττίσετε, και να το εγκαταστήσετε με το χέρι. Με το πακέτο λογισμικού, αυτό έχει ήδη γίνει για εσάς. Το μόνο που πρέπει να κάνετε είναι να εγκαταστήσετε το πακέτο. Ένα άλλο εύχρηστο χαρακτηριστικό της χρήσης πακέτων λογισμικού είναι η εύκολη απεγκατάσταση και αναβάθμιση τους, όταν το επιθυμείτε. Το Slackware έρχεται με προγράμματα για όλες τις ανάγκες διαχείρισης πακέτων. Μπορείτε να εγκαταστήσετε, να αφαιρέσετε, να αναβαθμίσετε, να δημιουργήσετε, και να εξετάσετε πακέτα πολύ εύκολα. Υπάρχει ένας μύθος που συνεχίζετε από τότε που πρωτοεμφανίσθηκε ο Διαχειριστής Πακέτων του RedHat (RedHat Package Manager), ότι το Slackware δεν έχει κάποιο εργαλείο διαχείρισης πακέτων. Αυτό απλά δεν θα μπορούσε να ήταν πιο μακριά από την πραγματικότητα. Το Slackware πάντα περιελάμβανε έναν διαχειριστή πακέτων, ακόμα και πριν την ύπαρξη του RedHat. Μπορεί να μην είναι τόσο πλήρες ή πανταχού παρόν σαν τα rpm, το pkgtool και τα σχετικά με αυτό προγράμματα είναι όμως εξίσου καλά στην εγκατάσταση πακέτων ως rpm. Η αλήθεια για το pkgtool δεν είναι ότι δεν υπάρχει, αλλά ότι δεν κάνει κανένα έλεγχο εξαρτήσεων (dependency checking). Προφανώς πολλοί άνθρωποι από κοινότητα του Linux πιστεύουν ότι ένας διαχειριστής πακέτων πρέπει εξορισμού να περιλαμβάνει έλεγχο εξαρτήσεων. Λοιπόν, για αυτό απλά δεν τίθεται θέμα, εφόσον το Slackware σχεδόν πάντα δεν κάνει κάτι τέτοιο. Αυτό δεν λέει ότι τα πακέτα του Slackware δεν έχουν εξαρτήσεις, αλλά ότι ο διαχειριστής πακέτων δεν κάνει έλεγχο για αυτές. Ο έλεγχος εξαρτήσεων έχει αφεθεί στον διαχειριστή του συστήματος, και αυτός είναι ο τρόπος που μας αρέσει. 18.1 Περίληψη της Μορφής των Πακέτων Πριν την εκμάθηση των εργαλείων, πρέπει να αποκτήσετε οικειότητα με την μορφή των πακέτων του Slackware. Στο Slackware, ένα πακέτο είναι απλά ένα αρχείο tar που έχει συμπιεστεί με το gzip. Τα πακέτα είναι έτσι φτιαγμένα ώστε να αποσυμπιέζονται στον κατάλογο root. Εδώ υπάρχει ένα παράδειγμα από ένα φανταστικό πρόγραμμα και το πακέτο του:./ usr/ usr/bin/ usr/bin/makehejaz usr/doc usr/doc/makehajaz-1.0/ usr/doc/makehajaz-1.0/copying usr/doc/makehajaz-1.0/readme usr/man usr/man/man1 usr/man/man1/makehejaz.1.gz install/ install/doinst.sh Το σύστημα πακέτων θα αποσυμπιέσει και θα τοποθετήσει αυτό το αρχείο στον κατάλογο
root και θα το εγκαταστήσει. Θα δημιουργηθεί μία εγγραφή στη βάση δεδομένων των πακέτων που θα περιέχει τα περιεχόμενα αυτού του πακέτου έτσι ώστε να μπορείτε να το αφαιρέσετε ή να το αναβαθμίσετε αργότερα. Σημειώστε τον υποκατάλογο install/. Είναι ένας ειδικός κατάλογος που μπορεί να περιέχει ένα αρχείο διαταγών μετά-εγκατάστασης (post-installation) που ονομάζεται doinst.sh. Εάν το σύστημα πακέτων βρει το αρχείο, θα το εκτελέσει μετά την εγκατάσταση του πακέτου. Άλλα αρχεία διαταγών μπορούν να ενσωματωθούν στα πακέτα, αλλά αυτά περιγράφονται αναλυτικά στην παράγραφο 18.3.2 παρακάτω. 18.2 Εργαλεία Πακέτων Υπάρχουν τέσσερα βασικά εργαλεία για την διαχείριση πακέτων. Εκτελούν εγκατάσταση, απεγκατάσταση, και αναβαθμίσεις των πακέτων. pkgtool Το pkgtool(8) είναι ένα πρόγραμμα οδηγούμενο από μενού που επιτρέπει την εγκατάσταση και την απεγκατάσταση πακέτων. Το βασικό μενού φαίνεται στο σχήμα Σχήμα 18-1. Σχήμα 18-1. Το βασικό μενού του pkgtool Η εγκατάσταση γίνετε από το τρέχον κατάλογο, από άλλο κατάλογο, ή από δισκέτες. Απλά επιλέξτε την μέθοδο εγκατάστασης που θέλετε και το pkgtool θα ψάξει αυτή την τοποθεσία αυτή για πακέτα προς εγκατάσταση. Μπορείτε επίσης να δείτε μία λίστα από τα εγκατεστημένα πακέτα, όπως φαίνεται στο Σχήμα 18-2.
Σχήμα 18-2. Η κατάσταση εμφάνισης (view mode) του pkgtool Εάν θέλετε να αφαιρέσετε πακέτα, επιλέξτε την επιλογή απεγκατάστασης και θα σας παρουσιαστεί μία λίστα επιλογών (checklist) με όλα τα εγκατεστημένα πακέτα. Σημειώστε αυτά που θέλετε να αφαιρέσετε και πατήστε OK. Το pkgtool θα τα αφαιρέσει. Κάποιοι χρήστες προτιμούν αυτό το εργαλείο από αυτά της γραμμής εντολών. Ωστόσο, πρέπει να σημειωθεί ότι τα εργαλεία γραμμής εντολών προσφέρουν πολύ περισσότερες επιλογές. Επίσης, η δυνατότητα αναβάθμισης πακέτων προσφέρεται μόνο μέσο των εργαλείων γραμμής εντολών. Installpkg Το installpkg(8) χειρίζεται την εγκατάσταση νέων πακέτων στο σύστημα. Η σύνταξη του είναι: # installpkg επιλογή όνομα_πακέτου Τρεις επιλογές παρέχονται στο installpkg. Μόνο μία μπορεί να χρησιμοποιείτε κάθε φορά. Πίνακας 18-1. Επιλογές του isntallpkg Επιλογή Αποτελέσματα -m Εκτελεί μία λειτουργία makepkg στο τρέχον κατάλογο. -warn Δείχνει τι θα συμβεί εάν εγκαταστήσετε το συγκεκριμένο πακέτο. Αυτό είναι χρήσιμο για συστήματα παραγωγής ώστε να βλέπετε ακριβώς τι θα γίνει πριν εγκαταστήσετε κάτι. -r Επαναληπτικά εγκαθιστά όλα τα πακέτα από τρέχον κατάλογο και κάτω. Το όνομα του πακέτου μπορεί να είναι μάσκα (wildcard), το όποιο θα χρησιμοποιείται σαν μάσκα αναζήτησης όταν εγκαθιστά επαναληπτικά. Εάν αλλάξετε την μεταβλητή περιβάλλοντος ROOT πριν το installpkg, αυτός ο κατάλογος θα χρησιμοποιηθεί σαν κατάλογος root. Αυτό είναι χρήσιμο για την εγκατάσταση νέων οδηγών συσκευών για τον κατάλογο root. Τυπικά θα προσαρτηθούν στο /mnt ή σε κάτι άλλο από το /. Η βάση δεδομένων των εγκατεστημένων πακέτων είναι αποθηκευμένη στο /var/log/packages. Οι εγγραφές είναι στην πραγματικότητα απλά αρχεία κειμένου, ένα για
κάθε πακέτο. Εάν το πακέτο έχει κάποιο αρχείο διαταγών μετά-εγκατάστασης, θα είναι γραμμένο στο /var/log/scripts/. Μπορείτε να ορίσετε διάφορα πακέτα ή να χρησιμοποιήσετε μάσκες κειμένου για όνομα πακέτου. Να θυμάστε ότι το installpkg δεν θα σας ενημερώσει εάν γράφετε πάνω από κάποιο εγκατεστημένο πακέτο. Απλά θα το εγκαταστήσει από πάνω από το παλιό. Εάν θέλετε να εξασφαλίσετε ότι τα παλιά αρχεία από το προηγούμενο πακέτο έχουν αφαιρεθεί με ασφάλεια, χρησιμοποιήστε το upgradepkg. removepkg Το removepkg(8) χειρίζεται την αφαίρεση των εγκατεστημένων πακέτων από το σύστημα. Η σύνταξη του είναι όπως φαίνεται παρακάτω: # removepkg επιλογή όνομα_πακέτου Τέσσερις επιλογές παρέχονται για το removepkg. Μόνο μία μπορεί να χρησιμοποιείτε κάθε φορά. Πίνακας 18-2. Επιλογές του removepkg Επιλογή -copy Αποτελέσματα Το πακέτο αντιγράφετε στον προστατευμένο κατάλογο πακέτων. Αυτό δημιουργεί ένα δέντρο από το αυθεντικό πακέτο χωρίς να το αφαιρεί. -keep Αποθηκεύει προσωρινά τα αρχεία που δημιουργήθηκαν κατά την αφαίρεση. Είναι χρήσιμο μόνο για χρήση debugging. -preserve Το πακέτο αφαιρείτε, αλλά αντιγράφεται στον προστατευμένο κατάλογο πακέτων την ίδια στιγμή. -warn Δείχνει το τι θα συμβεί εάν αφαιρέσετε το πακέτο. Εάν αλλάξετε την μεταβλητή περιβάλλοντος ROOT πριν το removepkg, αυτός ο κατάλογος θα χρησιμοποιηθεί σαν κατάλογος root. Αυτό είναι χρήσιμο για την εγκατάσταση νέων οδηγών συσκευών για τον κατάλογο root. Τυπικά θα προσαρτηθούν στο /mnt ή σε κάτι άλλο από το /. Το removepkg κοιτάει στα εγκαταστημένα πακέτα και αφαιρεί μόνο τα μοναδικά, για το πακέτο που ορίσατε αρχεία. Θα ελέγξει επίσης για το αρχείο διαταγών μετά-εγκατάστασης για το συγκεκριμένο πακέτο και θα διαγράψει οποιοδήποτε συμβολικό σύνδεσμο δημιουργήθηκε από αυτό. Κατά την διαδικασία αφαίρεσης, μία αναφορά κατάστασης εμφανίζεται. Μετά την εγκατάσταση, η εγγραφή στη βάση δεδομένων πακέτων μεταφέρεται στο /var/log/removed_packages και το αρχείο μετά-εγκατάστασης μεταφέρεται στο /var/log/removed_scripts. Όπως και στο installpkg, μπορείτε να ορίσετε διάφορα πακέτα ή να χρησιμοποιήσετε μάσκες κειμένου για το όνομα του πακέτου. upgradepkg Το upgrade(8) θα αναβαθμίσει ένα εγκατεστημένο πακέτου του Slackware. Η σύνταξη του
είναι όπως φαίνεται παρακάτω: # upgradepkg όνομα_πακέτου # upgradepkg όνομα_παλιού_πακέτου%όνομα_νέου_πακέτου Το upgradepkg δουλεύει εγκαθιστώντας το νέο πακέτο και μετά αφαιρώντας το παλιό πακέτο έτσι ώστε τα παλιά αρχεία να μην υπάρχουν στο σύστημα. Εάν το όνομα του αναβαθμισμένου πακέτου έχει αλλάξει, χρησιμοποιήστε τη σύνταξη με το σύμβολο επί τις εκατό για να ορίσετε το παλιό πακέτο (αυτό που είναι εγκατεστημένο) και το νέο πακέτο (η αναβάθμιση του παλιού). Εάν αλλάξετε την μεταβλητή περιβάλλοντος ROOT πριν το upgradepkg, αυτός ο κατάλογος θα χρησιμοποιηθεί σαν κατάλογος root. Αυτό είναι χρήσιμο για την εγκατάσταση νέων οδηγών συσκευών για τον κατάλογο root. Τυπικά θα προσαρτηθούν στο /mnt ή σε κάτι άλλο από το /. Το upgradepkg δεν είναι άψογο. Πάντα πρέπει να κρατάτε αντίγραφα ασφαλείας από τα αρχεία διαμόρφωσης (configuration files). Εάν διαγραφούν ή ξαναγραφτούν, χρειάζεστε ένα αντίγραφο από τα αυθεντικά για λόγους επιδιόρθωσης. Όπως και στο installpkg και στο removepkg, μπορείτε να ορίσετε διάφορα πακέτα ή να χρησιμοποιήσετε μάσκες κειμένου για το όνομα του πακέτου. rpm2tgz/rpm2targz Ο διαχειριστής πακέτων του Red Hat είναι ένα δημοφιλές σύστημα πακέτων που είναι διαθέσιμο σήμερα. Πολλές διανομές λογισμικού προσφέρουν τα προϊόντα τους σε μορφή RPM. Εφόσον αυτό δεν είναι η φυσική σε εμάς μορφή, δεν προτείνουμε στους ανθρώπους να βασίζονται σε αυτά. Ωστόσο, κάποια πράγματα είναι διαθέσιμα μόνο σε RPM (ακόμα και ο πηγαίος κώδικας). Παρέχουμε ένα πρόγραμμα που θα μετατρέπει τα RPM πακέτα στη φυσική σε εμάς μορφή.tgz. Αυτό θα σας επιτρέψει να αποσυμπιέζετε τα πακέτα (πιθανότατα με το exlodepkg) σε ένα προσωρινό κατάλογο και να ελέγχετε τα περιεχόμενα τους. Το πρόγραμμα rpm2tgz θα δημιουργήσει ένα πακέτο του Slackware με επέκταση.tgz, ενώ το rpm2targz δημιουργεί ένα αρχείο με επέκταση.tar.gz. 18.3 Δημιουργία Πακέτων Η δημιουργία πακέτων στο Slackware μπορεί να είναι είτε εύκολη ή δύσκολη. Δεν υπάρχει συγκεκριμένη μέθοδος για την κατασκευή πακέτων. Η μόνη προδιαγραφή είναι ότι το πακέτο πρέπει να είναι σε αρχείο tar συμπιεσμένο με gzip και εάν υπάρχει κάποιο αρχείο διαταγών μετά-εγκατάστασης, πρέπει να βρίσκεται στο /install/doinst.sh. Εάν ενδιαφέρεστε για την δημιουργία πακέτων για το σύστημα σας ή για ένα δίκτυο που διαχειρίζεστε, πρέπει να ρίξετε μια ματιά στα διάφορα αρχεία διαταγών μέσα στο δέντρο πηγής (source tree) του Slackware. Υπάρχουν διάφορες μέθοδοι που χρησιμοποιούμε για την δημιουργία πακέτων.
explodepkg Το explodepkg(8) θα κάνει το ότι κάνει και το installpkg για να αποσυμπιέσει το πακέτο, αλλά δεν το εγκαθιστά πραγματικά και δεν το καταγράφει στην βάση δεδομένων των πακέτων. Απλά το αποσυμπιέζει στο τρέχον κατάλογο. Εάν δείτε στο πηγαίο δέντρο του Slackware, θα δείτε πως χρησιμοποιούμε αυτή την εντολή για πακέτα πλαισίου (framework). Αυτά τα πακέτα περιέχουν έναν σκελετό για το πως θα πρέπει το τελικό πακέτο να μοιάζει. Κρατάνε όλα τα απαραίτητα ονόματα αρχείων (μηδενικού μήκους, zero-length), τα δικαιώματα, και τις ιδιοκτησίες. Τα αρχεία διαταγών κατασκευής (build scripts) θα αντιγράψουν τα περιεχόμενα του πακέτου από τον πηγαίο κατάλογο στον κατάλογο δημιουργίας του πακέτου. makepkg Το makepkg(8) θα πακετάρει το τρέχον κατάλογο σε ένα σωστό πακέτο του Slackware. Θα ψάξει το δέντρο για οποιοδήποτε συμβολικό σύνδεσμο και θα προσθέσει ένα κομμάτι δημιουργίας (creation block) στο αρχείο μετά-εγκατάστασης για να τα δημιουργήσει κατά την εγκατάσταση του πακέτου. Επίσης μας προειδοποιεί για οποιοδήποτε αρχείο μηδενικού μήκους στο δέντρο του πακέτου. Αυτή η εντολή τυπικά τρέχει αφού έχετε δημιουργήσει το δέντρο του πακέτου. Αρχεία Διαταγών SlackBuild Τα πακέτα του Slackware είναι κατασκευασμένα με πολλούς διαφορετικούς τρόπους λόγω αναγκών. Δεν είναι όλα τα πακέτα γραμμένα από τους προγραμματιστές τους για να μεταγλωττίζονται με τον ίδιο τρόπο. Πολλά έχουν επιλογές κατά την διάρκεια της μεταγλώττισης που δεν περιλαμβάνονται όλα στα πακέτα που χρησιμοποιεί το Slackware. Πιθανόν να χρειάζεστε λίγο από αυτή την λειτουργικότητα, τότε πρέπει να μεταγλωττίσετε το πακέτο σας. Ευτυχώς για πολλά πακέτα του Slackware, μπορείτε να βρείτε τα αχρεία διαταγών SlackBuild στον πηγαίο κώδικα του πακέτου. Λοιπόν τι είναι τα αρχεία διαταγών SlackBuild; Τα αρχεία διαταγών SlackBuild είναι εκτελέσιμα αρχεία διαταγών που μπορείτε να εκτελείτε ως root για να ρυθμίσετε, να μεταγλωττίσετε, και να δημιουργήσετε πακέτα του Slackware. Μπορείτε ελεύθερα να αλλάξετε αυτά τα αρχεία στον πηγαίο κατάλογο και να τα τρέξετε για να δημιουργήσετε τις δικές σας εκδόσεις από τα προκαθορισμένα πακέτα του Slackware. 18.4 Δημιουργία Ετικετών και Tagfiles (για εγκατάσταση) Το πρόγραμμα εγκατάστασης του Slackware χειρίζεται την εγκατάσταση των πακέτων λογισμικού στο σύστημά σας. Υπάρχουν αρχεία που λένε στο πρόγραμμα εγκατάστασης ποια πακέτα πρέπει να εγκατασταθούν, ποια είναι προαιρετικά, και ποια είναι επιλεγμένα από το σύστημα για το πρόγραμμα εγκατάστασης. Ένα tagfile είναι στον πρώτο κατάλογο σειράς λογισμικού (software series directory) και ονομάζεται tagfile. Αυτό έχει μια λίστα από τα πακέτα σε αυτόν το δίσκο και την κατάσταση τους. Η κατάσταση μπορεί να είναι:
Πίνακας 18-3. Επιλογές Κατάστασης Tagfile Επιλογή ADD SKP REC OPT Ερμηνεία Το πακέτο απαιτείται για τη σωστή λειτουργία του συστήματος. Το πακέτο θα παραληφθεί αυτόματα. Το πακέτο δεν απαιτείται, αλλά προτείνεται. Το πακέτο είναι προαιρετικό. Η μορφή είναι απλή: όνομα_πακέτου: κατάσταση Ένα πακέτο σε κάθε γραμμή. Τα αυθεντικά tagfiles για κάθε σειρά λογισμικού αποθηκεύονται ως tagfile.org. Έτσι εάν χαλάσετε το δικό σας, μπορείτε να επαναφέρετε το αυθεντικό. Πολλοί διαχειριστές προτιμούν να γράφουν τα δικά τους tagfiles και να ξεκινούν την εγκατάσταση και να επιλέγουν full. Το πρόγραμμα εγκατάστασης θα διαβάσει τα tagfiles και θα εκτελέσει την εγκατάσταση ανάλογα με τα περιεχόμενα. Εάν χρησιμοποιήσετε το REC ή το OPT, ένα πλαίσιο διαλόγου θα παρουσιαστεί στο χρήστη ρωτώντας τον εάν θέλει ή εάν δεν θέλει να χρησιμοποιήσει κάποιο συγκεκριμένο πακέτο. Για αυτό, προτείνεται να χρησιμοποιείτε μόνο ADD και SKP όταν γράφετε tagfiles για αυτοματοποιημένες εγκαταστάσεις. Σιγουρευτείτε ότι τα tagfiles σας είναι γραμμένα στην ίδια τοποθεσία με τα αυθεντικά. Ή μπορείτε να καθορίσετε ένα δικό σας μονοπάτι για το tagfile εάν έχετε δικά σας tagfiles.