Τυχαία επιλογή OpenVPN στο systemd: γιατί αποτυγχάνει το ExecStart
Το systemd δεν είναι κέλυφος, οπότε ένα ανακατεμένο αντίγραφο μέσα στο ExecStart πεθαίνει. Μεταφέρετε την επιλογή στο ExecStartPre ή αφήστε το OpenVPN να διαλέξει διακομιστή μόνο του.
Σαράντα αρχεία .ovpn για μία χώρα φτάνουν από έναν πάροχο, και το σχέδιο φαίνεται προφανές: αντίγραψε ένα τυχαίο στη θέση του και μετά ξεκίνα τη σήραγγα. Γραμμένο ως αγωγός μέσα στο ExecStart, αυτό το σχέδιο πεθαίνει στην εκκίνηση με κωδικό κατάστασης που δεν εξηγεί τίποτα. Το αρχείο μονάδας δεν είναι σενάριο, και η διόρθωση είναι είτε να φέρεις ένα κέλυφος ρητά είτε να σταματήσεις τελείως να διαλέγεις αρχεία.
Το σύμπτωμα: μια μονάδα που ξεκινά και πεθαίνει αμέσως
Η κατάσταση δείχνει ότι η υπηρεσία απέτυχε σε κλάσμα του δευτερολέπτου, και η γραμμή του ημερολογίου ονομάζει μια εντολή που κανένα κέλυφος δεν θα είχε λάβει ποτέ. Τίποτα για τη σήραγγα δεν εμφανίζεται, γιατί η σήραγγα δεν ξεκίνησε ποτέ.
Το διάβασμα της ακριβούς γραμμής εντολής από το ημερολόγιο είναι ο γρηγορότερος τρόπος να το επιβεβαιώσεις. Το systemd επαναλαμβάνει αυτό που εκτέλεσε, και η συμβολοσειρά θα δείξει τους χαρακτήρες του αγωγού ως κυριολεκτικά ορίσματα αντί ως τελεστές.
Γιατί το ExecStart δεν μπορεί να εκτελέσει αγωγό
Το systemd χωρίζει το ίδιο τη γραμμή εντολής, εφαρμόζει τη δική του παράθεση και αντικατάσταση μεταβλητών και μετά εκτελεί το αποτέλεσμα απευθείας. Οι αγωγοί, η ανακατεύθυνση, η επέκταση μοτίβων από κέλυφος και η αντικατάσταση εντολών απλώς δεν ανήκουν σε αυτή τη γραμματική. Είναι επιλογή σχεδιασμού και όχι παράλειψη: μια μονάδα δηλώνει τι θα εκτελεστεί, και η λογική του κελύφους ανήκει σε ένα σενάριο που καλεί η μονάδα. Και οι δύο διορθώσεις προκύπτουν από αυτό, και καμία δεν απαιτεί να δοθούν στη μονάδα περισσότερα προνόμια.
Εξηγεί επίσης τον παραπλανητικό κωδικό εξόδου. Το πρώτο όρισμα αντιμετωπίζεται ως το δυαδικό, οπότε μια κακοσχηματισμένη γραμμή αποτυγχάνει πριν τρέξει οτιδήποτε από τη λογική σου.
Κάνε την επιλογή στο ExecStartPre
Η άμεση διόρθωση είναι ένα βήμα προετοιμασίας που καλεί ρητά ένα κέλυφος, κρατώντας την επιλογή και την εκκίνηση στην ίδια μονάδα, ώστε μια αποτυχία στο ένα να μην αφήσει το άλλο να τρέχει μόνο του.
[Service]
Type=notify
ExecStartPre=/bin/bash -c "ls /etc/openvpn/profiles/au* | shuf -n 1 | xargs -r -I{} cp -f {} /etc/openvpn/%i.conf"
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/%i.conf
Τρεις λεπτομέρειες κρίνουν αν αυτό επιβιώνει από τη συνάντηση με πραγματικό μηχάνημα. Η ονομασία είναι η πρώτη παγίδα: το systemd αντικαθιστά το %i κατά την ανάλυση της μονάδας, πολύ πριν τρέξει το bash, οπότε ο προσδιοριστής πρέπει να βρίσκεται έξω από απλά εισαγωγικά. Το xargs -r εμποδίζει το cp να τρέξει χωρίς όρισμα όταν το μοτίβο δεν ταιριάζει με τίποτα. Και ένα αποτυχημένο βήμα προετοιμασίας σταματά τη μονάδα, που είναι το σωστό αποτέλεσμα: το ξεκίνημα με τη χθεσινή διαμόρφωση είναι χειρότερο από το να μην ξεκινήσεις. Μια τυχαία επιλογή που παίρνει πάντα το ίδιο αρχείο συνήθως δεν είναι κακή τύχη. Έλεγξε αν το αντιγραμμένο αρχείο αντικαθίσταται από ενημέρωση πακέτου, ή αν το μοτίβο ταιριάζει με μία μόνο παρωχημένη καταχώριση.
Ή άφησε το OpenVPN να διαλέξει το τελικό σημείο
OpenVPN μπορεί ήδη να κρατά πολλά τελικά σημεία σε ένα προφίλ και να διαλέγει τυχαία ανάμεσά τους, κάτι που αφαιρεί τελείως το κέλυφος, το αντίγραφο και την πρόσβαση εγγραφής από τη διαδρομή εκκίνησης.
client
remote-random
<connection>
remote au1.example.net 1194 udp
</connection>
<connection>
remote au2.example.net 1194 udp
</connection>
Αυτή η μορφή κρατά την επιλογή διακομιστή μέσα στο αρχείο που έφτιαξε ο πάροχος, ώστε μια εναλλαγή που μετονομάζει αρχεία να μη σπάει τη μονάδα. Κάνει επίσης τη λίστα υποψηφίων ελέγξιμη, κάτι που ένα μοτίβο πάνω σε κατάλογο δεν είναι ποτέ. Η ανακάτεψη εξακολουθεί να κερδίζει τη θέση της όταν τα προφίλ διαφέρουν σε περισσότερα από ένα τελικό σημείο: διαφορετικά πιστοποιητικά, διαφορετικές οδηγίες δρομολόγησης, διαφορετική πολιτική κρυπτογράφησης. Σε αυτή την περίπτωση η επιλογή γίνεται ανάμεσα σε ολόκληρες διαμορφώσεις, και ένα βήμα με κέλυφος είναι ο έντιμος τρόπος να το εκφράσεις.
Διάβασε πίσω τη μονάδα και το αρχείο που χρησιμοποίησε
Επιβεβαίωσε ποια μονάδα τρέχει πραγματικά πριν αποσφαλματώσεις το περιεχόμενό της. Η συσκευασμένη μετα-υπηρεσία και το πρότυπο είναι υποδομή· οι μονάδες που αντιστοιχούν στα αρχεία σου είναι τα στιγμιότυπα που πήραν το όνομά τους.
systemctl list-units 'openvpn*'
systemctl cat [email protected]
journalctl -u openvpn@au -n 30 --no-pager
Ένα στιγμιότυπο που κανείς δεν θυμάται να ενεργοποίησε συνήθως ανάγεται σε ένα περιπλανώμενο αρχείο διαμόρφωσης στον κατάλογο του πακέτου. Απενεργοποίησε αυτό το επώνυμο στιγμιότυπο αντί για το πρότυπο, αλλιώς η επόμενη αναβάθμιση πακέτου το επαναφέρει. Μετά την αλλαγή, ξεκίνα τη μονάδα και διάβασε τη γραμμή εντολής που αναφέρει το ημερολόγιο, και μετά επιβεβαίωσε τη διαδρομή διαμόρφωσης που άνοιξε πραγματικά. Αυτός ο ένας έλεγχος ξεχωρίζει μια λειτουργική τυχαία επιλογή από μια υπηρεσία που επαναχρησιμοποιεί σιωπηλά ένα αρχείο του προηγούμενου μήνα.