ดิสโทรของคุณลบแพ็กเกจ เมนูสูญเสียรายการ และทันเนลก็ยังขึ้นมาหลังรีบูตครั้งถัดไป ไคลเอนต์ VPN เชิงพาณิชย์ทิ้งชิ้นส่วนที่ตัวจัดการแพ็กเกจไม่เคยติดตามไว้ ดังนั้นการลบแบบสะอาดจึงไม่เหมือนเครื่องที่สะอาด ชิ้นส่วนสี่อย่างอธิบายการเชื่อมต่อผีแทบทุกกรณี ได้แก่ ยูนิต โปรไฟล์การเชื่อมต่อ ตัวช่วยที่มีสิทธิ์พิเศษ และรีโพซิทอรีของผู้จำหน่าย อ่านทั้งสี่อย่างก่อนลบสิ่งใด แล้วจึงลบแต่ละอย่างผ่านคอมโพเนนต์ที่เป็นเจ้าของ

สิ่งที่ตัวถอนการติดตั้งไม่เคยบันทึก

ตัวจัดการแพ็กเกจลบเฉพาะไฟล์ที่มันบันทึกไว้เองและไม่มีอะไรอื่น มันไม่มีบันทึกของโปรไฟล์การเชื่อมต่อที่ไคลเอนต์สร้างตอนรัน ของ ยูนิตที่เปิดใช้งานหลังการติดตั้ง หรือของตัวช่วยที่ลงทะเบียนตัวเองขณะทำงานด้วยสิทธิ์ที่สูงขึ้น แต่ละอย่างเป็นของระบบย่อยคนละตัว และแต่ละอย่างอยู่รอดหลังจากแพ็กเกจได้หนึ่งหรือหลายรีบูต ช่องว่างนั้นอธิบายว่าทำไมทันเนลจึงยังแข็งแรงได้ในขณะที่ซอฟต์แวร์ที่สร้างมันขึ้นมาหายไปแล้ว

ส่วนที่เหลือมีเจ้าของเสมอ ไม่ว่าจะเป็น systemd, NetworkManager, การกำหนดค่ารีโพซิทอรี หรือรายการเริ่มอัตโนมัติต่อผู้ใช้ การหาเจ้าของก่อนคือสิ่งที่ป้องกันไม่ให้การล้างกลายเป็นเครื่องที่กำหนดค่าไว้ครึ่งเดียว การลบไฟล์โดยตรงมักได้ผลจนกว่าเจ้าของจะสร้างมันใหม่ขึ้นมา ดังนั้นคำสั่งด้านล่างจึงเริ่มด้วยการสอบถาม

เจ้าของสี่ราย เริ่มด้วยการอ่านเท่านั้น

เริ่มด้วยการสอบถามแทนการลบ และจดชื่อที่ตรงตามจริงที่ส่งกลับมา ผู้จำหน่ายมักส่งเพย์โหลดที่มีเวอร์ชันมาข้างแพ็กเกจเมตา จึงอาจมีผลิตภัณฑ์เดียวปรากฏในสองชื่อ ชื่อที่ปรากฏในทั้งสองรายการคือผลิตภัณฑ์เดียวที่มีเจ้าของสองราย และต้องลบทั้งสอง ชุดแรกครอบคลุมแพ็กเกจและยูนิต ซึ่งส่วนที่เหลือส่วนใหญ่จะปรากฏให้เห็น

dpkg -l | grep -i acmevpn
systemctl list-unit-files | grep -i acmevpn
systemctl list-units --type=service --state=running | grep -i acmevpn

ชุดที่สองครอบคลุมสองคอมโพเนนต์ที่อยู่รอดหลังการล้างบ่อยที่สุด คือโปรไฟล์การเชื่อมต่อและรีโพซิทอรีของผู้จำหน่าย อ่านคอลัมน์ UUID ไม่ใช่ชื่อ เพราะชื่อซ้ำเป็นเรื่องปกติและคำสั่งลบต้องการตัวระบุ บรรทัดรีโพซิทอรีคุ้มค่าที่จะอ่านแม้คุณจะไม่ลบวันนี้ เพราะโฮสต์ผู้จำหน่ายที่ตายแล้วอาจทำให้การติดตั้งที่ไม่เกี่ยวข้องพังในอีกหลายเดือน ทั้งสองรายการไม่เปลี่ยนอะไรเลย และนั่นคือเหตุผลที่รันมันก่อน

nmcli -f NAME,UUID,TYPE connection show
nmcli connection show --active
grep -ril acmevpn /etc/apt/sources.list.d/ /etc/apt/sources.list

โปรเซสที่ยังมีชีวิตหลังการล้างอาจเป็นยูนิตที่ทำงานอยู่หรือลูกของโปรแกรมอื่น อ่านตารางโปรเซสและสายโซ่พ่อแม่ก่อนโทษบริการที่ไม่มีอยู่แล้ว รายการเริ่มอัตโนมัติต่อผู้ใช้ก็ต้องตรวจแบบเดียวกัน และจะปรากฏเฉพาะในเชลล์ล็อกอินใหม่ ไม่ใช่ในเซสชัน root

กริยาสามคำที่ใช้แทนกันไม่ได้

การหยุดยุติการทำงานปัจจุบัน การปิดใช้งานถอดลิงก์ตอนบูต และการมาสก์ชี้ยูนิตไปที่ /dev/null เฉพาะอย่างที่สามเท่านั้นที่บล็อกการเปิดใช้งานผ่านซ็อกเก็ต ไทเมอร์ หรือการพึ่งพา ซึ่งทำให้เป็นวิธีที่แข็งแกร่งที่สุดในสามอย่าง ลำดับสำคัญขณะคุณยังตัดสินใจว่าจะทำอะไรกับเครื่อง การมาสก์คือสถานะที่ถูกต้องระหว่างการตัดสินใจนั้น เพราะมันล้มเหลวเสียงดังแทนที่จะเริ่มอย่างเงียบ ๆ ในการบูตครั้งถัดไป

ถอดการมาสก์ก่อนติดตั้งใหม่ ไม่เช่นนั้นแพ็กเกจใหม่จะดูเสียหายด้วยเหตุผลที่ไม่มีใครบันทึกไว้ ข้อควรระวังเดียวกันใช้กับการแพ็กเกจที่ต่างกัน การสร้างหนึ่งส่งยูนิตที่หยุดได้ ขณะที่อีกอันไม่ทิ้งบริการใดเลย ตรวจสอบว่าคุณมีแพ็กเกจแบบไหนก่อนเลือกกริยา เพราะเส้นทางการล้างต่างกัน

ไวลด์การ์ดคือวิธีลบโปรไฟล์ผิดตัว

ลบโปรไฟล์ด้วย UUID ที่คุณจดไว้ และอย่าใช้ไวลด์การ์ดเลย ไดเรกทอรี keyfile ยังเก็บโปรไฟล์ Wi-Fi และ Ethernet ทุกตัวบนเครื่อง ดังนั้นการจับแบบกว้างจึงลบสิ่งที่คุณยังต้องใช้ ไฟล์ keyfile ที่ลบด้วยมืออาจถูกสร้างใหม่โดยนโยบายที่เป็นเจ้าของ ทำให้การลบดูไม่มีผล

nmcli connection delete uuid <uuid>

ส่งออกเกตเวย์และตัวตนก่อนหากโปรไฟล์นั้นเป็นสำเนาเดียวที่คุณยังมี เพราะการลบในเครื่องไม่เพิกถอนสิ่งใดบนเซิร์ฟเวอร์ รีโพซิทอรีก็ใช้กฎเดียวกัน ลบไฟล์ผู้จำหน่ายไฟล์เดียวและพวงกุญแจของมัน แล้วรีเฟรชรายการแพ็กเกจและลองการติดตั้งที่คุณต้องการจริงอีกครั้ง การทิ้งรายการของบุคคลที่สามที่ล้าสมัยไว้อาจตรึงการพึ่งพาเก่าไว้หรือไม่ตอบสนองเลย การลบทั้งสองอย่างเล็กน้อย และอย่างใดอย่างหนึ่งย้อนกลับได้จากสำเนาที่คุณเก็บไว้

สิ่งที่ยังทำงานหลังรีบูต

รีบูตก่อนประกาศชัยชนะ แล้วมองหาสิ่งตกค้างแทนตัวแอปพลิเคชัน อินเทอร์เฟซทันเนล เส้นทางแยกที่ล้าสมัย และ DNS ต่อลิงก์ที่ไคลเอนต์เก่าทิ้งไว้ ต่างต้องใช้คำสั่งของตัวเอง ทั้งสามอย่างอยู่รอดหลังการล้างที่ลบทุกแพ็กเกจสำเร็จได้

ip link
ip route
resolvectl status

เปิดเชลล์ล็อกอินใหม่ด้วย เพราะรายการเริ่มอัตโนมัติจะทำงานเฉพาะที่นั่น จากนั้นอ่าน /etc/NetworkManager/dispatcher.d/ เพื่อหาสคริปต์ที่ยกการเชื่อมต่อขึ้นทุกครั้งที่อินเทอร์เฟซเปลี่ยนสถานะ ซึ่งอธิบายทันเนลที่กลับมาโดยไม่มีบริการอยู่ข้างหลัง หากยังมีอะไรโทรออก ให้ตามโปรเซสไปถึงพ่อแม่แทนการลบไฟล์จนอาการหยุด การล้างเครื่องกับการเพิกถอนบัญชีเป็นงานแยกกัน และมีเพียงอย่างเดียวที่เสร็จเมื่อการรีบูตดูสงบ

บทความที่เกี่ยวข้อง