1. Έναρξη Της Αναβάθμισης Του Συστήματος
Η ιστορία ξεκινάει από το γεγονός ότι βγήκε η καινούργια έκδοση του FreeBSD εδώ και λίγες ημέρες. Φυσικά η επίσιμη ανακοίνωση δεν έχει βγει ακόμα (τη στιγμή που γράφεται το άρθρο αυτό), αλλά στους FTP Servers του project και στους binary upgrade servers υπάρχει ήδη η έκδοση 8.1-RELEASE. Η διαδικασία της αναβάθμισης, όπως πάντα, είναι πολύ απλή. Αρκεί η γνωστή διαδικασία που περιγράφεται και στο FreeBSD Handbook, Κεφάλαιο 24. Updating and Upgrading FreeBSD (Ναι, ξέρω... Αυτό θυμίζει Μανώλη!!!).
Η διαδικασία συνοψίζεται στις ακόλουθες εντολές:
eliaschr@pluto:/usr/home/eliaschr > su Password: pluto# freebsd-update -r 8.1-RELEASE upgrade . . . pluto# freebsd-update install . . . pluto# shutdown -r now . . . login: root Password: pluto# freebsd-update install . . . pluto# shutdown -r now . . .
Για ένα απλό σύστημα για "κοινούς θνητούς", που χρησιμοποιούν το FreeBSD με UFS και GENERIC Kernel, η διαδικασία αυτή είναι ίσως αρκετή. Για ένα σύστημα το οποίο χρησιμοποιεί ZFS για το root filesystem, ή ακόμα χειρότερα για ένα ZFS-Only μηχάνημα, η διαδικασία αυτή θα σταματήσει στην πρώτη επανεκκίνηση του συστήματος!!! Ο κάτοχος του μηχανήματος θα δει μπροστά του μια πολύ όμορφη εικόνα που θα δηλώνει ότι δε μπορεί η εκκίνηση να βρει το kernel...
Ο λόγος του μηνύματος είναι απλός. Αν θυμηθούμε λιγάκι την εγκατάσταση του συστήματος σε ZFS, ή ακόμα και τη δημοσίευση στα How-to του FreeBSD World, Μετατροπή εγκατάστασης FreeBSD από UFS σε ZFS, τότε σίγουρα θα μας έρθει στο μυαλό ότι ο loader του συστήματος δεν αναγνωρίζει το ZFS. Έτσι, έπρεπε να κάνουμε compile και εγκατάσταση ένός αντίστοιχου loader, ο οποίος όμως γνωρίζει τη χρήση του εν λόγω συστήματος αρχείων. Κατά την αναβάθμιση του συστήματος ο loader που είχαμε γράψει με την εγκατάσταση του FreeBSD με χρήση ZFS συστήματος αρχείων, τώρα έχει διαγραφεί και τη θέση του έχει πάρει ο loader που δίνεται με το βασικό σύστημα. Αυτός ο loader δε γνωρίζει τη χρήση του ZFS και έτσι δε μπορεί να κάνει mount το σύστημα αρχείων και να ξεκινήσει το φόρτωμα του kernel. Για την ακρίβεια δε βρίσκει κανένα αρχείο ή κατάλογο του συστήματος... Και εδώ ξεκινάει η διαδικασία του πως να περάσετε δημιουργικά και όμορφα το βράδυ σας :P
2. Χρήση Κονσόλας Fixit
Η λύση στο πρόβλημα είναι να επαναφέρουμε το σωστό ZFS loader. Για να γίνει αυτό θα μας χρειαστεί η κονσόλα Fixit που περιέχεται στο CD του λειτουργικού μας. Δεν έχετε Fixit; Μπορείτε να κατεβάσετε το CD του FreeBSD ή το livefs από τον FTP Server του Project. Εκκινόντας τον υπολογιστή μας από το CD βλέπουμε την κλασική εικόνα του sysinstall να μας ρωτάει για τη γλώσσα που επιθυμούμε να χρησιμοποιήσουμε. Επιλέγουμε ό,τι θέλουμε. Στη συνέχεια βλέπουμε το κεντρικό μενού στο οποίο επιλέγουμε το "Fixit". Η επόμενη οθόνη μας ρωτάει που θα βρεί τον κώδικα για την εν λόγω κονσολα και εκεί επιλέγουμε, τι άλλο, το CD. Και να το αγαπημένο μας μήνυμα που μας εύχεται και καλή τύχη... (αυτό θα πει ευγένεια! :D)
Ξεκινώντας θα πρέπει να θυμηθούμε πως ούτε η κοσνόλα Fixit γνωρίζει κάτι για το ZFS. Όμως έχουμε ένα ωραιότατο kernel το οποίο μπορούμε να του φορτώσουμε τα κατάλληλα modules και αμέσως να μπορέσει να χρησιμοποιήσει αυτό το σύστημα αρχείων:
Fixit# kldload /mnt2/boot/kernel/opensolaris.ko Fixit# kldload /mnt2/boot/kernel/zfs.ko Fixit# export LD_LIBRARY_PATH=/mnt2/lib
Με αυτή την κίνηση έχουμε κάνει το kernel μας να αναγνωρίζει το σύστημα των αρχείων μας. Η τελευταία εντολή δίνει τον κατάλλογο που υπάρχουν οι βιβλιοθήκες που χρησιμοποιούν οι εντολές που χρησιμοποιούμε. Χωρίς αυτή μια εντολή όπως η ls θα έδινε μήνυμα λάθους πως δεν βρίσκει κάποια κοινή βιβλιοθήκη και δε θα μπορούσε να εκτελεστεί.
Μπορούμε να δούμε τις κατατμήσεις που έχουμε χρησιμοποιήσει στους σκληρούς μας δίσκους. Οι πληροφορίες που εμφανίζονται ακολούθως είναι από το μηχάνημα του γράφοντος και είναι πιθανό να είναι διαφορετικές από τις δικές σας:
Fixit# gpart show
=> 34 2930274988 ad0 GPT (1.4T)
34 512 1 freebsd-boot (256K)
546 8388608 2 freebsd-swap (4.0G)
8389154 968341712 3 freebsd-zfs (462G)
976730866 976773168 4 freebsd-zfs (466G)
1953504034 976770988 5 freebsd-zfs (466G)
=> 34 976773101 ad1 GPT (466G)
34 976773101 1 freebsd-zfs (466G)
=> 34 976770988 ad2 GPT (466G)
34 976770988 1 freebsd-zfs (466G)
Fixit#
Βλέπουμε ότι το σύστημα έχει αναγνωρίσει επιτυχώς τις κατατμήσεις και έτσι μπορεί να σταματήσει ο κρύος υδρώτας που μας έκοψε όταν είδαμε το μήνυμα που έλεγε ότι ο boot loader δεν βρίσκει το kernel... Μην αναρρωτηθείτε για τη δομή του συστήματος που εμφανίζεται σε αυτή την εικόνα. Απλά μαζέψαμε μερικά περισσευούμενα εξαρτήματα και παίξαμε αρκετά με το ZFS για να περάσουμε αρκετές ώρες χαράς και δημιουργίας! Αν δεν τα κάναμε αυτά ίσως να μην ήμασταν σε θέση να μπορούμε να γράψουμε αυτό το How-to :D.
Το επόμενο βήμα είναι να χρησιμοποιήσουμε το κατάλληλο ZFS pool για να μπορέσουμε να δούμε το φρεσκοαναβαθμισμένο σύστημα. Με την ακόλουθη εντολή εμφανίζονται όλα τα ZFS Pools που περιέχονται στους σκληρούς μας δίσκους:
Fixit# zpool import
pool: Common2
id: 2880185314831596717
state: ONLINE
status: The pool was last accessed by another system
action: The pool can be imported using its name or numeric identifier and
the '-f' flag.
see: http://www.sun.com/msg/ZFS-8000-EY
config:
Common2 ONLINE
mirror ONLINE
gpt/disk2 ONLINE
gpt/Mirror2 ONLINE
pool: Common1
id: 16786791901886102938
state: ONLINE
status: The pool was last accessed by another system
action: The pool can be imported using its name or numeric identifier and
the '-f' flag.
see: http://www.sun.com/msg/ZFS-8000-EY
config:
Common1 ONLINE
mirror ONLINE
gpt/disk1 ONLINE
gpt/Mirror1 ONLINE
pool: zroot
id: 1188189039061593219
state: ONLINE
status: The pool was last accessed by another system
action: The pool can be imported using its name or numeric identifier and
the '-f' flag.
see: http://www.sun.com/msg/ZFS-8000-EY
config:
zroot ONLINE
gpt/disk0 ONLINE
Fixit#
Δύο βασικά πράγματα φαίνονται εδώ:
- Oι ZFS Pools είναι υγειείς, αυτό φαίνεται από την ένδειξη ONLINE που υπάρχει σε κάθε σημείο μιας ZFS Pool και
- Η βασική ZFS Pool που υπάρχει στο σύστημά μας είναι αυτή με την ονομασία zroot
3. Χρήση Της Βασικής ZFS Pool Και Προσάρτησή Της
Ώρα να κάνουμε το σύστημά μας να χρησιμοποιήσει τη ZFS Pool που μας ενδιαφέρει. Θα πρέπει να γίνει χρήση της στον υποκατάλογο /zroot:
Fixit# zpool import -fR /zroot zroot Fixit# zpool list NAME SIZE USED AVAIL CAP HEALTH ALTROOT zroot 460G 107G 353G 23% ONLINE /zroot Fixit#
Για να δούμε και τις ZFS κατατμήσεις μας:
Fixit# zfs list NAME USED AVAIL REFER MOUNTPOINT zroot 107G 346G 247M legacy zroot/tmp 338M 346G 338M /tmp zroot/usr 20,6G 346G 14,0G /usr zroot/usr/ports 6,23G 346G 364M /usr/ports zroot/usr/ports/distfiles 5,88G 346G 5,88G /usr/ports/distfiles zroot/usr/ports/packages 18K 346G 18K /usr/ports/packages zroot/usr/src 303M 346G 303M /usr/src zroot/var 1,75G 346G 13,3M /var zroot/var/crash 504M 346G 504M /var/crash zroot/var/db 1,13G 346G 1,08G /var/db zroot/var/db/pkg 53,4M 346G 53,4M /var/db/pkg zroot/var/empty 18K 346G 18K /var/empty zroot/var/log 91,9M 346G 91,9M /var/log zroot/var/mail 194K 346G 194K /var/mail zroot/var/run 110K 346G 110K /var/run zroot/var/tmp 26,7M 346G 26,7M /var/tmp Fixit#
Εδώ μπορούμε να κάνουμε μια ωραία παρατήρηση: η ZFS κατάτμηση με όνομα zroot έχει σημείο προσάρτησης (mountpoint) legacy. Αυτό σημαίνει πως δε μπορεί να προσαρτηθεί έτσι απλά! Για να αποφύγουμε εκπλήξεις θα της αλλάξουμε τη ρύθμιση. Το σύστημα ZFS έχει τη δυνατότητα να κάνει τέτοιες αλλαγές on-the-fly:
Fixit# zfs set mountpoint=/ zroot Fixit# ls /zroot . . . Fixit# zfs mount -a Fixit# zfs mount zroot /zroot/ zroot/tmp /zroot/tmp zroot/usr /zroot/usr zroot/usr/ports /zroot/usr/ports zroot/usr/ports/distfiles /zroot/usr/ports/distfiles zroot/usr/ports/packages /zroot/usr/ports/packages zroot/usr/src /zroot/usr/src zroot/var /zroot/var zroot/var/crash /zroot/var/crash zroot/var/db /zroot/var/db zroot/var/db/pkg /zroot/var/db/pkg zroot/var/empty /zroot/var/empty zroot/var/log /zroot/var/log zroot/var/mail /zroot/var/mail zroot/var/run /zroot/var/run zroot/var/tmp /zroot/var/tmp Fixit#
Τώρα είμαστε έτοιμοι να εγκαταστήσουμε τον loader που μας ενδιαφέρει
4. Εγκατάσταση ZFS Loader
Η διαδικασία είναι γνωστή. Αυτό το έχουμε ξανακάνει όταν εγκαθιστούσαμε το FreeBSD για χρήση με ZFS Root filesystem (ή ZFS Only). Ο κώδικας του loader βρίσκεται μέσα στο αναβαθμισμένο σύστημα που υπάρχει μέσα στον κατάλογο zroot. Όλη η δουλειά θα πρέπει να χρησιμοποιεί ΜΟΝΟ τον κώδικα και τα στοιχεία που υπάρχουν σε αυτό τον κατάλλογο, σα να είναι το σύστημα που τρέχει αυτή τη στιγμή. Και να η διαδικασία:
Fixit# chroot /zroot Fixit# mount -t devfs devfs /dev Fixit# export DESTDIR="" Fixit# cd /usr/src/sys/boot Fixit# make obj . . . Fixit# make depend . . . Fixit# make . . . Fixit# cd i386/loader Fixit# make install . . . Fixit# umount /dev Fixit# exit Fixit#
Ο loader έχει πλέον εγκατασταθεί και έχουμε βγει και από το περιβάλλον chroot. Μην ξεχνάμε ότι κάναμε μια αλλαγή στο σημείο προσάρτησης του βασικού καταλόγου της zroot. Αυτό θα πρέπει να το επαναφέρουμε:
Fixit# zfs umount -a Fixit# zfs set mountpoint=legacy zroot Fixit#
Σε αυτό το σημείο τελειώσαμε με την κονσόλα Fixit και μπορούμε να βγούμε από αυτήν:
Fixit# exit
Είμαστε έτοιμοι να βγούμε από το περιβάλλον του sysinstall και να κάνουμε επανεκκίνηση (μη με ρωτάτε πως γίνεται, δεν θυμάμαι :D:D:D) Φυσικά δεν ξεχνάμε να βγάλουμε το CD από το drive για να εκκινήσει το νέο μας σύστημα!...
5. Επίλογος Αναβάθμισης Του Συστήματος
Τι; Δεν τελειώσαμε; Μα ΟΧΙ ΦΥΣΙΚΑ!!!! Η αναβάθμιση είχε σταματήσει στην πρώτη επανεκκίνηση του συστήματος, η οποία και δεν πέτυχε!. Άρα, αφού επαναφέραμε τον loader είμαστε σε θέση να συνεχίσουμε με τα υπόλοιπα βήματα. Πατώντας τα ALT+CTRL+F1 ερχόμαστε στην πρώτη διαθέσιμη κονσόλα. Εκεί κάνουμε login σαν root και συνεχίζουμε την αναβάθμιση
login: root Password: pluto# freebsd-update install . . . pluto# shutdown -r now . . .
Η επανεκκίνηση δεν είναι υποχρεωτική (λένε κάποιοι), αλλά είναι μια καλή τακτική! Εξάλλου δε νομίζω να χάσουμε και το τεράστιο uptime :P Επίσης, κατά τη διάρκεια του freebsd-update install θα έχετε και λίγο χρόνο να παίξεται με το HTC Desire κινητό σας κανένα παιχνιδάκι, όπως jewels, sudoku, pinball κ.λ.π.
Το τελευταίο βήμα είναι να κάνουμε update τα ports και τα προγράμματα που έχουμε εγκαταστημένα στον υπολογιστή μας. Για άλλη μια φορά μπαίνουμε στην κονσόλα του συστήματος και κάνουμε login σαν root:
login: root Password: pluto# portsnap fetch update . . . pluto# less /usr/ports/UPDATING . . . pluto# portupgrade -a . . . pluto#
Οι εντολές που φαίνονται εδώ είναι ένα παράδειγμα με χρήση του portupgrade. Φυσικά δεν ξεχνάμε να διαβάσουμε το αρχείο /usr/ports/UPDATING (ακούς nakaliptos;). Εσείς μπορείτε να χρησιμοποιήσετε τον αγαπημένο σας τρόπο αναβάθμισης. Εδώ τελειώνει και η αναβάθμιση του FreeBSD σε 8.1-RELEASE.
pluto# uname -a FreeBSD pluto.universe 8.1-RELEASE FreeBSD 8.1-RELEASE #0: Mon Jul 19 02:36:49 UTC 2010 root@mason.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC amd64 pluto#



