How to copy / clone installed packages from one
Debian server to another
1. Dump all installed server packages from Debian Linux
server1
First it is necessery to dump a list of all installed packages on
the server from which the intalled deb packages 'selection' will be
replicated.
debian-server1:~# dpkg --get-selections \* >
packages.txt
The format of the produced
packages.txt file will have only
two columns, in
column1 there will be the package
(name) installed and in
column 2, the status of the package
e.g.:
install or
deinstall
Note that you can only use the
--get-selections as root
superuser, trying to run it with non-privileged user I got:
hipo@server1:~$ dpkg --set-selections > packages.txt
dpkg: operation requires read/write access to dpkg status
area
2. Copy packages.txt file containing the installed deb packages
from server1 to server2
There is many way to copy the
packages.txt package
description file, one can use
ftp,
sftp,
scp,
rsync ... lftp or even copy it via wget if placed in some
Apache directory on server1.
A quick and convenient way to copy the file from Debian
server1 to
server2 is with
scp as it can also
be used easily for an automated script to do the packages.txt file
copying (if for instance you have to
implement package cloning
on multiple Debian Linux servers).
root@debian-server1:~# scp ./packages.txt
hipo@server-hostname2:~/packages.txt
The authenticity of host '83.170.97.153 (83.170.97.153)' can't be
established. RSA key fingerprint is
38:da:2a:79:ad:38:5b:64:9e:8b:b4:81:09:cd:94:d4. Are you sure you
want to continue connecting (yes/no)? yes Warning: Permanently
added '83.170.97.153' (RSA) to the list of known hosts.
hipo@83.170.97.153's password:
packages.txt
As this is the first time I make connection to
server2 from
server1, I'm prompted to accept the host RSA unique
fingerprint.
3. Install the copied selection from server1 on server2 with
apt-get or dselect
debian-server2:/home/hipo# apt-get update
...
debian-server2:/home/hipo# apt-get upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
debian-server2:/home/hipo# dpkg --set-selections <
packages.txt
debian-server2:/home/hipo# apt-get -u dselect-upgrade
--yes
The first
apt-get update command assures the server will
have the latest version of the packages currently installed, this
will save you from running an outdated versions of the installed
packages on
debian-server2
Bear in mind that using
apt-get sometimes, might create
dependency issues. This is depending on the exact package names,
being replicated in between the servers
Therefore it is better to use another approach with bash for loop
to "replicate" installed packages between two servers, like
so:
debian-server2:/home/hipo# for i in $(cat packages.txt |awk
'{ print $1 }'); do aptitude install $i; done
If you want to automate the questioning about aptitude operations
pass on the
-y
debian-server2:/home/hipo# for i in $(cat packages.txt |awk
'{ print $1 }'); do aptitude -y install $i; done
Be cautious if the
-y is passed as sometimes some packages
might be removed from the server to resolve dependency issues, if
you need this packages you will have to again install them
manually.
4. Mirroring package selection from server1 to server2 using one
liner
A quick one liner, that does replicate a set of preselected
packages from
server1 to
server2 is also possible
with either a combination of
apt, ssh, awk and dpkg or with
ssh + dpkg + dselect :
a) One-liner code with
apt-get unifying the installed
packages between 2 or more servers
debian-server2:~# apt-get --yes install `ssh
root@debian-server1 "dpkg -l | grep -E ^ii" | awk '{print
$2}'`
...
If it is necessery to install on more than just debian-server2,
copy paste the above code to all servers you want to have identical
installed packages as with
debian-server1 or use a shor for
loop to run the commands for each and every host of multiple
servers group.
In some cases it might be better to use
dselect instead as
in some situations using apt-get might not correctly solve the
package dependencies, if encountering problems with dependencies
better run:
debian-server2:/home/hipo# ssh root@debian-server1 'dpkg
--get-selections' | dpkg --set-selections && dselect
install
As you can see using this second dselect installed "package"
mirroring is also way easier to read and understand than the prior
"cryptic" method with apt-get, hence I personally think using
dselect method is a better.
Well that's basically it. If you need to synchronize also
configurations, either an rsync/scp shell script, should be used
with all defined
server1 config files or in case if a
cloning of packages between identical server machines is necessery
dd or some other tool like
Norton Ghost could be
used.
Hope this helps, someone.