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

Υπηρεσίες PXE server, από το Raspberry Pi

Το Raspberry Pi μας είναι υπερήφανο για τις υπηρεσίες ad-blocking και VPN που απλόχερα προσφέρει. Την ίδια στιγμή είναι πολύ άνετο σε system resources και μερικές φορές, θα το πούμε κι ας κριθούμε, απορούμε αν αισθάνεται τύψεις. Υπάρχουν βλέπετε ένα σωρό άλλες υπηρεσίες που θα μπορούσε να παρέχει — και μάλιστα χωρίς να ζορίζεται ιδιαίτερα.

Τις προάλλες το πήραμε απόφαση: Αντί το Raspberry Pi να κάθεται κι εμείς να απορούμε, πολύ περισσότερο ενδιαφέρον θα ήταν να του βρούμε ακόμη έναν ρόλο. Θέλαμε, φυσικά, να εξακολουθήσει να μπλοκάρει διαφημίσεις για όλο το home network, βεβαίως και να συνεχίσει να είναι o έμπιστος OpenVPN server μας για όποτε είμαστε εκτός οικιακού δικτύου. Αρχικά πέρασαν από το μυαλό ιδέες του στιλ FTP/SAMBA/NFS server, media tank με Plex κ.ο.κ. Όμως με αυτά και με παρεμφερή θέματα έχουμε ασχοληθεί ξανά στο παρελθόν. Τώρα ψάχναμε κάτι εντελώς διαφορετικό, ώστε να μάθουμε και κάτι καινούργιο. Μετά από αρκετή σκέψη και μερικές δοκιμές, αποφασίσαμε για τον πρόσθετο ρόλο που θέλαμε ν’ αναλάβει το Raspberry Pi μας. Να σας πούμε ότι, τώρα που διαβάζετε τις γραμμές αυτές, τον διεκπεραιώνει με απόλυτη επιτυχία — κι εμείς είμαστε βέβαιοι ότι καθόλου δεν αισθάνεται τύψεις.

Το Raspberry Pi στο τοπικό μας δίκτυο, φίλες και φίλοι, είναι πλέον και PXE server. Σε λίγο θα σας δείξουμε πώς να χαρίσετε κι εσείς ανάλογες δυνατότητες στο δικό σας RasPi — ή σε κάποιο άλλο box με Linux που έχετε στη διάθεσή σας, τέλος πάντων. Πρώτα όμως πρέπει να πούμε γι’ αυτό το PXE και γιατί κάποιος θα το ήθελε.

Ο όρος PXE (προφέρεται “πίξι”) είναι αρκτικόλεξο του Preboot eXecution Environment κι αποτελεί μια τυποποιημένη προδιαγραφή για την εκτέλεση λογισμικού που βρίσκεται αποθηκευμένο σε έναν PXE server, από έναν PXE client. Ίσως αυτό δεν φαντάζει και πολύ εντυπωσιακό. Δεν χρειάζεται άλλωστε να σκεφτούμε πολύ, ώστε να συνειδητοποιήσουμε ότι, ουσιαστικά, σχεδόν κάθε μέρα χρησιμοποιούμε λογισμικό που δεν υπάρχει στον υπολογιστή μας αλλά σε κάποιον άλλον, στο τοπικό δίκτυο ή στο Internet. Το PXE όμως δεν περιγράφει πώς τρέχουμε λογισμικό που βρίσκεται σε άλλο μηχάνημα — κι ενδεχομένως βλέπουμε τα αποτελέσματα της εκτέλεσης στην οθόνη κάποιου άλλου. Πολύ περισσότερο, περιγράφει πώς ένας client, ο οποίος ίσως δεν έχει καν λειτουργικό σύστημα εγκατεστημένο, ξεκινά και τρέχει κώδικα από κάποιον απομακρυσμένο host. Το μόνο που χρειάζεται ο client είναι μια ασύρματη ή ενσύρματη κάρτα δικτύου που να ξέρει τι θα πει PXE. Μια τέτοια κάρτα γνωρίζει και το πρωτόκολλο DHCP, αφού χρειάζεται έναν τρόπο ώστε να δέχεται παραμέτρους δικτύωσης. Γνωρίζει επίσης και το απλό αλλά πολύ χρήσιμο πρωτόκολλο TFTP (Trivial File Transfer Protocol), χάρη στο οποίο επιτυγχάνεται η μεταφορά εκτελέσιμου κώδικα από τον PXE server στον PXE client.

Δύο είναι οι βασικές εφαρμογές που βρίσκει το PXE.

  • Εκκίνηση diskless workstations, δηλαδή λιτών σε hardware υπολογιστών που ενδεχομένως δεν έχουν καν δίσκο. Τέτοια μηχανήματα φορτώνουν το λειτουργικό τους σύστημα από έναν PXE server, ενώ είναι και πιθανό να προσαρτούν τα home directories των χρηστών από κάποιον άλλον υπολογιστή, π.χ., μέσω NFS.

  • Δικτυακή εγκατάσταση λειτουργικού συστήματος, χωρίς να απαιτούνται το φόρτωμα και η εκκίνηση του installer από CD/DVD/USB stick ή από φορητό δίσκο. Σε πολλά data centers αυτός ακριβώς είναι ο ενδεδειγμένος τρόπος για την εγκατάσταση λειτουργικών σε υπολογιστές. Δεν χρειάζεται, δηλαδή, να τρέχει ένας διαχειριστής εδώ κι εκεί, με δισκάκια και στικάκια και να φροντίζει για τις διαδικασίες εγκατάστασης. Μάλιστα ακόμη και οι (επαν)εκκινήσεις των μηχανημάτων γίνονται απομακρυσμένα, π.χ., χάρη στο IPMI (Intelligent Platform Management Interface).

Στο παρόν άρθρο μάς ενδιαφέρει αυτή η δεύτερη εφαρμογή, κι ας μην είμαστε υπεύθυνοι διαχειριστές σε κάποιο data center. Πράγματι, ένας μικρός PXE server αποδεικνύεται χρήσιμος ακόμη και σε ένα home network, αν μη τι άλλο για να κάνουμε τις εγκαταστάσεις μας και τις δοκιμές μας δικτυακά, χωρίς να σκοτιζόμαστε με δισκάκια και στικάκια. Εννοείται ότι οι PXE clients επιτρέπεται να είναι και εικονικές μηχανές. Να πούμε επίσης ότι, πέρα από τις εγκαταστάσεις, χάρη στον PXE server είναι πολύ εύκολο να ξεκινάμε μια Live διανομή Linux για την επιδιόρθωση ή το backup ενός υπάρχοντος συστήματος (σκεφτείτε, π.χ., το SystemRescueCd).

Υποψιαζόμαστε ότι κάπου εδώ έχουμε κερδίσει την προσοχή σας, οπότε ας περάσουμε σιγά σιγά στη δράση.

Προαπαιτούμενα

Δουλεύουμε σε ένα Raspberry Pi 3 με Raspbian, το οποίο εκτελεί χρέη network-wide ad-blocker με το Pi-hole, καθώς κι OpenVPN server με το PiVPN. Στο RasPi λοιπόν υπάρχει ήδη το dnsmasq εγκατεστημένο, και λειτουργεί ως DNS server για τα μηχανήματα και τις συσκευές του τοπικού δικτύου. Έχουμε επίσης ζητήσει από το Pi-hole να προσφέρει υπηρεσίες DHCP, γεγονός που στην πράξη σημαίνει ότι το dnsmasq είναι o ένας και μοναδικός DHCP server του τοπικού δικτύου. (Ναι, στο modem/router του ISP φροντίσαμε για την απενεργοποίηση της αντίστοιχης δυνατότητας.) Μπορείτε να εφαρμόσετε όλα όσα ακολουθούν στο Raspberry Pi σας — ή και σε κάποιο άλλο μηχάνημα με Linux. Να σημειώσουμε εδώ ότι, αν και το dnsmasq δεν είναι υποχρεωτικό και σίγουρα υπάρχει δυνατότητα επιλογής άλλου DHCP server, οι σχετικές ρυθμίσεις που σε λίγο θα δείξουμε έχουν νόημα για το dnsmasq και μόνο γι’ αυτό. Αν δεν έχετε ακόμη αποφασίσει για τον DHCP server που θα χρησιμοποιήσετε, σας προτείνουμε να εξετάσετε σοβαρά την περίπτωση του dnsmasq: πρόκειται για έναν server που εκτός από DHCP παρέχει και υπηρεσίες DNS, ενώ ταυτόχρονα υποστηρίζει τα PXE και TFTP. Όσον αφορά τέλος στο hardware, και συγκεκριμένα στις κάρτες δικτύωσης, δεν υπάρχει κανένας λόγος ανησυχίας: είναι πρακτικά αδύνατο να διαθέτετε κάρτα που δεν υποστηρίζει το PXE, ενώ το ίδιο ισχύει και για τις κάρτες δικτύωσης των εικονικών μηχανών.

Απαραίτητο λογισμικό και πρώτη δικτυακή εκκίνηση

Συνδεόμαστε στο Raspberry Pi μέσω SSH, φρεσκάρουμε τα repositories, εφαρμόζουμε τις όποιες διαθέσιμες ενημερώσεις κι εγκαθιστούμε το απαραίτητο λογισμικό για τη λειτουργικότητα PXE:

pi@nordostbahnhof:~ $ sudo apt update
pi@nordostbahnhof:~ $ sudo apt upgrade
pi@nordostbahnhof:~ $ sudo apt install pxelinux syslinux-common

Με δικαιώματα διαχειριστή και με τον text editor της προτίμησής μας, ανοίγουμε το αρχείο /etc/dnsmasq.conf. Στο τέλος του προσθέτουμε τέσσερις νέες γραμμές που μοιάζουν με τις ακόλουθες:

enable-tftp
dhcp-boot=pxelinux.0
pxe-service=x86PC,"Nordostbahnhof Boot System",pxelinux
tftp-root=/mnt/external/tftpboot

Ως μήνυμα στην τρίτη γραμμή, ανάμεσα στα εισαγωγικά, βάλτε ό,τι θέλετε. Στην τέταρτη γραμμή καθορίστε την πλήρη διαδρομή προς τον κατάλογο κάτω από τον οποίο σκοπεύετε να αποθηκεύετε κάποια κρίσιμα αρχεία για διάφορα λειτουργικά που επιθυμείτε να προσφέρει ο PXE server. Περιττό ν’ αναφέρουμε ότι καλό είναι να αποφύγετε την κάρτα SD του Raspberry Pi. Εμείς, π.χ., συνδεδεμένο στη συσκευή έχουμε έναν 500άρη εξωτερικό δίσκο USB. Τη μία και μοναδική κατάτμησή του την έχουμε προσαρτημένη κάτω από τον κατάλογο /mnt/external. Μεταξύ των καταλόγων στη ρίζα του δίσκου υπάρχει κι ο tftpboot — και κάτω απ’ αυτόν οργανώνουμε όλους τους καταλόγους και τα αρχεία που χρησιμοποιεί ο PXE server. Αποθηκεύουμε τις αλλαγές στο dnsmasq.conf, εγκαταλείπουμε τον editor κι επανεκκινούμε την υπηρεσία:

pi@nordostbahnhof:~ $ sudo systemctl restart dnsmasq

Αλλάζουμε το ιδιοκτησιακό καθεστώς από τον κατάλογο /mnt/external/tftpboot και κάτω, ώστε τα πάντα να ανήκουν στο χρήστη μας και στην ομάδα του (pi και pi, για την περίπτωσή μας):

pi@nordostbahnhof:~ $ sudo chown -R pi:pi /mnt/external/tftpboot

Μεταβαίνουμε στον /mnt/external/tftpboot

pi@nordostbahnhof:~ $ cd /mnt/external/tftpboot

…και κατεβάζουμε ένα συμπιεσμένο binary της τελευταίας έκδοσης του Memtest86:

pi@nordostbahnhof:/mnt/external/tftpboot $ wget \
> http://www.memtest.org/download/5.01/memtest86+-5.01.bin.gz

Γιατί το κάναμε αυτό; Μα, γιατί θέλουμε να εξοικειωθούμε με το PXE και τις δυνατότητές του, οπότε καλό είναι να ξεκινήσουμε με ένα απλό παράδειγμα: οι clients θα έχουν επιλογή απομακρυσμένης εκκίνησης του Memtest86 — και για το σκοπό μας πραγματικά δεν έχει σημασία αν υπάρχει ανάγκη ελέγχου της μνήμης τους ή όχι.

Φτιάχνουμε έναν υποκατάλογο για την αποθήκευση του Memtest86 binary, αποσυμπιέζουμε το αρχείο που μόλις κατεβάσαμε και το μετακινούμε εντός του προαναφερθέντος καταλόγου:

pi@nordostbahnhof:/mnt/external/tftpboot $ mkdir memtest
pi@nordostbahnhof:/mnt/external/tftpboot $ gzip -d memtest86+-5.01.bin.gz
pi@nordostbahnhof:/mnt/external/tftpboot $ mv memtest86+-5.01.bin \
> memtest/memtest86+-5.01

Παρατηρήστε ότι στη νέα θέση του Memtest86 binary, αφήσαμε το ίδιο όνομα αλλά παραλείψαμε την κατάληψη .bin. Τώρα, στο /mnt/external/tftpboot δημιουργούμε μια σειρά από symbolic links προς εκείνα τα αρχεία που είναι απαραίτητα για την εκκίνηση του bootloader στους PXE clients:

pi@nordostbahnhof:/mnt/external/tftpboot $ ln -s \
> /usr/lib/PXELINUX/pxelinux.0 .

pi@nordostbahnhof:/mnt/external/tftpboot $ ln -s \
> /usr/lib/syslinux/modules/bios/vesamenu.c32 .

pi@nordostbahnhof:/mnt/external/tftpboot $ ln -s \
> /usr/lib/syslinux/modules/bios/ldlinux.c32 .

pi@nordostbahnhof:/mnt/external/tftpboot $ ln -s \
> /usr/lib/syslinux/modules/bios/libcom32.c32 .

pi@nordostbahnhof:/mnt/external/tftpboot $ ln -s \
> /usr/lib/syslinux/modules/bios/libutil.c32 .

Πριν συνεχίσουμε, στον τρέχοντα κατάλογο μεταφέρουμε μια εικόνα για το boot menu. Ο τύπος της πρέπει να είναι PNG και οι διαστάσεις της 640×480 pixels. Δεν χρειάζεται, φυσικά, να δημιουργήσουμε κάτι περίτεχνο. Εμείς, π.χ., φτιάξαμε το αρχείο bootmenu.png, το οποίο είναι μια μαύρη εικόνα με ένα απλό πιγκουινάκι κάτω δεξιά. Ιδού πώς έχουν τα περιεχόμενα του καταλόγου /mnt/external/tftpboot έως αυτή τη τη στιγμή:

pi@nordostbahnhof:/mnt/external/tftpboot $ ls -lh
total 20K
...  Oct  3 ... bootmenu.png
...  Oct  3 ... ldlinux.c32 -> /usr/lib/syslinux/modules/bios/ldlinux.c32
...  Oct  3 ... libcom32.c32 -> /usr/lib/syslinux/modules/bios/libcom32.c32
...  Oct  3 ... libutil.c32 -> /usr/lib/syslinux/modules/bios/libutil.c32
...  Oct  3 ... memtest
...  Oct  3 ... pxelinux.0 -> /usr/lib/PXELINUX/pxelinux.0
...  Oct  3 ... vesamenu.c32 -> /usr/lib/syslinux/modules/bios/vesamenu.c32

Φτιάχνουμε τώρα τον κατάλογο ονόματι pxelinux.cfg κι εντός αυτού ένα αρχείο απλού κειμένου, με όνομα default. Τα περιεχόμενά του πρέπει να μοιάζουν με τα ακόλουθα:

UI vesamenu.c32
PROMPT 0
TIMEOUT 600
DEFAULT Memtest86
MENU TITLE Nordostbahnhof PXE Boot Loader
MENU BACKGROUND bootmenu.png
MENU COLOR SEL 30;47 #000000 #FFFFFFFF

LABEL Memtest86
  MENU LABEL Memtest86+ 5.01
  KERNEL /memtest/memtest86+-5.01

Μπορείτε βεβαίως να κάνετε τις τροποποιήσεις σας, αλλά η γενική ιδέα είναι ότι χάρη στο αρχείο pxelinux.cfg/default ορίζουμε ένα απλό μενού, το οποίο θα εμφανίζεται στις οθόνες των PXE clients για συγκεκριμένο χρόνο (εκφράζεται σε δέκατα του δευτερολέπτου). Το μενού προς το παρόν έχει μία μόνο επιλογή: το φόρτωμα του Memtest86, για την εκτέλεση διαγνωστικών ελέγχων στη μνήμη RAM του εκάστοτε PXE client.

Προκειμένου να βεβαιωθούμε ότι όλα έχουν πάει καλά, δεν έχουμε παρά να ξεκινήσουμε έναν PXE client. Αυτό που θα περιμένουμε να δούμε στην οθόνη του είναι ένα απλό μενού με μία και μόνο επιλογή, για το φόρτωμα του Memtest86. Μόλις το εκτελέσιμο φορτώσει, στον client θα πρέπει να βλέπουμε, ζωντανά, την εξέλιξη μιας σειράς διαγνωστικών ελέγχων για τη μνήμη του. Πρακτικά, δύο είναι οι επιλογές μας.

  • Πηγαίνουμε σε έναν φυσικό υπολογιστή του τοπικού με δικτύου και τον ξεκινάμε. Στο boot order, θα πρέπει να φροντίσουμε ώστε πρώτη συσκευή να είναι η κατάλληλη κάρτα δικτύωσης.

  • Δημιουργούμε ένα νέο VM με bridged networking, και το ξεκινάμε. Εναλλακτικά στρεφόμαστε σε ένα ήδη υπάρχον VM, βεβαιωνόμαστε ότι έχει bridged networking, και το ξεκινάμε. Όπως και να ‘χει, στο boot order του VM πρώτη συσκευή πρέπει να είναι η κάρτα δικτύωσης.

Προσέξτε ότι για τις ανάγκες τις συγκεκριμένης δοκιμής, το αν ο PXE client διαθέτει ή στερείται λειτουργικού συστήματος δεν έχει καμία σημασία. Αυτό που έχει σημασία είναι ότι αφού τον ξεκινήσουμε, μετά από λίγα δευτερόλεπτα θα πρέπει να δούμε στην οθόνη του ένα απλό μενού με μία μόνο επιλογή: το φόρτωμα του Memtest86. Αν δεν δούμε το μενού ή το Memtest86 αποτύχει να φορτώσει, τότε ελέγχουμε το συντακτικό του αρχείου pxelinux.cfg/default, τις θέσεις αρχείων και καταλόγων κάτω από τον κατάλογο tftpboot, καθώς και τα symbolic links που φτιάξαμε πριν λίγο. Τέλος, βεβαιωθείτε ότι ο client πράγματι φορτώνει πρώτα από την κατάλληλη κάρτα δικτύωσης.

Κατά τις δοκιμές μας οφείλουμε να βεβαιωνόμαστε ότι η εκκίνηση από το δίκτυο έχει τη μέγιστη προτεραιότητα στο boot order του PXE client. Επίσης, αν δουλεύουμε με κάποιο VM, η δικτύωση της μηχανής πρέπει να είναι τύπου bridged.

Κατά τις δοκιμές μας οφείλουμε να βεβαιωνόμαστε ότι η εκκίνηση από το δίκτυο έχει τη μέγιστη προτεραιότητα στο boot order του PXE client. Επίσης, αν δουλεύουμε με κάποιο VM, η δικτύωση της μηχανής πρέπει να είναι τύπου bridged.

Η πρώτη επιτυχημένη δοκιμή για τον δικό μας PXE server, όπου ελέγχουμε αν κάποιος client είναι ικανός να φορτώσει δικτυακά και να τρέξει το Memtest86.

Η πρώτη επιτυχημένη δοκιμή για τον δικό μας PXE server, όπου ελέγχουμε αν κάποιος client είναι ικανός να φορτώσει δικτυακά και να τρέξει το Memtest86.

Περισσότερες επιλογές για PXE booting

Μόλις βεβαιωθήκαμε ότι ο PXE server λειτουργεί. Προς το παρόν προσφέρει στους PXE clients μόνο το Memtest86. Σε λίγο θα επαυξήσουμε τις δυνατότητές του, συνεπώς θα τον καταστήσουμε πολύ πιο χρήσιμο για το home network. Στα παραδείγματα που ακολουθούν θα δείξουμε τι ακριβώς χρειάζεται να κάνουμε, ώστε οι PXE clients να έχουν επιλογή για δικτυακή εγκατάσταση δύο δημοφιλών διανομών Linux που πολύ αγαπάμε και χρησιμοποιούμε: του openSUSE Leap 42.3 και του Ubuntu Server 16.04.3 LTS.

Ανεξαρτήτως πάντως των distributions που θα διαθέτει ο PXE server, έχουμε ν’ αποφασίσουμε πώς οι PXE clients θα λαμβάνουν τα αρχεία εγκατάστασης. Αναλυτικότερα, ο πυρήνας και το initial ramdisk image κάθε διανομής μεταφέρονται στον εκάστοτε PXE client μέσω TFTP. Τα υπόλοιπα αρχεία, όμως, πρέπει να μεταφέρονται με κάποιον άλλον τρόπο. Σε οδηγούς στο Internet θα δείτε να γίνεται λόγος περί του πρωτοκόλλου NFS. Το δοκιμάσαμε κι εμείς, όμως με συγκεκριμένες διανομές συναντήσαμε προβλήματα κι εμπόδια. Αλλά η χρήση του NFS δεν είναι υποχρεωτική: Κάλλιστα μπορούμε να προσφέρουμε τα αρχεία εγκατάστασης, π.χ., μέσω HTTP. Από τη στιγμή που στο Raspberry Pi μας τρέχει ήδη ο lighttpd –προφέρεται “λάιτι” και τον εγκατέστησε το Pi-hole–, αποφασίσαμε να στρέψουμε την προσοχή μας στη διάθεση μέσω HTTP.

Μεταβαίνουμε στον κατάλογο /etc/lighttpd/conf-available και, με δικαιώματα root, δημιουργούμε ένα νέο αρχείο με όνομα 99-distributions.conf και το ακόλουθο περιεχόμενο:

dir-listing.activate = "enable"

Μετά πηγαίνουμε στον κατάλογο /etc/lighttpd/conf-enabled και δημιουργούμε έναν symbolic link προς το αρχείο που μόλις φτιάξαμε:

pi@nordostbahnhof:/etc/lighttpd/conf-enabled $ sudo ln -s \
> ../conf-available/99-distributions.conf .

Επανεκκινούμε το lighttpd πληκτρολογώντας sudo systemctl restart lighttpd, ώστε να ληφθεί υπόψη η αλλαγή. Μόλις φροντίσαμε ώστε ο web server να παρουσιάζει τα αρχεία και τους υποκαταλόγους των καταλόγων, οι οποίοι δεν έχουν αρχεία HTML και βρίσκονται κάτω από το λεγόμενο document root. Στην περίπτωσή μας, αυτό είναι το /var/www/html. Ας πάμε λοιπόν σε αυτόν τον κατάλογο (cd /var/www/html) κι ας δημιουργήσουμε μια δομή υποκαταλόγων για τη φιλοξενία των αρχείων των διανομών που θέλουμε να παρέχει ο PXE server:

pi@nordostbahnhof:/var/www/html $ sudo mkdir -p \
> distributions/osuse-leap-42.3-x86_64

pi@nordostbahnhof:/var/www/html $ sudo mkdir \
> distributions/ubuntu-16.04.3-server-amd64

Όλα καλά, μέχρι να συνειδητοποιήσουμε ότι ο κατάλογος /var/www/html βρίσκεται στην κάρτα SD του Raspberry. Όποια κι αν είναι η χωρητικότητά της, όσο ελεύθερο χώρο κι αν έχει, σίγουρα δεν θέλουμε ν’ αποθηκεύουμε χιλιάδες αρχεία άλλων διανομών σε αυτή. Γι’ αυτό και θα εργαστούμε ως εξής:

  • θα κατεβάσουμε τα αρχεία ISO των διανομών που θέλουμε
  • τα αρχεία ISO θα τα έχουμε σε ένα άλλο μέσο, π.χ., σε έναν εξωτερικό δίσκο USB
  • κάθε ISO image θα το προσαρτήσουμε κάτω από τον αντίστοιχο κατάλογο του /var/www/html/distributions
  • θα προσθέσουμε τα αντίστοιχα entries στο αρχείο /etc/fstab, ώστε οι συνδέσεις (προσαρτήσεις) των ISO να γίνονται αυτόματα κατά την εκκίνηση του Raspbian.

Ας δούμε τα τέσσερα αυτά βήματα αναλυτικότερα.

Κατ’ αρχάς, στο πλαίσιο της παρουσίασής μας κατεβάσαμε τα ISO images των openSUSE Leap 42.3 και Ubuntu Server 16.04.3 LTS.

Πήραμε τα αρχεία openSUSE-Leap-42.3-DVD-x86_64.iso και ubuntu-16.04.3-server-amd64.iso, το οποίο και μετονομάσαμε σε Ubuntu-16.04.3-Server-amd64.iso (μη ρωτάτε γιατί, παραξενιές είν’ αυτές). Γενικά, όλα τα ISO iamges τα αποθηκεύουμε στον κατάλογο /mnt/external/ISOs — και τα δύο προαναφερθέντα δεν πήγαν κάπου αλλού.

Για τη χειροκίνητη προσάρτηση των δύο ISO images, ως root πληκτρολογήσαμε:

pi@nordostbahnhof:~ $ sudo mount \
> /mnt/external/ISOs/openSUSE-Leap-42.3-DVD-x86_64.iso \
> /var/www/html/distributions/osuse-leap-42.3-x86_64

pi@nordostbahnhof:~ $ sudo mount \
> /mnt/external/ISOs/Ubuntu-16.04.3-Server-amd64.iso \
> /var/www/html/distributions/ubuntu-16.04.3-server-amd64

Τα ISO images των δύο διανομών που αρχικά αρχικά σχεδιάζουμε να παρέχουμε στους PXE clients, προσαρτημένα κάτω από τον κατάλογο distributions κι εντός του document root του lighttpd. Η πρόσβαση στα αρχεία εγκατάστασης των διανομών θα γίνεται μέσω HTTP.

Τα ISO images των δύο διανομών που αρχικά σχεδιάζουμε να παρέχουμε στους PXE clients, προσαρτημένα κάτω από τον κατάλογο distributions κι εντός του document root του lighttpd. Η πρόσβαση στα αρχεία εγκατάστασης των διανομών θα γίνεται μέσω HTTP.

Θέλουμε τα ISO images να προσαρτώνται αυτόματα κατά την εκκίνηση του Raspbian, γι’ αυτό και προσθέτουμε τις κατάλληλες γραμμές στο /etc/fstab. Δείτε στο ακόλουθο screenshot τις σχετικές γραμμές που έχουμε βάλει στο δικό μας fstab.

Σε πρασινωπό υπόβαθρο είναι οι δύο γραμμές στο /etc/fstab του Raspberry Pi μας, οι οποίες διασφαλίζουν την αυτόματη προσάρτηση των ISO images των διανομών που προσφέρουμε στους PXE clients του τοπικού δικτύου.

Σε πρασινωπό υπόβαθρο είναι οι δύο γραμμές στο /etc/fstab του Raspberry Pi μας, οι οποίες διασφαλίζουν την αυτόματη προσάρτηση των ISO images των διανομών που προσφέρουμε στους PXE clients του τοπικού δικτύου.

Προκειμένου να βεβαιωθούμε ότι παρέχεται πρόσβαση HTTP στο περιεχόμενο των δύο ISO images, από έναν web browser, σε ένα οποιοδήποτε μηχάνημα του τοπικού δικτύου, αρκεί να επισκεφτούμε τις διευθύνσεις http://192.168.178.2/distributions, http://192.168.178.2/distributions/osuse-leap-42.3-x86_64 και βεβαίως http://192.168.178.2/distributions/ubuntu-16.04.3-server-amd64 (στη θέση του 192.168.178.2 θα βάλετε, φυσικά, τη διεύθυνση IP του RasPi σας).

Έλεγχος για την πρόσβαση στο περιεχόμενο των προσαρτημένων ISO images μέσω HTTP, και χάρη στον lighttpd web server που έχει εγκαταστήσει το Pi-hole.

Έλεγχος για την πρόσβαση στο περιεχόμενο των προσαρτημένων ISO images μέσω HTTP, και χάρη στον lighttpd web server που έχει εγκαταστήσει το Pi-hole.

Ωραία. Είδαμε έναν τρόπο για παροχή πρόσβασης στα αρχεία εγκατάστασης των διανομών, μέσω HTTP. Στη συνέχεια φροντίζουμε ώστε οι PXE clients να έχουν δυνατότητα για επιλογή διανομής και βεβαίως για δικτυακή εγκατάστασή της.

Περίπτωση openSUSE

Πηγαίνουμε κάτω από το /mnt/external/tftpboot και φτιάχνουμε μια δομή καταλόγων για την αποθήκευση του πυρήνα και του initial ramdisk image κάθε διανομής που σχεδιάζουμε να προσφέρουμε μέσω PXE. Για το openSUSE Leap 42.3, εμείς δώσαμε:

pi@nordostbahnhof:/mnt/external/tftpboot $ mkdir -p \
> boot/osuse-leap-42.3-x86_64

Μέσα στον boot/osuse-leap-42.3-x86_64 αντιγράφουμε τα αρχεία linux και initrd, από τον κατάλογο /var/www/html/distributions/osuse-leap-42.3-x86_64/boot/x86_64/loader. Με έναν text editor ανοίγουμε το αρχείο pxelinux.cfg/default και του προσθέτουμε τις ακόλουθες γραμμές (αλλάξτε IP και paths, ώστε να ανταποκρίνονται στο setup σας):

LABEL openSUSE-Leap-42.3
  MENU LABEL openSUSE Leap 42.3
  KERNEL boot/osuse-leap-42.3-x86_64/linux
  APPEND initrd=boot/osuse-leap-42.3-x86_64/initrd install=...

(Ολόκληρη η τελευταία γραμμή, είναι: APPEND initrd=boot/osuse-leap-42.3-x86_64/initrd install=http://192.168.178.2/distributions/osuse-leap-42.3-x86_64.) Αποθηκεύουμε τις αλλαγές, εγκαταλείπουμε τον editor και είμαστε έτοιμοι να δοκιμάσουμε την πρώτη μας δικτυακή εγκατάσταση μέσω PXE boot. Δεν είναι απαραίτητο να επανεκκινήσουμε τον dnsmasq, τον lighttpd ή κάποια άλλη υπηρεσία στο RasPi. Απλά, χρειαζόμαστε έναν φυσικό ή εικονικό υπολογιστή που ξεκινά ψάχνοντας για εκτελέσιμο κώδικα πρώτα μέσω της PXE capable κάρτας δικτύου που διαθέτει. Αν όλα έχουν πάει καλά, στην οθόνη του client θα δούμε το απλό μενού που ορίζεται από το pxelinux.cfg/default και προς το παρόν περιλαμβάνει δύο entries: Memtest86+ 5.01 και openSUSE Leap 42.3. Επιλέγοντας το δεύτερο, στο κάτω μέρος της οθόνης θα παρατηρήσουμε ότι πρώτα φορτώνει ο πυρήνας, μετά το initial ramdisk image. Ίσως αυτό το πρώτο στάδιο της εγκατάστασης σας φανεί ότι διαρκεί περισσότερο από το αναμενόμενο. Μην ανησυχείτε, αυτό είναι εντελώς φυσιολογικό. Μετά από λίγο θα ξεκινήσει ο installer του openSUSE και θα μπορέσετε να φέρετε εις πέρας την εγκατάσταση του λειτουργικού. Θα σας προτείναμε να το κάνετε, ώστε να είστε 100% βέβαιοι ότι όλα είναι όπως πρέπει.

Περίπτωση Ubuntu

Κατά τα αναμενόμενα, εργαζόμαστε παρόμοια με την περίπτωση του openSUSE. Κάτω από το /mnt/external/tftpboot/boot φτιάχνουμε τον κατάλογο ubuntu-16.04.3-server-amd64. Μέσα στον νέο αυτό κατάλογο αντιγράφουμε τα αρχεία linux και initrd.gz, από τη θέση /var/www/html/distributions/ubuntu-16.04.3-server-amd64/install/netboot/ubuntu-installer/amd64.

Μετά προσθέτουμε τις ακόλουθες γραμμές στο αρχείο pxelinux.cfg/default:

LABEL Ubuntu-16.04.3-Server-LTS
  MENU LABEL Ubuntu 16.04.3 Server LTS
  KERNEL boot/ubuntu-16.04.3-server-amd64/linux
  APPEND initrd=boot/ubuntu-16.04.3-server-amd64/initrd.gz install=...

(Ολόκληρη η τελευταία γραμμή, είναι: APPEND initrd=boot/ubuntu-16.04.3-server-amd64/initrd.gz install=http://192.168.178.2/distributions/ubuntu-16.04.3-server-amd64.) Ξεκινήστε έναν φυσικό ή εικονικό PXE client και στο μενού με τα συστήματα προς εγκατάσταση θα δείτε τρεις γραμμές. Μετακινηθείτε πάνω από την Ubuntu 16.04.3 Server LTS και πιέστε το [Enter]. Αμέσως θα ξεκινήσει το φόρτωμα του πυρήνα και μετά του initial ramdisk image. Αν έχετε ήδη δοκιμάσει την εγκατάσταση του openSUSE Leap 42.3 μέσω PXE, όπως δείξαμε πριν λίγο, τώρα θα διαπιστώσετε ότι ο installer του Ubuntu θα ξεκινήσει αισθητά πιο γρήγορα. Δοκιμάστε να προχωρήσετε με την εγκατάσταση. Αν όλα έχουν πάει καλά, θα ολοκληρωθεί ομαλά και χωρίς προβλήματα.

Η συνέχεια

Από τη στιγμή που έχουμε κατανοήσει τη λογική του PXE booting μέσω TFTP, το μόνο που πρέπει να προσέχουμε είναι τη δομή καταλόγων εντός του tftpboot. Είναι σημαντικό να έχουμε μια καθαρή εικόνα για τις θέσεις των καταλόγων που φιλοξενούν kernel και initial ramdisk images, των διανομών που θέλουμε να προσφέρει ο PXE server.

Η δομή καταλόγων και τα αρχεία κάτω από το tftpboot, στο πλαίσιο της παρουσίασής μας. Προς το παρόν ο PXE server μας προσφέρει δυνατότητα εγκατάστασης δύο διανομών στους clients, όμως εύκολα μπορούμε να εμπλουτίσουμε το μενού του.

Η δομή καταλόγων και τα αρχεία κάτω από το tftpboot, στο πλαίσιο της παρουσίασής μας. Προς το παρόν ο PXE server μας προσφέρει δυνατότητα εγκατάστασης δύο διανομών στους clients, όμως εύκολα μπορούμε να εμπλουτίσουμε το μενού του.

Προσοχή χρειάζεται επίσης η σύνταξη νέων επιλογών για το μενού που παρουσιάζει ο server στους PXE clients. Αναφερόμαστε στο αρχείο pxelinux.cfg/default: αν υπάρχει κάποιο λάθος πληκτρολόγησης για κάποια επιλογή, το φόρτωμα πυρήνα ή/και initial ramdisk image απλά θα αποτυγχάνει χωρίς κατ’ ανάγκη να παίρνουμε κάποιο σχετικό μήνυμα στην οθόνη.

Τέλος, νομίζουμε ότι έχει ήδη γίνει φανερό ότι χρειάζεται μια κάποια προσοχή για την επιλογή των αρχείων πυρήνα και ramdisk image, για κάθε διανομή που θέλουμε να προσφέρει ο PXE server. Ως άσκηση, προτείνουμε να φροντίσετε ώστε ο δικό σας PXE server να παρέχει δυνατότητα εγκατάστασης των πλέον πρόσφατων εκδοχών των Debian και Fedora.

Καλή επιτυχία σας ευχόμαστε — και καλή σας διασκέδαση!

4 Responses to “Υπηρεσίες PXE server, από το Raspberry Pi”

  1. hlias | 24/11/2017 at 19:25

    Καλησπερα σας
    Επειδη παρατηρω οτι χρησιμοποιειτε πολυ το raspberry pi για διαφορες υπηρεσιες(server) ισως καποιος να μπορεσει να μe βοηθησει.Εχω συνδεσει στο lan μου ενα raspberry pi (αυτο με τα 5 led) εχω φορτωσει σε μια Micro SD το Raspbian στην εκδοχή LITE με το Etcher ΑΛΛΑ δεν βλεπω το raspberry στο
    lan(ουτε στο router το βλεπω,ουτε στην εξοδο της εντολη nmap με διαφορες παραμετρους) εννοειται εχω κοιταξει το καλωδιο ethernet.
    ΕΥΧΑΡΙΣΤΩ ΚΑΙ ΚΑΛΗ ΣΥΝΕΧΕΙΑ

  2. Nio9345 | 16/05/2018 at 14:13

    Ωραίο άρθρο και ένα θέμα που θα ήθελα να δοκιμάσω, αν κατάφερνα να το κάνω να δουλέψει. Επειδή δεν θέλω να φορτώνω τα αρχεία για τα λειτουργικά από την SD Card προσπαθώ να τα φορτώσω ένα 64GB Usb stick, αλλά δεν μπορώ να καταλάβω τι κάνω λάθος. Προσπαθώ να κάνω mount το USB κάτω από το /mnt/external αφού το ετοίμασα με το fdisk. Αλλά όταν κάνω εκτέλεση την εντολή “sudo chown -R pi:pi /mnt/external/tftpboot” μου λέει ότι δεν έχω δικαίωμα να το κάνω.

    • Nio9345 | 16/05/2018 at 19:04

      Οκ, κατάφερα να λύσω το προϊγούμενο πρόβλημα, τώρα έχω άλλο. Ναι μεν ο Intel PXE loader βρίσκει τον DHCP Server, μου πετάει μήνυμα ότι δεν βρίσκει το boot configuration file. Έχω κάνει την εγκατάσταση 2-3 φορές τώρα και δεν ξέρω τι άλλο να κάνω.

    • Nio9345 | 17/05/2018 at 15:33

      Έλυσα και το τελευταίο πρόβλημα.Πρως το τέλος που λέτε να δημιουργήσουμε το αρχείο default δεν εξηγούσατε ότι έπρεπε να είναι η διαδρομή του /mnt/external/tftpboot/pxelinux.cfg/default και το δημιουργούσα σαν /pxelinux.cfg/default. Το κατάλαβα όταν είδα στο τέλος του άρθρου για το tree command, που χρειάζεται έχτρα εγκατάσταση.

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

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