apt purge je odstranil VPN, a storitev se vseeno zažene ob zagonu
apt purge briše datoteke paketa, ne enote, ki jo je namestil skript ponudnika. Izbrišite enoto in njeno povezavo wants, nato izberite enega lastnika zagona.
apt purge pravi, da paketa ni več, pa se ob vsakem zagonu vseeno dvigne tunel. Journal še naprej raste, poti se vračajo, in stroj se obnaša, kot da ni bilo nič odstranjeno. Nameščevalnik ponudnika lahko zapiše datoteke, ki jih upravitelj paketov ni nikoli zabeležil, zato so odstranitev paketa in odstranitev izdelka dve različni opravili. Spodnji runbook loči oba zapisa in odstranitev namerno dokonča.
Dva nameščevalnika, dva različna zapisa
Paketi Debian vodijo seznam datotek, in purge izbriše natanko to, kar ta seznam navaja, plus konfiguracijo paketa. Namestitveni program lupine ali paket .run takega seznama ne vodi; piše, kamor hoče, običajno v /opt, /usr/local in /etc/systemd/system. Nobena od teh poti se ne pojavi na seznamu datotek katerega koli paketa, zato dpkg zanje ne ve in jih ne poroča. Na koncu imate dva lastnika namestitve na enem datotečnem sistemu, in le eden od njiju vodi knjige.
Pred brisanjem vprašajte dpkg za točno pot. Pot, ki jo zavrne, je vaša za odstranitev, in isti odgovor pove, ali bi jo poznejša posodobitev vrnila.
dpkg -S /etc/systemd/system/acmevpn.service
systemctl list-unit-files | grep -i acmevpn
Enota in njena povezava wants sta ločeni datoteki
Omogočanje je dejanje, ločeno od nameščanja. Enota v razdelku [Install] razglasi ciljna razmerja, in systemctl enable te razglasitve spremeni v simbolne povezave v imeniku .wants/ vsakega cilja. Zdaj obstajata dve poti: datoteka enote in povezava, ki jo potegne v cilj zagona. Izbrišite samo datoteko in povezava kaže v prazno, kar ob zagonu povzroči pritožbo; izbrišite samo povezavo in enota ostane zagonljiva po imenu. Oboje mora proč.
Odstranite ju po vrsti in nato znova naložite, da systemd preneha držati stare definicije v pomnilniku.
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
Berite FragmentPath namesto da bi predpostavili lokacijo, saj je ponudnik morda pisal v /usr/lib/systemd/system ali /lib/systemd/system in ne v /etc. Brisanje pričakovane kopije pusti delujočo kopijo v teku, in popravek se zdi uspešen do naslednjega nalaganja. Po končanem nalaganju znova izpišite datoteke enot in potrdite, da se ime ne pojavlja več.
Poiščite binarno datoteko, ki drži to ureditev pri življenju
Omogočena enota še naprej zaganja demonski proces, kar koli že misli baza paketov. Ta proces lahko vrne tunel, znova doda poti ali obnovi pravilo kill-switch, in vedenje se zdi nadnaravno, dokler ne pregledate ureditve. Sledite poti ExecStart in preverite, ali je binarna datoteka še tam, saj je izvršljiva datoteka, puščena pod /opt, vse, kar ureditev potrebuje. Brisanje enote ustavi načrtovani zagon; programa ne izbriše.
Do imenikov stanja ravnajte enako skrbno. Žetoni računov, ustvarjeni profili in predpomnjeni seznami strežnikov živijo pod /var/lib ali v domačem imeniku, in to so poverilnice, ne predpomnilnik za smeti. Odstranite jih po ustavitvi storitve, namerno, in zabeležite, kaj ste vzeli.
sudo ls -l /opt/acmevpn /usr/local/bin/acmevpn
sudo find /var/lib -maxdepth 2 -iname "*acme*"
systemctl is-enabled acmevpn.service
Izberite enega lastnika zagona in ga preizkusite
Trije kandidati se lahko potegujejo za zagon, in namestitev vseh treh ustvari tekmo namesto dvojnega varovala. Datoteka za samodejni zagon na namizju se izvede šele po prijavi, enota systemd se izvede prej, a potrebuje odjemalca, ki deluje brez zaslona, in vnos cron @reboot se sproži po urniku, ki je lahko za omrežnega odjemalca napačen. CLI ponudnika lahko dodatno zahteva argument strežnika, ker ob zagonu ni prejšnje seje za nadaljevanje. Izberite kandidata, ki ustreza načinu preverjanja pristnosti odjemalca, in ostale zavrzite.
Preizkusite ga s ponovnim zagonom stroja in s pogledom na tri neodvisna dejstva: stanje enote, seznam procesov in novo povezavo z nečim, kar lahko preverite. Odjemalec, ki potrebuje shrambo ključev ali interaktivno prijavo, ob zagonu spodleti tudi s pravilno datoteko enote, in journal to pove, če ga berete namesto samo stanja storitve.
Odjemalcu bodisi dajte poverilnico, ki deluje brez vprašanja, bodisi ga zaženite ob prijavi. Oboje je zagovorljivo, in njuno združevanje je način, kako en tunel dobi dva lastnika, ki se zanj prepirata.
Zapišite, kaj naj naslednji purge pričakuje
Po vsaki ročni odstranitvi zabeležite dve dejstvi: kateri nameščevalnik je ustvaril ureditev in kateri lastnik jo zdaj zaganja. Ta zapis spremeni naslednji purge iz presenečenja v postavko kontrolnega seznama, in preživi osebo, ki je delo opravila.
Hranite ga ob konfiguraciji storitve in ne v osebnem imeniku, ter ga datirajte, ker lahko posodobitev ponudnika obnovi enoto, ki ste jo izbrisali. Primerjava systemctl list-unit-files s tem zapisom vsakih nekaj mesecev ujame obnovitev, dokler je popravek še poceni.