在Ubuntu9.04下卸载用dpkg命令安装的Ubuntu9.10新版软件包并重新安装旧版软件包

需求:
在Ubuntu 9.04下面手动下载了Ubuntu 9.10下面的libxml2包满足其它的软件编译要求,结果仍不能完成编译(注:后来用下载libxml2源码安装的方法解决编译要求),并且与系统中的软件包产生依赖关系的冲突(在屏幕右上角出现一个中间一红色横线的圆圈图标,是软件包自动升级的提示图标所在位置)。因此,需要删除新安装的高版本的deb包并且恢复9.04下面旧版本的软件包。

解决的步骤:
sudo dpkg -r --force-all libxml2   //强制卸载新版本的libxml2,但 dpkg --force-help中指出:“警告 - 使用带有[!]标记的选项可能会严重破坏您的系统。”, --force-all即是带有[!]标记的

sudo apt-get install libxml2   //安装ubuntu9.04本身旧版本的libxml2

失败的步骤:
sudo apt-get --reinstall install libxml2
sudo dpkg -r libxml2

apt-get remove卸载的时候因为要检查依赖关系,所以在这个例子里,如果用sudo apt-get remove libxml2的命令卸载的话会连带卸载掉数百个软件!

参考文章:
dpkg软件包管理器http://book.csdn.net/bookfiles/710/10071022117.shtml
此文中说到“使用dpkg可以直接卸载指定的软件包。但要小心,dpkg不会理睬系统中软件间复杂的关联关系,删除指定软件包后,其他与之相关的软件包将置之不理。“应该是可以使用--force-* 选项强制卸载的意思。

而在apt-get 中,我还没有找到这种卸载指定软件包而不管其它依赖关系的方法。

也就是说,dpkg也是要检查依赖关系的,但可以不顾这种依赖关系而强制进行软件包的安装或卸载。

总结:
不要安装非本系统版本的deb包,因为由于包之间的依赖关系可能引起各种问题。如果要安装某软件的新版本,可以考虑从源代码编译安装。

备注:
我对apt-get和dpkg也没有深刻的理解,此文仅供参考。欢迎交流和批评指正。电子邮件:dashing.meng#gmail.com(请将#换成@)

下面是执行的全部步骤:

tester@tester-laptop:~/Desktop$ sudo dpkg -i libxml2_2.7.5.dfsg-1ubuntu1_i386.deb
(正在读取数据库 ... 系统当前总共安装有 277462 个文件和目录。)
正预备替换 libxml2 2.6.32.dfsg-5ubuntu4.2 (使用 libxml2_2.7.5.dfsg-1ubuntu1_i386.deb) ...
正在解压缩将用于更替的包文件 libxml2 ...
正在设置 libxml2 (2.7.5.dfsg-1ubuntu1) ...

正在处理用于 libc6 的触发器...
ldconfig deferred processing now taking place
tester@tester-laptop:~/Desktop$ dpkg -l libxml2
期望状态=未知(u)/安装(i)/删除(r)/清除(p)/保持(h)
| 当前状态=未(n)/已安装(i)/仅存配置(c)/仅解压缩(U)/配置失败(F)/不完全安装(H)/触发器等待(W)/触发器未决(T)
|/ 错误?=(无)/保持(H)/须重装(R)/两者兼有(X) (状态,错误:大写=故障)
||/ 名称         版本         简介
+++-==============-==============-============================================
ii  libxml2        2.7.5.dfsg-1ub GNOME XML library
tester@tester-laptop:~/Desktop$
tester@tester-laptop:~/Desktop$ sudo apt-get --reinstall install libxml2
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
不能重新安装 libxml2,因为无法下载它。
共升级了 0 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 1 个软件未被升级。
tester@tester-laptop:~/Desktop$
tester@tester-laptop:~/Desktop$ sudo apt-get remove libxml2
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
下列软件包是自动安装的并且现在不再被使用了:
  libopenal1 libclucene0ldbl liborbit2-dev libwildmidi0 libchewing3-data
  libboost-regex1.34.1 libsigc++-2.0-dev stardict-common libatk1.0-dev
  libbabl-0.0-0 libxine1-x wine-gecko kdebase-runtime-data-common
省略......
  xsltproc xulrunner-1.9 yelp zenity
共升级了 0 个软件包,新安装了 0 个软件包,要卸载 450 个软件包,有 0 个软件未被升级。
解压缩后将会空出 1475MB 的空间。
您希望继续执行吗?[Y/n]n

tester@tester-laptop:~/Desktop$ sudo dpkg -r libxml2
dpkg:由于依赖问题的缘故,libxml2 不能被删除:
 libgnome-media0 依赖于 libxml2 (>= 2.6.27).
 openbox 依赖于 libxml2 (>= 2.6.27).
 python-gnome2-extras 依赖于 libxml2 (>= 2.6.27).
 libraptor1 依赖于 libxml2 (>= 2.6.27).
 gstreamer0.10-tools 依赖于 libxml2 (>= 2.6.27).
 libgmyth0 依赖于 libxml2 (>= 2.6.27).
省略......
libmagickcore1 依赖于 libxml2 (>= 2.6.27).
 libffado0 依赖于 libxml2 (>= 2.6.27).
 libgnomekbd3 依赖于 libxml2 (>= 2.6.27).
 python-lxml 依赖于 libxml2 (>= 2.6.32).
 libbonoboui2-0 依赖于 libxml2 (>= 2.6.27).
dpkg:处理 libxml2 (--remove)时出错:
 依赖问题 - 即将不删除
在处理时有错误发生:
 libxml2
tester@tester-laptop:~/Desktop$
tester@tester-laptop:~/Desktop$ sudo dpkg -r --force-all libxml2
dpkg:libxml2:有依赖问题,但是如您所愿还是继续删除:
 libgnome-media0 依赖于 libxml2 (>= 2.6.27).
 openbox 依赖于 libxml2 (>= 2.6.27).
 python-gnome2-extras 依赖于 libxml2 (>= 2.6.27).
 libraptor1 依赖于 libxml2 (>= 2.6.27).
省略......
 seahorse-plugins 依赖于 libxml2 (>= 2.6.27);然而:
  即将删除 libxml2。
 shared-mime-info 依赖于 libxml2 (>= 2.6.27).
 libmagickcore1 依赖于 libxml2 (>= 2.6.27).
 libffado0 依赖于 libxml2 (>= 2.6.27).
 libgnomekbd3 依赖于 libxml2 (>= 2.6.27).
 python-lxml 依赖于 libxml2 (>= 2.6.32).
 libbonoboui2-0 依赖于 libxml2 (>= 2.6.27).
(正在读取数据库 ... 系统当前总共安装有 277461 个文件和目录。)
正在删除 libxml2 ...
正在处理用于 libc6 的触发器...
ldconfig deferred processing now taking place
tester@tester-laptop:~/Desktop$

tester@tester-laptop:~/Desktop$ sudo apt-get install libxml2
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
下列【新】软件包将被安装:
  libxml2
共升级了 0 个软件包,新安装了 1 个软件包,要卸载 0 个软件包,有 1 个软件未被升级。
需要下载 0B/821kB 的软件包。
解压缩后会消耗掉 1675kB 的额外空间。
选中了曾被取消选择的软件包 libxml2。
(正在读取数据库 ... 系统当前总共安装有 277451 个文件和目录。)
正在解压缩 libxml2 (从 .../libxml2_2.6.32.dfsg-5ubuntu4.2_i386.deb) ...
正在设置 libxml2 (2.6.32.dfsg-5ubuntu4.2) ...

正在处理用于 libc6 的触发器...
ldconfig deferred processing now taking place
tester@tester-laptop:~/Desktop$
tester@tester-laptop:~/Desktop$ dpkg -l libxml2
期望状态=未知(u)/安装(i)/删除(r)/清除(p)/保持(h)
| 当前状态=未(n)/已安装(i)/仅存配置(c)/仅解压缩(U)/配置失败(F)/不完全安装(H)/触发器等待(W)/触发器未决(T)
|/ 错误?=(无)/保持(H)/须重装(R)/两者兼有(X) (状态,错误:大写=故障)
||/ 名称         版本         简介
+++-==============-==============-============================================
ii  libxml2        2.6.32.dfsg-5u GNOME XML library
tester@tester-laptop:~/Desktop$

在/etc/apt/sources.list中加入karmic的源后的测试结果:
tester@tester-laptop:~/Desktop$ sudo apt-get update
tester@tester-laptop:~/Desktop$ sudo dpkg -i libxml2_2.7.5.dfsg-1ubuntu1_i386.deb
(正在读取数据库 ... 系统当前总共安装有 277689 个文件和目录。)
正预备替换 libxml2 2.6.32.dfsg-5ubuntu4.2 (使用 libxml2_2.7.5.dfsg-1ubuntu1_i386.deb) ...
正在解压缩将用于更替的包文件 libxml2 ...
正在设置 libxml2 (2.7.5.dfsg-1ubuntu1) ...

正在处理用于 libc6 的触发器...
ldconfig deferred processing now taking place
tester@tester-laptop:~/Desktop$ sudo apt-get --reinstall install libxml2
正在读取软件包列表... 完成
正在分析软件包的依赖关系树      
正在读取状态信息... 完成      
您可能需要运行“apt-get -f install”来纠正下列错误:
下列的软件包有不能满足的依赖关系:
  libxml2-dev: 依赖: libxml2 (= 2.6.32.dfsg-5ubuntu4.2) 但是 2.7.5.dfsg-1ubuntu1 正要被安装
E: 有未能满足的依赖关系。请尝试不指明软件包的名字来运行“apt-get -f install”(也可以指定一个解决办法)。
tester@tester-laptop:~/Desktop$ sudo apt-get -f install
正在读取软件包列表... 完成
正在分析软件包的依赖关系树      
正在读取状态信息... 完成      
正在更正依赖关系... 完成
将会安装下列额外的软件包:
  libxml2-dev
下列的软件包将被升级:
  libxml2-dev
共升级了 1 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 1298 个软件未被升级。
需要下载 745kB 的软件包。
解压缩后会消耗掉 12.3kB 的额外空间。
您希望继续执行吗?[Y/n]y
获取:1 http://tw.archive.ubuntu.com karmic/main libxml2-dev 2.7.5.dfsg-1ubuntu1 [745kB]
下载 745kB,耗时 1min 4s (11.5kB/s)                                           
(正在读取数据库 ... 系统当前总共安装有 277689 个文件和目录。)
正预备替换 libxml2-dev 2.6.32.dfsg-5ubuntu4.2 (使用 .../libxml2-dev_2.7.5.dfsg-1ubuntu1_i386.deb) ...
正在解压缩将用于更替的包文件 libxml2-dev ...
正在处理用于 man-db 的触发器...
正在设置 libxml2-dev (2.7.5.dfsg-1ubuntu1) ...

下面回到Ubuntu 9.04的旧版本libxml2 和 libxml2-dev

tester@tester-laptop:~/Desktop$
tester@tester-laptop:~/Desktop$sudo dpkg -r --force-all libxml2 libxml2-dev

删除/etc/apt/sources.list里面 Ubuntu 9.10中的源
tester@tester-laptop:~/Desktop$sudo apt-get update
tester@tester-laptop:~/Desktop$ sudo apt-get install libxml2 libxml2-dev