Workaround: dpkg goes Segmentation Fault
So, your apt-get [dist-]upgrade stops when a post/pre-installation script goes in Segmentation Fault. The strange thing is that the same script, extracted from your favourite deb package, works if launched standalone. That's probably a debconf or dpkg bug but, frankly, I didn't even google to find if it's really a known bug: I get this problem quite often on my Debian testing (especially while upgrading libc6, tzdatam console_common), so I chose to spend my time looking for a workaround. And, finally, I found a very simple one.
That's, more or less, the error I get (note: my system is localized in italian):
(Lettura del database ... 184524 file e directory attualmente installati.)
Mi preparo a sostituire libc6 2.7-3 (con libc6 2.7-5) ...
Spacchetto il sostituto di libc6 ...
Configuro libc6 (2.7-5) ...
dpkg: errore processando libc6 (--install):
il sottoprocesso post-installation script è stato terminato dal segnale (Segmentation fault)
Sono occorsi degli errori processando:
libc6
In a nutshell, my solution is:
- Unpack the .deb package causing the problem and grab the meta-files
- Clear the pre/post-installation script (depending on which one causes the segmentation fault)
- Pack a new .deb package with these fake scripts and install it
- Run manually the scripts you modified (do this before the installation if it was a preinst or pre/post-rm)
- Done: you can go on with your dist-upgrade
# Make a copy of crashing packageDirty and functional, as usual. But pay attention to the manual execution of scripts: they may crash, or refuse to go on, or they may contain debconf commands that bash can't execute; so my advice is: take a look inside and try to manually do, step by step, what the script was supposed to do (uninstalling packages, stopping processes, restarting daemons, upgrading configurations, and so on).
cp /var/cache/apt/archives/crashing_pkg_x.y.z.deb ./crashing_package.deb
# Extracts package data
dpkg-deb -x crashing_package.deb ./temp_dir
# Extracts package meta-files
dpkg-deb -e crashing_package.deb ./temp_dir/DEBIAN
# Make fake post/pre installation scripts
echo "echo Fake" > ./temp_dir/DEBIAN/postinst
# Pack a new modified package
dpkg-deb -b ./temp_dir/ mod_package.deb
# Install the hacked package (should not go in segfault)
dpkg -i mod_package.deb
# Manually run postinst script
./temp_dir/DEBIAN/postinst
# Clean
rm -rf ./temp_dir
rm crashing_package.deb mod_package.deb
I guess you're experienced enough to change them to suit your needs (and, above all, I'm in a hurry now!). So, good luck and may the GNU-force be with you =)
3 comments:
Very helpful - worked like a charm. Thanks :)
I'm glad it was helpful!
Did you have the same problem in Debian Testing (like me) or in another distro?
libc6 update just failed on unstable, for some reason I had not thought of going berserk like that. Worked like a charm, thanks!
Post a Comment