Εισαγωγή στο NanoBSD
DanielGerzo
ΚυριάκοςΚεντρωτής
2006, 2009
Η Ομάδα Τεκμηρίωσης του &os;
&tm-attrib.freebsd;
&tm-attrib.general;
$FreeBSD$
$FreeBSD$
Το έγγραφο αυτό παρέχει πληροφορίες για τα εργαλεία
του NanoBSD, τα οποία μπορούν να
χρησιμοποιηθούν προκειμένου να δημιουργηθούν είδωλα του συστήματος
&os; για embedded εφαρμογές, κατάλληλες για χρήση από κάρτα Compact
Flash (ή άλλο μέσο αποθήκευσης).
Εισαγωγή στο NanoBSD
NanoBSD
Το NanoBSD είναι ένα εργαλείο το οποίο
αναπτύσσεται ενεργά από τον &a.phk;. Δημιουργεί ένα εικονικό είδωλο του
συστήματος &os; για embedded εφαρμογές, ιδανικό για κάρτες Compact Flash
(ή άλλο μέσο αποθήκευσης).
Μπορεί να χρησιμοποιηθεί για να φτιαχτούν εξειδικευμένες εικόνες,
σχεδιασμένες για εύκολη εγκατάσταση και συντήρηση συστημάτων
τύπου computer appliance
. Τα συστήματα τέτοιου είδους
έχουν το υλικό και λογισμικό τους ενοποιημένα μέσα στο προϊόν. Αυτό
σημαίνει πως συχνά είναι προεγκατεστημένα όλα τα απαραίτητα προγράμματα.
Η συσκευή συνδέεται σε ένα υπάρχον δίκτυο και μπορεί να λειτουργήσει
(σχεδόν) αμέσως.
Τα βασικά χαρακτηριστικά του NanoBSD
είναι:
Τα ports και τα πακέτα λειτουργούν όπως στο &os; —
οποιοδήποτε πρόγραμμα μπορεί να εγκατασταθεί και να χρησιμοποιηθεί
στο &os; μπορεί να ενσωματωθεί και σε ένα
είδωλο NanoBSD και να λειτουργήσει με τον
ίδιο τρόπο.
Δε υστερεί σε λειτουργικότητα — Αν είναι εφικτό να
γίνει κάτι με το &os;, τότε είναι εφικτό να γίνει το ίδιο πράμα και
με το NanoBSD, εκτός αν το συγκεκριμένο
χαρακτηριστικό έχει σκόπιμα αφαιρεθεί από το είδωλο
του NanoBSD.
Το NanoBSD τρέχει με το σύστημα σε
κατάσταση προστασίας από εγγραφή. Μπορείτε ακόμα και να το
αποσυνδέσετε από το ρεύμα την ώρα που λειτουργεί. Δεν είναι
αναγκαίο να εκτελεστεί το &man.fsck.8; μετά από μια άγαρμπη διακοπή
λειτουργίας του συστήματος.
Είναι εύκολο να δημιουργηθεί και να προσαρμοστεί ένα
είδωλο NanoBSD. Με τη χρήση ενός μόνο
σεναρίου φλοιού και ενός αρχείου διαμόρφωσης είναι εφικτή η δόμηση
προσαρμοσμένων ειδώλων που ικανοποιούν οποιαδήποτε ανάγκη.
Ρύθμιση του NanoBSD
Η Σχεδίαση του NanoBSD
Αφού γραφτεί ένα είδωλο του NanoBSD σε
κάποιο αποθηκευτικό μέσο, μπορεί να χρησιμοποιηθεί για να ξεκινήσει
ένα σύστημα &os;. Η προκαθορισμένη διαμόρφωση του μέσου εκκίνησης
αποτελείται από τρία μέρη:
Δύο διαμερίσματα εκκίνησης: code#1
και code#2.
Το διαμέρισμα ρυθμίσεων, Αυτό μπορεί να προσαρτηθεί στον
κατάλογο /cfg την ώρα
λειτουργίας του NanoBSD.
Αυτά τα τρία διαμερίσματα κανονικά είναι προσαρτημένα μόνο για
ανάγνωση.
Οι κατάλογοι /etc
και /var είναι εικονικοί δίσκοι
&man.md.4; (malloc).
Το διαμέρισμα ρυθμίσεων μπορεί να προσαρτηθεί στον
κατάλογο /cfg. Περιέχει αρχεία
τα οποία αντιγράφονται στον
κατάλογο /etc. Κατά την
εκκίνηση του συστήματος το διαμέρισμα ρυθμίσεων προσαρτάται προσωρινά
μόνο για ανάγνωση και αντιγράφονται τα αρχεία του στον
κατάλογο /etc. Οπότε για να
είναι κάποια αλλαγή ρυθμίσεων πιο μόνιμη
και να ισχύει
ακόμα και μετά από επανεκκίνηση του συστήματος, πρέπει να αντιγράφεται
από τον κατάλογο /etc στο
διαμέρισμα ρυθμίσεων, αφού αυτό προσαρτηθεί για γράψιμο στον
κατάλογο /cfg.
Κάνοντας μόνιμες αλλαγές στο /etc/resolv.conf
&prompt.root; vi /etc/resolv.conf
[...]
&prompt.root; mount /cfg
&prompt.root; cp /etc/resolv.conf /cfg
&prompt.root; umount /cfg
Το διαμέρισμα το οποίο περιέχει τον
κατάλογο /cfg πρέπει να
προσαρτάται μόνο κατά την εκκίνηση και όταν έχουν προτεραιότητα τα
αρχεία ρυθμίσεων
του /cfg.
Δεν είναι καλή ιδέα να μένει μόνιμα προσαρτημένο το
διαμέρισμα /cfg. Αν ένα
διαμέρισμα είναι προσαρτημένο για γράψιμο και το αποθηκευτικό μέσο
του NanoBSD επιτρέπει περιορισμένο αριθμό
κύκλων εγγραφής (όπως π.χ. μερικές κάρτες CF), μπορεί να επηρεαστεί
αρνητικά το αποθηκευτιμό μέσο επειδή ο πυρήνας γράφει κάθε λίγο
στους δίσκους του συστήματος (syncer).
Δημιουργία Ενός Προσαρμοσμένου Συστήματος NanoBSD
Το είδωλο του NanoBSD δημιουργείται από
ένα απλό σενάριο κονσόλας, το nanobsd.sh, το
οποίο μπορεί να βρεθεί στον
κατάλογο /usr/src/tools/nanobsd.
Αυτό το σενάριο δημιουργεί ένα είδωλο δίσκου, το οποίο μπορεί να
αντιγραφεί απευθείας σε κάποιο αποθηκευτικό μεσο χρησιμοποιώντας το
πρόγραμμα &man.dd.1;.
Οι απαραίτητες εντολές προκειμένου να δημιουργηθεί ένα είδωλο
του NanoBSD είναι οι εξής:
&prompt.root; cd /usr/src/tools/tools/nanobsd
&prompt.root; sh nanobsd.sh
&prompt.root; cd /usr/obj/nanobsd.full
&prompt.root; dd if=_.disk.full of=/dev/da0 bs=64k
Αλλαγή από τον τρέχοντα κατάλογο στον βασικό κατάλογο του
σεναρίου δημιουργίας
του NanoBSD.
Εκκίνηση της δημιουργίας του ειδώλου.
Αλλαγή από τον τρέχοντα κατάλογο στον κατάλογο που περιέχει το
είδωλο του NanoBSD.
Αντιγραφή του NanoBSD σε ένα μέσο
αποθήκευσης.
Προσαρμόζοντας το είδωλο του NanoBSD
Αυτό είναι πιθανότατα το πιο σημαντικό και πιο ενδιαφέρον
χαρακτηριστικό του NanoBSD. Αυτό είναι και
το μέρος της διαδικασίας ανάπτυξης του
ειδώλου NanoBSD για το οποίο θα ξοδέψετε
ένα μεγάλο ποσοστό του χρόνου προετοιμασίας του ειδώλου.
Η ακόλουθη εντολή θα κάνει το nanobsd.sh να
διαβάσει τις ρυθμίσεις του από το
αρχείο myconf.nano που βρίσκεται στο τρέχοντα
κατάλογο:
&prompt.root; sh nanobsd.sh -c myconf.nano
Η προσαρμογή και παραμετροποίηση
του NanoBSD γίνεται συνήθως με δύο
τρόπους:
Επιλογές διαμόρφωσης
Προσαρμοσμένες συναρτήσεις
Επιλογές διαμόρφωσης
Οι ρυθμίσεις του NanoBSD μπορούν να
χρησιμοποιηθούν για να οριστούν προσαρμοσμένες επιλογές
μεταγλώττισης και εγκατάστασης του &os;. Αυτές οι επιλογές
επηρεάζουν τα στάδια buildworld
και installworld
του NanoBSD, καθώς και άλλες επιλογές της
δημιουργίας του τελικού ειδώλου. Με τις κατάλληλες ρυθμίσεις
το NanoBSD μπορεί να μικρύνει αρκετά σε
μέγεθος· μπορεί να χωρέσει ένα πολύ μικρό υποσύνολο του βασικού &os;
σε χώρο μικρότερο από 64MB. Μπορείτε επίσης να χρησιμοποιήσετε τις
επιλογές του NanoBSD για να δημιουργήσετε
ένα είδωλο που έχει μόνο τον πυρήνα και δυο-τρία αρχεία στο βασικό
σύστημα.
Το αρχείο ρυθμίσεων του NanoBSD
περιέχει εντολές οι οποίες ορίζουν νέες τιμές για κάποια
προκαθορισμένη μεταβλητή ή επεκτείνουν τις υπάρχουσες ρυθμίσεις. Οι
πιο σημαντικές μεταβλητές είναι οι εξής:
NANO_NAME — Το όνομα του
ειδώλου NanoBSD που θα δημιουργηθεί
(χρησιμοποιείται για να φτιάξει τα ονόματα των κατάλογων
εργασίας).
NANO_SRC — Η διαδρομή του δέντρου
πηγαίου κώδικα το οποίο θα χρησιμοποιηθεί για να μετγλωττιστεί
το είδωλο.
NANO_KERNEL — Το όνομα του αρχείου
ρυθμίσεων πυρήνα το οποίο θα χρησιμοποιηθεί για να χτιστεί ο
πυρήνας του ειδώλου.
CONF_BUILD — Επιλογές που περνούν
στο στάδιο buildworld της μεταγλώττισης του
&os;.
CONF_INSTALL — Επιλογές που περνούν
στο στάδιο installworld της προετοιμασίας του
ειδώλου.
CONF_WORLD — Επιλογές που περνούν
και στα δύο στάδια της προετοιμασίας του ειδώλου, και
στο buildworld και
στο installworld.
FlashDevice — Ορίζει τον τύπο
του μέσου αποθήκευσης που θα χρησιμοποιηθεί. Για περισσότερες
λεπτομέρειες δείτε το
αρχείο FlashDevise.sub.
Προσαρμοσμένες Συναρτήσεις
Στο αρχείο ρύθμισης του NanoBSD
μπορεί να ρυθμιστεί σχεδόν κάθε λεπτομέρεια της προετοιμασίας του
ειδώλου και του τελικού ειδώλου το οποίο θα δημιουργηθεί.
Χρησιμοποιώντας μικρές συναρτήσεις φλοιού, μπορούμε να ρυθμίσουμε τα
πάντα. Για παράδειγμα, μπορούμε να τρέξουμε δικές μας εντολές οι
οποίες παραμετροποιούν το τελικό είδωλο ως εξής:
cust_foo () (
echo "bar=topless" > \
${NANO_WORLDDIR}/etc/foo
)
customize_cmd cust_foo
Ένα πιο χρήσιμο παράδειγμα συνάρτησης φλοιού, η οποία ρυθμίζει
κάποια παράμετρο του τελικού ειδώλου, είναι αυτό που ακολουθεί. Η
συνάρτηση cust_etc_size αλλάζει την προεπιλεγμένη
τιμή μεγέθους του
καταλόγου /etc από 5MB σε
30MB:
cust_etc_size () (
cd ${NANO_WORLDDIR}/conf
echo 30000 > default/etc/md_size
)
customize_cmd cust_etc_size
Το σενάριο φλοιού που δημιουργεί
το NanoBSD έχει μερικές έτοιμες
συναρτήσεις φλοιού οι οποίες εκτελούν τέτοιες επιπλέον
ρυθμίσεις:
cust_comconsole — Απενεργοποιεί το
&man.getty.8; στις κονσόλες VGA (οι
συσκευές /dev/ttyv*) και ενεργοποιεί την
χρήση της σειριακής θύρας COM1 ως κονσόλα συστήματος.
cust_allow_ssh_root — Επιτρέπει την
είσοδο του χρήστη root μέσω του
&man.sshd.8;.
cust_install_files — Εγκαθιστά
αρχεία από τον
κατάλογο nanobsd/Files.
Σε αυτό τον κατάλογο βρίσκονται μερικά χρήσιμα σενάρια φλοιού
για τη διαχείριση
ενός συστήματος NanoBSD.
Προσθέτοντας Πακέτα
Σε ένα είδωλο NanoBSD μπορούν να
προστεθούν και έτοιμα πακέτα, που έχουν φτιαχτεί από πριν
χρησιμοποιώντας τη Συλλογή των Ports. Μια συνάρτηση φλοιού μπορεί
να εγκαταστήσει έξτρα πακέτα την ώρα που προετοιμάζεται το είδωλο.
Για παράδειγμα, η παρακάτω συνάρτηση θα εγκαταστήσει στο είδωλο όλα
τα πακέτα που βρίσκονται στον
κατάλογο /usr/src/tools/tools/nanobsd/packages:
install_packages () (
mkdir -p ${NANO_WORLDDIR}/packages
cp /usr/src/tools/tools/nanobsd/packages/* ${NANO_WORLDDIR}/packages
chroot ${NANO_WORLDDIR} sh -c 'cd packages; pkg_add -v *;cd ..;'
rm -rf ${NANO_WORLDDIR}/packages
)
customize_cmd install_packages
Παράδειγμα Αρχείου Ρυθμίσεων του NanoBSD
Ένα πλήρες παράδειγμα αρχείου ρυθμίσεων για
το NanoBSD, με διάφορες ρυθμίσεις για τη
μεταγλώττιση του &os; και την προετοιμασία του τελικού ειδώλου,
μπορεί να μοιάζει κάπως έτσι:
NANO_NAME=custom
NANO_SRC=/usr/src
NANO_KERNEL=MYKERNEL
NANO_IMAGES=2
CONF_BUILD='
NO_KLDLOAD=YES
NO_NETGRAPH=YES
NO_PAM=YES
'
CONF_INSTALL='
NO_ACPI=YES
NO_BLUETOOTH=YES
NO_CVS=YES
NO_FORTRAN=YES
NO_HTML=YES
NO_LPR=YES
NO_MAN=YES
NO_SENDMAIL=YES
NO_SHAREDOCS=YES
NO_EXAMPLES=YES
NO_INSTALLLIB=YES
NO_CALENDAR=YES
NO_MISC=YES
NO_SHARE=YES
'
CONF_WORLD='
NO_BIND=YES
NO_MODULES=YES
NO_KERBEROS=YES
NO_GAMES=YES
NO_RESCUE=YES
NO_LOCALES=YES
NO_SYSCONS=YES
NO_INFO=YES
'
FlashDevice SanDisk 1G
cust_nobeastie() (
touch ${NANO_WORLDDIR}/boot/loader.conf
echo "beastie_disable=\"YES\"" >> ${NANO_WORLDDIR}/boot/loader.conf
)
customize_cmd cust_comconsole
customize_cmd cust_install_files
customize_cmd cust_allow_ssh_root
customize_cmd cust_nobeastie
Ενημερώνοντας το NanoBSD
Η διαδικασία ενημέρωσης του NanoBSD
είναι σχετικά απλή:
Δημιουργία ενός νέου
ειδώλου NanoBSD, με το συνηθισμένο
τρόπο.
Ανέβασμα του νέου ειδώλου σε μια αχρησιμοποίητη κατάτμηση μιας
συσκευής που τρέχει NanoBSD.
Η πιο σημαντική διαφορά αυτού του σημείου από την αρχική
εγκατάσταση του NanoBSD είναι ότι τώρα
αντί του αρχείου _.disk.full (το οποίο
περιέχει το είδωλο ενός ολόκληρου δίσκου), εγκαταστάθηκε το αρχείο
_.disk.image (το οποίο περιέχει το είδωλο
μιας μόνο κατάτμησης του δίσκου).
Κλείσιμο και επανεκκίνηση του συστήματος από την νέα
εγκατεστημένη κατάτμηση.
Αν όλα πάνε καλά, η αναβάθμιση τελείωσε.
Αν οτιδήποτε πάει στραβά, επανεκκινήστε τη συσκευή από την
προηγούμενη κατάτμηση (η οποία περιέχει το παλιό είδωλο, που
λειτουργεί σωστά). Έτσι μπορείτε να επαναφέρετε άμεσα το σύστημα
σε λειτουργική κατάσταση. Διορθώστε οποιαδήποτε προβλήματα έχει
το νέο είδωλο, και επαναλάβετε την διαδικασία.
Για να εγκατασταθεί το νέο είδωλο σε ένα
σύστημα NanoBSD, το οποίο ήδη βρίσκεται σε
λειτουργία, μπορεί να χρησιμοποιηθεί είτε το
σενάριο updatep1 είτε
το updatep2. Αυτά τα δύο σενάρια φλοιού
βρίσκονται στον
κατάλογο /root.
Ανάλογα με τις υπηρεσίες του συστήματος στο οποίο δημιουργείται
ένα είδωλο NanoBSD, μπορεί να μεταφερθεί
ένα νέο είδωλο στο τελικό σύστημα με διάφορους τρόπους:
Χρησιμοποιώντας το &man.ftp.1;
Αν σας ενδιαφέρει η καλή ταχύτητα μεταφοράς, χρησιμοποιήστε
το FTP για τη μεταφορά του ειδώλου:
&prompt.root; ftp myhost
get _.disk.image "| sh updatep1"
Χρησιμοποιώντας το &man.ssh.1;
Αν σας ενδιαφέρει η μεταφορά του ειδώλου να γίνει με ασφαλή
τρόπο και δεν έχετε αφαιρέσει από το αρχικό είδωλο το &man.ssh.1;,
προτιμήστε τη μεταφορά μέσω SSH:
&prompt.root; ssh myhost cat _.disk.image.gz | zcat | sh updatep1
Χρησιμοποιώντας το &man.nc.1;
Αν το σύστημα στο οποίο έχει δημιουργηθεί το νέο είδωλο
του NanoBSD δεν τρέχει ούτε &man.ftpd.8;
ούτε &man.sshd.8;, μπορείτε να χρησιμοποιήσετε άλλα εργαλεία για τη
μεταφορά, όπως το &man.nc.1;:
Πρώτα ανοίξτε ένα εξυπηρετητή TCP στο
σύστημα το οποίο θα παρέχει το νέο είδωλο, και ορίστε το νέο
είδωλο ως είσοδο για τη μεταφορά που θα γίνει αργότερα:
myhost&prompt.root; nc -l 2222 < _.disk.image
Πριν από αυτό βεβαιωθείτε ότι η θύρα που χρησιμοποιείτε
για τον εξυπηρετητή μπορεί να δεχθεί εισερχόμενες συνδέσεις
από το σύστημα NanoBSD προς το
σύστημα του εξυπηρετητή, και δεν εμποδίζεται, για παράδειγμα,
από κάποιο τείχος προστασίας (firewall
).
Συνδεθείτε από το NanoBSD στον
εξυπηρετητή, ο οποίος είναι ήδη έτοιμος να παρέχει το νέο
είδωλο, και τροφοδοτείστε το σενάριο
φλοιού updatep1 με την έξοδο του εργαλείου
&man.nc.1;:
&prompt.root; nc myhost 2222 | sh updatep1