IntroductionRPM (RPM Package Manager) is a popular utility for installing software on Unix-like systems, particularly Red Hat Linux. The name RPM variously refers to the .rpm file format.
It is an open packaging system available for anyone to use. It allows users to take source code for new software and package it into source and binary form such that binaries can be easily installed and tracked and source can be rebuilt easily. It also maintains a database of all packages and their files that can be used for verifying packages and querying for information about files and/or packages.
Design GoalsRPM provides the capability to install an entire application with a single command, to track the files it put on the system, and to remove those files by using another single command.
- Make it easy to verify a package was installed correctly.
- Make it easy for the package builder.
- Make it start with original source code.
- Make it work on different computer architecture
TerminologyRPM packages are provided as compressed archive files that contain one or more files, as well as instructions specifying installation information about those files, including the ownerships and permissions that should be applied to each file during installation.
The instructions can also contain scripts to be run after installation or before uninstallation. These package files are extremely convenient, they provide a single file that can be easily transferred between machines for installation rather than having to transfer each file to be installed. To help in installation and management, all package files are labeled with highly identifiable names.
Package files have four-part names, which typically look something like:
The four parts of each name are separated from each other by dashes or periods. The structure of the package file name is
name - > name of an application or package that the archive installs on the system version → version number of the software that is contained in the package file release → release of that version of the software the package file contains architecture → architecture identifies the system types for which the package file is appropriate
When building RPMs, go through the following steps:
- Set up the directory structure.
- Place the sources in the right directory.
- Create a spec file that tells the rpmbuild command what to do.
- Build the source and binary RPMs.
The following sections provide details for these steps.
Setting up the directory structure
RPM requires a set of directories (as listed in below Table)in which to perform the build. While the directories locations and names can be changed, unless there's a reason to do so, it's best to use the default layout. Note that if you've installed RPM, the build directories are most likely in place already.
The directory in which the sources are unpacked, and the software is built.
Contains the binary package files created by the build process.
Contains the original sources, patches, and icon files.
Contains the spec files used to control the build process.
Contains the source package files created by the build process.
The RPMS directory usually has a number of architecture-specific subdirectories, such as the following (on an Intel architecture system):
athlon, i386, i486, i586, i686, noarch.
By default, Red Hat Linux systems expect RPMs to be built in the /usr/src/redhat directory.
Do not build RPMs while logged in as root as root can alter any file on the system. Mistakes in building packages can have serious consequences if you are logged in as root.
To build RPMs, At a minimum you need only two things:
- source code in the SOURCES directory
- spec file in the SPECS directory
Placing your sources into the directory structureThe first thing we need to do in order to build a package is to place all the source file directly in the /usr/src/redhat/SOURCES directory. It will be easier if you create a tarball of the source you want to build and then place in the SOURCES directory.
The convention for these tarball files is package-version.tar.gz. For example:
Creating the spec fileThe spec file is nothing more than a text file with a special syntax and having extension .spec. It defines all the actions the rpmbuild command should take to build your application, as well as all the actions necessary for the rpm command to install and remove the application.
The normal naming convention is to name the file with the package name and a .spec filename extension.
The following sections describe these spec file sections and the necessary syntax in each section.
Introduction sectionThe introduction section contains information about the package, the type of information.
- Summary : This is a one line
description of the package.
- Name: This must be the name
string from the rpm filename you plan to use.
- Version : This must be the
version string from the rpm filename you plan to use.
- Release : This is the
release number for a package of the same version.
- Copyright : This line tells
how a package is copyrighted.
- Group : This is a group that
the package belongs to in a higher level package tool or the Red Hat
- Buildroot : This line allows
you to specify a directory as the "root" for building and
installing the new package.
- %description: This is a
multi−line field that should be used to give a comprehensive
description of the package.
prep sectionThis is the second section in the spec file. It is short for prepare, defines the commands necessary to prepare for the build. If you are starting with a compressed tar archive (a tarball) of the sources, the prep section needs to extract the sources. The prep section starts with a %prep statement.
build sectionThe build section contains the commands to build the software. Any sh commands can go here. It starts with a %build statement.
./configure CXXFLAGS=-O3 --prefix=$RPM_BUILD_ROOT/usr
Install sectionThe install section holds the commands necessary to install the newly built application or library. In most cases, your install section should clean out the Buildroot directory and run the make install command. The install section starts with an %install statement.
rm -fr $RPM_BUILD_ROOT
Clean sectionThe clean section cleans up the files that the commands in the other sections create, It starts with a %clean statement. %clean
rm -rf $RPM_BUILD_ROOT
Files section The files section lists the files to go into the binary RPM, along with the defined file attributes. It starts with a %files statement
SampleWhile working on one of my project, Once there was a requirement where I have to deploy the tomcat, place the war into the tomcat at the appropriate directory and also start the tomcat on the client machine using rpm.
To achieve above task, I went through the following steps;
- Created RPM build directory
- Placed our tar file into
- Spec file into SPEC
Note : For security purpose, while creating tar I have removed the war file. So to make it working,
Download the tar file from SOURCES, untar it and then add your war file with name “mxlcloudsso.war” and tar it again and place into SOURCES directory.
To build the rpm :
rpmbuild -ba $redhat/SPECS/mxl_installer.spec
The rpm file will get created under $redhat/RPMS/noarch directory structure.
To install the package:
rpm -i mfe-cloudsso-sl-installer-1.0.0-1.noarch.rpm
It will install the tomcat on your machine, deploy your war file in tomcat ,start the tomcat.
To remove the package:
rpm -e mfe-cloudsso-sl-installer
Note : To remove the rpm, We just need the package name.
Useful command :To build RPMs with the rpmbuild command, use the following basic syntax:
rpmbuild -bBuildStage spec_file
The -b option tells rpmbuild to build an RPM. The extra BuildStage option is a special code that tells the rpmbuild command
Build all, both a binary and source RPM
Build a binary RPM
Build (compile) the program but do not make the
full RPM, stopping just after the %build section
Prepare for building a binary RPM, and stop just
after the %prep section.
Create a binary RPM and stop just after the
Check the listing of files for the RPM and
generate errors if
the buildroot is missing any of the files to be installed
Build a source RPM only