dpkg #
dpkg的功能可分为四部分:
- 管理DEB(dpkg-deb)
- 安装包
- 查询包管理数据库(dpkg-query)
- 移除包
管理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互不相干。