我刚刚重新安装了 Ubuntu MATE 15.10。我已遵循这个答案保存已安装软件包的列表并在新安装的系统上恢复它。
然而,当我这样做的时候
sudo dpkg --set-selections < packages-backup.list
我收到一长串错误消息,如下所示:
dpkg: warning: package not in database at line 1417: sqlite3
dpkg: warning: package not in database at line 1417: sqliteman
dpkg: warning: package not in database at line 1417: sqliteman-doc
最后
dpkg: warning: found unknown packages; this might mean the available database is outdated, and needs to be updated through a frontend method
于是我运行了sudo apt-get update
一次又一次,dpkg
但仍然出现同样的错误。
我似乎对列表中的每个软件包都收到此错误消息,包括默认内核或 sqlite 等相当不起眼的软件包。此外,我在之前的设置中没有添加任何额外的 PPA,因此非默认存储库中的软件包不可能是问题所在。
作为测试,我尝试使用 安装其中一个“有问题的”软件包sudo apt-get install
,结果没有任何问题。
这里出了什么问题?
答案1
这些警告可以忽略,因为它们只与dpkg
数据库有关。实际安装由 APT 完成,它不使用此数据库。
当您以这种方式使用时dpkg
,您需要使用dselect-upgrade
以便应用标记的更改。
sudo apt-get dselect-upgrade
来自男人软件包:
请注意,如果您不使用 dselect 而使用基于 APT 的前端,则此文件几乎没用:APT 有自己的系统来跟踪可用的软件包。
答案2
尝试这个:
sudo apt-get install dselect && sudo dselect update
之后你可以执行:
sudo dpkg --set-selections < packages-backup.list
答案3
此方法不需要dselect
包
从 apt 缓存更新 dpkg 数据库:
apt-get update # can skip this
apt-cache dumpavail > /var/cache/apt/available
dpkg --admindir=/var/lib/dpkg --update-avail /var/cache/apt/available
或者使用 root 的单行命令:
dpkg --admindir=/var/lib/dpkg --update-avail <(apt-cache dumpavail)
答案4
以下脚本对我来说是一种解决方法。注意 linux-images 和 linux-headers。如果你的 dpkglist.txt 中有很多这样的文件,那么你可能想要用 grep -v 命令过滤掉它们,比如
cat dpkglist.txt | grep "$l_mode" | grep -v linux-headers | grep -v linux-image-3 | grep -v linux-image-extra-3 | cut -f1
通过 apt-get 从 dpkglist.txt 安装和卸载软件包的脚本
#!/bin/bash
#
# get the packages
#
# param 1: l_mode: install or deinstall
#
packages() {
local l_mode="$1"
# get the lines for the given mode
cat dpkglist.txt | grep "$l_mode" | cut -f1
}
#
# loop over the packages in the given mode
# param 1: l_mode: install or deinstall
#
loop() {
local l_mode="$1"
for package in $(packages $l_mode)
do
case "$l_mode" in
install) apt-get -y install $package;;
deinstall) apt-get -y remove $package;;
esac
done
}
# do two loops
loop deinstall
loop install