<?xml version="1.0" encoding="UTF-8"?>


Η Οργάνωση Έκδοσης των  ακέτων Λογισμικού
από Τρίτους του FreeBSD


Steve Price

<steve@FreeBSD.org>
Αναθεώρηση: 43126
2013-11-07 από gabor.
 ερίληψη
Αυτό το άρθρο περιγράφει την προσέγγιση
της ομάδας οργάνωσης των επίσημων εκδόσεων
του FreeBSD για την παραγωγή μιας υψηλής
ποιότητας συλλογής πακέτων για τα επίσημα
μέσα εγκατάστασης του FreeBSD (CD-ROM αυτή τη
στιγμή). Αυτό το κείμενο αποτελεί μέρος
μιας δουλειάς που βρίσκεται σε εξέλιξη, μα
όταν τελικά ολοκληρωθεί θα περιγράφει την
διαδικασία που χρησιμοποιείται για την
μεταγλώττιση της συλλογής των πακέτων στο
"Ports Cluster" του FreeBSD.org, πως μπορούν να
ρυθμιστούν οποιαδήποτε άλλα μηχανήματα
για να χρησιμοποιηθούν με τον ίδιο τρόπο,
πως να χωριστούν τα πακέτα σε ομάδες στα
μέσα της εγκατάστασης, καθώς και πως
μπορούν να γίνουν έλεγχοι στο σύνολο των
πακέτων.
-------------------------------------------------------------------------------
 ίνακας  εριεχομένων


  1._Μεταγλώττιση_των_πακέτων_από_την
  Συλλογή_των_Ports

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


1. Μεταγλώττιση των πακέτων από την Συλλογή
των Ports

Η Συλλογή_των_Ports_του_FreeBSD αποτελείται από
περισσότερα από 24,000 προγράμματα, γραμμένα
από τρίτους, που είναι διαθέσιμα για χρήση
στο FreeBSD. Οι Ομάδα Διαχείρισης των Ports
<portmgr@FreeBSD.org> είναι υπεύθυνοι για την
συντήρηση ενός ολοκληρωμένου δέντρου
πηγαίου κώδικα που μπορεί να
χρησιμοποιηθεί για να δημιουργηθούν
μεταγλωττισμένα πακέτα, τα οποία θα
συνοδεύουν κάθε επίσημη έκδοση του FreeBSD.

1.1. Το 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.

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 για βοήθεια.
