%entities; ]>
Η Οργάνωση Έκδοσης των Πακέτων Λογισμικού από Τρίτους του FreeBSD Steve Price
steve@FreeBSD.org
$FreeBSD$ $FreeBSD$ Αυτό το άρθρο περιγράφει την προσέγγιση της ομάδας οργάνωσης των επίσημων εκδόσεων του FreeBSD για την παραγωγή μιας υψηλής ποιότητας συλλογής πακέτων για τα επίσημα μέσα εγκατάστασης του FreeBSD (CD-ROM αυτή τη στιγμή). Αυτό το κείμενο αποτελεί μέρος μιας δουλειάς που βρίσκεται σε εξέλιξη, μα όταν τελικά ολοκληρωθεί θα περιγράφει την διαδικασία που χρησιμοποιείται για την μεταγλώττιση της συλλογής των πακέτων στο "Ports Cluster" του FreeBSD.org, πως μπορούν να ρυθμιστούν οποιαδήποτε άλλα μηχανήματα για να χρησιμοποιηθούν με τον ίδιο τρόπο, πως να χωριστούν τα πακέτα σε ομάδες στα μέσα της εγκατάστασης, καθώς και πως μπορούν να γίνουν έλεγχοι στο σύνολο των πακέτων.
Μεταγλώττιση των πακέτων από την Συλλογή των Ports Η Συλλογή των Ports του FreeBSD αποτελείται από περισσότερα από &os.numports; προγράμματα, γραμμένα από τρίτους, που είναι διαθέσιμα για χρήση στο FreeBSD. Οι &a.portmgr; είναι υπεύθυνοι για την συντήρηση ενός ολοκληρωμένου δέντρου πηγαίου κώδικα που μπορεί να χρησιμοποιηθεί για να δημιουργηθούν μεταγλωττισμένα πακέτα, τα οποία θα συνοδεύουν κάθε επίσημη έκδοση του FreeBSD. Το Cluster των Ports Για να είμαστε σίγουροι ότι κάθε πακέτο δεν έχει προβλήματα όταν δίνεται μαζί με κάποια επίσημη έκδοση του FreeBSD, κάθε port μεταγλωττίζεται σε ένα ξεχωριστό περιβάλλον chroot, ξεκινώντας με άδειους τους καταλόγους /usr/local και /usr/X11R6. Τα προαπαιτούμενα πακέτα εγκαθίστανται σαν προμεταγλωττισμένα πακέτα πριν ξεκινήσει η μεταγλώττιση. Αυτές οι προϋποθέσεις είναι που ενισχύουν την ομοιομορφία στην διαδικασία μεταγλώττισης του κάθε πακέτου. Ξεκινώντας τη μεταγλώττιση κάθε πακέτου σε ένα καθαρό περιβάλλον, μπορούμε να ελέγξουμε ότι τα συνοδευτικά δεδομένα κάθε πακέτου (όπως η λίστα με τα προαπαιτούμενα πακέτα) είναι ακριβή, κι έτσι δεν θα δημιουργήσουμε ποτέ πακέτα που μπορεί σε κάποια συστήματα να δουλεύουν και σε άλλα όχι ανάλογα με τα προγράμματα που έχουν εγκατασταθεί πριν. Το Cluster των Ports για την αρχιτεκτονική x86 αποτελείται αυτή τη στιγμή από ένα κύριο κόμβο (Dual Pentium III στα 733MHz) και 8 δευτερεύοντες κόμβους (Pentium III στα 800MHz), οι οποίοι κάνουν την μεταγλώττιση των πακέτων. Με αυτά τα μηχανήματα, μια μεταγλώττιση όλων των ports παίρνει πάνω από 24 ώρες. Αυτά τα μηχανήματα είναι co-located μαζί με τα άλλα μηχανήματα της ομάδας του FreeBSD στον χώρο Exodus του Yahoo, στην Santa Clara, CA. To Cluster των Ports για την αρχιτεκτονική Alpha αποτελείται από 7 PWS 500A μηχανήματα, τα οποία χάρισε η Compaq. Είναι κι αυτά co-located στους χώρους του Yahoo. Ο Διαχωρισμός των Πακέτων Το συνολικό μέγεθος των πακέτων ξεπέρασε τα 4.1 gigabytes για την έκδοση 4.4 του FreeBSD. Αυτό είναι λίγο πρόβλημα όμως για τις διανομές που είναι βασισμένες σε CDROM, γιατί γενικά θέλουμε να μπορούμε να διανέμουμε όσο το δυνατόν περισσότερα πακέτα χωρίς όμως να αναγκάζουμε τον χρήστη να αλλάζει δισκάκια για να ικανοποιήσει τις απαιτήσεις εγκατάστασης των πακέτων. Η λύση είναι φυσικά να φτιάξουμε ομάδες από πακέτα με αντίστοιχη λειτουργικότητα που έχουν παρόμοιες απαιτήσεις, και να βάλουμε όλα τα πακέτα κάθε ομάδας στον ίδιο δίσκο. Αυτό το τμήμα του άρθρου περιγράφει το λογισμικό και τη μεθοδολογία που χρησιμοποιείται για να δημιουργηθούν οι συλλογές από πακέτα που περιέχονται στους δίσκους των επίσημων εκδόσεων του FreeBSD. Τα script και τα υπόλοιπα αρχεία που χρειάζονται για να χωριστούν τα πακέτα σε ομάδες μπορείτε να τα βρείτε στο CVS στον κατάλογο ports/Tools/scripts/release. Αντιγράψτε αυτό τον κατάλογο σε ένα μηχάνημα που έχει αρκετό χώρο για να κρατήσει τουλάχιστον 2 ή 3 φορές το σύνολο των πακέτωνν που θέλετε να χωρίσετε σε ομάδες. Τα παρακάτω scripts υπάρχουν σε αυτό τον κατάλογο: config Αυτό το αρχείο περιέχει το μέγεθος του ελεύθερου χώρου σε κάθε δίσκο, και αν τα πακέτα, τα distfiles, ή και τα δυο επιτρέπεται να πάνε σε κάθε συγκεκριμένο δίσκο. Η πρώτη στήλη είναι το όνομα του δίσκου. Πρέπει να είναι της μορφής disc[0-9a-z]. Τώρα το αρχείο αυτό έχε ρυθμίσεις μέσα για 10 δίσκους (4 για το σετ της εγκατάστασης και 6 για το συμπληρωματικό toolkit). Υπάρχει κι ένας ακόμα δίσκος που λέγεται scratch, όπου καταλήγουν όλα τα πακέτα και distfiles που δεν χωράνε πουθενά αλλού. Η δεύτερη στήλη μπορεί να είναι 1 ή 0, όπου η τιμή 1 σημαίνει ότι μπορούν να τοποθετηθούν πακέτα σε αυτό το δίσκο. Η τρίτη στήλη δουλεύει με παρόμοιο τρόπο, αλλά κανονίζει αν μπορούν να τοποθετηθούν distfiles σε αυτό το δίσκο. Η τελευταία στήλη περιέχει τον αριθμό των ελεύθερων bytes στον δίσκο. doit.sh Αυτό κάνει την περισσότερη δουλειά. Μόλις έχετε βάλει όλα τα αρχεία στη θέση τους και έχετε κάνει τις απαραίτητες ρυθμίσεις, αυτό το script οδηγεί την διαδικασία διαχωρισμού των πακέτων. Έχετε το νου σας όσο τρέχει όμως, γιατί είναι interactive. Περισσότερες λεπτομέρειες σχετικά με αυτό το script υπάρχουν και παρακάτω. checkdeps.pl Ελέγχει αν όλα τα προαπαιτούμενα πακέτα είναι διαθέσιμα, όταν του δοθεί ένα αρχείο INDEX κι ένας κατάλογος με πακέτα. oneshot.pl Αυτό είναι το πρόγραμμα που κάνει όλα τα μαγικά (και χρησιμοποιώ τον όρο πολύ χαλαρά, καθώς χρησιμοποιεί μια brute force προσέγγιση). Με είσοδο μια συλλογή από απαιτούμενα πακέτα για κάθε δίσκο και ένα σετ από πακέτα/distfiles αυτό είναι το script που τοποθετεί ένα πακέτο ή distfile σε ένα δίσκο μαζί με όλα τα πακέτα από τα οποία εξαρτάται. print-cdrom-packages.sh Αυτό το αρχείο είναι ένα αντίγραφο του src/release/scripts/print-cdrom-packages.sh από την έκδοση στην οποία δουλεύετε. scrubindex.pl Αυτό το πρόγραμμα αφαιρεί από ένα INDEX αρχείο τις γραμμές που είναι σχετικές με πακέτα που δεν υπάρχουν. Αφαιρεί επίσης και τα πακέτα που απαιτούν τα XFree86. ΣΗΜΕΙΩΣΗ: θα πρέπει να ρυθμίσετε την τιμή της μεταβλητής xdep για να βεβαιωθείτε ότι ο αριθμός έκδοσης είναι σωστός. setup.sh Αυτό είναι ένα βοηθητικό script που χρησιμοποιείται στο bento cluster για να κατεβάσει ένα αντίγραφο του ports tree και του αντίστοιχου σετ από πακέτα/distfiles. Μια λίστα από ελέγχους που πρέπει να κάνετε και ρυθμίσεις που πρέπει να ελέγξετε πριν συνεχίσετε είναι: Διορθώστε το config για να περιέχει πληροφορίες για όλους τους δίσκους που έχετε, τα μεγέθη τους, και αν θέλετε να περιέχουν πακέτα, distfiles, και τα δύο, ή κανένα από τα δύο. Βεβαιωθείτε ότι έχετε σβήσει τον κατάλογο gen αν υπάρχει κάποιος παλιός κατάλογος με αυτό το όνομα που έχει ξεμείνει από παλιότερα. Αυτός ο κατάλογος περιέχει διάφορα αρχεία που έχουν νόημα μόνο για το τωρινό τρέξιμο των προγραμμάτων. Στα πρώτα τρεξίματα που θα κάνετε για να χωριστούν τα πακέτα είναι καλύτερα να μην κάνετε στα αλήθεια την αντιγραφή των πακέτων και των distfiles. Αυτό θα σας γλιτώσει και χρόνο και χώρο στο δίσκο όσο κάνετε δοκιμές μέχρι να σιγουρευτείτε ότι όλα πάνε καλά. Στο αρχείο oneshot.pl αλλάξτε την τιμή της μεταβλητής fake σε 1 κι αντί να κάνει αντιγραφή των αρχείων θα τα κάνει απλώς &man.touch.1;. Βεβαιωθείτε ότι αλλάξατε την τιμή της fake πάλι σε 0 πριν δώσετε τους δίσκους σε αυτόν που θα κάνει την μαζική παραγωγή βέβαια, γιατί αλλιώς οι δίσκοι θα έχουν ένα κατάλογο με πολλά αρχεία μηδενικού μεγέθους. Βεβαιωθείτε ότι έχετε ένα πρόσφατο αντίγραφο του print-cdrom-packages.sh και ότι είναι από την σωστή έκδοση. Ελέγξτε ότι στο αρχείο scrubindex.pl αναφέρεται η σωστή έκδοση των XFree86. Η ίδια τιμή πρέπει να υπάρχει και στα doit.sh. Το επόμενο βήμα είναι να φτιάξετε ένα αντίγραφο από το ports tree, τα πακέτα και τα distfiles από ένα πρόσφατο τρέξιμο της μεταγλώττισης των πακέτων από το cluster των ports. Δείτε το αρχείο setup.sh για ένα παράδειγμα. Τα βασικά βήματα που πρέπει να κάνετε όμως είναι τα εξής: Αντιγράψτε το ports.tar.gz και αποσυμπιέστε το στον κατάλογο ports μαζί με το doit.sh και τον κατάλογο scripts. Σβήστε τις συντομεύσεις και τους καταλόγους των πακέτων/distfiles. Το bento τα έχει αυτά σαν συντομεύσεις και θα πάρετε λάθος αποτελέσματα αν δεν τα σβήσετε πριν συνεχίσετε. Δημιουργήστε ένα νέο κατάλογο για τα ports/πακέτα και αντιγράψτε το σετ των πακέτων από το cluster μεταγλώττισης των πακέτων. Δημιουργήστε ένα νέο κατάλογο για ports/distfiles και αντιγράψτε τα distfiles από το cluster μεταγλώττισης των πακέτων. ΣΗΜΕΙΩΣΗ: αν δεν θέλετε κανένα distfile απλά δημιουργήστε τον κατάλογο και αφήστε τον άδειο. Αυτός ο κατάλογος πρέπει να υπάρχει ακόμα κι αν δεν περιέχει τίποτα. Τώρα είμαστε πλέον έτοιμοι για το διασκεδαστικό κομμάτι της ομαδοποίησης των πακέτων. Μπορείτε να ξεκινήσετε την διαδικασία τρέχοντας το ./doit.sh. Την πρώτη φορά που το τρέχετε κάνει τα εξής: Δημιουργεί μια λίστα από τα ports που δεν μπορούν να διανέμονται στο FTP master site. Σας ρωτάει αν θέλετε να σβήσετε αυτά τα ports, αφού δεν μπορούν να διανέμονται ελεύθερα. Γενικά εδώ καλύτερα να απαντάτε (y)es. Φτιάχνει μια λίστα από τα πακέτα που δεν μπορούν να μπουν στους δίσκους. Σας ρωτάει αν θέλετε να σβήσετε τα πακέτα/distfiles που δεν μπορούν να μπουν σε CD-ROM. Καλύτερα είναι να απαντήσετε (y)es εδώ. Αντιγράφει το αρχείο INDEX από τον κατάλογο ports στον κατάλογο gen. Καθώς το κάνει, αφαιρεί τις γραμμές που αντιστοιχούν σε ports ή πακέτα που δεν υπάρχουν. Ελέγχει επίσης αν υπάρχουν όλα τα προαπαιτούμενα πακέτα και ικανοποιούνται οι εξαρτήσεις των πακέτων/ports. Δημιουργεί μια λίστα από πακέτα που είναι απαραίτητο να υπάρχουν σε κάθε δίσκο. Σας ρωτάει αν θέλετε να αντιγράψετε τα αρχεία στους δίσκους. Αφού γίνει η αντιγραφή στους δίσκους θα ελέγξει για εξαρτήσεις που λείπουν, θα καθαρίσει το αρχείο INDEX και θα δημιουργήσει ένα αρχείο CHECKSUM.MD5. Ελέγχει ότι όλα τα απαιτούμενα πακέτα είναι όντως σε κάθε δίσκο, και τυπώνει ένα συγκεντρωτικό πίνακα με τα μεγέθη των δίσκων. θα πρέπει να είστε αρκετά τυχεροί για να πετύχει ο διαχωρισμός την πρώτη φορά, όλα τα πακέτα που χρειάζονται να μεταγλωττιστούν σωστά και να χωρέσουν και σε κάθε δίσκο. Το μόνο που χρειάζεται μετά είναι να δώσετε την τιμή 0 στην μεταβλητή fake στο αρχείο oneshot.pl και να ξανατρέξετε το ./doit.sh. Την δεύτερη φορά που θα τρέξει, καθώς και όλες τις υπόλοιπες, δεν θα κάνει τα βήματα 1-5 που αναφέραμε παραπάνω. Αν θέλετε να ξανατρέξετε κάποια από αυτά τα βήματα, κοιτάξτε στο doit.sh για να δείτε ποια αρχεία πρέπει να σβήσετε ώστε να μην αποφύγει το doit.sh αυτά τα βήματα. Αν θέλετε να ξανατρέξουν όλα τα βήματα, ο πιο εύκολος τρόπος είναι με rm -rf gen. Όταν τελειώσει επιτυχώς η διαδικασία, τα πακέτα/distfiles θα έχουν αντιγραφεί σε καταλόγους disc* και όσα έχουν απομείνει θα υπάρχουν στον κατάλογο scratch. Τι να κάνετε αν κάτι δεν πάει καλά; Μερικά από τα πιο συχνά προβλήματα και συμβουλές γι' αυτά φαίνονται παρακάτω: Απαιτούμενα πακέτα που λείπουν Αυτό συμβαίνει πολύ συχνά. Θα χρειαστεί είτε να περιμένετε για ένα νέο σετ από πακέτα να ετοιμαστεί, στο οποίο τα πακέτα που λείπουν θα έχουν μεταγλωττιστεί επιτυχώς, ή να βρείτε κάποιον που μπορεί να ξεκινήσει πάλι την διαδικασία μεταγλώττισης των πακέτων για σας. Μην προσπαθήσετε να μεταγλωττίσετε εσείς τα πακέτα που λείπουν στα δικά σας μηχανήματα και να τα προσθέσετε στο σωρό. Παρόλο που μπορεί να τα καταφέρετε κι έτσι αν είστε εξαιρετικά προσεκτικοί, στη μεγαλύτερη πλειοψηφία των περιπτώσεων θα σας ξεφύγει κάποια λεπτομέρεια και η απλή προσθήκη ενός μόνο πακέτου μπορεί να προκαλέσει προβλήματα σε εκατοντάδες άλλα πακέτα. Απαιτούμενα πακέτα που δεν χωράνε Μερικές φορές συμβαίνει κι αυτό, και είναι σχετικά απλό να διορθωθεί. Απλώς διορθώστε το print-cdrom-packages.sh και μετακινήστε τα πακέτα μέχρι να βρείτε μια διάταξη που να βολεύει. Ναι, αυτό είναι μια χρονοβόρα διαδικασία και ένας από τους σοβαρούς λόγους για τους οποίους θα πρέπει να ενεργοποιήσετε την μεταβλητή fake στο αρχείο oneshot.pl μέχρι να καταφέρετε το αποτέλεσμα που θέλετε. Ξανατρέξτε το ./doit.sh όταν τελειώσετε με τις ρυθμίσεις σας. Απαιτούμενα πακέτα δεν είναι στον σωστό (ή σε κανένα) δίσκο Αυτό συνήθως σημαίνει ότι δεν τα προσθέσατε στο print-cdrom-packages.sh ή τα τοποθετήσατε σε λάθος δίσκο. Αυτό το script είναι ο κανόνας στον οποίο βασίζεται η απόφαση για την τοποθεσία ενός πακέτου. Αν θέλετε οπωσδήποτε να τοποθετηθεί ένα συγκεκριμένο πακέτο σε κάποιο δίσκο, αυτός είναι ο μόνος τρόπος να το κάνετε με σιγουριά. Αν κολλήσετε σε κάποιο σημείο και δεν μπορείτε να βρείτε γιατί κάτι δεν πάει καλά ή πως να το διορθώσετε, στείλτε ένα email στον &a.steve; για βοήθεια.