Το apt purge λέει ότι το πακέτο έφυγε, και όμως ένα tunnel εμφανίζεται σε κάθε εκκίνηση. Το journal συνεχίζει να μεγαλώνει, οι διαδρομές επιστρέφουν, και το μηχάνημα συμπεριφέρεται σαν να μην αφαιρέθηκε τίποτα. Ο εγκαταστάτης του προμηθευτή μπορεί να γράψει αρχεία που ο διαχειριστής πακέτων δεν κατέγραψε ποτέ, οπότε η απεγκατάσταση πακέτου και η απεγκατάσταση προϊόντος είναι διαφορετικές εργασίες. Το runbook παρακάτω χωρίζει τα δύο αρχεία και ολοκληρώνει την αφαίρεση σκόπιμα.

Δύο εγκαταστάτες, δύο διαφορετικά αρχεία

Τα πακέτα Debian κρατούν λίστα αρχείων, και το purge διαγράφει ακριβώς ό,τι ονομάζει αυτή η λίστα συν τη διαμόρφωση του πακέτου. Ένας shell εγκαταστάτης ή ένα πακέτο .run δεν κρατά τέτοια λίστα· γράφει όπου θέλει, συνήθως στα /opt, /usr/local και /etc/systemd/system. Κανένα από αυτά τα μονοπάτια δεν εμφανίζεται στη λίστα αρχείων οποιουδήποτε πακέτου, οπότε το dpkg ούτε τα γνωρίζει ούτε τα αναφέρει. Καταλήγετε με δύο ιδιοκτήτες εγκατάστασης σε ένα σύστημα αρχείων και μόνο ένας από αυτούς κρατά βιβλία.

Ρωτήστε το dpkg για τη συγκεκριμένη διαδρομή πριν τη διαγράψετε. Μια διαδρομή που αποκηρύσσει είναι δική σας για αφαίρεση, και η ίδια απάντηση σας λέει αν μια μεταγενέστερη αναβάθμιση θα την επέστρεφε.

dpkg -S /etc/systemd/system/acmevpn.service
systemctl list-unit-files | grep -i acmevpn

Μια unit και ο σύνδεσμός της wants είναι ξεχωριστά αρχεία

Η ενεργοποίηση είναι ξεχωριστή πράξη από την εγκατάσταση. Η unit δηλώνει σχέσεις στόχων στην ενότητα [Install], και το systemctl enable μετατρέπει αυτές τις δηλώσεις σε συμβολικούς δεσμούς μέσα στον κατάλογο .wants/ κάθε στόχου. Τώρα υπάρχουν δύο μονοπάτια: το αρχείο unit, και ο δεσμός που το τραβά σε έναν στόχο εκκίνησης. Διαγράψτε μόνο το αρχείο και ο δεσμός δείχνει στο κενό, κάτι που παράγει παράπονο στην εκκίνηση· διαγράψτε μόνο τον δεσμό και η unit παραμένει εκκινήσιμη με το όνομα. Και τα δύο πρέπει να φύγουν.

Αφαιρέστε τα με σειρά και επαναφορτώστε μετά, ώστε το systemd να σταματήσει να κρατά τους παλιούς ορισμούς στη μνήμη.

systemctl disable --now acmevpn.service
systemctl show -p FragmentPath -p ExecStart acmevpn.service
sudo rm /etc/systemd/system/acmevpn.service
sudo rm /etc/systemd/system/multi-user.target.wants/acmevpn.service
systemctl daemon-reload

Διαβάστε το FragmentPath αντί να υποθέσετε την τοποθεσία, αφού ο προμηθευτής μπορεί να έγραψε στα /usr/lib/systemd/system ή /lib/systemd/system και όχι στο /etc. Αν διαγράψετε το αντίγραφο που περιμένατε, το ενεργό συνεχίζει να τρέχει, και η διόρθωση φαίνεται επιτυχής μέχρι την επόμενη επαναφόρτωση. Καταγράψτε ξανά τα αρχεία unit όταν τελειώσει η επαναφόρτωση, και επιβεβαιώστε ότι το όνομα δεν εμφανίζεται πια.

Βρείτε το δυαδικό που κρατά τη διάταξη ζωντανή

Μια ενεργοποιημένη unit συνεχίζει να ξεκινά τον δαίμονα ό,τι κι αν πιστεύει η βάση δεδομένων πακέτων. Αυτή η διεργασία μπορεί να φέρει πίσω το tunnel, να προσθέσει ξανά διαδρομές ή να επαναφέρει έναν κανόνα kill-switch, και η συμπεριφορά μοιάζει υπερφυσική μέχρι να εξετάσετε τη διάταξη. Ακολουθήστε τη διαδρομή ExecStart και ελέγξτε αν το δυαδικό είναι ακόμη εκεί, γιατί ένα εκτελέσιμο που έμεινε στο /opt είναι το μόνο που χρειάζεται η διάταξη. Η διαγραφή της unit σταματά την προγραμματισμένη εκκίνηση· δεν διαγράφει το πρόγραμμα.

Χειριστείτε τους καταλόγους κατάστασης με την ίδια φροντίδα. Τα token λογαριασμού, τα παραγόμενα προφίλ και οι αποθηκευμένες λίστες διακομιστών ζουν στο /var/lib ή σε έναν κατάλογο home, και αυτά είναι διαπιστευτήρια, όχι cache για πέταμα. Αφαιρέστε τα αφού σταματήσει η υπηρεσία, σκόπιμα, και σημειώστε τι πήρατε.

sudo ls -l /opt/acmevpn /usr/local/bin/acmevpn
sudo find /var/lib -maxdepth 2 -iname "*acme*"
systemctl is-enabled acmevpn.service

Επιλέξτε έναν ιδιοκτήτη εκκίνησης και δοκιμάστε τον

Τρεις υποψήφιοι μπορούν να διεκδικήσουν την εκκίνηση, και η εγκατάσταση και των τριών παράγει αγώνα και όχι διπλή ασφάλεια. Ένα αρχείο αυτόματης εκκίνησης επιφάνειας εργασίας τρέχει μόνο αφού συνδεθεί κάποιος, μια unit systemd τρέχει νωρίτερα αλλά χρειάζεται πελάτη που δουλεύει χωρίς οθόνη, και μια καταχώριση cron @reboot ενεργοποιείται σε χρονοδιάγραμμα που μπορεί να είναι λάθος για δικτυακό πελάτη. Το CLI του προμηθευτή μπορεί επιπλέον να απαιτεί όρισμα διακομιστή, γιατί στην εκκίνηση δεν υπάρχει προηγούμενη συνεδρία για συνέχιση. Επιλέξτε τον υποψήφιο που ταιριάζει στον τρόπο με τον οποίο ο πελάτης πιστοποιείται, και αφήστε τους άλλους.

Δοκιμάστε το επανεκκινώντας το μηχάνημα και κοιτάζοντας τρία ανεξάρτητα γεγονότα: την κατάσταση της unit, τη λίστα διεργασιών, και μια νέα σύνδεση σε κάτι που μπορείτε να επαληθεύσετε. Ένας πελάτης που χρειάζεται κλειδοθήκη ή διαδραστική σύνδεση αποτυγχάνει στην εκκίνηση ακόμη και με σωστό αρχείο unit, και το journal το λέει αν το διαβάσετε αντί μόνο την κατάσταση υπηρεσίας.

Είτε δώστε στον πελάτη διαπιστευτήριο που δουλεύει χωρίς ερώτηση, είτε ξεκινήστε τον στη σύνδεση. Και τα δύο είναι υπερασπίσιμα, και ο συνδυασμός τους είναι πώς ένα tunnel αποκτά δύο ιδιοκτήτες που μαλώνουν γι αυτό.

Γράψτε τι πρέπει να περιμένει το επόμενο purge

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

Κρατήστε την δίπλα στη διαμόρφωση της υπηρεσίας και όχι σε προσωπικό κατάλογο, και βάλτε ημερομηνία, γιατί μια ενημέρωση προμηθευτή μπορεί να επαναφέρει μια unit που διαγράψατε. Η σύγκριση του systemctl list-unit-files με αυτή τη σημείωση κάθε λίγους μήνες πιάνει την επαναφορά όσο η διόρθωση είναι ακόμη φθηνή.

Σχετικά άρθρα