Trình quản lý gói Linux, như Apt và DNF, cực kỳ mạnh mẽ và trực quan, nhưng không có nghĩa mọi thứ không thể sai. Đôi khi cài gói sai, và bạn phải gom mảnh. Trình quản lý gói có khả năng sửa gói hỏng và bỏ qua cập nhật hỏng để hệ thống hoạt động lại và tránh rắc rối sau. Bài viết bao quát cách sửa gói hỏng trên Linux.
Mẹo này giúp bạn thoát khỏi đa số trường hợp. Chúng khá phổ quát, nhưng mọi tình huống khác nhau, nên nhớ khi debug tình huống riêng.
Sửa Gói Hỏng Trên Ubuntu/Mint/Debian
Apt có vài cờ dùng sửa phụ thuộc thiếu hoặc gói hỏng vì lý do nào đó khi cài. Trường hợp thường gặp là cài .deb bên thứ ba và thấy nó có phụ thuộc bạn không biết. Những phụ thuộc đó có thể không tự kéo về, và dpkg sẽ phàn nàn gói thiếu. Dù sao, bạn có thể thử các bước sau.
Trước, chạy cập nhật đảm bảo không có phiên bản mới của gói cần.
sudo apt --fix-missing update
Tiếp, thử ép Apt tìm và sửa phụ thuộc thiếu hoặc gói hỏng khi cài lại gói gây sự. Điều này thực sự cài phụ thuộc thiếu và sửa cài đặt hiện có.
sudo apt install -f
Nơi khác lỗi xuất hiện trong cài gói là quá trình cấu hình. Phía sau, dpkg lo phần này, không phải Apt, nên hợp lý khi gói fail khi cấu hình, dpkg là công cụ cần dùng để sửa.
Bắt đầu bằng ép dpkg cấu hình lại gói hỏng hoặc cấu hình một phần.
sudo dpkg --configure -a
Nếu không giải quyết, dùng cách mạnh hơn. Bắt đầu liệt kê gói dpkg đánh dấu cần cài lại.
sudo dpkg -l | grep ^..r
Bạn sẽ thấy gói gây sự ở đó. Miễn không có gì không thuộc về đó, bạn có thể ép xóa gói hỏng.
sudo dpkg --remove --force-remove-reinstreq [tên gói]
Khi dpkg xong, dọn dẹp với Apt.
sudo apt clean sudo apt update
Với may mắn, điều đó đưa bạn về điểm xuất phát. Nó không mang lại gói hỏng bạn cố cài, nhưng ít nhất Apt sẽ hoạt động lại, và bạn quay lại dùng nó cố cài gói và phụ thuộc.
Khóa DPKG Vĩnh Viễn
Có vấn đề ít gặp với khóa dpkg ngăn bạn làm bất cứ điều gì. Mỗi lần dùng Apt hoặc dpkg, lỗi nói ứng dụng khác đang... khi nó không.
Thực tế dễ xóa tệp khóa ngăn dùng Apt và quay lại làm việc. Đôi khi tệp khóa vẫn ở đó sau lỗi cài hoặc mất điện, làm lệch quy trình và ngăn tệp tự xóa. Trong trường hợp này, bạn tự làm.
sudo rm /var/lib/apt/lists/lock
Để chắc chắn, xóa khóa trong cache.
sudo rm /var/cache/apt/archives/lock
Sửa Gói Hỏng Trên Fedora/CentOS/RHEL
Sửa gói hỏng trên Fedora/CentOS/RHEL ít phổ biến, vì yum và dnf làm việc tuyệt vời đảm bảo gói cài đúng. Tuy nhiên, đôi khi thứ lẫn lộn trong dùng gói. Lệnh làm vậy trên hệ thống rpm:
sudo rpm -Va
Tùy chọn -V là verify, nghĩa là nó duyệt qua so sánh thông tin tệp cài với thông tin trong cơ sở dữ liệu rpm. Hơi không hữu ích, vì thường cho danh sách tệp dài, nhưng có thể cho điểm bắt đầu nếu bạn gặp vấn đề với ứng dụng cụ thể. Bạn có thể chạy dnf reinstall trên gói thấy trong danh sách có thể gây rắc rối.
sudo dnf --refresh reinstall TÊN_GÓI
Điều đó đặt tất cả metadata thành hết hạn, nên nó bò qua mọi kho bạn bật tìm phiên bản mới gói đó. Nếu thấy phụ thuộc hỏng với gói đó, DNF có thể phàn nàn và bảo dùng cờ --skip-broken. Điều này cũng có nghĩa bạn không có kho cụ thể bật để kéo phụ thuộc, nên có thể phải research thêm.
Sửa Gói Hỏng Trên Arch
Mặc dù trình quản lý gói Arch có nhiều điểm tương đồng Debian, nó hoàn toàn con thú khác. Bước đầu chẩn đoán là đảm bảo kho cập nhật và thử nâng cấp đầy đủ:
sudo pacman -Syu
Nếu cố cài gói hoặc nâng cấp hệ thống vẫn fail, phải izolate nguyên nhân theo terminal báo:
"Gói Không Hợp Lệ Hoặc Hỏng"
Thay đổi "pacman.conf" bất kỳ cách nào có thể gây vấn đề khiến pacman gán nhãn sai gói hỏng. Thủ phạm có khả năng nhất là tệp một phần (".part") trong cache trình quản lý gói, giải pháp là xóa nó:
sudo find /var/cache/pacman/pkg/ -iname "*.part" -delete
Luôn có cơ hội gói bạn cài thực sự hỏng và không cung cấp metadata hợp lệ cho Arch. Trong trường hợp đó, chờ maintainer gói cập nhật. Nếu gói cài trên hệ thống gây vấn đề khi nâng cấp, gỡ nó bằng:
sudo pacman -Rns [tên gói]
"Không Thể Khóa Cơ Sở Dữ Liệu"
Giống apt của Debian, trình quản lý gói Arch tạo tệp khóa khi hoạt động. Nếu bạn mất điện hoặc pacman bị ngắt cứng không kịp xóa khóa, rất có thể để lại tệp khóa.
Trước, tìm xem tiến trình nào còn dùng tệp:
sudo fuser /var/lib/pacman/db.lck
Trong hình trên, tiến trình ID 121497 dùng khóa tệp. Nếu tò mò tiến trình và muốn thêm info, dùng ps:
ps -p [PID#]
Trong trường hợp tôi, instance pacman khác nắm khóa. Cách an toàn xóa khóa là trước kill tiến trình đó:
sudo kill [PID#]
Bây giờ tiến trình chết, xóa tệp khóa:
sudo rm /var/lib/pacman/db.lck
Bạn tốt rồi!
"Tệp Xung Đột/Tệp Tồn Tại Trong Hệ Thống Tệp"
Điều này xảy ra khi nâng cấp pacman phát hiện xung đột. Trước khi sửa, chú ý đường dẫn tệp trình quản lý gói phàn nàn.
Điều đầu phải tìm là ai sở hữu tệp:
pacman -Qo [đường dẫn tệp]
Nếu thuộc user không phải gói khác, chỉ xóa nó:
sudo rm [đường dẫn tệp]
Nếu thuộc gói khác, cách an toàn là chờ maintainer gói sửa xung đột. Đôi khi không phải lựa chọn, bạn muốn xong ngay.
Cách đơn giản nhất dùng cờ --overwrite trong pacman. Chỉ biết đây thường không an toàn và có thể dẫn đến app không chạy đúng. Đề nghị backup trước.
Cờ --overwrite cho phép pacman bỏ qua quy tắc sở hữu cho tệp cụ thể và xỏ qua cập nhật. Ví dụ:
pacman -Syu --overwrite [tên tệp]
Nếu lệnh trên không chạy, thay tên tệp bằng đường dẫn tuyệt đối. Một số user báo bỏ dấu gạch chéo đầu ("/") trước đường dẫn làm lệnh chạy khi nó cứng đầu.
Câu Hỏi Thường Gặp
1. Có thể áp dụng sửa Arch với AUR helper không?
Chung có thể. Thay "pacman" bằng AUR helper trong lệnh hướng dẫn. Ví dụ:
yay -Qo /path/to/file
2. Các hướng dẫn này an toàn không?
Phần lớn, mọi hướng dẫn ở đây an toàn như mọi thao tác quản lý gói khác. Ngoại lệ lớn khi xóa tệp khóa. Nếu có cách, quan trọng kill tiến trình có thể dùng tệp đó trước khi xóa. Luôn nhận thức hệ thống làm gì. Bạn có thể quên instance apt hoặc pacman chạy đâu đó!
Thực hành tốt nhất: luôn backup hệ thống trước nâng cấp.
3. Làm sao nếu ngắt cập nhật?
Làm gián đoạn cập nhật bằng Ctrl + C, kill tiến trình trình quản lý gói, hoặc đóng terminal sớm sẽ dẫn đến mức độ hỏng cơ sở dữ liệu gói có thể phức tạp khi cài cái khác. Để sửa, dọn cache và lặp cập nhật.
Trên Debian/Ubuntu/Mint/Pop!_OS/v.v.:
sudo apt-get clean
Trên Fedora/CentOS/RHEL:
sudo dnf clean all
Trên Arch:
sudo pacman -Scc
Kết Luận
Hy vọng một trong những sửa này hoạt động cho bạn, và bạn quay lại làm việc bình thường trên Linux. Nhớ cách tốt xử lý tình huống hoàn toàn mất kiểm soát là cố quay lại trạng thái trước. Đừng cố gắng ép qua và thêm thứ để sửa hỏng bằng thêm thứ trừ khi bạn biết chính xác làm gì. Khả năng bạn sẽ kết thúc với mớ hỗn độn gói hỏng khó gỡ hơn.
Bạn cũng có thể cần dọn dẹp hệ thống Linux để loại gói không cần và hỏng. Nếu nguyên nhân là PC cũ không hỗ trợ phần mềm mới, bạn cũng có thể tận dụng ba cách 활용 PC cũ hiệu quả.