Linux package managers เช่น Apt และ DNF ทรงพลังและเข้าใจง่าย แต่ไม่ได้หมายความว่าดבריםไม่ผิดพลาด บางครั้งการติดตั้งแพ็กเกจผิดพลาด ทำให้คุณต้องเก็บเศษซาก Package managers มีความสามารถแก้ broken packages และข้าม broken updates เพื่อให้ระบบทำงานอีกครั้งและหลีกเลี่ยงปัญหาในอนาคต บทความนี้ครอบคลุมวิธีแก้ broken packages ใน Linux
เคล็ดลับเหล่านี้ควรช่วยให้คุณ 脱困 ได้ในส่วนใหญ่ ทั้งหมด universal ค่อนข้าง แต่ทุกสถานการณ์ต่างกัน จงจำไว้ตอน debug สถานการณ์ของตัวเอง
แก้ Broken Packages ใน Ubuntu/Mint/Debian
Apt มี flags 2 ตัวแก้ missing dependencies หรือ packages ที่แตกตอนติดตั้ง กรณีทั่วไปคือติดตั้ง third-party .deb พบว่า dependencies ไม่รู้เรื่อง Dependencies นั้นน่าจะไม่ถูกดึงมาเอง และ dpkg จะบ่นว่าแพ็กเกจหายไปใน dependencies ไม่ว่าจะเป็นกรณีไหน ลองขั้นตอนต่อไปนี้
ก่อนอื่น รัน update ให้แน่ใจว่าไม่มี newer versions ของ required packages
sudo apt --fix-missing update
ต่อไป ลองบังคับ Apt หาและแก้ missing dependencies หรือ broken packages ตอนพยายามติดตั้ง offending package อีกครั้ง จะติดตั้ง missing dependencies และซ่อม existing installs จริงๆ
sudo apt install -f
อีกที่ที่ error ปลดปล่อยในการติดตั้งแพ็กเกจคือ configuration process ข้างหลัง dpkg ดูแลส่วนนี้ ไม่ใช่ Apt ดังนั้น ถ้าแพ็กเกจล้มเหลวระหว่าง configuration dpkg คือเครื่องมือที่ต้องใช้แก้
เริ่มด้วยการบังคับ dpkg reconfigure broken หรือ partially configured packages ใดๆ
sudo dpkg --configure -a
ถ้าไม่แก้ปัญหา ลองแนวทาง forceful มากขึ้น เริ่มด้วย list packages ที่ dpkg ติดฉลากว่าต้อง reinstall
sudo dpkg -l | grep ^..r
ควรเห็น problematic package(s) ที่นี่ ถ้าไม่มีอะไรดูผิดปกติ force-remove broken packages
sudo dpkg --remove --force-remove-reinstreq [package name]
dpkg เสร็จ ลอง clean ด้วย Apt
sudo apt clean sudo apt update
โชคดีจะกลับสู่จุดเริ่มต้น ไม่ได้ broken packages ที่พยายามติดตั้ง แต่ Apt จะ functional อีกครั้ง และกลับไปใช้ติดตั้งแพ็กเกจและ dependencies ได้
Permanent DPKG Lock
มี issue น้อยกว่า กับ dpkg locks ป้องกันไม่ให้ทำอะไร ทุกครั้งพยายามใช้ Apt หรือ dpkg ได้ error ว่า application อื่นใช้อยู่... ตอนที่ไม่ได้ใช้
ลบ lock file ที่ป้องกันการใช้ Apt ง่าย กลับมาทำสิ่งที่ต้องการ บางครั้ง lock files ค้างหลัง install error หรือ power outage ทำให้ process ออกและป้องกันไฟล์ไม่ถูกลบอัตโนมัติ ในกรณีนี้ ต้องลบเอง
sudo rm /var/lib/apt/lists/lock
เพื่อความแน่ใจ ลบ lock ใน cache ด้วย
sudo rm /var/cache/apt/archives/lock
แก้ Broken Packages ใน Fedora/CentOS/RHEL
แก้ broken packages ใน Fedora/CentOS/RHEL น้อยกว่า เพราะ yum และ dnf ทำงานดีมาก ให้แน่ใจว่า packages ติดตั้งถูกต้อง แต่บางครั้งสับสนในการใช้แพ็กเกจ คำสั่งสำหรับ rpm-based systems:
sudo rpm -Va
Option -V คือ verify จะไป compare ข้อมูลบนไฟล์ที่ติดตั้งกับข้อมูลใน rpm database ค่อนข้าง unhelpful เพราะมักให้ list ไฟล์ยาว แต่วิธีเริ่มต้นได้ถ้ามีปัญหากับ application เฉพาะ รัน dnf reinstall บนแพ็กเกจใน list นั้นที่อาจทำปัญหา
sudo dnf --refresh reinstall PACKAGE_NAME
จะ set metadata ทั้งหมดเป็น expired จะ crawl ทุก repository ที่ enabled หา new version ของแพ็กเกจ ถ้าพบ broken dependencies กับแพ็กเกจนั้น DNF น่าจะบ่นและบอกใช้ flag --skip-broken อาจหมายถึงไม่มี repository เปิดใช้งานเพื่อดึง dependency ต้อง research เพิ่ม
แก้ Broken Packages ใน Arch
แม้ package manager ของ Arch คล้าย Debian หลายอย่าง แต่มันเป็นสัตว์ชนิดอื่น ขั้นตอนแรก diagnose issue คือ ให้แน่ใจว่า repositories up-to-date และพยายาม full upgrade:
sudo pacman -Syu
ถ้าพยายามติดตั้งแพ็กเกจหรือ system upgrade ยังล้มเหลว ต้อง isolate cause ตามที่ terminal บอก:
"Invalid or Corrupted Package"
การเปลี่ยนแปลง "pacman.conf" อย่างไรก็ตาม อาจทำให้ pacman ติดฉลากแพ็กเกจผิดว่า corrupt สาเหตุน่าจะเป็น partial (".part") file ใน package manager cache วิธีแก้คือลบมัน:
sudo find /var/cache/pacman/pkg/ -iname "*.part" -delete
มีโอกาสตลอดว่าแพ็กเกจที่ติดตั้งจริง corrupt ไม่ให้ valid metadata กับ Arch ในกรณีนั้น ต้องรอ package maintainer อัปเดต ถ้าแพ็กเกจติดตั้งอยู่ในระบบและทำปัญหาตอน upgrade ลบด้วย:
sudo pacman -Rns [package name]
"Unable to Lock Database"
เหมือน apt ของ Debian package manager ของ Arch สร้าง lock file ระหว่าง operations ถ้า power outage หรือ pacman ได้ hard interrupt ที่ลบ lock ไม่ทัน น่าจะเหลือ lock file
ก่อนอื่น หาว่า process บนเครื่องยังใช้ file อยู่:
sudo fuser /var/lib/pacman/db.lck
ในรูป Process ID 121497 ใช้ file lock ถ้าสนใจ process และอยากข้อมูลเพิ่ม ใช้ ps:
ps -p [PID#]
ในกรณีของผม pacman instance อื่นเป็นเจ้าของ lock file วิธีปลอดภัยที่สุดลบ lock คือ kill process ก่อน:
sudo kill [PID#]
ตอน process ตายแล้ว ลบ lock file:
sudo rm /var/lib/pacman/db.lck
พร้อมใช้งานแล้ว!
"Conflicting Files/File Exists in Filesystem"
เกิดระหว่าง upgrades ที่ pacman ตรวจพบ conflict ก่อนแก้ สังเกต path ไปยังไฟล์ที่ package manager บ่น
สิ่งแรก หาว่าใครเป็นเจ้าของไฟล์:
pacman -Qo [path to the file]
ถ้าเป็นเจ้าของโดย user ไม่ใช่แพ็กเกจอื่น แค่ลบมัน:
sudo rm [path to the file]
ถ้าเป็นเจ้าของโดยแพ็กเกจอื่น สิ่งปลอดภัยที่สุดคือรอ maintainer ของแพ็กเกจแก้ conflict เอง บางครั้งไม่ใช่ตัวเลือก แต่อยากทำ ตอนนี้
วิธีง่ายที่สุดคือใช้ flag --overwrite ใน pacman รู้ว่า โดยทั่วไป unsafe และอาจนำไปสู่แอปพลิเคชันบางอย่างทำงานไม่ถูกต้อง แนะนำ backup ก่อนรัน
Flag --overwrite ให้ package manager ของ Arch ไม่สน ownership rules สำหรับไฟล์เฉพาะ และ steamroller ผ่าน update ตัวอย่าง:
pacman -Syu --overwrite [file name]
ถ้าคำสั่งข้างบนไม่ได้ ลองแทน file name ด้วย absolute path บาง user รายงานว่าลบ leading slash ("/") หน้า path ทำให้คำสั่งทำงานตอนมันขี้ขืน
คำถามที่พบบ่อย
1. ใช้ Arch Fixes กับ AUR helper ได้ไหม?
โดยทั่วไปได้ แทน "pacman" ด้วย AUR helper ในคำสั่งในคู่มือ ตัวอย่าง:
yay -Qo /path/to/file
2. คำแนะนำเหล่านี้ปลอดภัยไหม?
ส่วนใหญ่ ทุกคำแนะนำปลอดภัยเท่าการจัดการแพ็กเกจอื่นๆ ข้อยกเว้นใหญ่คือตอนลบ lock files ถ้ามีวิธีทำ ควร kill processes ที่อาจใช้ไฟล์เหล่านั้นก่อนลบ ระวังสิ่งที่ระบบทำ อาจลืม instance ของ apt หรือ pacman รันอยู่ที่ไหน!
Best practice คือ backup ระบบก่อน upgrade ทุกครั้ง
3. ทำไงถ้าหยุด update ระหว่างทาง?
หยุด update process ด้วย Ctrl + C, kill process ของ package manager, หรือปิด terminal ก่อนเวลา จะทำให้ package database corrupt ระดับหนึ่ง ทำให้ซับซ้อนตอนติดตั้งอย่างอื่น วิธีแก้: clear cache และทำ update ใหม่
Debian/Ubuntu/Mint/Pop!_OS/etc.:
sudo apt-get clean
Fedora/CentOS/RHEL:
sudo dnf clean all
Arch:
sudo pacman -Scc
สรุป
หวังว่าวิธีแก้ใดวิธีหนึ่งทำงาน และคุณกลับมาทำงานบน Linux system ได้ปกติ จำไว้ว่า วิธีดีที่สุดจัดการสถานการณ์ที่ควบคุมไม่ได้ คือพยายามกลับสู่สภาพเดิม อย่าพยายาม power through และเพิ่มสิ่งเพื่อแก้ breakage โดยเพิ่มสิ่ง เว้นแต่รู้แน่ชัดว่าทำอะไร โอกาสมากจะได้ tangled mess ของสิ่งที่แตกซ้ำ ยากกว่าจัดเรียง
อาจต้อง clean up Linux system ลบ unnecessary และ broken packages ถ้าสาเหตุคือ PC เก่าไม่รองรับซอฟต์แวร์ใหม่ ใช้ 3 วิธีนี้เอา PC เก่าไปทำประโยชน์