ข้อผิดพลาด "The following packages have unmet dependencies" พบบ่อยใน Ubuntu เกิดขึ้นเมื่อติดตั้งแพ็กเกจด้วย apt ผ่านเทอร์มินัล แล้วล้มเหลวโดยไม่มีสาเหตุชัดเจน ไม่ได้มาจากโปรแกรมที่ติดตั้ง แต่มาจากระบบ apt เอง โดยเฉพาะเมื่อผสมใช้ third-party dependencies
มีหลายวิธีแก้ เรียงจากง่ายไปยาก ทำตามขั้นตอนด้านล่างจะแก้ได้
หมายเหตุ: ก่อนเริ่ม ควรสำรองไฟล์การตั้งค่า:
- กด Alt+Ctrl+T เปิดเทอร์มินัล
- พิมพ์ sudo cp /var/lib/dpkg/status /var/lib/dpkg/status.original กด Enter
วิธีที่ 1: ใช้พารามิเตอร์ -f
ง่ายที่สุด แค่เพิ่ม -f แทนที่จะพิมพ์ sudo apt-get install PACKAGENAME ให้ใช้:
sudo apt-get install -f
พารามิเตอร์ -f จะพยายามแก้ dependency ที่เสีย แล้วค่อยติดตั้งแพ็กเกจที่ต้องการ
- เปิดเทอร์มินัล (Ctrl+Alt+T)
- รัน sudo apt-get install -f
- รัน sudo dpkg --configure -a แล้วรันคำสั่งข้อ 2 อีกครั้ง
วิธีที่ 2: ใช้ Aptitude
Aptitude เป็น package manager ระดับสูงกว่า apt-get ติดตั้งก่อน:
- เปิดเทอร์มินัล (Ctrl+Alt+T)
- รัน sudo apt-get install aptitude
- รัน sudo aptitude install PACKAGENAME (แทน PACKAGENAME ด้วยชื่อแพ็กเกจ) จะพยายามติดตั้งผ่าน aptitude แทน apt-get
วิธีที่ 3: เปิด restricted/universe repositories และเลือกเซิร์ฟเวอร์ที่ดีกว่า
- กด Alt+F2 พิมพ์ software-properties-gtk กด Enter
- แท็บ Ubuntu Software: เปิดทุก repository (main, universe, restricted, multiverse)
- คลิก "Download from" > Select Best Server
- เปิดเทอร์มินัล (Alt+Ctrl+T) รัน sudo apt-get update แล้วลองติดตั้งใหม่
วิธีที่ 4: ล้างฐานข้อมูลแพ็กเกจ
ฐานข้อมูลเสียก็ทำให้ dependencies ไม่ครบ เปิดเทอร์มินัล (Ctrl+Alt+T) รัน:
- sudo apt-get clean - ลบไฟล์ .deb ที่ดาวน์โหลดไว้ทั้งหมด (ยกเว้น lock files) จาก /var/cache/apt/archives/ และ /var/cache/apt/archives/partial/
- sudo apt-get autoclean - ลบเฉพาะแพ็กเกจที่ดาวน์โหลดไม่ได้แล้ว (เก่าลงตัว)
วิธีที่ 5: กำจัด held packages
Held packages ถูก hold ไว้เพราะ apt แก้ dependency ไม่ได้ การกำจัดอาจแก้ปัญหา
- เปิดเทอร์มินัล (Ctrl+Alt+T)
- รัน sudo apt-get -u dist-upgrade จะแสดง held packages (ถ้ามี)
- ลองรัน sudo apt-get -o Debug::pkgProblemResolver=yes dist-upgrade ดูแก้ได้ไหม
หากจบด้วย X not upgraded (X = จำนวน held packages) ต้องลบทีละตัว:
- sudo apt-get remove --dry-run PACKAGENAME (--dry-run แสดงว่าจะเกิดอะไรขึ้น) ลบครบแล้ว ลองติดตั้งแพ็กเกจที่ทำปัญหาเดิมดู
วิธีที่ 6: Purge/Remove/Disable PPAs
PPA (Personal Package Archives) บน Launchpad ใช้ติดตั้ง/อัปเกรดแพ็กเกจที่ไม่มีใน repo resmi สาเหตุหลักของ unmet dependencies โดยเฉพาะตอนอัปเกรดแพ็กเกจจาก repo Ubuntu
Disable: แพ็กเกจจาก PPA นั้นจะไม่ได้รับอัปเดต
- Alt+F2 รัน software-properties-gtk
- แท็บ Other Software: แต่ละ PPA มี 2 บรรทัด (source + compiled) ยกติ๊กทั้งคู่เพื่อ disable
Purge: ดาวน์เกรดแพ็กเกจใน PPA กลับเป็นเวอร์ชัน repo resmi และ disable PPA ติดตั้ง ppa-purge:
mkdir ppa-purge && cd ppa-purge && wget https://old-releases.ubuntu.com/ubuntu/pool/universe/p/ppa-purge/ppa-purge_0.2.8+bzr56_all.deb && wget https://ftp.u-picardie.fr/mirror/ubuntu/ubuntu/pool/main/a/aptitude/aptitude_0.8.10-6ubuntu1_i386.deb && sudo dpkg -i ./*.deb
จากนั้น sudo ppa-purge ppa:someppa/ppa เพื่อ purge PPA ที่ต้องการ (ppa-purge ไม่ลบ PPA ให้ต้องลดเอง):
- sudo apt-get autoremove --purge PACKAGENAME (ถ้าอยากลบแพ็กเกจที่ติดตั้งด้วย)
- sudo add-apt-repository --remove ppa:someppa/ppa
- sudo apt-get autoclean
หลังจากนี้ควรติดตั้งแพ็กเกจที่ต้องการได้ แม้มีหลายวิธี แต้องป้องกันดีกว่า: อัปเดตระบบสม่ำเสมอ ใช้ PPA ที่เชื่อถือได้ สำรองข้อมูลตอนทำงานปกติ เพื่อ restore ได้ภายหลัง