ติดตั้งแพ็คเกจ Debian ทั้งหมดใหม่อีกครั้ง


19

ฉันฆ่าโดยไม่ได้ตั้งใจกระบวนการ dpkg ทำงานในพื้นหลังและฉันต้องการติดตั้งแพ็กเกจทั้งหมดใหม่เพื่อให้แน่ใจว่าทุกอย่างเรียบร้อยดี

ก่อนอื่นฉันพยายามรับรายชื่อของแพ็คเกจทั้งหมดและติดตั้งใหม่

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

แต่มีข้อความเช่น:

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

ฉันพยายามapt-get -f installไม่ประสบความสำเร็จ

เป็นทางเลือกสุดท้ายฉันติดตั้งโปรแกรมทั้งหมดที่ล้มเหลวในการตรวจสอบใหม่:

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

ฉันควรทำอย่างไรเพื่อติดตั้งใหม่ทุกอย่าง

แก้ไข: แก้ไขปัญหาแล้ว ปัญหาเป็นอย่างอื่น (ดูความคิดเห็น) ฉันเข้าใจว่ามันเป็นสิ่งที่ควรหลีกเลี่ยงกับ Debian


1
ฉันเพิ่งเกิดข้อผิดพลาดขณะพยายามติดตั้งแพคเกจ เมื่อฉันรีบูทและพยายามติดตั้งแพคเกจใหม่ฉันได้รับข้อความ "E: dpkg ถูกขัดจังหวะคุณต้องเรียกใช้ 'dpkg --configure -a' ด้วยตนเองเพื่อแก้ไขปัญหา" เรียกใช้คำสั่งที่ลบแพคเกจดังกล่าวและไฟล์การกำหนดค่า ฉันสามารถติดตั้งแพ็กเกจได้แล้วตั้งแต่เริ่มต้น ลองใช้คำสั่งนั้น
embedded.kyle

มันไม่ได้ทำอะไรเลยดังนั้นฉันเดาว่าไม่มีอะไรเสียหาย ฉันจะลองใหม่ภายหลังเพื่อตรวจสอบว่าปัญหาไดรเวอร์ของฉันได้รับการแก้ไขหรือไม่
alex_reader

1
การติดตั้งแพ็คเกจทั้งหมดซ้ำอีกครั้ง == ความคิดที่เลว (a) แทบจะไม่จำเป็นทุกครั้ง (b) มันอาจจะล้มเหลว (c) หากระบบของคุณยุ่งมาก ๆ ให้ติดตั้งใหม่ เพียงแก้ไขปัญหาที่คุณเห็นจริง
Faheem Mitha

คำตอบ:


9

ลองสิ่งนี้โดยจดจำว่าฉันไม่ได้ทดสอบ:

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

แหล่งที่มา:


ปัญหาของฉันแตกต่างอย่างสิ้นเชิง: ฉันไม่ได้บูตเคอร์เนลที่ถูกต้อง (!) ฉันจะยอมรับคำตอบของคุณตามที่ดูเหมือนว่าจะทำสิ่งที่ฉันต้องการ (แต่ยังไม่ได้ทดสอบ)
alex_reader

สิ่งนี้จะไม่ทำงานและจะทำให้ระบบพังอย่างสมบูรณ์ บรรทัดที่ 3 จะถอนการติดตั้ง apt ดังนั้นจะไม่สามารถติดตั้งทุกอย่างได้ในภายหลัง
rkjnsn

@rkjnsn: ฉันอัพเดตคำตอบแล้วตรวจสอบว่ามันใช้งานได้หรือเปล่า
Marco Sulla

1
กำลังพยายามทำสิ่งนี้ไม่ได้รับการติดตั้งใหม่แม้ว่าไฟล์ตัวเลือกจะได้รับการเติมข้อมูล: pi @ prodpi ~ $ sudo apt-get - ติดตั้ง dselect-upgrade รายชื่อแพ็คเกจการอ่าน ... เสร็จสิ้นการพึ่งพาต้นไม้การอ่านข้อมูลสถานะ ... เสร็จ 0 อัปเกรดแล้ว , 0 ติดตั้งใหม่, 0 เพื่อลบและ 0 ไม่ได้อัพเกรด ความคิดใด ๆ
andig

เหตุผลหนึ่งที่ฉันคิดว่ารหัสของคุณใช้ไม่ได้เพราะdpkg --get-selectionsรายชื่อคำสั่งนั้นยังติดตั้งแพ็คเกจ
Ortomala Lokni

2

ในกรณีลองติดตั้งแต่ละแพคเกจใหม่ :

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

คุณอาจต้องการเพิ่มคำตอบใช่สำหรับทุกคำถามด้วยเช่นกัน


cat: list.log: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
IgorGanapolsky

2
@IgorGanapolsky เรียกใช้dpkg --get-selections > list.logก่อน
QwertyChouskie

2
list.logถูกนำมาจากคำถาม
Stephen Kitt

2

ในหนึ่งทรัพยากรที่อ้างถึงโดยลูคัส Malor ผมพบว่าสคริปต์เรียก populator ซึ่งดูเหมือนว่าจะอยู่ใกล้กับการแก้ปัญหา หากคุณตั้งค่าตัวแปรการเลือกแพ็คเกจเป็นรายการของแพ็คเกจทั้งหมดของคุณ

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

จากนั้นคุณสามารถเรียกใช้สคริปต์และติดตั้งแพ็คเกจทั้งหมด แต่ระบบอาจมีปัญหา มันจะเป็นการดีกว่าที่จะทดสอบในเครื่องเสมือนก่อน

นี่คือตัวแปรของสคริปต์จากลิงค์ด้านบน:

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

หากมีข้อผิดพลาดแสดงว่าไม่สามารถติดตั้งแพคเกจใหม่ได้ให้รันคำสั่งนี้เพื่อลองอีกครั้ง:

sudo apt-get -y autoremove

1

ลองใช้สิ่งนี้แทนเพราะมันจะเอาท์พุทของคุณและทำให้มันเป็นหนึ่งบรรทัดยักษ์ที่มีช่องว่างแยกชื่อไฟล์

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)

การเปลี่ยนแปลงเฉพาะโพสต์ต้นฉบับของคุณคือการเพิ่มในคำสั่ง awk ที่สองซึ่งอาจเป็นไปได้โดยสอดคล้องกับคำสั่งแรกเพื่อสร้างไฟล์ที่คุณต้องการ

การเปลี่ยนแปลงนี้จะบังคับให้ได้รับการดาวน์โหลดแพคเกจใหม่และการพึ่งพาที่ขาดหายไปที่ไม่ได้ติดตั้งในครั้งแรกและติดตั้งใหม่ตามลำดับ

หากเราทำให้มันเป็นแบบอินไลน์ผมเชื่อว่ามันจะมีลักษณะเช่นนี้แล้ว:

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

จากนั้นตรวจสอบให้แน่ใจว่าคุณทำให้ระบบมีแพ็คเกจที่ถูกต้อง (หรือล่าสุด) ล้างแคช apt อัปเดตแล้วดาวน์โหลดไฟล์ทั้งหมดอีกครั้ง (คุณสามารถข้ามสองขั้นตอนแรกหากคุณต้องการสิ่งที่คุณมีในแคช ติดตั้งใหม่):

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

ฉันติดตั้งแพคเกจมากกว่า 2k บนระบบที่ฉันอัพเกรดซึ่งมี Hangup ใช้ dpkg - กำหนดค่า -a เสร็จสิ้นการติดตั้ง (มันอยู่ในขั้นตอนสุดท้าย) จากนั้นฉันก็รันสิ่งนี้เพื่อทำให้การติดตั้งทุกอย่างถูกต้อง

หรือตามที่ระบุไว้ที่/superuser/298912/reinstall-debian-while-keeping-installed-packages-and-data :

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

เพียงให้แน่ใจว่าคุณเรียกใช้ "init 2" ก่อนติดตั้งใด ๆ เนื่องจากส่วนประกอบของ X หรือตัวจัดการหน้าต่างที่คุณชื่นชอบอาจไม่ต้องการติดตั้งใหม่


นอกจากว่าคุณได้แก้ไข IFS แล้วให้ถอนการทำเครื่องหมายโท$(cat file)เค็นบน whitespace ใด ๆ และให้ผลลัพธ์เดียวกันว่าไฟล์ถูกคั่นด้วยการขึ้นบรรทัดใหม่หรือเว้นวรรค --reinstallอาจช่วย แต่ได้รับสองครั้งก่อนหน้านี้
dave_thompson_085

1

เมื่อใช้ความถนัดมีวิธีที่ง่ายและรวดเร็วในการทำ:

sudo aptitude reinstall '~i'

ซึ่งจะติดตั้งแพ็กเกจที่ติดตั้งใหม่ทั้งหมดในปัจจุบัน


-1

เมื่อใช้ RPM ในกรณีที่คุณทำให้เกิดความเสียหายในฐานข้อมูลแพคเกจมีตัวเลือกในการสร้างฐานข้อมูลนี้ใหม่จึงป้องกันไม่ให้คุณต้องผ่านการติดตั้งโดยทั่วไป ในฐานะที่เป็นผู้ใช้รายหนึ่งที่นี่ชี้ให้เห็นนี้จะทำใน Debian dpkg --configure -aโดย


1
บทบาทของdpkg --configure -aคือการกำหนดค่าแพคเกจที่ไม่ได้บรรจุและไม่ได้กำหนดค่าทั้งหมด ดู man pages ของdpkgและdpkg-reconfigureและdebian.org/doc/manuals/debian-faq/ch-pkg_basics.en.html
Ortomala Lokni
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.