deb打包错误笔记 以及卸载失败时强制卸载的方法

374 阅读2分钟

root@ubuntu:/home/xtrabackup/build# dpkg -i /root/mysoft-mysqlbackup-support-1.21022516-ubuntu.x86_64.deb
(Reading database ... 85108 files and directories currently installed.)
Preparing to unpack .../mysoft-mysqlbackup-support-1.21022516-ubuntu.x86_64.deb ...
dpkg: warning: subprocess old pre-removal script returned error exit status 1
dpkg: trying script from the new package instead ...
dpkg: error processing archive /root/mysoft-mysqlbackup-support-1.21022516-ubuntu.x86_64.deb (--install):
subprocess new pre-removal script returned error exit status 1

   mysoft-mysqlbackup-support is installed successfully.
Errors were encountered while processing:
/root/mysoft-mysqlbackup-support-1.21022516-ubuntu.x86_64.deb

遇到上面这个错误,装一个没问题的软件,再安装就是更新的提示。

root@ubuntu:/home/xtrabackup/build# dpkg -i /root/mysoft-mysqlbackup-support-1.21022516-ubuntu.x86_64.deb
Selecting previously unselected package mysoft-test.
(Reading database ... 85059 files and directories currently installed.)
Preparing to unpack .../mysoft-mysqlbackup-support-1.21022516-ubuntu.x86_64.deb ...
Unpacking mysoft-test (1.21022516) ...
dpkg: warning: unable to delete old directory '/etc/sdata/scripts': Directory not empty
dpkg: warning: unable to delete old directory '/etc/sdata': Directory not empty
dpkg: warning: unable to delete old directory '/usr/local/sdata/sbin': Directory not empty
dpkg: warning: unable to delete old directory '/usr/local/sdata': Directory not empty
Setting up mysoft-test (1.21022516) ...

   mysoft-mysqlbackup-support is installed successfully.

原因:

control文件中的名称错误了。

root@ubuntu:/home/xtrabackup/build# dpkg -i /root/mysoft-mysqlbackup-support-1.21022516-ubuntu.x86_64.deb
Selecting previously unselected package mysoft-mysqlbackup-support.
(Reading database ... 85108 files and directories currently installed.)
Preparing to unpack .../mysoft-mysqlbackup-support-1.21022516-ubuntu.x86_64.deb ...
Unpacking mysoft-mysqlbackup-support (1.21022516) ...
dpkg: error processing archive /root/mysoft-mysqlbackup-support-1.21022516-ubuntu.x86_64.deb (--install):
trying to overwrite '/usr/local/mysqlbackup/8.0/lib/private/libnssutil3.so', which is also in package mysoft-test 1.21022516
dpkg-deb: error: subprocess paste was killed by signal (Broken pipe)
Errors were encountered while processing:
/root/mysoft-mysqlbackup-support-1.21022516-ubuntu.x86_64.deb

原因: 存在旧包 mysoft-test (版本号为1.21022516)

root@ubuntu:/home/xtrabackup/build# dpkg -l |grep mysoft-test
ri  mysoft-test                   1.21022516                            amd64        I2 Replication I2Node
rc  mysoft-test-for-article         1.20102800                            amd64        I2 Replication I2Node

(注意以上结果中第一列ri和rc,后续会用到)

尝试apt-get remove卸载mysoft-test 和 mysoft-test-for-article都失败了。

最终解决方法:

dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P

dpkg -l |grep ^ri|awk '{print $2}' |sudo xargs dpkg -P

再次查询 

dpkg -l |grep ^rc  或 dpkg -l |grep ^ri可看到已经卸载成功了。

如果还存在,就通过强制安装

dpkg -i --force-all [deb file path]

dpkg - How force remove when post-installation script always fail - Ask Ubuntu

trying to remove xmail with dpkg --purge --force-all xmail failed because the pre-removal script was exiting with a failure attempting to stop the xmail daemon. I found the solution here: debian - how to remove a package which post-installation and pre-removal script fails? - Server Fault

specifically, I edited /var/lib/dpkg/info/xmail.prerm and changed || exit $! to || true