2 Ο Διαχωρισμός των Πακέτων

Το συνολικό μέγεθος των πακέτων ξεπέρασε τα 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.

Μια λίστα από ελέγχους που πρέπει να κάνετε και ρυθμίσεις που πρέπει να ελέγξετε πριν συνεχίσετε είναι:

  1. Διορθώστε το config για να περιέχει πληροφορίες για όλους τους δίσκους που έχετε, τα μεγέθη τους, και αν θέλετε να περιέχουν πακέτα, distfiles, και τα δύο, ή κανένα από τα δύο.

  2. Βεβαιωθείτε ότι έχετε σβήσει τον κατάλογο gen αν υπάρχει κάποιος παλιός κατάλογος με αυτό το όνομα που έχει ξεμείνει από παλιότερα. Αυτός ο κατάλογος περιέχει διάφορα αρχεία που έχουν νόημα μόνο για το τωρινό τρέξιμο των προγραμμάτων.

  3. Στα πρώτα τρεξίματα που θα κάνετε για να χωριστούν τα πακέτα είναι καλύτερα να μην κάνετε στα αλήθεια την αντιγραφή των πακέτων και των distfiles. Αυτό θα σας γλιτώσει και χρόνο και χώρο στο δίσκο όσο κάνετε δοκιμές μέχρι να σιγουρευτείτε ότι όλα πάνε καλά. Στο αρχείο oneshot.pl αλλάξτε την τιμή της μεταβλητής fake σε 1 κι αντί να κάνει αντιγραφή των αρχείων θα τα κάνει απλώς touch(1). Βεβαιωθείτε ότι αλλάξατε την τιμή της fake πάλι σε 0 πριν δώσετε τους δίσκους σε αυτόν που θα κάνει την μαζική παραγωγή βέβαια, γιατί αλλιώς οι δίσκοι θα έχουν ένα κατάλογο με πολλά αρχεία μηδενικού μεγέθους.

  4. Βεβαιωθείτε ότι έχετε ένα πρόσφατο αντίγραφο του print-cdrom-packages.sh και ότι είναι από την σωστή έκδοση.

  5. Ελέγξτε ότι στο αρχείο scrubindex.pl αναφέρεται η σωστή έκδοση των XFree86. Η ίδια τιμή πρέπει να υπάρχει και στα doit.sh.

Το επόμενο βήμα είναι να φτιάξετε ένα αντίγραφο από το ports tree, τα πακέτα και τα distfiles από ένα πρόσφατο τρέξιμο της μεταγλώττισης των πακέτων από το cluster των ports. Δείτε το αρχείο setup.sh για ένα παράδειγμα. Τα βασικά βήματα που πρέπει να κάνετε όμως είναι τα εξής:

  1. Αντιγράψτε το ports.tar.gz και αποσυμπιέστε το στον κατάλογο ports μαζί με το doit.sh και τον κατάλογο scripts.

  2. Σβήστε τις συντομεύσεις και τους καταλόγους των πακέτων/distfiles. Το bento τα έχει αυτά σαν συντομεύσεις και θα πάρετε λάθος αποτελέσματα αν δεν τα σβήσετε πριν συνεχίσετε.

  3. Δημιουργήστε ένα νέο κατάλογο για τα ports/πακέτα και αντιγράψτε το σετ των πακέτων από το cluster μεταγλώττισης των πακέτων.

  4. Δημιουργήστε ένα νέο κατάλογο για ports/distfiles και αντιγράψτε τα distfiles από το cluster μεταγλώττισης των πακέτων. ΣΗΜΕΙΩΣΗ: αν δεν θέλετε κανένα distfile απλά δημιουργήστε τον κατάλογο και αφήστε τον άδειο. Αυτός ο κατάλογος πρέπει να υπάρχει ακόμα κι αν δεν περιέχει τίποτα.

Τώρα είμαστε πλέον έτοιμοι για το διασκεδαστικό κομμάτι της ομαδοποίησης των πακέτων. Μπορείτε να ξεκινήσετε την διαδικασία τρέχοντας το ./doit.sh. Την πρώτη φορά που το τρέχετε κάνει τα εξής:

  1. Δημιουργεί μια λίστα από τα ports που δεν μπορούν να διανέμονται στο FTP master site.

  2. Σας ρωτάει αν θέλετε να σβήσετε αυτά τα ports, αφού δεν μπορούν να διανέμονται ελεύθερα. Γενικά εδώ καλύτερα να απαντάτε (y)es.

  3. Φτιάχνει μια λίστα από τα πακέτα που δεν μπορούν να μπουν στους δίσκους.

  4. Σας ρωτάει αν θέλετε να σβήσετε τα πακέτα/distfiles που δεν μπορούν να μπουν σε CD-ROM. Καλύτερα είναι να απαντήσετε (y)es εδώ.

  5. Αντιγράφει το αρχείο INDEX από τον κατάλογο ports στον κατάλογο gen. Καθώς το κάνει, αφαιρεί τις γραμμές που αντιστοιχούν σε ports ή πακέτα που δεν υπάρχουν. Ελέγχει επίσης αν υπάρχουν όλα τα προαπαιτούμενα πακέτα και ικανοποιούνται οι εξαρτήσεις των πακέτων/ports.

  6. Δημιουργεί μια λίστα από πακέτα που είναι απαραίτητο να υπάρχουν σε κάθε δίσκο.

  7. Σας ρωτάει αν θέλετε να αντιγράψετε τα αρχεία στους δίσκους. Αφού γίνει η αντιγραφή στους δίσκους θα ελέγξει για εξαρτήσεις που λείπουν, θα καθαρίσει το αρχείο INDEX και θα δημιουργήσει ένα αρχείο CHECKSUM.MD5.

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

θα πρέπει να είστε αρκετά τυχεροί για να πετύχει ο διαχωρισμός την πρώτη φορά, όλα τα πακέτα που χρειάζονται να μεταγλωττιστούν σωστά και να χωρέσουν και σε κάθε δίσκο. Το μόνο που χρειάζεται μετά είναι να δώσετε την τιμή 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 στον Steve Price για βοήθεια.

Αυτό το κείμενο, και άλλα κείμενα, μπορεί να βρεθεί στο ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Για ερωτήσεις σχετικά με το FreeBSD, διαβάστε την τεκμηρίωση πριν να επικοινωνήσετε με την <questions@FreeBSD.org>.
Για ερωτήσεις σχετικά με αυτή την τεκμηρίωση, στείλτε e-mail στην <doc@FreeBSD.org>.