cook:dpkg

cook:dpkg

dpkg #

dpkg的功能可分为四部分:

  1. 管理DEB(dpkg-deb)
  2. 安装包
  3. 查询包管理数据库(dpkg-query)
  4. 移除包

管理DEB(dpkg-deb) #

dpkg-deb --info postfix_2.1.5-1_i386.deb
dpkg-deb --field postfix_2.1.5-1_i386.deb Version
dpkg-deb --field postfix_2.1.5-1_i386.deb Recommends Suggests
dpkg-deb --contents postfix_2.1.5-1_i386.deb
dpkg-deb --control postfix_2.1.5-1_i386.deb
dpkg-deb --extract postfix_2.1.5-1_i386.deb .

安装DEB #

dpkg --install ./postfix_2.1.5-1_i386.deb
dpkg --unpack postfix_2.1.5-1_i386.deb

dpkg在安装时会把包的信息放在/var/lib/dpkg/info/目录之下。

dpkg --configure postfix

移除rc标识的包 #

dpkg-query的man文档中有各个状态字符的说明。

dpkg --list | grep ˆrc | awk ’ { print $2 } ’ | xargs dpkg -P

不过上面的命令可能会出错,因为dpkg的输出中包名的长度是固定值,因此有的包可能无法完整显示名称,这时再用dpkg -P命令删除时就会出错,解决办法是使用COLUMNS环境变量。

COLUMNS=1000 dpkg --list | grep ˆrc | awk ’ { print $2 } ’ | xargs dpkg -P

当然,使用dpkg-query也能很好地完成任务。

dpkg-query --show --showformat='${Status} ${Package}\n' | grep ˆdeinstall | cut -d' ' -f4 | xargs dpkg -P

查看包的信息 #

即可用dpkg –info也可用dpkg –status,后者比前者多了安装状态信息。

dpkg-awk #

搜索包的另一个工具是dpkg-awk:

dpkg-awk --sort Section Version:ˆ0.0?[12]- -- Package Status

从文件找安装包 #

dpkg --search /usr/lib/postfix/*d

dlocate #

用dlocate查找包的安装文件时,可以根据类别列出相关文件,比如配置文件。

dlocate -lsconf postfix

dlocate也可用于验证哈希码:

dlocate -md5check postfix

hold状态 #

hold只能阻止自动升级,手动升级还是能够做到的。dpkg中把hold状态称为 selection,查看hold状态用:

dpkg --get-selections apt-doc apt-utils at

设置hold状态:

echo postfix hold | dpkg --set-selections

包的卸载 #

debian中deinstall和purge是两个不同概念。deinstall(remove)会保留 conffiles,而purge会清除之。默认情况下,debian都会选用remove。同时移除多个包,可用下面的命令:

̃# echo postfix deinstall | dpkg --set-selections
̃# dpkg --remove --pending
̃# echo postfix purge | dpkg --set-selections
̃# dpkg --purge --pending

突破dpkg的限制 #

不检查依赖关系:

dpkg --remove --force-depends vim-common

覆盖文件,往往用在使用相同conffiles,但却没有标识冲突的两个包:

dpkg --install --force-overwrite coreutils_5.0.91-2_i386.deb

处理包的错误 #

依赖不满足的问题,A包被破坏,而B包依赖A包,这时要重新安装A包,同时对B包执行configure:

̃# dpkg --install /var/cache/apt/archives/netbase_4.19_all.deb
̃# dpkg --configure postfix

尽量不使用强制安装,可以考虑使用equivs和checkinstall。

文件冲突的处理。一般来说,只有不同源的情况下才可能出现文件冲突。 foo包要安装/usr/bin/foobar,可是这个文件也在bar包中。这时可以告诉dpkg,让其它所有版本的/usr/bin/foobar使用另一个文件名:

dpkg-divert --package foo --rename --divert /usr/bin/foobar.bar /usr/bin/foobar

处理被破坏的控制脚本。比如postinst脚本出错,这时主要的解决办法是对调试脚本错误,下面的命令会在脚本的第1行添加set -x,这样可以看到每个具体的命令:

sed -i -e ’1aset -x’ /var/lib/dpkg/info/netbase.postinst

再不行的话,可以在脚本的某个位置添加下面的语句,让脚本正确结束:

exit 0

dselect的可安装文件目录在/var/lib/available,与apt互不相干。

From #