Переустановка всех пакетов 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
Переустановка всех пакетов == действительно плохая идея. (а) Это почти всегда не нужно (б) это, вероятно, даст сбой (в) Если ваша система действительно сильно испорчена, просто переустановите ее. Просто исправьте проблемы, которые вы на самом деле видите.
Фахим Митха

Ответы:


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: я обновил ответ, проверь, работает ли он.
Марко Сулла

1
Попытка сделать это ничего не переустанавливается, хотя файл выбора заполняется: pi @ prodpi ~ $ sudo apt-get --reinstall dselect-upgrade Чтение списков пакетов ... Готово Построение дерева зависимостей Чтение информации о состоянии ... Выполнено 0 обновлено , 0 недавно установлено, 0 для удаления и 0 не обновлено. любая идея?
andig

Одна из причин, по которой я думаю, что ваш код не будет работать, заключается в том, что dpkg --get-selectionsсписок команд также удаляет пакеты.
Ортомала Локни

2

На всякий случай попробуйте переустановить каждый пакет :

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

Вы также можете добавить вариант ответа «да» на все вопросы.


cat: list.log: Нет такого файла или каталога
Игорь Ганапольский

2
@IgorGanapolsky Беги dpkg --get-selections > list.logпервым.
QwertyChouskie

2
list.logвзято из вопроса.
Стивен Китт,

2

На одном из ресурсов, на которые ссылается Лукас Малор, я нашел скрипт под названием 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, что, вероятно, можно сделать в строке с первым, чтобы создать нужный файл.

Это изменение заставит apt-get корректно перезагружать пакеты и все недостающие зависимости, которые не были установлены в первый раз, и переустанавливать их по порядку.

Если мы сделаем это встроенным, я думаю, что это будет выглядеть так:

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)

У меня было более 2 тыс. Пакетов, установленных в обновленной системе с зависанием. Использование dpkg --configure -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)токены в кавычках без кавычек и дают точно такой же результат, независимо от того, разделен ли файл символами новой строки или пробелами. --reinstallможет помочь, но уже было дано дважды до этого.
dave_thompson_085

1

При использовании Aptitude есть простой и быстрый способ сделать это:

sudo aptitude reinstall '~i'

который переустановит все установленные на данный момент пакеты.


-1

При использовании RPM, в случае, если вы вызываете повреждение в базе данных пакета, есть возможность перестроить эту базу данных, таким образом, не позволяя вам выполнить в основном переустановку. Как отметил один из пользователей, это делается в Debian dpkg --configure -a.


1
Роль dpkg --configure -aзаключается в настройке всех распакованных и ненастроенных пакетов. См искусственные страницы dpkgи , dpkg-reconfigureа также debian.org/doc/manuals/debian-faq/ch-pkg_basics.en.html
Ortomala Lokni
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.