Το προφίλ μας στο Google Plus
1

PkgNG: New Generation Package Management για το FreeBSD

Όσοι χρησιμοποιείτε FreeBSD γνωρίζετε φυσικά ότι ένα από τα βασικά του πλεονεκτήματα είναι η δυνατότητα μεταγλώττισης όλων των εργαλείων, προγραμμάτων κι εφαρμογών μέσω της Συλλογής των Ports (Ports Collection). Η Συλλογή μάς δίνει καταπληκτικές δυνατότητες ελέγχου πάνω στο λογισμικό μας, καθώς μας επιτρέπει να επιλέγουμε έξτρα λειτουργίες πριν το build και έτσι να βελτιστοποιούμε την απόδοση των εφαρμογών για το μηχάνημά μας.

Εκτός από το σύστημα των ports, το FreeBSD διαθέτει και σύστημα εγκατάστασης με χρήση έτοιμων binary packages. Αυτά τα πακέτα είναι περισσότερο κατάλληλα όταν δεν χρειαζόμαστε τις δυνατότητες που μας παρέχει η Συλλογή των Ports και, κυρίως, όταν δεν έχουμε …πολλά απογεύματα στη διάθεση μας: Σε έναν server οι εφαρμογές είναι λίγες και σχετικά μικρές, αλλά η μεταγλώττιση προγραμμάτων όπως το KDE και το LibreOffice για ένα σύστημα desktop αποτελούν μάλλον τιτάνιο έργο.

Παρά την φανερή απώλεια χρόνου, οι περισσότεροι φανατικοί φίλοι του FreeBSD φαίνεται να αγνοούν τα πακέτα και να μεταγλωττίζουν τα πάντα, ακόμη και τα τέρατα που αναφέραμε πριν. Γιατί, όμως;

Η διαχείριση πακέτων στο FreeBSD κατά παράδοση γίνεται με μια σειρά package management tools που περιέχονται στο βασικό σύστημα, με πιο χαρακτηριστικό το pkg_add που αναλαμβάνει να προσθέτει και να καταχωρεί στη βάση δεδομένων του συστήματος ένα πακέτο, καθώς και τις όποιες εξαρτήσεις του. Το πακέτο μπορεί είτε να βρίσκεται ήδη στο σύστημα είτε να κατέβει από κάποιο μηχάνημα mirror του FreeBSD Project, εργασία που αναλαμβάνει το pkg_add. Μια ολόκληρη σειρά μηχανημάτων στο FreeBSD αναλαμβάνει να κάνει build μέρα-νύχτα τα περισσότερα προγράμματα της Συλλογής των Ports, και να δημιουργεί binary packages.

Υπάρχει ένα πρόβλημα με τα συγκεκριμένα εργαλεία διαχείρισης πακέτων: είναι ελαφρώς απαρχαιωμένα! Βλέπετε, στο FreeBSD τα ports ανανεώνονται συνέχεια και τα πακέτα, προφανώς, ακολουθούν. Όμως η αναβάθμιση εγκατεστημένων πακέτων είναι κάπως προβληματική: Πρέπει να χρησιμοποιούμε προγράμματα όπως το portupgrade, να διαβάζουμε οδηγίες από το /usr/ports/UPDATING, να διατηρούμε ενημερωμένο δέντρο ports (κι ας μην κάνουμε εγκατάσταση από source), ενώ δεν είναι καν σίγουρο ότι το πακέτο που ψάχνουμε έχει ενημερωθεί στα mirrors!

Ένα ακόμα πρόβλημα αυτών των legacy προγραμμάτων διαχείρισης πακέτων είναι η έλλειψη αμφίδρομου dependency tracking. Τι είν’ πάλι τούτο, θα με ρωτήσετε;

Υποθέστε ότι χρησιμοποιείτε πακέτα για να εγκαταστήσετε μια εφαρμογή, όπως, π.χ., το LibreOffice. Πολύ λογικό, καθώς πρόκειται για μια μεγάλη εφαρμογή. Το LibreOffice κατεβάζει κι ένα σωρό από dependencies. Συνεχίζετε την εγκατάσταση με άλλες εφαρμογές και, κάποιες από αυτές, χρησιμοποιούν τα dependencies που έχετε ήδη εγκαταστήσει λόγω του LibreOffice.

Μέχρι εδώ καλά. Αλλά μια μέρα βγαίνει μια νέα έκδοση του LibreOffice. Θέλετε να αναβαθμιστείτε σε αυτή. Η νέα έκδοση όμως έχει και νέες εκδόσεις εξαρτήσεων, οι οποίες όμως χρησιμοποιούνται και από άλλες εφαρμογές που έχετε ήδη εγκαταστήσει. Είναι πιθανόν οι εφαρμογές αυτές να μη δουλεύουν με τις νέες εξαρτήσεις! Πιθανώς βέβαια να υπάρχουν νέες εκδόσεις τους, οι οποίες χρησιμοποιούν τις ανανεωμένες εξαρτήσεις. Και τι κάνετε για όλη αυτή την κατάσταση; Στο κάτω κάτω εσείς το LibreOffice θέλατε να αναβαθμίσετε, όχι να μπείτε σε μια περιπέτεια τύπου portupgrade -aPP (αναβάθμιση όλων των εφαρμογών με χρήση πακέτων).

Καλώς ήλθατε στο pkgng, με two-way dependency tracking: Αν χρησιμοποιήσετε το νέο σύστημα πακέτων θα μπορείτε να ζητήσετε, απλά, την αναβάθμιση του LibreOffice. Το pkgng θα εντοπίσει τις εξαρτήσεις που πρέπει να ενημερωθούν για το LibreOffice — και θα τις ενημερώσει. Επιπρόσθετα, θα εντοπίσει και ποια άλλα προγράμματα χρειάζονται ενημέρωση, λόγω των ενημερωμένων εξαρτήσεων, και θα τα αναβαθμίσει κι εκείνα! Και μάλιστα όλα αυτές τις εργασίες θα τις κάνει εντελώς αυτόματα. Αλλά, για μισό λεπτό: Pkgng; Τι είναι αυτό;

PkgNG: The New Generation
Το pkgng είναι μια νέα σειρά εργαλείων διαχείρισης πακέτων. Βασική εντολή στο όλο σύστημα είναι η pkg και και δεν υπάρχει καμία σχέση με το legacy σύστημα. Σε καμιά περίπτωση δεν πρέπει να συνδυάσετε πακέτα του pkgng με άλλα, από το παλιό σύστημα! Το pkgng χρησιμοποιεί διαφορετική βάση δεδομένων για να παρακολουθεί τις εφαρμογές που έχουν εγκατασταθεί. Εννοείται, βέβαια, ότι τα πακέτα του pkgng δημιουργούνται και πάλι με μεταγλώττιση των αντίστοιχων ports (και θα δούμε παρακάτω πώς). Το pkgng διαθέτει το πολυπόθητο two way dependency tracking και μας επιτρέπει να δημιουργήσουμε ένα σύστημα FreeBSD αποκλειστικά με πακέτα, χωρίς καθόλου κόπο. Φανταστείτε το σαν ένα apt-get για το FreeBSD!

Πώς θα το εγκαταστήσετε
Αν ξεκινάτε από το 9.1-RELEASE, δεν θα το εγκαταστήσετε καν! Το pkgng και η εντολή pkg είναι μέρος του βασικού συστήματος. Για παλιότερα συστήματα μπορείτε να το εγκαταστήσετε με τον κλασικό τρόπο, είτε από πακέτο

pkg_add -r pkg

είτε από τα ports:

cd /usr/ports/ports-mgmt/pkg
make install clean

Αν εγκαταστήσετε το πακέτο, να ξέρετε ότι θα είναι το τελευταίο που θα εγκαταστήσετε με τον legacy τρόπο!

Χρήση του pkgng
Πριν αρχίσετε να χρησιμοποιείτε την εντολή pkg, θα πρέπει να κάνετε κάποιες ρυθμίσεις: Αντιγράψτε το αρχείο /usr/local/etc/pkg.conf.sample στο /usr/local/etc/pkg.conf και ανοίξτε το με τον αγαπημένο σας editor (δηλαδή το vi, αν δεν θέλετε να σας κοροϊδεύω μέχρι αύριο):

cd /usr/local/etc
cp pkg.conf.sample pkg.conf
vi pkg.conf

Θα πρέπει να ρυθμίσετε τη γραμμή PACKAGESITE. Τη δεδομένη στιγμή, το υπόδειγμα γράφει:

PACKAGESITE: http://pkg.freebsd.org/${ABI}/latest

Πιθανές γραμμές εκτός από την παραπάνω, είναι οι

PACKAGESITE: http://pkgbeta.freebsd.org/freebsd-9-i386/latest 
PACKAGESITE: http://pkgbeta.freebsd.org/freebsd-9-amd64/latest

Οι γραμμές αυτές αντιστοιχούν φυσικά σε FreeBSD 9.x, 32 και 64bit. Επιλέξτε μία, ανάλογα με το σύστημά σας. Για να ανανέωσετε τη λίστα των διαθέσιμων πακέτων, γράψτε:

pkg update

Είστε πλέον σε θέση να εγκαθιστάτε έτοιμα πακέτα. Παράδειγμα:

pkg install vim-lite
Updating repository catalogue
Repository catalogue is up-to-date, no need to fetch fresh copy
The following packages will be installed:

        Installing libiconv: 1.14
        Installing gettext: 0.18.1.1
        Installing vim-lite: 7.3.556_1

The installation will require 36 MB more space

10 MB to be downloaded

Proceed with installing packages [y/N]: y
libiconv-1.14.txz        100%  595KB 595.3KB/s 595.3KB/s   00:01
gettext-0.18.1.1.txz     100% 4955KB 991.0KB/s 825.1KB/s   00:05
vim-lite-7.3.556_1.txz   100% 5117KB   1.0MB/s 607.4KB/s   00:05
Checking integrity... done
Installing libiconv-1.14... done
Installing gettext-0.18.1.1... done
Installing vim-lite-7.3.556_1... done

Για να δείτε όλα τα πακέτα που είναι εγκατεστημένα, πληκτρολογήστε

pkg info

Παρατηρήστε πόσο γρήγορη είναι η διαδικασία σε σχέση με την παλιά, με το pkg_info! Αν και δεν μπορείτε πλέον να χρησιμοποιείτε παλιού τύπου πακέτα με τo pkgng, μπορείτε ωστόσο να χρησιμοποιείτε κανονικά τα ports! Το μόνο που χρειάζεται να κάνετε είναι να προσθέσετε την παρακάτω γραμμή στο /etc/make.conf:

WITH_PKGNG=yes

Δεν πρέπει να ξεχνάμε ότι όποτε κάνουμε build ένα port δημιουργείται ουσιαστικά ένα πακέτο, το οποίο εγκαθίσταται στο σύστημά μας. Με την παραπάνω παρέμβαση, ειδοποιούμε απλά το σύστημα των ports να το καταχωρίσει στη νέα βάση δεδομένων του pkgng κι όχι στη legacy βάση του pkg_add.

Με δυο κινήσεις, μπορείτε επίσης να αναβαθμίσετε όλα τα πακέτα στο σύστημα σας:

pkg update
pkg upgrade

Όλα αυτά κι ακόμη περισσότερα μπορείτε να διαβάσετε, φυσικά, στη σελίδα man του pkg:

man pkg

Πολύ καλά λοιπόν, αλλά ξέχασα να σας πω μια σημαντική λεπτομέρεια: Αυτή τη στιγμή, ούτε το pkg.freebsd.org ούτε το pkgbeta.freebsd.org έχουν διαθέσιμα πακέτα! Βέβαια αυτό αναμένεται να αλλάξει σύντομα, αλλά μέχρι τότε θα πρέπει να μάθετε πώς να φτιάχνετε δικά σας! Γιατί, φυσικά, κι αυτό γίνεται: να δημιουργήσετε το δικό σας, προσωπικό pkgng repo. Και πάνω που νομίζατε ότι θα ξεφορτωθείτε το source build. Σας έπιασα αδιάβαστους :)

Δημιουργία πακέτων για το pkgng με το poudriere
Όχι, δεν πρόκειται να βάλουμε πούδρα στο FreeBSD. Poudriere είναι το όνομα του προγράμματος με το οποίο μπορούμε να φτιάξουμε πακέτα για το FreeBSD. με αρκετά αυτοματοποιημένο και εύκολο τρόπο. Το poudriere υποστηρίζει τόσο δημιουργία των παλιών, κλασικών πακέτων, όσο και των νέων, του pkgng. Εμείς θα το ρυθμίσουμε, φυσικά, για pkgng.

Το poudriere έχει ορισμένες πολύ συγκεκριμένες απαιτήσεις.

  • Χρειάζεται μηχάνημα με τουλάχιστον ένα ZFS pool διαθέσιμο — και φυσικά κάμποσο χώρο στο δίσκο. Το 486 που ξεθάψατε από το πατάρι, απλά δεν κάνει (ούτε εκείνος ο πιο αργός από το θάνατο Atom).
  • Αν θέλετε να κάνετε build για συστήματα 64bit, χρειάζεστε το αντίστοιχο hardware και φυσικά την εκδοχή 64bit του FreeBSD. Μπορείτε, στο ίδιο μηχάνημα, να κάνετε build και για αρχιτεκτονικές 32bit.

Το poudriere χρησιμοποιεί chroot (jails), προκειμένου να κάνει build σε ένα κλειστό περιβάλλον. Σε σύστημα FreeBSD 9.x 64bit μπορείτε να κάνετε build για FreeBSD 8 ή 9, 32 ή 64bit. Δεν είναι θαυμάσιο αυτό;

Εγκατάσταση του poudriere
Σημειώστε ότι δεν είναι απαραίτητο το μηχάνημα (host) που φιλοξενεί το poudriere να χρησιμοποιεί το ίδιο, δηλαδή για τον εαυτό του, το pkgng. To host είναι απλά το καλό μηχάνημα που εκεί πάνω κάνουμε build τα πακέτα μας και, μέσω του web server που τρέχουμε σε αυτό, τα διανέμουμε στα άλλα μας μηχανήματα, όπως αυτό το άχρηστο με τον Atom, που λέγαμε πριν. Μη βιαστείτε λοιπόν να σβήσετε το workstation σας, για να το μετατρέψετε σε pkgng. Μπορείτε, όπως είναι τώρα, να χρησιμοποιήσετε το poudriere. (Hint: Τα μηχανήματα με πακέτα παλιού τύπου μπορούν επίσης να μετατραπούν σε pkgng, με την εντολή pkg2ng. Δείτε τα links στο τέλος του άρθρου.)

Η εγκατάσταση του poudriere γίνεται από το ports system:

cd /usr/ports/ports-mgmt/poudriere
make install clean

Αν ερωτηθείτε για οτιδήποτε, χρησιμοποιήστε τις default επιλογές.

Χρήση του poudriere
Πριν ξεκινήσετε να χρησιμοποιείτε το poudriere, θα πρέπει να αντιγράψετε το υπόδειγμα του αρχείου ρυθμίσεων και να το αλλάξετε κατάλληλα:

cd /usr/local/etc
cp poudriere.conf.sample poudriere.conf

Ανοίξτε το poudriere.conf με τον αγαπημένο σας editor και φτιάξτε τις παρακάτω ρυθμίσεις:

ZPOOL=data
FTPHOST=ftp://ftp.freebsd.org
FREEBSD_HOST=ftp://ftp.freebsd.org
RESOLV_CONF=/etc/resolv.conf
BASEFS=/usr/local/poudriere
DISTFILES_CACHE=/usr/ports/distfiles

Κάποιες από τις παραπάνω ρυθμίσεις είναι ήδη σωστές στο αρχείο. Δεν χρειάζεται να πειράξετε τις υπόλοιπες. Πρέπει ωστόσο να βάλετε σωστή ρύθμιση εδώ:

ZPOOL=data

Θα πρέπει, στη θέση του data, να βάλετε το σωστό όνομα του δικού σας ZFS pool. To poudriere χρειάζεται απαραίτητα ένα ZFS pool για να λειτουργήσει.

Δημιουργήστε τον κατάλογο poudriere.d:

mkdir -p /usr/local/etc/poudriere.d

Στον κατάλογο αυτό μπαίνουν τα make.conf, για τα jails που θα φτιάξουμε. Στο παράδειγμα μας θα υλοποιήσουμε ένα jail για τη δημιουργία πακέτων του 9.1-RELEASE-i386. Κατά παράδοση, τα jails για package building ονομάζονται με τον αριθμό της έκδοσης και την αρχιτεκτονική. Έτσι, το δικό μας θα λέγεται 91i386. Το αντίστοιχο make.conf για το jail θα έχει όνομα 91i386-make.conf. Δημιουργήστε το μέσα στον κατάλογο που φτιάξατε, με το παρακάτω περιεχόμενο:

WITH_PKGNG=yes

Καθώς φαντάζεστε, αν δεν βάλετε αυτή την παράμετρο το poudriere θα φτιάχνει πακέτα για το παλιό σύστημα!

Για να δουλέψει το poudriere χρειάζεται ένα ports tree. Μπορούμε να έχουμε πολλαπλά αντίγραφα ports tree για το poudriere, αλλά συνήθως αρκεί ένα. Σε περίπτωση που δεν το ονομάσουμε εμείς (με την παράμετρο -p) θα πάρει το όνομα default και θα χρησιμοποιείται από προεπιλογή. Μας κάνει μια χαρά:

poudriere ports -c

Το παραπάνω θα δημιουργήσει ένα ports tree για το poudriere, εκτελώντας το portsnap. Είμαστε τώρα έτοιμοι να δημιουργήσουμε το jail μας:

poudriere jail -c -j 91i386 -v 9.1-RELEASE -a i386

Η εντολή θα κατεβάσει τα αρχεία txz του 9.1-RELEASE (base.txz, doc.txz, games.txz) από τον FTP server του FreeBSD και θα τα αποσυμπιέσει για να δημιουργήσει το jail. Όχι, δεν πρόκειται να γίνει μεταγλώττιση! Η διαδικασία διαρκεί πολύ λίγο.

Είμαστε έτοιμοι να φτιάξουμε πακέτα! Δημιουργήστε ένα αρχείο, π.χ., pkglist στον κατάλογο σας και γράψτε μέσα τα ports που θέλετε να μεταγλωττίσετε. Παράδειγμα:

misc/figlet
security/sudo
sysutils/screen

Ας ξεκινήσουμε:

poudriere bulk -j 91i386 -f ~/pkglist
====>> Mounting system devices for 91i386
/etc/resolv.conf -> /usr/local/poudriere/jails/91i386/etc/resolv.conf
====>> Starting jail 91i386
====>> Mounting ports from: /usr/local/poudriere/ports/default/ports
====>> Mounting packages from: /usr/local/poudriere/data/packages/91i386-default
====>> Appending to /etc/make.conf: /usr/local/etc/poudriere.d/91i386-make.conf
====>> Populating LOCALBASE
====>> Calculating ports order and dependencies
====>> Sanity checking the repository
====>> Deleting stale symlinks
====>> Cleaning the build queue
====>> Building 7 packages using 2 builders
====>> [01] Starting build of ports-mgmt/pkg
====>> [01] Finished build of ports-mgmt/pkg: Success
====>> [01] Starting build of sysutils/screen
====>> [02] Starting build of misc/figlet
====>> [02] Finished build of misc/figlet: Success
====>> [02] Starting build of devel/libtool
====>> [01] Finished build of sysutils/screen: Success
====>> [02] Finished build of devel/libtool: Success
====>> [02] Starting build of converters/libiconv
====>> [02] Finished build of converters/libiconv: Success
====>> [02] Starting build of devel/gettext
====>> [02] Finished build of devel/gettext: Success
====>> [02] Starting build of security/sudo
====>> [02] Finished build of security/sudo: Success
====>> Stopping 2 builders
====>> Creating pkgng repository
tar: Removing leading '/' from member names
Generating repo.sqlite in /usr/ports/packages/: done!
====>> Cleaning up
====>> Umounting file systems
====>> Built ports: ports-mgmt/pkg misc/figlet sysutils/screen devel/libtool converters/libiconv devel/gettext security/sudo

Με το επιτυχές τέλος της μεταγλώττισης, θα βρούμε τα πακέτα μας στην τοποθεσία

/usr/local/poudriere/data/packages/91i386-default

Η δομή των υποκαταλόγων πακέτων που θα βρείτε μέσα στον παραπάνω κατάλογο, ακολουθεί τη γνωστή του FreeBSD με τον κατάλογο All να περιέχει τα πραγματικά πακέτα και τον Latest να παρέχει δεσμούς προς τις τελευταίες εκδόσεις, μέσα στον All. Για να χρησιμοποιήσετε το μηχάνημα σας ως repository για τα υπόλοιπα, θα πρέπει να εγκαταστήσετε τον Apache web server και να τον ρυθμίσετε ώστε να δείχνει τα περιεχόμενα του παραπάνω υποκαταλόγου. Σε γενικές γραμμές, χρειάζεστε τις παρακάτω γραμμές στο /usr/local/etc/apache22/httpd.conf:

DocumentRoot "/usr/local/poudriere/data/packages"

<Directory />
  AllowOverride None
  Order deny,allow
  Allow from all
</Directory>

<Directory "/usr/local/poudriere/data/packages">
  AllowOverride None
  Order allow,deny
  Allow from All
  Options +Indexes
</Directory>

Στο μηχάνημα που θα εγκαταστήσετε τα πακέτα, μπορείτε να βάλετε στο /usr/local/etc/pkg.conf:

PACKAGESITE: http://your_server_ip_or_url/91i386-default

Είστε έτοιμοι να αρχίσετε να εγκαθιστάτε πακέτα, με την pkg install. Μπορείτε επίσης να πάρετε τα πακέτα με ένα USB thumb drive ή δισκάκι CD και να τα εγκαταστήσετε τοπικά, χρησιμοποιώντας την εντολή pkg add. Υποθέτοντας ότι έχετε κάνει mount το USB thumb drive στον κατάλογο media του client, πληκτρολογήστε

cd /media/All
pkg add figlet-2.2.5.txt

Επιπλέον πληροφορίες και βιβλιογραφία
Για το παρόν άρθρο αντλήσαμε πληροφορίες από τις παρακάτω πηγές.

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

One Response to “PkgNG: New Generation Package Management για το FreeBSD”

  1. Spirost94 | 14/08/2013 at 14:39

    Πρέπει να φτιάξεις το δικό σου repository και να χτίσεις τα δικά σου πακέτα, με το poudriere, για να μπορείς να χρησιμοποιείς το pkgng;

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

Αρχείο δημοσιεύσεων