Khá nhiều lần, trong khi cài đặt / cập nhật một gói từ dòng lệnh (sử dụng apt-get hoặc apt ) trong Ubuntu, chúng tôi nhận được lỗi này: E: Không thể khóa thư mục quản trị (/ var / lib / dpkg /) . Từ quan điểm của người mới bắt đầu, đó là một lỗi phức tạp, vì người dùng mới hầu như không biết về thư mục “/ var / lib / dpkg /” và nó phải làm gì với hoạt động hiện tại mà họ đang thực hiện.

Về mặt kỹ thuật, lỗi được đưa ra bởi hệ thống trong nhiều tình huống, và người ta nên thực sự quan tâm đến việc anh ta / cô ấy đi giải quyết vấn đề này như thế nào. Trong bài viết này, chúng tôi sẽ thảo luận tất cả các khía cạnh liên quan đến lỗi này và cách bạn có thể loại bỏ nó một cách an toàn.

Không thể khóa (/ var / lib / dpkg /) - chẩn đoán sự cố

Bất cứ khi nào bạn gặp lỗi này, bước đầu tiên phải là đọc kỹ mô tả lỗi. Nó thường chứa một số gợi ý quan trọng và tiết kiệm thời gian. Ví dụ, các ảnh chụp màn hình sau đây cho thấy lệnh "apt-get install" có lỗi tương tự.

Tuy nhiên, nếu bạn nhìn kỹ hơn, bạn sẽ quan sát rằng văn bản trong dấu ngoặc trong dòng đầu tiên và văn bản sau dấu phẩy trong dòng thứ hai khác nhau trong cả hai trường hợp, làm rõ rằng lỗi trong kịch bản đầu tiên có gì đó làm với quyền người dùng, trong khi trong kịch bản thứ hai nó có liên quan đến tệp khóa tạm thời không khả dụng.

Nếu bạn đang gặp lỗi liên quan đến quyền (như được hiển thị trong hình đầu tiên ở trên), rất có thể vì người dùng đang chạy lệnh "apt-get" hoặc "apt" không có đủ đặc quyền và lệnh được chạy mà không có sudo . Khi lệnh được chạy với quyền root, lỗi sẽ biến mất.

Tuy nhiên, nếu đó là lỗi liên quan đến khóa, thì nó yêu cầu điều tra thêm.

/ Var / lib / dpkg / là gì?

"/ Var / lib / dpkg /" có thể được coi là thư mục làm việc cho trình quản lý gói "dpkg", do đó thực sự là động cơ đằng sau "apt-get" (cũng như các công cụ "apt" và "aptitude") . Bất cứ khi nào bạn sử dụng các công cụ này để cài đặt hoặc gỡ bỏ phần mềm, chúng sẽ khóa cơ sở dữ liệu gói (bằng cách tạo tệp “khóa”) trước khi thực hiện thao tác thực tế. " danh mục. Bước này giúp tránh bị hỏng dữ liệu hoặc gián đoạn hoạt động liên tục đang được thực hiện bởi một số quy trình khác.

Giả sử bạn đã hiểu khái niệm được giải thích ở trên, hãy thảo luận các bước điều tra.

Bước 1: Xem liệu có quá trình nào khác giữ khóa không

Điều này bây giờ có vẻ khá hợp lý, phải không? Và để làm điều này, bạn có thể sử dụng sự trợ giúp của lệnh ps cũ tốt và đặt đầu ra của nó thành grep để bạn dành ít thời gian tìm kiếm những gì bạn muốn. Ví dụ, đây là một lệnh cho phép bạn tìm thấy nếu có bất kỳ "apt", "apt-get", hoặc "aptitude" quá trình đã chạy:

 ps aux | grep apt 

Bước 2: Đợi một lúc rồi hành động

Nếu thực sự có một lệnh đã có khóa, bạn nên đợi nó hoàn thành và nhả khóa. Tuy nhiên, nếu lệnh được dùng nhiều hơn thời gian dự kiến ​​và bạn chắc chắn rằng nó bị kẹt ở đâu đó, bạn có thể tiếp tục và giết nó bằng cách sử dụng lệnh kill hoặc killall có sẵn (thông tin thêm về chúng ở đây). Điều này sẽ giải quyết được vấn đề bạn đang gặp phải.

Một điều đáng nói đến ở đây là việc giết chết một quy trình "dpkg" trực tiếp không bao giờ được khuyến nghị - nó có thể làm hỏng cơ sở dữ liệu gói. Tôi nhấn mạnh điểm này bởi vì bây giờ bạn biết rằng các công cụ như “apt” và “apt-get” gọi “dpkg” trong nội bộ, nên bạn có thể nghĩ đến việc giết quá trình “dpkg” nếu bạn phát hiện ra nó trong “ps” "Đầu ra lệnh.

Các quá trình giết chết được khởi tạo bằng cách chạy các lệnh apt, apt-get hoặc aptitude thường an toàn hơn nhiều.

Bước 3: Khi đầu ra lệnh "ps" không trợ giúp

Hãy nhớ rằng ngoài các công cụ dòng lệnh như apt và apt-get, một số ứng dụng dựa trên GUI như Trung tâm Phần mềm hoặc Trình quản lý Cập nhật cũng có được khóa này.

Lưu ý : nếu bạn nhận được lỗi liên quan đến khóa ngay sau khi bạn đã khởi động vào Ubuntu, có thể hoạt động của bạn bị trùng lặp với việc bỏ phiếu tự động được khởi tạo bởi trình quản lý cập nhật. Chờ một chút sẽ giải quyết vấn đề trong trường hợp này.

Quay lại các ứng dụng dựa trên GUI mà chúng ta đang nói đến, một tùy chọn hữu ích và tiết kiệm thời gian khác là sử dụng lệnh fuser .

Với "fuser", bạn chỉ cần biết tệp đang được truy cập ("/ var / lib / dpkg / lock" trong trường hợp của chúng tôi) và bạn có thể hủy quá trình truy cập tệp đó ngay cả khi bạn không biết quá trình đó là gì. Ví dụ:

 sudo fuser -cuk / var / lib / dpkg / khóa 

Hãy nhớ rằng lệnh fuser sẽ không giải phóng khóa được mua lại bởi quá trình bạn vừa mới giết, vì vậy bạn sẽ phải thực hiện việc này theo cách thủ công:

 sudo rm -f / var / lib / dpkg / khóa 

Lưu ý : để " giải phóng khóa " chỉ đơn giản là có nghĩa là xóa tệp "khóa" để các quá trình khác có thể " lấy khóa " bằng cách tạo lại khóa.

Bạn cũng có thể cần chạy hai lệnh sau:

 sudo fuser -cuk / var / cache / apt / lưu trữ / khóa; sudo rm -f / var / cache / apt / lưu trữ / khóa 

Mẹo quan trọng : không bao giờ xóa các tệp khóa dưới dạng bước đầu tiên - đây chỉ là phương sách cuối cùng của bạn.

Phần kết luận

Nói chung, nó luôn luôn là tốt để hiểu lý do đằng sau vấn đề trước khi đi trước và giải quyết nó. Các giải pháp cố gắng để giải quyết một vấn đề sẽ không bao giờ giúp bạn - bạn có thể thành công trong một số trường hợp, nhưng thường xuyên hơn là bạn sẽ không gặp rắc rối lớn hơn, đặc biệt nếu hệ điều hành là Linux.

Bạn đã bao giờ gặp lỗi chúng tôi đã thảo luận ở đây chưa? Bạn đã phân loại nó ra sao? Để lại câu trả lời của bạn trong các ý kiến.