Подробный гайд по ремонту APT-системы после сломанных зависимостей Часть 1
Гайд подходит для систем на базе APT и dpkg: Debian, Ubuntu, Linux Mint, Pop!_OS, Kali Linux и похожих дистрибутивов.
1. Главное правило: не удаляйте лишнего
Если APT предлагает удалить критически важные пакеты, остановитесь.
Особенно опасно, если в списке на удаление есть:
apt
dpkg
bash
coreutils
libc6
systemd
init
util-linux
Пример опасного вывода:
The following packages will be REMOVED:
bash* coreutils* dpkg*
В такой ситуации не нужно сразу соглашаться. Сначала следует понять, какой пакет или репозиторий стал причиной конфликта.
2. Подготовка перед ремонтом
2.1. Получите права администратора
Можно работать через sudo:
sudo команда
Или открыть root-сессию:
sudo -i
Дальше команды будут указаны без sudo, но в обычной сессии его нужно добавлять.
2.2. Сделайте резервную копию
Если система загружается, сохраните важные данные:
cp -a /home/имя_пользователя /mnt/backup/
Если используется Btrfs, можно сделать snapshot.
Для Timeshift:
timeshift --create --comments "Перед ремонтом APT"
Для LVM:
lvs
lvcreate --size 10G --snapshot --name root_snapshot /dev/mapper/vg-root
Если система не загружается, ремонт можно выполнять с Live USB через chroot.
3. Быстрая диагностика
3.1. Проверка целостности зависимостей
apt-get check
Если вывод пустой, проблем с зависимостями нет.
Если есть ошибка, вывод может быть примерно таким:
E: Unmet dependencies. Try 'apt-get --fix-broken install' with no packages.
3.2. Проверка состояния dpkg
dpkg --audit
Команда покажет пакеты в проблемных состояниях:
half-installed
half-configured
unpacked
triggers-awaited
3.3. Проверка удержанных пакетов
apt-mark showhold
Если какие-то пакеты удержаны, это может блокировать обновление.
Снять удержание:
apt-mark unhold имя_пакета
3.4. Проверка источников пакетов
Посмотрите основной файл источников:
cat /etc/apt/sources.list
И дополнительные источники:
ls /etc/apt/sources.list.d/
Очень частая причина поломки — сторонние PPA, репозитории testing/sid или пакеты из другого дистрибутива.
4. Базовый ремонт APT
Выполняйте команды по порядку.
4.1. Обновление списков пакетов
apt-get update
Если есть ошибки ключей или репозиториев, их нужно устранить, иначе APT может не видеть нужные версии пакетов.
4.2. Завершение прерванной установки
dpkg --configure -a
Эта команда завершает настройку пакетов, которые были распакованы, но не настроены до конца.
Полезно после:
- внезапного выключения питания;
- прерванного обновления;
- ошибки во время установки пакета.
4.3. Исправление сломанных зависимостей
apt-get --fix-broken install
или:
apt --fix-broken install
Это основная команда для восстановления зависимостей. Перед подтверждением обязательно прочитайте, какие пакеты будут установлены, обновлены или удалены.
4.4. Обычное обновление
apt-get update
apt-get upgrade
Если требуется обновление с изменением зависимостей:
apt-get dist-upgrade
или:
apt full-upgrade
full-upgrade может удалять или заменять пакеты, поэтому используйте его внимательно.
5. Если стандартный ремонт не помогает
5.1. Использование aptitude
aptitude часто предлагает несколько вариантов разрешения конфликтов.
Установка:
apt-get install aptitude
Если установка возможна, попробуйте:
aptitude full-upgrade
Когда появится предложение, не спешите нажимать Y.
Нажмите:
n
чтобы посмотреть следующий вариант решения.
Ищите вариант, где:
- устанавливаются недостающие зависимости;
- не удаляются критические системные пакеты;
- не удаляется половина рабочего окружения.
5.2. Проверка версий пакета
apt-cache policy имя_пакета
Пример:
apt-cache policy libc6
Вывод покажет установленную версию и доступные кандидаты из репозиториев.
5.3. Проверка зависимостей
Зависимости пакета:
apt-cache depends имя_пакета
Обратные зависимости, то есть кто зависит от пакета:
apt-cache rdepends имя_пакета
5.4. Поиск пакетов в плохом состоянии
Обычно нормально установленный пакет выглядит так:
ii bash 5.1-6ubuntu1
Где:
ii— установлен нормально;rc— удалён, но остались конфигурационные файлы;iU— распакован, но не настроен;iF— полунастроен;iH— удержан.
Посмотреть пакеты не в состоянии ii:
dpkg -l | grep -v '^ii'
Если такие пакеты есть, нужно разбираться с каждым из них.
6. Типовые ошибки и их решение
6.1. Unmet dependencies
Пример:
The following packages have unmet dependencies:
package-name : Depends: other-package but it is not going to be installed
E: Unable to correct problems, you have held broken packages.
Решение:
apt-get check
apt --fix-broken install
Если не помогает:
aptitude install package-name
Затем перебирать варианты клавишей n.
6.2. Held broken packages
Пример:
E: Unable to correct problems, you have held broken packages.
Проверить удержанные пакеты:
apt-mark showhold
Снять удержание:
apt-mark unhold package-name
Затем:
apt --fix-broken install
6.3. dpkg was interrupted
Пример:
E: dpkg was interrupted, you must manually run 'dpkg --configure -a' to correct the problem.
Решение:
dpkg --configure -a
Если во время настройки снова появляется ошибка, нужно смотреть, какой именно пакет падает.
6.4. Package is in a very bad inconsistent state
Пример:
dpkg: error processing package example (--configure):
package is in a very bad inconsistent state; you should
remove it entirely before retrying the operation
Сначала:
dpkg --configure -a
Если не помогает:
apt-get install --reinstall package-name
Если пакет всё равно не восстанавливается, можно аккуратно удалить его:
dpkg --remove --force-remove-reinstreq package-name
Затем:
apt --fix-broken install
6.5. Cannot unpack package archive
Пример:
dpkg-deb: error: archive is corrupt
или:
E: Cannot unpack package archive
Возможно, повреждён кэш загруженных пакетов.
Очистить кэш:
apt-get clean
apt-get autoclean
apt-get update
Затем:
apt --fix-broken install
6.6. Ошибка блокировки dpkg или APT
Пример:
E: Could not get lock /var/lib/dpkg/lock-frontend
Проверить процессы:
ps aux | grep -E 'apt|dpkg'
Если процесс действительно завис, его можно завершить:
kill PID
Если вы уверены, что APT и dpkg сейчас не работают, можно удалить lock-файлы:
rm -f /var/lib/dpkg/lock
rm -f /var/lib/dpkg/lock-frontend
rm -f /var/cache/apt/archives/lock
dpkg --configure -a
Не удаляйте lock-файлы, если установка действительно выполняется.
6.7. dpkg returned an error code
Пример:
Errors were encountered while processing:
/var/cache/apt/archives/package.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
Запустите:
dpkg --configure -a
Если ошибка указывает на конкретный пакет, попробуйте:
apt-get install --reinstall package-name
Если пакет не нужен:
dpkg --remove package-name
apt --fix-broken install
6.8. Ошибка конфигурационного файла
Пример:
dpkg: error processing package nginx-common (--configure):
installed nginx-common package post-installation script subprocess returned error exit status 1
Посмотреть состояние пакета:
dpkg -s nginx-common
Посмотреть файлы пакета:
dpkg -L nginx-common
Попробовать переустановку:
apt-get install --reinstall nginx-common
Если мешает пользовательский конфиг, временно переместите его:
mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.broken
Затем:
dpkg --configure -a
7. Ремонт конкретного сломанного пакета
Если известно, что проблема в пакете package-name, используйте следующие действия.
7.1. Переустановка пакета
apt-get install --reinstall package-name
7.2. Установка загруженного .deb
Скачать пакет:
apt-get download package-name
Установить:
dpkg -i package-name*.deb
Затем:
apt --fix-broken install
7.3. Удаление сломанного пакета
Если пакет можно удалить и потом установить заново:
dpkg --remove package-name
Если обычное удаление не работает:
dpkg --remove --force-remove-reinstreq package-name
После этого:
apt --fix-broken install
7.4. Удаление остаточных конфигураций
Если пакет удалён, но конфигурации остались:
dpkg -l | grep '^rc'
Удалить конфигурации конкретного пакета:
apt-get purge package-name
Аккуратно удалить все остатки:
dpkg -l | awk '/^rc/ {print $2}' | xargs apt-get purge -y
8. Если причина в PPA или стороннем репозитории
Частые причины:
- подключён PPA;
- установлены пакеты из testing или sid;
- смешаны пакеты разных версий Ubuntu;
- подключён репозиторий от другого дистрибутива.
8.1. Посмотреть источники
cat /etc/apt/sources.list
ls -l /etc/apt/sources.list.d/
8.2. Сделать резервную копию источников
mkdir /root/sources-backup
cp -a /etc/apt/sources.list /root/sources-backup/
cp -a /etc/apt/sources.list.d /root/sources-backup/
8.3. Временно отключить сторонние репозитории
Создать каталог для отключённых источников:
mkdir /etc/apt/sources.list.d.disabled
Переместить туда файлы:
mv /etc/apt/sources.list.d/* /etc/apt/sources.list.d.disabled/
Затем отредактировать:
nano /etc/apt/sources.list
Закомментировать подозрительные строки, оставив только официальные репозитории.
Обновить списки:
apt-get update
8.4. Понизить версию пакета
Посмотреть доступные версии:
apt-cache policy package-name
Установить нужную версию:
apt-get install package-name=version
Пример:
apt-get install libc6=2.35-0ubuntu3.4
Если нужны конкретные версии зависимостей, указывайте их вместе:
apt-get install package=version dependency1=version dependency2=version
8.5. Ограничить приоритет PPA через pinning
Создать файл:
nano /etc/apt/preferences.d/block-ppa
Пример понижения приоритета PPA:
Package: *
Pin: release o=LP-PPA-some-ppa
Pin-Priority: 100
Или запретить установку конкретного пакета из PPA:
Package: package-name
Pin: release o=LP-PPA-some-ppa
Pin-Priority: -1
После этого:
apt-get update
9. Если система не загружается
Если система не стартует из-за сломанных пакетов, используйте Live USB и chroot.
9.1. Загрузиться с Live USB
Выберите режим:
Try Ubuntu
или аналогичный пункт в вашем дистрибутиве.
9.2. Найти корневой раздел
lsblk -f
Пример:
NAME FSTYPE LABEL MOUNTPOINT
sda
sda1 ext4
sda2 swap
9.3. Смонтировать корневой раздел
mount /dev/sdX1 /mnt
Если есть отдельный EFI-раздел:
mkdir -p /mnt/boot/efi
mount /dev/sdX2 /mnt/boot/efi
Если есть отдельный /boot:
mount /dev/sdX2 /mnt/boot
Если используется LVM:
vgchange -ay
lvs
mount /dev/mapper/vg-root /mnt
9.4. Подготовить chroot
Смонтировать служебные файловые системы:
for i in /dev /dev/pts /proc /sys /run; do
mount --bind "$i" "/mnt$i"
done
Для UEFI можно дополнительно выполнить:
mount --bind /sys/firmware/efi/efivars /mnt/sys/firmware/efi/efivars 2>/dev/null || true
Войти в систему:
chroot /mnt
9.5. Выполнить ремонт внутри chroot
export PATH=/usr/sbin:/usr/bin:/sbin:/bin
apt-get update
dpkg --configure -a
apt --fix-broken install
apt-get upgrade
Если нужно переустановить пакет:
apt-get install --reinstall package-name
Если внутри chroot нет DNS:
echo nameserver 1.1.1.1 > /etc/resolv.conf
или:
echo nameserver 8.8.8.8 > /etc/resolv.conf
9.6. Выйти и отмонтировать
Выйти из chroot:
exit
Отмонтировать всё:
umount -R /mnt
Если что-то осталось смонтировано:
umount -l /mnt
10. Если сломан dpkg
Если dpkg не работает, это серьёзная проблема, но часто её можно восстановить.
10.1. Проверить наличие dpkg
which dpkg
ls -l /usr/bin/dpkg
10.2. Переустановить dpkg из кэша
Посмотреть, есть ли пакет в кэше:
ls /var/cache/apt/archives | grep dpkg
Установить вручную:
dpkg -i /var/cache/apt/archives/dpkg_*.deb
10.3. Скачать dpkg на другой машине
На рабочей системе той же версии:
apt-get download dpkg
Перенести .deb на сломанную машину и установить:
dpkg -i dpkg_*.deb
10.4. Если повреждён libc6
libc6 — критическая системная библиотека.
Признаки проблем:
error while loading shared libraries
libc.so.6: version not found
Segmentation fault
Если система ещё работает:
apt-get download libc6
dpkg -i libc6_*.deb
Если система не работает, используйте Live USB и chroot:
apt-get install --reinstall libc6
или:
dpkg -i /path/to/libc6*.deb
Никогда не удаляйте libc6 вручную.
11. Если сломаны зависимости Python
Системный Python в Debian и Ubuntu тесно связан с APT. Нельзя без необходимости обновлять системные Python-модули через pip в системные каталоги.
11.1. Типичные ошибки
ModuleNotFoundError: No module named 'apt_pkg'
или:
/usr/bin/python3: No module named 'distutils'
или синтаксические ошибки в системных скриптах APT.
11.2. Переустановить системные Python-пакеты
apt-get install --reinstall python3 python3-minimal python3-apt python3-distutils
11.3. Проверить, не установлен ли другой Python вручную
ls -l /usr/local/bin/python*
Если там есть пользовательский Python, временно переименуйте его:
mv /usr/local/bin/python3 /usr/local/bin/python3.custom
Проверить:
which python3
python3 --version
Системный Python обычно находится здесь:
/usr/bin/python3
12. Если сломаны зависимости ядра или драйверов
12.1. Проблема с dkms
Пример ошибки:
dkms: autoinstall for kernel failed
Посмотреть статус модулей:
dkms status
Пересобрать модули:
dkms autoinstall
Если проблема с конкретным модулем:
dkms remove module/version --all
dkms install module/version
12.2. Переустановить заголовки ядра
Для текущего ядра:
apt-get install --reinstall linux-headers-$(uname -r)
Для Ubuntu часто подходит:
apt-get install --reinstall linux-headers-generic
12.3. Удалить проблемное ядро
Посмотреть установленные ядра:
dpkg -l | grep linux-image
Узнать текущее ядро:
uname -r
Удалить старое проблемное ядро, но не текущее рабочее:
apt-get purge linux-image-5.15.0-XX-generic
Затем:
apt --fix-broken install
update-grub
13. Если обновление релиза завершилось с ошибкой
Например, система обновлялась с Ubuntu 22.04 до 24.04, но процесс прервался.
13.1. Проверить версию системы
cat /etc/os-release
13.2. Завершить обновление
dpkg --configure -a
apt --fix-broken install
apt-get update
apt-get dist-upgrade
или:
apt full-upgrade
Если использовался do-release-upgrade, после базового восстановления можно попробовать:
do-release-upgrade -d
Но лучше сначала убедиться, что пакетная база восстановлена.
13.3. Проверить пакеты не в нормальном состоянии
dpkg -l | grep -v '^ii'
14. Безопасная симуляция действий APT
Перед потенциально опасными командами используйте режим симуляции.
apt-get -s --fix-broken install
или:
apt-get -s install package-name
или:
apt-get -s full-upgrade
Если в выводе предлагается удаление критических пакетов, не выполняйте команду без резервной копии и понимания последствий.
15. Полезные команды диагностики
15.1. Информация о пакете
dpkg -s package-name
Пример:
dpkg -s bash
15.2. К какому пакету относится файл
dpkg -S /usr/bin/apt
15.3. Файлы, установленные пакетом
dpkg -L package-name
15.4. Зависимости пакета
apt-cache depends package-name
15.5. Кто зависит от пакета
apt-cache rdepends package-name
15.6. Доступные версии пакета
apt-cache policy package-name
15.7. История операций APT
less /var/log/apt/history.log
Архивные логи:
zless /var/log/apt/history.log.1.gz
15.8. Лог dpkg
less /var/log/dpkg.log
15.9. Поиск установки, удаления и обновления
grep -E "remove|purge|install|upgrade" /var/log/apt/history.log | less
16. Восстановление случайно удалённого важного пакета
16.1. Посмотреть, что было удалено
grep -B 5 -A 20 "Remove" /var/log/apt/history.log
16.2. Переустановить метапакет рабочего окружения
Ubuntu GNOME:
apt-get install --reinstall ubuntu-desktop
Kubuntu:
apt-get install --reinstall kubuntu-desktop
Linux Mint Cinnamon:
apt-get install --reinstall mint-meta-cinnamon
Debian GNOME:
apt-get install --reinstall task-gnome-desktop
Debian KDE:
apt-get install --reinstall task-kde-desktop
16.3. Переустановить минимальный набор системы
Ubuntu:
apt-get install --reinstall ubuntu-minimal
Debian:
apt-get install --reinstall dpkg apt base-files base-passwd bash coreutils util-linux
Linux Mint:
apt-get install --reinstall mint-meta-core
17. Если APT предлагает удалить половину системы
Пример:
The following packages will be REMOVED:
gnome-shell* mutter* ubuntu-desktop* xorg*
17.1. Не соглашайтесь сразу
Не нажимайте Y, пока не поймёте причину.
17.2. Используйте симуляцию
apt-get -s --fix-broken install
17.3. Используйте aptitude
aptitude full-upgrade
Перебирайте решения клавишей:
n
17.4. Попробуйте установить конфликтующий пакет вручную
apt-get install package=version
Версию смотрите через:
apt-cache policy package
17.5. Временно удалите только виновника
Если проблемный пакет не является критическим:
apt-get remove problem-package
apt --fix-broken install
18. Опасные команды
18.1. dpkg --force
Пример:
dpkg --force-all -i package.deb
Используйте только в крайнем случае.
Более точечные варианты:
dpkg --force-remove-reinstreq --remove package
dpkg --force-depends --remove package
После любых принудительных действий выполните:
dpkg --configure -a
apt --fix-broken install
18.2. Удаление содержимого /var/lib/dpkg/info
Не делайте этого без понимания последствий.
Там находятся:
- списки файлов пакетов;
- скрипты установки и удаления;
- служебная информация dpkg.
18.3. Удаление критических пакетов
Опасно удалять:
dpkg
apt
libc6
systemd
bash
coreutils
init
18.4. Удаление /var/lib/dpkg
Команда вида:
rm -rf /var/lib/dpkg
крайне опасна. Это база состояния пакетной системы.
19. Ремонт баз данных dpkg и APT
19.1. Проверить файл status
ls -l /var/lib/dpkg/status
Сделать резервную копию:
cp -a /var/lib/dpkg/status /root/status.backup
19.2. Восстановить status из резервной копии
Проверить наличие резервных копий:
ls /var/backups/dpkg.status*
Восстановить:
cp /var/backups/dpkg.status.0 /var/lib/dpkg/status
Затем:
dpkg --configure -a
apt --fix-broken install
19.3. Проверить каталог updates
ls /var/lib/dpkg/updates
Если система падала во время операции dpkg, там могут остаться незавершённые записи.
Сделать резервную копию:
mkdir /root/dpkg-updates-backup
cp -a /var/lib/dpkg/updates/* /root/dpkg-updates-backup/
Очистить:
rm -f /var/lib/dpkg/updates/*
Затем:
dpkg --configure -a
Делайте это только если действительно понимаете, что база dpkg повреждена.
19.4. Если повреждён /var/lib/dpkg/info
В этом каталоге хранятся файлы пакетов и скрипты сопровождения.
Если данные повреждены, может помочь переустановка критических пакетов:
apt-get install --reinstall dpkg apt base-files bash coreutils
19.5. Переустановка всех пакетов
Это тяжёлый вариант, но иногда он помогает восстановить повреждённую пакетную базу.
Список установленных пакетов:
dpkg --get-selections | grep -v deinstall | awk '{print $1}' > /root/reinstall.txt
Переустановка по списку:
xargs -a /root/reinstall.txt apt-get install --reinstall -y
Этот процесс может занять много времени и потребовать много сетевого трафика.
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.