Cài đặt lại tất cả các gói Debian


19

Tôi đã chết do nhầm lẫn một quy trình dpkg đang chạy trong nền và tôi muốn cài đặt lại tất cả các gói để đảm bảo mọi thứ đều ổn.

Đầu tiên, tôi đã cố gắng để có được một danh sách tất cả các gói và cài đặt lại chúng

dpkg --get-selections | grep -v deinstall | awk '{print $1}' > list.log
apt-get install --reinstall $(cat list.log)

Nhưng có những tin nhắn như:

E: Couldn't configure pre-depend debconf:i386 for console-setup:i386, probably a dependency cycle.

Tôi đã cố gắng apt-get -f install, không thành công.

Như một phương sách cuối cùng, tôi đã cài đặt lại tất cả các chương trình không thành công trong tổng kiểm tra:

dpkg -l | grep ^ii | awk '{ print $2 }' | xargs debsums -s -a

Tôi nên làm gì để cài đặt lại mọi thứ?

Chỉnh sửa: Vấn đề được giải quyết. Vấn đề là một cái gì đó khác (xem các ý kiến). Tôi hiểu rằng đó là điều cần tránh với Debian.


1
Gần đây tôi đã gặp sự cố trong khi cố gắng cài đặt một gói. Khi tôi khởi động lại và cố gắng cài đặt lại gói đó, tôi nhận được thông báo: "E: dpkg bị gián đoạn, bạn phải chạy thủ công 'dpkg - thông minh -a' để khắc phục sự cố.". Chạy lệnh đó đã gỡ bỏ gói nói và tập tin cấu hình. Sau đó tôi đã có thể cài đặt gói từ đầu. Hãy thử đưa ra lệnh đó đi.
embedded.kyle

Nó không làm gì cả, vì vậy tôi đoán không có gì bị hỏng. Tôi sẽ thử sau để kiểm tra xem các vấn đề về trình điều khiển của tôi đã được giải quyết chưa.
alex_reader

1
Cài đặt lại tất cả các gói == ý tưởng thực sự xấu. (a) Hầu như không cần thiết (b) nó có thể sẽ thất bại (c) Nếu hệ thống của bạn thực sự quá rối, chỉ cần cài đặt lại. Chỉ cần sửa chữa các vấn đề bạn thực sự nhìn thấy.
Faheem Mitha

Câu trả lời:


9

Hãy thử điều này, hãy nhớ rằng tôi đã không kiểm tra nó:

dpkg --get-selections > selections
sudo dpkg --clear-selections
sudo dpkg --set-selections < selections
sudo apt-get --reinstall dselect-upgrade

Nguồn:


Vấn đề của tôi hoàn toàn khác: Tôi đã không khởi động đúng kernel (!). Tôi sẽ chấp nhận câu trả lời của bạn vì nó dường như làm những gì tôi muốn (nhưng cũng chưa được kiểm tra).
alex_reader

Điều này sẽ không hoạt động, và sẽ phá vỡ hoàn toàn hệ thống. Dòng 3 sẽ gỡ cài đặt apt, do đó không thể cài đặt lại mọi thứ sau đó.
rkjnsn

@rkjnsn: Tôi đã cập nhật câu trả lời, kiểm tra xem nó có hoạt động không.
Marco Sulla

1
Cố gắng làm điều này không có gì được cài đặt lại, mặc dù tệp lựa chọn được điền: pi @ prodpi ~ $ sudo apt-get --reinstall dselect-nâng cấp Danh sách gói ... Xong Xây dựng cây phụ thuộc Đọc thông tin trạng thái ... Xong 0 đã nâng cấp , 0 mới cài đặt, 0 để loại bỏ và 0 không được nâng cấp. bất kỳ ý tưởng?
andig

Một lý do tôi nghĩ rằng mã của bạn sẽ không hoạt động là vì dpkg --get-selectionsdanh sách lệnh cũng cài đặt các gói.
Ortomala Lokni

2

Chỉ trong trường hợp, hãy thử cài đặt lại từng gói :

for i in $(cat list.log); do apt-get install --reinstall "$i"; done

Bạn có thể muốn thêm câu trả lời có cho tất cả các tùy chọn câu hỏi quá.


cat: list.log: Không có tập tin hoặc thư mục như vậy
IgorGanapolsky

2
@IgorGanapolsky Chạy dpkg --get-selections > list.logtrước.
QwertyChouskie

2
list.logđược lấy từ câu hỏi.
Stephen Kitt

2

Trong một trong những tài nguyên được trích dẫn bởi Lucas Malor, tôi đã tìm thấy một tập lệnh gọi là trình giả lập dường như gần giải pháp. Nếu bạn đặt biến lựa chọn gói thành danh sách tất cả các gói của bạn

PKGLIST=$(dpkg --get-selections | grep -v deinstall| cut -f1)

sau đó bạn có thể chạy tập lệnh và cài đặt lại tất cả các gói nhưng hệ thống có thể sẽ gặp một số vấn đề. Nó sẽ tốt hơn để kiểm tra nó trong một máy ảo đầu tiên.

Đây là một biến thể của tập lệnh từ liên kết ở trên:

#!/bin/bash
#
# Script to pre-populate apt-get proxy for faster later downloads.
# It uses apt-get and wget to pull all the specified packages.
#

# Make sure only root can run our script
if [[ $EUID -ne 0 ]]; then
   echo "You're not root, are you?" 1>&2
   exit 1
fi

# Specify wanted packages
PKGLIST="exaile" 

# Clears out the local repository of retrieved package files
apt-get clean

# Resynchronize the package index files from their sources
apt-get update

# Re-install specified packages at the newest version. 
apt-get install --reinstall $PKGLIST

Nếu lỗi được hiển thị, các gói cụ thể không thể được cài đặt lại, hãy chạy lệnh này để thử lại:

sudo apt-get -y autoremove

1

Thay vào đó, hãy thử điều này vì nó sẽ lấy đầu ra của bạn và biến nó thành một dòng khổng lồ với khoảng trắng ngăn cách tên tệp.

dpkg --get-selections | grep -v deinstall | awk '{print $1}' > list.log awk '$1=$1' ORS=' ' list.log > newlist.log apt-get install --reinstall $(cat newlist.log)

Thay đổi duy nhất cho bài viết gốc của bạn là thêm vào câu lệnh awk thứ hai, có thể được thực hiện nội tuyến với lần đầu tiên để tạo tệp bạn muốn.

Thay đổi này sẽ buộc apt-get tải lại chính xác các gói và mọi phụ thuộc bị thiếu chưa được cài đặt lần đầu tiên và cài đặt lại chúng theo thứ tự.

Nếu chúng ta làm cho nó nội tuyến, tôi tin rằng nó sẽ trông như thế này sau đó:

dpkg --get-selections | grep -v deinstall | awk '{print $1}' | awk '$1=$1' ORS=' ' > list.log

Và sau đó đảm bảo rằng bạn thực sự làm cho hệ thống có các gói chính xác (hoặc mới nhất), dọn sạch bộ đệm apt, cập nhật và sau đó tải xuống lại tất cả các tệp (bạn có thể bỏ qua hai bước đầu tiên nếu bạn chỉ muốn những gì bạn có trong bộ đệm cài đặt lại):

apt-get clean && apt-get update && apt-get install --reinstall $(cat list.log)

Tôi đã có hơn 2k gói được cài đặt trên hệ thống tôi đã nâng cấp bị treo máy. Sử dụng dpkg - thông minh -a đã hoàn tất cài đặt (nó đã ở giai đoạn cuối). Sau đó tôi chạy cái này để làm cho mọi thứ được cài đặt lại một cách chính xác.

Hoặc như đã nêu tại /superuser/298912/reinstall-debian-fter-keep-installed-packages-and-data :

sudo apt-get install --reinstall $(dpkg --get-selections | grep -w 'install$' | cut -f1)

Chỉ cần đảm bảo rằng bạn chạy "init 2" trước khi cài đặt lại, vì một số thành phần của X hoặc trình quản lý cửa sổ yêu thích của bạn có thể không thích được cài đặt lại.


Trừ khi bạn đã sửa đổi IFS, không được trích dẫn $(cat file)mã thông báo trên bất kỳ khoảng trắng nào và cho kết quả chính xác như nhau cho dù tệp được phân định bởi dòng mới hoặc dấu cách. --reinstallcó thể giúp đỡ nhưng đã được đưa ra hai lần trước đó.
dave_thndry_085

0

Khi sử dụng Aptitude, có một cách dễ dàng và nhanh chóng để làm điều đó:

sudo aptitude reinstall '~i'

sẽ cài đặt lại tất cả các gói hiện đang cài đặt.


-1

Khi sử dụng RPM, trong trường hợp bạn gây ra hỏng hóc trong cơ sở dữ liệu gói, có một tùy chọn để xây dựng lại cơ sở dữ liệu này, do đó ngăn bạn không phải cài đặt lại về cơ bản. Như một người dùng ở đây đã chỉ ra điều này được thực hiện trong Debian bởi dpkg --configure -a.


1
Vai trò của dpkg --configure -alà cấu hình tất cả các gói đã giải nén và chưa được định cấu hình. Xem các trang của dpkgdpkg-reconfigurecũng như debian.org/doc/manuals/debian-faq/ch-pkg_basics.en.html
Ortomala Lokni
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.