Installing .deb Packages from a Local Repository
Want to jump straight to the meat of this post? Click here.
So you’ve built or downloaded some .deb packages and want to install them on your Ubuntu/Debian server. If these packages do not have (m)any external dependencies, you can use
dpkg -i, otherwise it would make sense to set up a repository and use conventional APT tools.
For instance, if you have followed my previous post and backported PHP 5.3.3 to Lucid, you may want to install the
php5-gd package to enable graphics handling in your PHP scripts. Let’s see:
$ aptitude show php5-gd . . . Depends: libc6 (>= 2.4), libfreetype6 (>= 2.2.1), libgd2-xpm (>= 2.0.36~rc1~dfsg), libjpeg62, libpng12-0 (>= 1.2.13-4), libt1-5 (>= 5.1.0), libx11-6, libxpm4, zlib1g (>= 1:1.1.4), phpapi-20090626+lfs, php5-common (= 5.3.2-1ubuntu4.7) . . .
php5-gd depends on a handful of graphics libraries that are not installed by default on Ubuntu Server, and these libraries in turn have dependencies, so better leave it to APT to deal with all that.
If you agree, here is
I will only consider the setup of a local repository right on a production server. If you need to deploy to many physical and/or virtual servers, you likely already have a network-accessible repository on a dedicated system and so on (if you do not, that is unfortunately beyond the scope of this post.)
I however suggest that you create and maintain such a repository on a reference system, and then simply copy it to production servers, so as to minimize interference with their daily operation.
- If you came here from my PHP backport post, you may create such a reference repository right on the build system and skip this step. Otherwise, you may need to install the
sudo apt-get install dpkg-dev
- Create a directory that will hold the repository, such as
/usr/local/deb, and in it, a subdirectory for each package set:
sudo mkdir -p /usr/local/deb/php5-5.3.3
- In the root of the repository, create an update script, owned by root:
Paste the following:
#!/bin/sh ! cd "$(dirname "$0")" \ && echo "Cannot change directory to $(basename "$0") script location" 1>&2 \ && exit 1 echo "Updating the local repository in" `pwd` find . -mindepth 1 -maxdepth 1 -type d \ | cut -c3- \ | xargs -n 1 -I DIRNAME dpkg-scanpackages DIRNAME DIRNAME/override \ | gzip -c9 >Packages.gz [ $? -ne 0 ] \ && echo "Update failed" 1>&2 \ && [ `id -u` -ne 0 ] && echo "Maybe you've forgotten to sudo?" 1>&2
and give the owner execute permission:
sudo chmod u+x /usr/local/deb/update
Basically, this script runs
dpkg-scanpackagesagainst all immediate subdirectories of its own containing directory and collects the output in a repository index file called
- Copy the packages that you need to deploy to the repository.
For instance, the only PHP packages needed for this WordPress installation to work are
php5-mysql, and the former in turn requires
sudo cp php5-fpm*.deb php5-mysql*.deb php5-common*.deb /usr/local/deb/php5-5.3.3/
- (optional) Create an extra override file in each subdirectory, e.g.:
For the above three packages, paste:
php5-common optional web php5-mysql optional web php5-fpm optional universe/php
(I have extracted these lines from the original Ubuntu 10.10 extra override files, found in the
indicesdirectory of your favorite mirror, e.g. http://us.archive.ubuntu.com/ubuntu/indices/)
- Run the repository update script:
Updating the local repository in /usr/local/deb dpkg-scanpackages: info: Wrote 3 entries to output Packages file.
Create a new
with the following contents:
deb file:/usr/local/deb ./
sudo apt-get update
Test the repository:
sudo apt-get -s install package-name
-s” means simulated install, omit it if you want to do a real one)
sudo apt-get -s install php5-fpm php5-mysql
Expected output (watch for version number and “
. . . The following NEW packages will be installed: php5-common php5-fpm php5-mysql 0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded. Inst php5-common (5.3.3-1ubuntu9.5 localhost) Inst php5-fpm (5.3.3-1ubuntu9.5 localhost) Inst php5-mysql (5.3.3-1ubuntu9.5 localhost) . . .
Finally, package the repository for easy deployment to production servers. Include
Packages.gz, and the
tar cvfPz php5_5.3.3-lucid-backport.tgz \ /usr/local/deb/Packages.gz \ /usr/local/deb/php5-5.3.3/*.deb \ /etc/apt/sources.list.d/local.list
P” option is a shorthand to
--absolute-names– do not strip the leading “
/” from file names.)
Now, to install the backport on another system, simply unpack the archive from wherever you have copied it and run
apt-get as usual:
sudo tar xvf php5_5.3.3-lucid-backport.tgz sudo apt-get update sudo apt-get install php5-fpm php5-mysql