apt-get purge <packages> работает отлично, aptitude все еще имеет <пакеты>, помеченные как установленные, и переустанавливает их

Я создал Rubygem, чтобы помочь с удалением старых ядер, которые накопились в течение многих лет, и есть место на диске. (У моего ноутбука было только 19 ядер, и на маленьком SSD …)

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

Проблема возникает, когда некоторые пользователи используют aptitude для других вещей. Сценарий:

  1. Пользователь использует мой драгоценный камень, который успешно apt-get purge пакеты ядра.
  2. Пользователь запускает aptitude в интерактивном режиме по любой причине,
  3. Пользователь сразу же нажимает клавишу «g» (Download / Install / Remove Pkgs) без каких-либо изменений, ->
  4. aptitude повторно загружает и переустанавливает пакеты, которые apt-get удалил.

В настоящее время камень использует apt-get purge <packages> для очистки пакетов ядра. ( См. Здесь .) Я также пробовал с dpkg --purge <packages> , но результат тот же, aptitude все еще хочет переустановить их.

Я прочитал все руководство по навыкам и искал много вещей, никаких кубиков.

Возможно, я мог бы программно управлять списком упакованных / немаркированных пакетов aptitude если бы мог найти, где это (хотя я бы предпочел более чистое решение.) Я предполагаю, что это не /var/lib/dpkg/status иначе не было бы никакого различия ?

dpkg-query показывает status пакета как « Not а desired состояние – « Unknown .

 deKernel$ dpkg-query -l linux-image-3.2.0-39-generic Desired=Unknown/Install/Remove/Purge/Hold | Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend |/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad) ||/ Name Version Description +++-==========================================-==========================================-==================================================================================================== un linux-image-3.2.0-39-generic <none> (no description available) deKernel$ 

Можно пойти в aptitude и вручную отменить эти пакеты ядра, и проблема исчезнет, ​​однако это явно непрактично.

aptitude имеет собственную базу данных состояния пакета /var/lib/aptitude/pkgstates , которая, к сожалению, кажется довольно недокументированной. Он хранит такой блок для каждого пакета:

 Package: bash Architecture: amd64 Unseen: no State: 1 Dselect-State: 1 Remove-Reason: 0 

Я считаю, что состояние 1 означает installed , состояние белого 3 not installed . У меня также есть несколько пакетов с состоянием 4 в моей системе, но я не могу понять, что это значит.

Я считаю, что ваша проблема /var/lib/aptitude/pkgstates с несогласованностью базы данных dpkg /var/lib/dpkg/status и базы данных aptitude /var/lib/aptitude/pkgstates . Согласно этому сообщению pkgstates должен отражать «предполагаемое» состояние пользователя для пакета [s] », поэтому aptitude, вероятно, считает, что пользователь хочет, чтобы эти пакеты были установлены, хотя apt-get только что удалил их.

Кажется, что лучшим решением для вашей проблемы является то, что предлагает тройка: используйте aptitude если она установлена, а если нет, вернитесь к apt-get .