Skip to main content

Upgrading ZFS-Only FreeBSD System to FreeBSD 8.1-RELEASE

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#