Monday, November 15, 2010

Package Installation

Install a binary package

rpm -i packagename-1.0.0-kll.i386.rpm

Install a package, verbose output

rpm -iv packagename-1.0.0-kll.i386.rpm

Install a package, verbose mode, print progress hash

rpm -ivh packagename-1.0.0-kll.i386.rpm

Upgrade a package. Install package if not already installed.

rpm -Uvh packagename-1.0.0-kll.i386.rpm

Upgrade a package if it is already installed. Does nothing if package is not installed.

rpm -Fvh packagename-1.0.0-kll.i386.rpm

Re-Install an existing package (useful for corrupted packages)

rpm --replacepkgs -ivh packagename-1.0.0-kll.i386.rpm

Package Removal
Uninstall (erase) a package

rpm -e packagename
rpm -e packagename-version

Package Query
Query if a package is installed

rpm -q packagename

Print information about an installed package

rpm -qi packagename

Print information about an rpm package file.

rpm -qip packagename-1.0.0-kll.i386.rpm

Print name of package that owns a file

rpm -qf /path/to/file

Print list of files belonging to a package

rpm -ql packagename

Print names of all installed packages

rpm -qa

Print name and size of all installed packages

rpm -qa --queryformat "%-20{name} \t %20{size}\n"

Print name and summary for the package called bash.

rpm -q --queryformat "%{name} \t %{summary}\n" bash

Report if package contents, time stamps, checksums have changed. Important flags include:

* S File Size
* M Permissions/Filetype
* 5 MD5 Sum
* U Ownership
* T Time stamp

Read the manpages for the full listing.

rpm --verify packagename

Or to verify all packages:

rpm -Va

Maintenance

Rebuild the RPM database

rpm --rebuilddb

Building from Source

Rebuild a source RPM (RPM 4.0)

rpmbuild --rebuild packagename-1.0.0-kll.src.rpm

Rebuild a source RPM (RPM 3.x)

rpm --rebuild packagename-1.0.0-kll.src.rpm

Rebuild a package with Athlon optimizations

rpmbuild --rebuild --target=athlon packagename-1.0.0-kll.src.rpm

Install RPM sources into ${RPMDIR}

rpm -i packagename-1.0.0-kll.src.rpm

Rebuild all packages, including source and binary RPMS, from a spec file

rpmbuild -ba packagename.spec

Rebuild a binary RPM from a spec file

rpmbuild -bb packagename.spec

Creating a local RPM build tree in $HOME

cd $HOME
mkdir -p rpm
cd rpm
mkdir BUILD RPMS SOURCES SPECS SRPMS
cd RPMS
mkdir i386 i486 i586 i686 athlon noarch ppc mipsel (etc...)

Edit ${HOME}/.rpmmacros Add:

%_topdir ${HOME}/rpm
%_tmppath ${HOME}/tmp
# Change to 1 if you want to abort on unpackaged files
%_unpackaged_files_terminate_build 0
# Don't build debuginfo packages
%debug_package %{nil}

(NOTE: Use the full path instead of ${HOME} as $HOME is not expanded.

Creating an RPM
Why go through the hassle of creating an RPM to distribute your package? The main reasons are ease of installation for the end user, the ability to control exactly how your application gets installed, and the ability to recreate the package exactly. Download the sample specfile and source tarball for this next section.

Section 1

Summary: A program to print a famous greeting.
Name: hello
Version: 1.0.0
Release: 1
Copyright: GPL
Group: System Environment/Base
Source: http://www.digitalhermit.com/~kwan/hello-1.0.0.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}

This section contains information about the package. The summary field is a one line, er, summary of the entire package. The Name, Version and Release tags are used to generate the final rpm package name. The basename of the Source tag, in this case "hello-1.0.0.tar.gz", is the what RPM will attempt to extract to build the package. BuildRoot specifies the temporary directory where the package will get built. The environment variables are defined in /usr/lib/rpm/macros on most systems.

%description
This program prints a friendly greeting.

The description tag contains a more in depth description of the package.

%prep
%setup -q
%build
make
%install
make ROOT="$RPM_BUILD_ROOT" install
%clean
rm -rf $RPM_BUILD_ROOT
%files
%defattr(-,root,root)
%doc README
%{_bindir}/hello

These are the steps used to build and install the package. Note that the ROOT variable is passed to the Makefile in our example package:

install: hello
install -m 755 -o 0 -g 0 -d $(ROOT)/usr/bin/
install -m 755 -o 0 -g 0 hello $(ROOT)/usr/bin/hello

Though not absolutely necessary, it allows the end-user to have more control over where the package contents are installed.

RPM will automatically put files in the %doc tag in the proper documents directory (often /usr/share/doc/). It also allows the option of not installing the documentation files for small-disk systems.

%changelog
* Mon Apr 7 2003 Kwan Lowe
- Did stuff.
* Mon Apr 6 2003 Kwan Lowe
- Initial version.

The changelog section details what changes have been made in this version of the package. It allows the end-user to easily track the differences between package versions.

To build the example package, place the hello-1.0.0.tar.gz file in your ${RPMROOT}/SOURCES directory and the hello.spec file in your ${RPMROOT}/SPECS directory. Next, change to the SPECS directory and run the following command:

rpm -ba hello.spec

Or, on RPM 4.0 systems:

rpmbuild -ba hello.spec

This will create a source and binary RPM.

Advanced Topics
Create a new RPM database for the alternate root. The ${ROOTPATH}/var/lib/rpm directory must exist. Note the difference between the install root specified here and the build root in the previous section.

rpm --root=/path/to/alternate/root --initdb

Install package into an alternate root filesystem (useful for initial installation of the Operating System. Also useful in case you break your system and need to reinstall from a rescue disk (e.g., incorrect glibc library).

rpm --root=/path/to/alternate/root -ivh packagename-1.0.0-kll.i386.rpm

Extract files from a binary rpm.

mkdir tmp
cd tmp
rpm2cpio packagename-1.0.0-kll.i386.rpm | cpio -ivd

Troubleshooting

No job control in shell.

Verify that the system rpm macros file (/usr/lib/rpm/macros) contains all the macros used in the package spec file.


error: cannot get exclusive lock on /var/lib/rpm/Packages
error: cannot open Packages index using db3 - Operation not permitted (1)
error: cannot open Packages database in /var/lib/rpm

Need to be root to install packages into system. -or- Another root session has locked the rpm database. -or- The database has not been created.

Failed dependencies

Check relevant RPM sources to satisfy needed packages.

© 2002, 2003 Kwan Lowe DigitalHermit

No comments:

Post a Comment