Διάγνωση προβλημάτων εκκίνησης με systemd

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

Χρησιμοποιώντας μια σειριακή κονσόλα

Αν θυμόσαστε το παλιό βύσμα που συνδέαμε ποντικά και modem, έχετε κάνει το εμβόλιο; Βελτιώθηκε καθόλου το σήμα; Εκεί μπορούμε να συνδέουμε κάποιο κανονικό τερματικό ή κάτι που να το εξομοιώνει. Εξωτικό σενάριο; Όχι και τόσο αν τρέχει σε μια εικονική μηχανή. Οι παράμετροι του πυρήνα για αυτό είναι

systemd.log_level=debug systemd.log_target=console console=ttyS0,38400 console=tty1

ή το πρόβλημα προκύπτει αργά κατά την διαδικασία εκκίνησης, κάνουμε redirect εκεί το journal

systemd.journald.forward_to_console=1 console=ttyS0,38400 console=tty1

Με αυτό τον τρόπο είμαστε απλά παρατηρητές.

Emergency και rescue targets

Προσθέτοντας στις παραμέτρους του πυρήνα είτε systemd.unit=rescue.target, είτε systemd.unit=emergency.target ο υπολογιστής θα ξεκινήσει με το συγκεκριμένο target. Η διαδικασία εκκίνησης θα σταματήσει και θα πρέπει να δώσουμε τον κωδικό του root. Η διαφορά μεταξύ τους είναι πως το emergency.target θα κάνει προσάρτηση το file system σαν redonly ώστε να μπορούμε να του κάνουμε fsck. To rescue.target θα καθυστερήσει λίγο και θα φορτώσει κάποιες βασικές υπηρεσίες. Τερματίζοντας το κέλυφος το σύστημα θα συνεχίσει την εκτέλεση κανονικά.

systemd.debug-shell

Μια άλλη λύση είναι να αποκτήσεις ένα τερματικό με πρόσβαση σε root πολύ νωρίς κατά την εκκίνηση του συστήματος. Από εκεί μπορούμε να διερευνήσουμε το πρόβλημα και να απενεργοποιήσουμε μια προβληματική υπηρεσία. Το κέλυφος θα το βρούμε στο tty9

Αυτόματα κατά την εκκίνηση έχουμε ένα τερματικό με πρόσβαση root. Αφήνω σαν άσκηση στον αναγνώστη να πει αν αυτό είναι καλή ιδέα να το έχει μόνιμα ενεργό.

Για την ενεργοποίηση αρκεί να προσθέσουμε την παράμετρο systemd.debug-shell στον πυρήνα και κάθε διαχειριστής εκκίνησης έχει κάποιο πλήκτρο, συνήθως το E για μια προσωρινή αλλαγή. Δεν βλάπτει να προσθέσουμε και το systemd.log_level=debug.

Για κάτι ποίο μόνιμο δημιούργησα μια καταχώρηση το systemd-boot δημιουργώντας ένα αντίγραφο του αρχείου και αλλάζοντας τα ορίσματα του πυρήνα. Δεν είναι η καλύτερη λύση προφανώς, απλά για εξάσκηση :grin:

title Pop!_OS Debug Shell
linux /EFI/Pop_OS-173df903-f9b0-414b-a482-f6aad82fafe2/vmlinuz.efi
initrd /EFI/Pop_OS-173df903-f9b0-414b-a482-f6aad82fafe2/initrd.img
options root=UUID=173df903-f9b0-414b-a482-f6aad82fafe2 systemd.log_target=kmsg systemd.log_level=debug systemd.debug-shell

Υπάρχει και σαν το service debug-shell το οποίο μπορούμε να κάνουμε enable/disable, αλλά αυτό απαιτεί ένα λειτουργικό systemctl. Ποια είναι η διαφορά με την προηγούμενη μέθοδο; Δεν θα σταματήσει η διαδικασία εκκίνησης και θα μπούμε και στο γραφικό περιβάλλον κανονικά. Απλά σε μια κονσόλα θα υπάρχει μια σύνδεση σαν χρήστης root.

Είναι να μην σου τύχει

Μερικές φορές ο υπολογιστής δεν ξεκινάει. Συμβαίνουν αυτά. Είτε από αποτυχία του βασικού συστήματος (κάτι σπάνιο) είτε (συχνότερα) γιατί κάποια υπηρεσία δεν έχει ρυθμιστεί σωστά είτε γιατί κάποιο υλικό είναι προβληματικό. Και αντίστοιχα προβλήματα θα τα έχεις σε κάθε λειτουργικό και σε κάθε λογισμικό.

Μιας και δεν μπορείς να τα αποφύγεις αυτά, ας έχεις τουλάχιστον τα εργαλεία να μπορείς να διαγνώσεις το πρόβλημα και αν είναι δυνατόν να το διορθώσεις. Αλλά αυτό δεν αρκεί, θα πρέπει να γνωρίζεις πως υπάρχουν (και σε αυτό ελπίζω να βοήθησα λιγάκι), αλλά και πως να φτιάξεις το πρόβλημα. Στο δεύτερο δεν μπορεί να βοηθήσει αυτό το μικρό αρθράκι. Αλλά έχουμε εδώ δεκάδες οδηγούς που μπορούν να βοηθήσουν, και στα ζόρια με μια δημοσίευση του προβλήματος, όπου όλοι μας θα προσπαθήσουμε να βοηθήσουμε με τις (λίγες) γνώσεις μας. Οπότε ψυχραιμία :grin:

1 «Μου αρέσει»