How do I export a list of installed Debian packages on a system, and then install those same packages on a new system?


To backup:

sudo dpkg --get-selections > /tmp/dpkglist.txt

To Restore:

sudo dpkg --set-selections < /tmp/dpkglist.txt
sudo apt-get -y update
sudo apt-get dselect-upgrade

Also see this question for additional options and info: Ubuntu, how to setup a new machine like an existing one

I have the above running in a daily cronjob that checks the dpgklist into SVN as part of our server inventory. This will allow you to keep a reasonable accurate inventory of installed packages across your servers and its easy to do a quick side-by-side diff to see if a server is missing a particular package.

  • 2
    I get this error message for each input line: dpkg: warning: package not in status nor available database at line ... – danorton Mar 21 '19 at 14:58
  • this way doesnt work since few ubuntu versions – QkiZ Dec 30 '19 at 16:44

aptitude also satisfies this usecase, and it preserves information about "automatically installed" packages that other methods do not. Run the following on the reference machine:

aptitude search -F '%p' '~i!~M' > package_list 

Copy package_list to the other machine and run

xargs aptitude --schedule-only install < package_list; aptitude install; 
  • Just a minor note. According to the aptitude reference manual, the "package" field is "expandable" by default, so aptitude search -F '%p' '~i!~M' > package_list should also work fine. – chronos Oct 17 '13 at 23:34
  • Regarding package backup: see plug for deborphan @ bogdan.org.ua/2013/10/18/… – TomRoche Nov 17 '15 at 5:43
  • [insert your own linebreaks, since http://serverfault.com/editing-help#linebreaks lies] Regarding package restore: this will need to be done as root, no? If so,<br/> The xargs in your restore commandline= xargs aptitude --schedule-only install < package_list; aptitude install; makes me want to know,<br/> 1. Why does aptitude need the xargs? dpkg --set-selections doesn't.<br/> 2. Presuming aptitude does need the xargs, where to put one or more sudos in your restore commandline? Or otherwise get root for running that line, presuming that's necessary. – TomRoche Nov 17 '15 at 6:00

That's a good idea, and you might also set up one server with apt-proxy if you make a habit of this.

  • After playing around with several proxies for apt, I ended up deciding on apt-cacher-ng. apt-cacher-ng is very simple to setup and from several accounts it seems to be more robust than the original apt-proxy. Each person has their own favourite though. unix-ag.uni-kl.de/~bloch/acng – faultyserver Aug 20 '09 at 21:06
  • My vote is for approx, it's the only one that isn't some kind of insane. – womble Aug 20 '09 at 23:08
  • Interesting... I've not actually tried any of the alternatives. – user17642 Aug 21 '09 at 16:00

faultyservers answer worked for me only after running a different command as per http://rayslinux.blogspot.de/2012/10/ubuntu-1210-dpkg-warning-package-not-in.html

sudo apt-get install dselect sudo dselect access sudo dselect update

Before that running

sudo apt-get dselect-upgrade

only returned

dpkg: warning: package not in database at line 302: xfonts-utils
dpkg: warning: found unknown packages; this might mean the available database is outdated, and needs to be updated through a frontend method
pi@FHEM-new:/tmp $ sudo apt-get dselect-upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

I was trying to install the same packages from my old Raspberry Pi (running Raspbian GNU/Linux 7 (wheezy)) on my new Raspberry (Raspbian GNU/Linux 8 (jessie)).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.