When NOTHING else will remove a half-installed .deb package

WARNING: ALL WARRANTIES NULL AND VOID

With that important disclaimer out of the way… when you’re stuck in the world’s worst apt -f install loop and can’t figure out any other way to get the damn thing unwedged when there’s a half-installed package (eg if you’ve removed an /etc directory for a package you installed before, and this breaks an installer script—or the installer script “knows you already have it” and refuses to replace a removed config directory), this is the nuclear option:

sudo nano /var/lib/dpkg/status

Remove the offending package (and any packages that depend on it) entirely from this file, then apt install the offending package again.

If you’re still broken after that… did I mention all warranties null and void? This is an extremely nuclear option, and I really wouldn’t recommend it outside a throwaway test environment; you’re probably better off just nuking the whole server and reinstalling.

With that said, the next thing I had to do to clean out the remnants of the mysql/mariadb coinstall debacle that inspired this post was:

find / -iname “*mysql*” | grep -v php | grep -v snap | xargs rm -r

This got me out of a half-broken state on a machine that somebody had installed both mariadb-server and mysql-server on, leaving neither working properly.

Published by

Jim Salter

Mercenary sysadmin, open source advocate, and frotzer of the jim-jam.

3 thoughts on “When NOTHING else will remove a half-installed .deb package”

  1. I’ve occasionally found it necessary to edit one of the shell scripts in /var/lib/dpkg/info/whatever.{prerm,postinst} to get out of packaging hole.

  2. sometimes editing the postinst/preinst dpkg script works …. (e.g stick a ‘set -x’ in it, hope repeating the apt command gives you something to work with, or just ‘exit 0’ early in the script).

    see /var/lib/dpkg/info/$package.(preinst|postinst|postrm|prerm) etc.

Leave a Reply

Your email address will not be published. Required fields are marked *