Saturday, October 23, 2010

Σειριακό Τερματικό και Σειριακή Κονσόλα στο FreeBSD


Ίσως με πείτε και αναχρονιστικό, αλλά είχα πολλά χρόνια να ασχοληθώ με σειριακές επικοινωνίες! Θα μου πείτε ποιος χρειάζεται σήμερα σειριακά τερματικά; Ακόμα και αν έχουμε headless μηχανήματα υπάρχει πάντα η δυνατότητα του ssh. Βέβαια μια κανονική σειριακή κονσόλα - και όχι απλό τερματικό - μας δίνει τη δυνατότητα να έχουμε όλα τα μυνήματα ήδη από την εκκίνηση του μηχανήματος καθώς και single user mode. Έτσι μπορούμε πραγματικά να αποσυνδέσουμε το πληκτρολόγιο και οθόνη από το server μας γνωρίζοντας ότι μπορούμε να κάνουμε τα πάντα από την σειριακή κονσόλα.

Ωστόσο το παραπάνω μίνι project είχε στη δική μας περίπτωση ένα άλλο πιο προφανή σκοπό: καθώς τα σειριακά ή "κουτά" τερματικά αναφέρονται ήδη στην ύλη του μαθήματος "Δίκτυα Υπολογιστών" των ΕΠΑΛ, είναι μια καλή ευκαιρία να δουν και οι μαθητές πως λειτουργεί στην πράξη κάτι τέτοιο και τι δυνατότητες και περιορισμούς έχει. Όπως βλέπετε και στη φωτογραφία, εγκαταστήσαμε το τερματικό μας σε μια γωνιά του Εργαστηρίου (το οποίο είναι ήδη βασισμένο σε FreeBSD) και αναρτήσαμε και μια αρκετά καλή περιγραφή για το τι είναι και πως λειτουργεί. Και φυσικά κάθε μαθητής μπορεί να το δοκιμάσει μόνος του!


Σειριακό Τερματικό


Είναι αρκετά απλό στην πραγματικότητα. Χρειάζεται το κεντρικό σας μηχάνημα να διαθέτει σειριακή θύρα. Σε πολλά καινούρια μηχανήματα η θύρα αυτή απουσιάζει. Ρίξτε ωστόσο μια ματιά στην μητρική: είναι αρκετά πιθανό να διαθέτει κάποιο header στο οποίο να μπορεί να συνδεθεί η αντίστοιχη καλωδιοταινία που καταλήγει στο γνωστό μας βύσμα DB9 (που στην πραγματικότητα λέγεται DE9). Για τερματικό μπορείτε να χρησιμοποιήσετε πρακτικά ένα οσοδήποτε παλιό μηχάνημα: στην πιο απλή περίπτωση, μπορείτε σε αυτό να εκτελέσετε το παλιό (κακό) DOS - ακόμα και από δισκέτα - και ένα πρόγραμμα σειριακής επικοινωνίας / εξομοίωσης τερματικου. Στη δική μας περίπτωση κάναμε ακριβώς αυτό: χρησιμοποιήσαμε το telix, πρόγραμμα για DOS. Το μηχάνημα που χρησιμοποιήσαμε για τερματικό είναι ένα Pentium 200Mhz (αρκετά ισχυρό για αυτή τη χρήση!) αλλά εύκολα μπορείτε να βάλετε ακόμα και... 8088. Φτιάξαμε ένα συνηθισμένο καλώδιο τύπου null modem και ακολουθήσαμε τις απλές οδηγίες στο FreeBSD Handbook:

http://www.freebsd.org/doc/el/books/handbook/term.html

Για μια απλή σειριακή κονσόλα, το μόνο που χρειάζεται είναι η παρακάτω γραμμή στο /etc/ttys:

ttyu0    "/usr/libexec/getty std.115200"    vt100    on  secure


Αν είστε λίγο παρανοικός ίσως θέλετε να μετατρέψετε το "secure" σε "insecure" ώστε να μην επιτρέπεται το root login μέσω της σειριακής ;)

Προσέξτε ότι σε FreeBSD 8.x η πρώτη σειριακή θύρα (η γνωστή μας COM1) θα είναι ttyu0 ενώ σε 7.χ θα είναι ttyd0. To 115200 δίνει την ταχύτητα της σύνδεσης. Αν χρησιμοποιείτε ένα πραγματικά παλιό μηχάνημα σαν τερματικό το πιθανότερο είναι να μην μπορέσετε να ανεβείτε τόσο ψηλά και να πρέπει να περιοριστείτε στα 9600 bps. Αμέσως μετά, το μόνο που χρειάζεται να κάνετε είναι:

# kill -HUP 1

ώστε η init να ξαναδιαβάσει το /etc/ttys και να ξεκινήσει η getty να εκτελείται στη σειριακή θύρα. Από τη μεριά του τερματικού, έχοντας συνδέσει το σειριακό καλώδιο μπορούμε να ρυθμίσουμε την επικοινωνία μας:

Ταχύτητα: 115200 (ή όσο βάλαμε στη γραμμή παραπάνω)
Data bits: 8
Parity: None
Stop bits: 1

το γνωστό δηλ. στους παλιούς 115200,8,Ν,1 ;) Η ρύθμιση γίνεται στο πρόγραμμα σειριακής επικοινωνίας που έχουμε εγκαταστήσει. Αν για κάποιο λόγο τρέχετε Windows (περαστικά σας) μπορείτε να χρησιμοποιήσετε το hyperterminal.

Αν όλα είναι καλά, θα δούμε αμέσως την προτροπή login στο τερματικό μας και μπορούμε να συνδεθούμε και να το χρησιμοποιήσουμε κανονικά.

Σειριακή Κονσόλα



Η παραπάνω διαδικασία είναι πράγματι απλή, αλλά δεν μας επιτρέπει να δούμε τα μυνήματα εκκίνησης ή να ξεκινήσουμε το μηχάνημα σε single user mode, καθώς ενεργοποιείται μόνο μετά που το σύστημα φτάσει σε πλήρη λειτουργία. Για να το επιτύχουμε αυτό, πρέπει να ενεργοποιήσουμε την σειριακή κονσόλα:

http://www.freebsd.org/doc/el/books/handbook/serialconsole-setup.html

Η διαδικασία γίνεται προσθέτοντας τις παρακάτω γραμμές στο αρχείο /boot/loader.conf:

boot_multicons="YES"
boot_serial="YES"
comconsole_speed="115200"
console="comconsole,vidconsole"


Με αυτές τις επιλογές ενεργοποιείται ταυτόχρονα τόσο η σειριακή όσο και η κανονική κονσόλα (multicons), στο επόμενο boot φυσικά. Προσέξτε την επιλογή comconsole_speed που καθορίζει προσαρμοσμένη ταχύτητα 115200. Αν δεν τη βάλετε, η ταχύτητα σας θα μείνει στην προεπιλεγμένη των 9600 bps.

Βέβαια και εμείς που τη βάλαμε δεν έγινε τίποτα: Η σειριακή κονσόλα πεισματικά παρέμεινε στα 9600 bps. Δοκιμάσαμε και με FreeBSD 7.X για να σιγουρευτούμε ότι δεν πρόκειται για κάποιο bug/feature του 8.X, αλλά δεν άλλαξε τίποτα. Τελικά καταλήξαμε στην εναλλακτική λύση που περιγράφεται στο Handbook, δηλ. την επαναμεταγλώττιση και εγκατάσταση των boot blocks:

# cd /usr/src/sys/boot/
# make clean
# make BOOT_COMCONSOLE_SPEED=115200
# make install


Μετά από αυτό, το serial console λειτούργησε υπέροχα στα 115200 bps. Μπορείτε να δείτε το ταυτόχρονο boot (vidconsole,comconsole) στο δοκιμαστικό μηχάνημα μου:


No comments: