16

I just reinstalled Ubuntu MATE 15.10 from scratch. I had followed this answer to save a list of installed packages and restore it on the newly installed system.

However, when I do

sudo dpkg --set-selections < packages-backup.list

I get a long list of error messages like these:

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

and finally

dpkg: warning: found unknown packages; this might mean the available database is outdated, and needs to be updated through a frontend method

So I ran sudo apt-get update and re-ran dpkg but I keep getting the same error.

I seem to get this error message for every single package in the list, including rather unspectacular ones such as the default kernel or sqlite. Also, I had not added any additional PPAs on my previous setup, thus packages from non-default repositories can't be the issue here.

As a test, I tried to install one of the "offending" packages with sudo apt-get install, which worked without any issues.

What's going wrong here?

user149408
  • 1,453
  • 4
  • 15
  • 30

5 Answers5

8

The warnings are safe to ignore, as they only concern the dpkg database. Actual installation is done with APT, which doesn't use this database.

When you are using dpkg in this manner, you need to use dselect-upgrade in order to apply the changes marked.

sudo apt-get dselect-upgrade

From man dpkg:

Note that this file is mostly useless if you don't use dselect but an APT-based frontend: APT has its own system to keep track of available packages.

user149408
  • 1,453
  • 4
  • 15
  • 30
philsf
  • 864
7

Try this:

sudo apt-get install dselect && sudo dselect update

After you can execute:

sudo dpkg --set-selections < packages-backup.list
4

In recent versions of Debian/Ubuntu/Mint, dpkg needs available packages to be in its "avail" database for dpkg --set-selections to work.

Example sequence:

  1. (On other system) dpkg --get-selections > installed.dselect
  2. sudo apt update
  3. apt-cache dumpavail | sudo dpkg --merge-avail
  4. sudo dpkg --set-selections < installed.dselect
  5. sudo apt-get dselect-upgrade

The third command populates dpkg's "avail" database. It's important to run this before setting the selections of which additional packages to install.

This reqires dpkg v1.17.7 and later. See Q: Why does ''dpkg --set-selections'' not record selections for unknown packages? on the Debian wiki for more details.

3

This method does not require dselect package

To update dpkg database from apt cache:

apt-get update # can skip this
apt-cache dumpavail > /var/cache/apt/available
dpkg --admindir=/var/lib/dpkg --update-avail /var/cache/apt/available

Or one-liner with root:

dpkg --admindir=/var/lib/dpkg --update-avail <(apt-cache dumpavail)
jcppkkk
  • 163
0

The following script was a workaround for me. Watch out for linux-images and linux-headers. If you have many of those in your dpkglist.txt then you might want to filter these out with grep -v commands like

 cat dpkglist.txt | grep "$l_mode" | grep -v linux-headers | grep -v linux-image-3 | grep -v linux-image-extra-3 | cut -f1

script to install and uninstall packages from dpkglist.txt via apt-get

#!/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