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.
Great blog, read it all
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.
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.