Instal ulang semua paket Debian

19

Saya membunuh karena kesalahan proses dpkg berjalan di latar belakang dan saya ingin menginstal ulang semua paket untuk memastikan semuanya baik-baik saja.

Pertama, saya mencoba untuk mendapatkan daftar semua paket dan menginstalnya kembali

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

Tetapi ada pesan seperti:

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

Saya mencoba apt-get -f install, tanpa hasil.

Sebagai upaya terakhir, saya menginstal ulang semua program yang gagal checksum:

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

Apa yang harus saya lakukan untuk menginstal ulang semuanya?

Sunting: Masalah terpecahkan. Masalahnya adalah sesuatu yang lain (lihat komentar). Saya mengerti itu sesuatu yang harus dihindari dengan Debian.

alex_reader
sumber
1
Baru-baru ini saya mengalami crash saat mencoba menginstal paket. Ketika saya reboot dan mencoba menginstal ulang paket itu, saya menerima pesan, "E: dpkg terputus, Anda harus secara manual menjalankan 'dpkg --configure -a' untuk memperbaiki masalah.". Menjalankan perintah itu menghapus paket tersebut dan mengonfigurasi file. Saya kemudian dapat menginstal paket dari awal. Coba beri perintah itu.
embedded.kyle
Itu tidak melakukan apa-apa, jadi saya kira tidak ada yang rusak. Saya akan mencoba nanti untuk memeriksa apakah masalah driver saya terpecahkan.
alex_reader
1
Menginstal ulang semua paket == ide yang sangat buruk. (a) Hampir selalu tidak perlu (b) mungkin akan gagal (c) Jika sistem Anda benar-benar kacau, instal ulang saja. Perbaiki masalah yang sebenarnya Anda lihat.
Faheem Mitha

Jawaban:

9

Coba ini, mengingat yang saya lakukan tidak mengujinya:

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

Sumber:

Marco Sulla
sumber
Masalah saya sangat berbeda: Saya tidak mem-boot kernel yang benar (!). Saya akan menerima jawaban Anda karena tampaknya melakukan apa yang saya inginkan (tetapi juga belum diuji).
alex_reader
Ini tidak akan berhasil, dan akan sepenuhnya merusak sistem. Baris 3 akan menghapus instalan, jadi tidak mungkin menginstal ulang semuanya, sesudahnya.
rkjnsn
@ rkjnsn: Saya memperbarui jawabannya, periksa apakah itu berhasil.
Marco Sulla
1
Mencoba melakukan hal ini, tidak ada yang diinstal ulang, walaupun file pilihan terisi: pi @ prodpi ~ $ sudo apt-get - install ulang dselect-upgrade Daftar paket membaca ... Selesai Membangun pohon dependensi Membaca informasi keadaan ... Selesai 0 ditingkatkan , 0 baru dipasang, 0 untuk dihapus dan 0 tidak ditingkatkan. ada ide?
andig
Salah satu alasan saya pikir kode Anda tidak akan berfungsi adalah karena dpkg --get-selectionsdaftar perintah juga menghapus paket.
Ortomala Lokni
2

Untuk berjaga-jaga, coba instal ulang setiap paket :

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

Anda mungkin ingin menambahkan jawaban ya untuk semua opsi pertanyaan juga.

Pengecut
sumber
cat: list.log: Tidak ada file atau direktori seperti itu
IgorGanapolsky
2
@IgorGanapolsky Jalankan dpkg --get-selections > list.logdulu.
QwertyChouskie
2
list.logdiambil dari pertanyaan.
Stephen Kitt
2

Dalam salah satu sumber yang dikutip oleh Lucas Malor saya menemukan sebuah skrip yang disebut populator yang tampaknya dekat dengan solusi. Jika Anda mengatur variabel pemilihan paket ke daftar semua paket Anda

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

Anda kemudian dapat menjalankan skrip dan menginstal ulang semua paket tetapi sistem mungkin akan memiliki beberapa masalah. Akan lebih baik untuk mengujinya di mesin virtual terlebih dahulu.

Berikut adalah varian skrip dari tautan di atas:

#!/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

Jika kesalahan ditampilkan bahwa paket tertentu tidak dapat diinstal ulang jalankan perintah ini untuk mencoba lagi:

sudo apt-get -y autoremove
Ortomala Lokni
sumber
1

Coba ini sebagai gantinya karena itu akan mengambil output Anda dan menjadikannya satu garis raksasa dengan spasi yang memisahkan nama file.

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)

Satu-satunya perubahan pada posting asli Anda adalah menambahkan dalam pernyataan awk kedua, yang mungkin bisa dilakukan sejalan dengan yang pertama untuk membuat file yang Anda inginkan.

Perubahan ini akan memaksa apt-get untuk mengunduh ulang paket dengan benar dan setiap dependensi yang hilang yang tidak diinstal pertama kali dan menginstalnya kembali secara berurutan.

Jika kita membuatnya sejajar, saya percaya itu akan terlihat seperti ini maka:

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

Dan kemudian pastikan Anda benar-benar membuat sistem memiliki paket yang benar (atau terbaru), bersihkan cache apt, perbarui dan kemudian unduh kembali semua file (Anda dapat melewati dua langkah pertama jika Anda hanya ingin apa yang Anda miliki di cache diinstal ulang):

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

Saya memiliki lebih dari 2k paket yang diinstal pada sistem yang saya tingkatkan yang mengalami hangup. Menggunakan dpkg --configure -a menyelesaikan instalasi (itu masih dalam tahap akhir). Saya kemudian menjalankan ini untuk membuat semuanya menginstal ulang dengan benar.

Atau seperti yang dinyatakan di /superuser/298912/reinstall-debian-while-keeping-installed-packages-and-data :

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

Pastikan Anda menjalankan "init 2" terlebih dahulu sebelum menginstal ulang, karena beberapa komponen X atau window manager favorit Anda mungkin tidak suka diinstal ulang.

Pengecut Anonim
sumber
Kecuali Anda telah memodifikasi IFS, tanda kutip tidak $(cat file)dikutip pada spasi putih dan memberikan hasil yang sama persis apakah file dibatasi oleh baris baru atau spasi. --reinstallmungkin bisa membantu tetapi sudah diberikan dua kali sebelum ini.
dave_thompson_085
0

Saat menggunakan Aptitude ada cara mudah dan cepat untuk melakukannya:

sudo aptitude reinstall '~i'

yang akan menginstal ulang semua paket yang diinstal saat ini.

goetzc
sumber
-1

Saat menggunakan RPM, jika Anda menyebabkan kerusakan dalam paket database, ada opsi untuk membangun kembali basis data ini, sehingga mencegah Anda dari harus melalui dasarnya menginstal ulang. Seperti yang ditunjukkan oleh satu pengguna di sini, ini dilakukan di Debian oleh dpkg --configure -a.

mdpc
sumber
1
Peran dari dpkg --configure -aadalah untuk mengkonfigurasi semua paket yang tidak dibongkar dan tidak dikonfigurasi. Lihat halaman manual dpkgdan dpkg-reconfiguredan juga debian.org/doc/manuals/debian-faq/ch-pkg_basics.en.html
Ortomala Lokni