8.4 Querying the RPM Database
You can query RPM's database, which lists the packages installed on your system. For example, to display a simple description of an installed package, use a command like this one:
rpm -q package
In this command, package is the name of the package you want RPM to describe. In response, RPM prints the package name, version, and release number.
Rather than use the -q option and the package name, you can use any of the following alternative options:
You can also tailor the output of an RPM query, by specifying one or more of the following options:
For example, the command:
rpm -qid rhide
displays information about the rhide package, including a list of documentation files included in the package.
8.5 Installing a Package
To install a package, log in as root and issue the following command from a shell prompt:
rpm -ivh package
where package specifies the name of the file that contains the package. You can specify multiple packages, as long as you include a space to separate each package name from its neighbor. For example, the following command installs both the nano and mutt packages from files in the current directory:
rpm -ivh nano-1.2.1-4.i386.rpm mutt-1.4.1-3.i386.rpm
The options used with the rpm command include:
Generally, RPM will successfully install the specified package. However, errors can occur. RPM may report:
The next three sections explain how to resolve these errors.
8.5.1 Package Is Already Installed
If a package has already been installed, RPM will not overwrite the package without your permission:
# rpm -ivh bad-1.0-1.i386.rpm bad package bad-1.0-1 is already installed
If you want to overwrite the package, add the —replacepkgs option to your command:
rpm -ivh --replacepkgs bad-1.0-1.i386.rpm
It may be more appropriate to update the package. Updating the package leaves its configuration files intact, whereas overwriting the package replaces the configuration files with files containing default options. An upcoming section shows you how to update a package.
Of course, it's also possible that you should do nothing. You may have attempted to install the package without first checking whether it's already installed and operational. In that case, you can use RPM to verify that the package is installed correctly and update or overwrite the package only if RPM reports problems.
To verify a package against a package file, issue the following command from a shell prompt:
rpm -Vp package
In the command, package specifies the name of the file that contains the package; for example, basesystem-8.0-1.rpm. In verifying a package, RPM compares the installed files with the original package contents. If RPM detects no discrepancies, no output will appear. Otherwise, RPM displays a line for each file that differs from the original package contents. Figure 8-5 shows the structure of such a line.
Figure 8-5. The structure of RPM's discrepancy report
The first eight characters report discrepancies; each character has the meaning described in Table 8-1. Following the list of discrepancies, you may see the letter c, which denotes that this is a configuration file. Finally, the filename appears.
The configuration files associated with a package are generally modified during installation and use, so it's not unusual for the content of configuration files to differ from that of the original files. You should generally ignore MD5 checksum and file size discrepancies that pertain to configuration files.
You can verify a package against the information recorded in the RPM database when the package was installed. To do so, issue a command of the form:
rpm -V package
Here, package specifies the name the package, for example, basesystem. Another form of the rpm command lets you verify packages that contain a specified file:
rpm -Vf path
In this form, path specifies the absolute pathname of the file. The output of this command is the same as that given earlier.
8.5.2 Conflicting File
Conflict is RPM's term for a situation in which two packages include one or more identically named files that have different contents. For example, suppose that package a contains a file named /etc/superconfig having 12 lines and that package b contains a file named /etc/superconfig having 13 lines. The two packages conflict, because the two instances of /etc/superconfig are inconsistent.
In the event of a conflict, only one of the two conflicting packages is likely to work properly. If you instruct RPM to install a package and RPM finds that one or more of the package files conflict with existing files, RPM reports the conflict and terminates without installing the package:
# rpm -ivh bad-1.0-1.i386.rpm bad /bin/badfile conflicts with file from good-1.0-1
In its report, RPM gives the name of the file and the name of the package that originally installed the file. You can force RPM to install the package, by using the —replacefiles option:
rpm -ivh --replacefiles package
In response, RPM saves and then replaces any conflicting configuration files; it overwrites other types of files. However, using the —replacefiles option is a bit like hitting a malfunctioning mechanical device with a hammer. Sometimes, it's what you must do; but, more often, it merely causes damage. The better way to resolve a conflict is to decide which of the two conflicting packages you prefer. Then, delete the unwanted package and install the preferred one.
8.5.3 Failed Dependency
Packages are not always self-contained: some packages require that other packages be installed before they operate correctly. RPM can identify such dependencies. If you attempt to install a package before you install other packages it requires, RPM reports a "failed dependency" and terminates without installing the package:
# rpm -ivh bad-1.0-1.i386.rpm failed dependencies: mefirst is needed by bad-1.0-1
To resolve a failed dependency, you should install the missing package (or packages) and then install the desired package. If you prefer, you can force RPM to install the package; however, the package may not operate correctly. To force package installation, specify the — nodeps option:
rpm -ivh --nodeps bad-1.0-1.i386.rpm
However, a forcibly installed package is unlikely to work correctly.