Package Management: Difference between revisions
Jump to navigation
Jump to search
Managing alternatives with
(2 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
== Ubuntu / Debian == |
== Ubuntu / Debian == |
||
See [[apt]]. |
|||
'''{{red|NEW}}''' — Do not use <code>apt-get</code> anymore, use <code>apt</code> instead. Mostly the same, but with progress bar! |
|||
=== Basic === |
|||
{{blue|'''Installing'''}} a package '''from REPOSITORIES''', using '''aptitude''': |
|||
<source lang="bash"> |
|||
# ----- Installing from the REPOSITORIES - APTITUDE |
|||
aptitude update # (OPTIONAL) update the local repository cache |
|||
aptitude install <package(s)> # Install given package |
|||
aptitude remove <package(s)> # Remove package (or install it if package name prefixed with - ) |
|||
</source> |
|||
''Note: Advantage of <code>aptitude</code> over <code>apt-get</code> is that it maintains <tt>/var/log/aptitude</tt>, and remove dependencies by default.'' |
|||
{{blue|'''Installing'''}} a package '''from REPOSITORIES''', using <code>apt</code> (a better version of <code>apt-get</code>): |
|||
<source lang="bash"> |
|||
# ----- Installing from the REPOSITORIES - APT |
|||
apt update # (OPTIONAL) update the local repository cache |
|||
apt install <package(s)> # Install given package |
|||
apt install <package(s)>=<version> # Use = to install a specific version (usually to force downgrade) !!! no space !!! |
|||
apt install <package(s)>/<release> # Or use / to install from a specific distribution version !!! no space !!! |
|||
apt upgrade # Install new version of all installed package (without installing new package) |
|||
apt remove <package(s)> # Remove package (or install it if package name prefixed with - ) |
|||
apt autoremove <package(s)> # Remove package and all its unused dependencies |
|||
apt purge <package(s)> # Remove package and related configuration files |
|||
apt autoremove # Remove package installed to satisfy dependencies for some package and that are no more needed |
|||
</source> |
|||
{{blue|'''Installing'''}} a package '''from a .deb PACKAGE file''': |
|||
<source lang="bash"> |
|||
# ----- Installing from a .deb PACKAGE file |
|||
dpkg --install <debfile> # (or -i) Install a package from given .deb file |
|||
</source> |
|||
{{blue|'''Querying'''}} the '''cache''' or '''installed''' packages: |
|||
<source lang=bash> |
|||
# ----- Querying INSTALLED PACKAGE |
|||
dpkg --get-selections # Show the list of packages installed through apt-get |
|||
dpkg --get-selections | grep php # ... filtering for some specific package keyword |
|||
dpkg -l <pattern> # (dpkg-query) List packages matching pattern, incl. version + description |
|||
dpkg -s <package> # (dpkg-query) Report status of specified package |
|||
dpkg -L <package> # List files delivered by a given <package> |
|||
dlocate -L <package> # ... same as above but much faster (require package dlocate) |
|||
dpkg -S <file> # List packages providing given file |
|||
dlocate -S <file> # ... same as above but much faster (require package dlocate) |
|||
dlocate <file> # ... same as dpkg -L -S combined but much faster (require package dlocate) |
|||
debsums -s <pacakge> # List MODIFIED files in given package |
|||
debsums -s # List MODIFIED files in all installed packages |
|||
# ----- Querying the CACHE |
|||
apt-cache search <regex> # Search package cache (package name and description) for given <regex> |
|||
apt-cache search --name-only <regex> # ... same but only search in package name |
|||
apt-cache showpkg <package(s)> # Show version and dependencies information about given package(s) |
|||
apt-cache show <package(s)> # Show information (description...) about given package(s) |
|||
apt-cache dotty <package(s)>|dot -Tpng|display |
|||
# Generate & display dependency graph (require graphviz & imagemagick) |
|||
apt-rdepends -d <package(s)>|dot -Tpng|display |
|||
# Idem (but usually much lighter) |
|||
apt-cache dotty -o APT::Cache::GivenOnly=true $(dpkg --get-selections linux*|awk '{print $1}')|dot -Tpng|display |
|||
# Dependency graph restricted to package(s) given on command line |
|||
aptitude why|why-not <package> # Explain why a package should or cannot be installed on the system |
|||
# ----- Querying a .deb PACKAGE file |
|||
dpkg --info <debfile> # (or -I) Show information of given .deb file |
|||
dpkg --content <debfile> # (or -c) Show content of given .deb file |
|||
# ----- Querying LIST of packages |
|||
deborphan -a | sort # List of all packages that have no dependencies |
|||
apt-show-versions # List all installed packages, and whether there are up-to-date, obsolete, not coming from repo |
|||
apt-show-versions -a # ... idem, but show all available versions |
|||
apt-show-versions | grep -v uptodate # ... only show packages that are no up-to-date (No available version, upgradeable) |
|||
aptitude search '~o' # Similar to 'apt-show-versions' | grep 'No available version' |
|||
</source> |
|||
{{blue|'''Querying'''}} packages that are '''not installed yet''' (may require package '''apt-file'''):<br> |
|||
<source lang=bash> |
|||
apt-file update # (optional - needed 1st time use) |
|||
apt-file list <package> # Search package in repositories, and show the content |
|||
apt-file search <file> # Display the name of all packages within repository that contain this file |
|||
apt-file search -l <file> # ... only print package name |
|||
apt-file search -x "/<file>$" # ... more accurate query using regex |
|||
#View package CHANGELOG |
|||
aptitude changelog <package> # changelog of version that was/will be installed |
|||
aptitude changelog <package>=version # ... specific version |
|||
</source> |
|||
:''Note: An alternative is to use the script '''[{{#file: dweblocate}} dweblocate]''', but '''apt-file''' is more powerful actually'' |
|||
<div style="display:none"><source lang="bash"> |
|||
#!/bin/bash |
|||
# Very handy script to query online debian/ubuntu package database. |
|||
# It more or less imitates the behaviour of dlocate, but is not limited to package installed on the current system. |
|||
# |
|||
# Usage: |
|||
# |
|||
# dweblocate -L <package> List all files in package <package> |
|||
# dweblocate -S <filename> List all packages that contains <filename> |
|||
# |
|||
# Based on script at http://mydebian.blogdns.org/?p=742 |
|||
# Modified by Fuujuhi, 2009. |
|||
DIST=ubuntu # debian | ubuntu |
|||
SUITENAME=jaunty # Not necessary for debian |
|||
if [ "$DIST" = "ubuntu" ] ; then |
|||
LISTURL="http://packages.ubuntu.com/$DISTNAME/all/$2/filelist" |
|||
SEARCHURL="http://packages.ubuntu.com/search?suite=${SUITENAME}&searchon=contents&keywords=$2" |
|||
elif [ "$DIST" = "debian" ] ; then |
|||
LISTURL="http://packages.ubuntu.com/$DISTNAME/all/$2/filelist" |
|||
SEARCHURL="http://packages.debian.org/search?suite=stable&searchon=contents&keywords=$2" |
|||
else |
|||
echo -e "Unknown distribution $DIST... Aborting!" |
|||
exit 1 |
|||
fi |
|||
if [ $# -lt 2 ]; then |
|||
echo -e "Usage:\t$0 -S file \n\t$0 -L package" |
|||
exit 1 |
|||
fi |
|||
if [ "$1" = "-L" ]; then |
|||
wget -q "$LISTURL" -O- | sed -n '/<pre>/,/<\/pre>/ {s/^[^/]*//;/\/pre>/!p}' |
|||
elif [ "$1" = "-S" ]; then |
|||
wget -q "$SEARCHURL" -O- | sed -n '/<table>/,/<\/table>/ { s/[[:space:]]*<a href="[^>]*>\([^<]*\)<\/a>/\1/p}' |
|||
else |
|||
echo "Error: invalid argument \"$1\""; |
|||
exit 2 |
|||
fi |
|||
</source></div> |
|||
{{blue|'''View'''}} package source repository: |
|||
<source lang="bash"> |
|||
apt-cache madison <package> # Display available version of a package in each repository |
|||
</source> |
|||
{{blue|'''View'''}} package installation history: |
|||
<source lang="bash"> |
|||
grep install /var/log/dpkg.log # Also check dpkg.log.1, etc. |
|||
sudo cat /var/log/apt/terl.log # Also check |
|||
sudo cat /var/log/apt/history.log |
|||
</source> |
|||
{{blue|'''Add'''}} a repository: |
|||
<source lang="bash"> |
|||
vi /etc/apt/sources.list # or edit files in /etc/apt/sources.list.d/ |
|||
apt-get update |
|||
</source> |
|||
{{blue|'''Add'''}} a package authentication key: |
|||
<source lang="bash"> |
|||
gpg --keyserver keyserver.ubuntu.com --recv 247D1CFF # (optional) Get the key from some keyserver |
|||
gpg --export --armor 247D1CFF | sudo apt-key add - # Add the key |
|||
</source> |
|||
Miscellaneous: |
|||
<source lang="bash"> |
|||
dpkg-reconfigure popularity-contest # subscribe / unsubscribe to the package usage survey |
|||
apt-get moo # Get super cow powers |
|||
aptitude moo # Get super cow powers? try with -v, -vv |
|||
</source> |
|||
{{blue|'''Add'''}} an CDROM/DVDROM installation media |
|||
Note that a better option is to mount the CDROM as a loop device, and access content via <code>file://</code> URI (see further below). |
|||
<source lang="bash"> |
|||
# ADD media |
|||
sudo apt-cdrom -d=/media/cdrom add # Here mount path is irrelevant |
|||
sudo mount /path/to/debian-8.7.1-amd64-DVD-1.iso /media/cdrom -o loop # Mount *after* apt-cdrom because CD is ejected first |
|||
# Same for other DVD |
|||
# Install from media |
|||
sudo apt install ... |
|||
sudo mount /path/to/debian-8.7.1-amd64-DVD-1.iso /media/cdrom -o loop # Mount *AT THE SAME* path as reported by apt install |
|||
</source> |
|||
See also [http://wiki.yobi.be/wiki/Debian_Commands Debian commands on Yobi.be]. |
|||
=== APT policy === |
|||
Use <code>apt-cache policy</code> to view current package policy: |
|||
<source lang="bash"> |
|||
apt-cache policy # Policy summary |
|||
apt-cache policy <pkg> # Policy for a given <pkg> |
|||
</source> |
|||
Content of file {{file|/etc/apt/apt.conf.d/00default}} (or {{file|/etc/apt/apt.conf}} if that file doesn't exist): |
|||
<source lang="bash"> |
|||
APT::Default-Release "testing"; |
|||
</source> |
|||
This changes the order of preference for packages. Here it says <tt>default=testing=wheezy</tt>, so: |
|||
<source lang="bash"> |
|||
apt-cache policy virtualbox-osevirtualbox-ose: |
|||
# Installed: (none) |
|||
# Candidate: 4.0.2-dfsg-1 |
|||
# Version table: |
|||
# 4.0.4-dfsg-1+b1 0 |
|||
# 500 http://ftp.be.debian.org/debian/ sid/main amd64 Packages |
|||
# 4.0.2-dfsg-1 0 |
|||
# 990 http://ftp.be.debian.org/debian/ wheezy/main amd64 Packages |
|||
# 3.2.10-dfsg-1 0 |
|||
# 500 http://ftp.be.debian.org/debian/ squeeze/main amd64 Packages |
|||
</source> |
|||
The number (<code>500</code> vs <code>990</code>) is giving the priority. |
|||
=== APT Pinning === |
|||
Reference: |
|||
* <code>man apt_preferences</code> |
|||
* http://jaqque.sbih.org/kplug/apt-pinning.html |
|||
* http://www.argon.org/~roderick/apt-pinning.html |
|||
;Priorities |
|||
This is (simplified) summary from <code> man apt_preferences</code>. By default, <code>apt</code> assigns the following priorities. |
|||
{| class=wikitable |
|||
|- |
|||
|1 |
|||
| Version marked <code>NotAutomatic: yes</code> but not as <code>ButAutomaticUpgrades: yes</code>. |
|||
|- |
|||
| 100 |
|||
| Installed version. |
|||
|- |
|||
| 500 |
|||
| Version not in target release. |
|||
|- |
|||
| 990 |
|||
| Version in target release. |
|||
|} |
|||
The ''target release'' is the release given on command line (<code>-t release</code>) or in configuration file. |
|||
<tt>apt</tt> installs the package with highest priority, and if two packages have equal priority, it installs the one with highest version number. <tt>apt</tt> never downgrades a package except if priority is > 1000. |
|||
;Examples |
|||
Simple {{file|/etc/apt/preferences}} file, to track Debian ''stable'': |
|||
<source lang=bash> |
|||
Package: * |
|||
Pin: release a=stable |
|||
Pin-Priority: 700 |
|||
Package: * |
|||
Pin: release a=testing |
|||
Pin-Priority: 650 |
|||
Package: * |
|||
Pin: release a=unstable |
|||
Pin-Priority: 600 |
|||
</source> |
|||
Another example. Default release is ''lucid'', but we pin {{deb|git}} packages from ''natty'': |
|||
<source lang=bash> |
|||
Package: * |
|||
Pin: release a=natty-updates |
|||
Pin-Priority: 250 |
|||
Package: * |
|||
Pin: release a=natty |
|||
Pin-Priority: 200 |
|||
Package: etckeeper git git-core git-doc git-gui git-man git-svn gitk gitweb dpkg dpkg-dev build-essential |
|||
Pin: release a=natty-updates |
|||
Pin-Priority: 990 |
|||
Package: etckeeper git git-core git-doc git-gui git-man git-svn gitk gitweb dpkg dpkg-dev build-essential |
|||
Pin: release a=natty |
|||
Pin-Priority: 900 |
|||
Package: * |
|||
Pin: release a=lucid-backports |
|||
Pin-Priority: 400 |
|||
</source> |
|||
=== Debian version numbering === |
|||
* Summary: [https://readme.phys.ethz.ch/documentation/debian_version_numbers/ Debian Version Numbers] |
|||
* Reference: [https://www.debian.org/doc/debian-policy/ch-controlfields.html#s-f-Version Debian policy manual - Version numbering] |
|||
=== Rebuild / Recompile a package === |
|||
References: [http://www.cyberciti.biz/faq/rebuilding-ubuntu-debian-linux-binary-package/], [http://ubuntuforums.org/showthread.php?t=101097] |
|||
<source lang=bash> |
|||
# Install required packages |
|||
sudo apt-get install build-essential fakeroot dpkg-dev |
|||
# DEBIAN - need the following: |
|||
sudo apt install devscripts |
|||
# Create build directory |
|||
mkdir build |
|||
cd build |
|||
# Get package source (e.g. udisks) |
|||
# - See further down to solve gpg signature verification warning |
|||
apt-get source udisks |
|||
# Install all packages needed to build 'udisks' (aka. build deps) |
|||
sudo apt-get build-dep udisks |
|||
# (optional) Unpack Debian / Ubuntu source package (.dsc) - this is done automatically by apt-get |
|||
# First get gpg key, and export it as trusted keys (see http://askubuntu.com/questions/56841/gpg-cant-check-signature) |
|||
gpg --keyserver keyserver.ubuntu.com --recv-keys 7ADF9466 |
|||
gpg --no-default-keyring -a --export 136B762D | gpg --no-default-keyring --keyring ~/.gnupg/trustedkeys.gpg --import - |
|||
# Second unpack the source package |
|||
dpkg-source -x udisks_1.0.4-5ubuntu2.1.dsc |
|||
# Go into package dir |
|||
cd udisks-1.0.4/ |
|||
# (optional) Edit the files |
|||
vi src/device.c |
|||
# (optional) Change compilation settings |
|||
DEB_BUILD_OPTIONS="--enable-gui --enable-radio" fakeroot debian/rules binary |
|||
CC=gcc-3.4 DEB_BUILD_OPTIONS="--enable-gui --enable-radio" fakeroot debian/rules binary |
|||
# (optional, strongly suggested) Change package version |
|||
debchange --local foo --preserve --distribution precise-proposed "Force mount flag 'dmode=0500' for UDF filesystem." |
|||
# Rebuild the package |
|||
dpkg-buildpackage -rfakeroot -b |
|||
# Install the package |
|||
cd .. |
|||
dpkg -i udisks_1.0.4-5ubuntu2.1foo1_amd64.deb |
|||
</source> |
|||
=== Ignore dependencies, force package install === |
|||
<source lang=bash> |
|||
apt-get download overlay-scrollbar-gtk2:i386 |
|||
sudo dpkg --ignore-depends overlay-scrollbar -i overlay-scrollbar-gtk2*.deb |
|||
sudo vi /var/lib/dpkg/status |
|||
# On line Depends: remove 'overlay-scrollbar' for package 'overlay-scrollbar-gtk2', architecture 'i386' |
|||
sudo apt-get install -f |
|||
</source> |
|||
=== Hold a package === |
|||
Using <code>dpkg</code> [https://askubuntu.com/questions/18654/how-to-prevent-updating-of-a-specific-package]: |
|||
<source lang="bash"> |
|||
# Put a package on hold: |
|||
echo "<package-name> hold" | sudo dpkg --set-selections |
|||
# Remove the hold |
|||
echo "<package-name> install" | sudo dpkg --set-selections |
|||
# Display the status of your packages |
|||
dpkg --get-selections |
|||
# Display the status of a single package |
|||
dpkg --get-selections | grep "<package-name>" |
|||
</source> |
|||
Using <code>apt</code>: |
|||
<source lang="bash"> |
|||
# Hold a package: |
|||
sudo apt-mark hold <package-name> |
|||
# Remove the hold: |
|||
sudo apt-mark unhold <package-name> |
|||
</source> |
|||
=== Clone or repackage === |
|||
'''dpkg-repack''' creates a {{file|.deb}} file out of a package that has already |
|||
been installed. If any changes have been made to the package while it was |
|||
unpacked (ie, files in {{file|/etc}} were modified), the new package will inherit |
|||
the changes. |
|||
This utility can make it easy to copy packages from one computer to another, |
|||
or to recreate packages that are installed on your system, but no longer |
|||
available elsewhere, or to store the current state of a package before you |
|||
upgrade it. |
|||
<source lang=bash> |
|||
apt-get install dpkg-repack |
|||
dpkg-repack package |
|||
</source> |
|||
'''apt-clone''' can be used to clone/restore the packages on a apt based system. |
|||
<source lang=bash> |
|||
apt-get install apt-clone |
|||
</source> |
|||
=== Create custom package === |
|||
See usage of {{deb|checkinstall}} in [[#Source package|Source package]]. |
|||
=== Update a computer not connected to internet === |
|||
Here we describe how to update a debian/ubuntu distribution on a computer not connected to internet (called the ''offline'' system), using another computer connected to internet (called the ''proxy'' system). |
|||
==== Via apt cache ==== |
|||
This method assumes that both ''offline'' and ''proxy'' systems are identical. Here we will simply first install the packages on the ''proxy'' system, then upgrade the ''offline'' system. |
|||
# First sync ''offline'' and ''proxy'' |
|||
: Copy the folders {{file|/etc/apt}}, {{file|/var/lib/apt}} from ''proxy'' to ''offline'' system. Make sure that these folders are identical. Delete the folder {{file|/var/cache/apt}} on the ''offline'' system, it will be generated at next invocation of apt. |
|||
# Install the packages on ''proxy'' system. |
|||
# Copy the content of {{file|/var/cache/apt/archives}} to ''offline'' system. |
|||
# Install the packages on ''offline'' system. |
|||
:Make sure to use the exact same <code>apt-get install</code> command. If some packages are missing, you may force reinstall these packages on the ''proxy'' system to get back the corresponding packages. |
|||
==== Using <code>apt-offline</code> ==== |
|||
See dedicated page [[Apt-offline]]. |
|||
==== Via CDROM ==== |
|||
Add to {{file|etc/fstab}}: |
|||
<source lang=bash> |
|||
/media/path/to/debian-9.0.0-i386-DVD-1.iso /mnt/debian-stretch-i386-DVD-1 udf,iso9660 user,noauto,ro,loop 0 0 |
|||
/media/path/to/debian-9.0.0-i386-DVD-2.iso /mnt/debian-stretch-i386-DVD-2 udf,iso9660 user,noauto,ro,loop 0 0 |
|||
/media/path/to/debian-9.0.0-amd64-DVD-1.iso /mnt/debian-stretch-amd64-DVD-1 udf,iso9660 user,noauto,ro,loop 0 0 |
|||
/media/path/to/debian-9.0.0-amd64-DVD-2.iso /mnt/debian-stretch-amd64-DVD-2 udf,iso9660 user,noauto,ro,loop 0 0 |
|||
/media/path/to/debian-9.0.0-amd64-DVD-3.iso /mnt/debian-stretch-amd64-DVD-3 udf,iso9660 user,noauto,ro,loop 0 0 |
|||
</source> |
|||
Add to {{file|/etc/apt/sources.list}}: |
|||
<source lang="bash"> |
|||
deb [arch=i386] file:///mnt/debian-stretch-i386-DVD-1 stretch contrib main |
|||
deb [arch=i386] file:///mnt/debian-stretch-i386-DVD-2 stretch contrib main |
|||
deb [arch=amd64] file:///mnt/debian-stretch-amd64-DVD-1 stretch contrib main |
|||
deb [arch=amd64] file:///mnt/debian-stretch-amd64-DVD-2 stretch contrib main |
|||
deb [arch=amd64] file:///mnt/debian-stretch-amd64-DVD-3 stretch contrib main |
|||
</source> |
|||
Mount all cdroms and update: |
|||
<source lang="bash"> |
|||
for d in /mnt/*; do sudo mount $d; done |
|||
sudo apt update # Ignore errors about missing 'Packages' |
|||
</source> |
|||
=== Internals === |
|||
; {{file|/var/cache/apt/archives}} |
|||
:Contains the latest packages installed via <code>apt-get</code>. Before downloading a package, ''apt'' checks whether the package is already available (and not corrupted) in that folder. |
|||
; {{file|/var/cache/apt/srcpkgcache.bin}} |
|||
:(From [https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=566275] and <code>man apt.conf</code>) {{file|srcpkgcache.bin}} includes the information containing in the files in {{file|/var/lib/apt/lists}} — aka all informations you get from the internet by <code>deb</code> and <code>deb-src</code> lines — these information are changed only on <code>apt-get update</code>. |
|||
; {{file|/var/cache/apt/pkgcache.bin}} |
|||
:{{file|pkgcache.bin}} on the other hand caches the information in {{file|srcpkgcache.bin}} + the informations extracted from the apt and dpkg status files. These change on every install/remove done by apt or directly by <code>dpkg</code>. So if only the status files are changed apt doesn't need to reparse the other informations again - and if no file was changed in between yet and the last call apt can directly load the {{file|pkgcache.bin}} file into memory. |
|||
; {{file|/var/lib/apt}} |
|||
:Contains the list of repository content (as selected in {{file|/etc/apt/sources.list}} and {{file|/etc/apt/sources.list.d}}, the trusted keyrings, etc. |
|||
== RPM's == |
== RPM's == |
||
Line 474: | Line 45: | ||
</source> |
</source> |
||
:Note that <tt>checkinstall</tt> can actually run any arbitrary command and monitor change on the file system. |
:Note that <tt>checkinstall</tt> can actually run any arbitrary command and monitor change on the file system. |
||
== Backports == |
|||
=== Debian === |
|||
See [https://www.ocf.berkeley.edu/docs/staff/procedures/backporting-packages/ Backporting Debian packages]. |
|||
== Managing alternatives with <code>update-alternatives</code> == |
== Managing alternatives with <code>update-alternatives</code> == |
||
Line 541: | Line 116: | ||
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-3.8 100 |
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-3.8 100 |
||
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-6.0 1000 |
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-6.0 1000 |
||
sudo update-alternatives --install /usr/bin/clang++ clang /usr/bin/clang-3.8 100 |
|||
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-3.8 100 |
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-3.8 100 |
||
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-6.0 1000 |
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-6.0 1000 |
Latest revision as of 09:24, 26 November 2019
Ubuntu / Debian
See apt.
RPM's
- RPM RedHat Package Manager
- Using RPM: THe Basics (Part I)
- Install commands
rpm -ivh package # Installing a package - verbose and progress bars
rpm -iv -nodeps package # Installing a package (verbose), ignore dependencies
- Query commands
rpm -ql package # List files provided by a package
- To query a package that has not been installed, add -p option to the command:
rpm -qpl package # List files provided by a package
Source package
Installing from source package is usually done with
./configure
make
sudo make install
Usually ./configure --help
gives additional package configuration options (like installing documentation, etc).
- Installing build dependencies
- Building from sources usually requires more dependencies than using the package. If the package is available on the distribution, the easiest way to install these dependencies is usually via
apt-get build-dep
:
sudo apt-get build-dep udisks
- Installing as a package
- Instead of installing with
make install
, usecheckinstall
to create a temporary package that can later be uninstalled with the package manager.
./configure
make
sudo checkinstall # Creates a package and install it as if 'sudo make install' was run
#... to uninstall:
sudo dpkg -r <packagename>
- Note that checkinstall can actually run any arbitrary command and monitor change on the file system.
Backports
Debian
See Backporting Debian packages.
Managing alternatives with update-alternatives
Display current set of alternatives (e.g. here for gcc on Cygwin):
$ /usr/sbin/update-alternatives --display gcc
# gcc - status is manual.
# link currently points to /usr/bin/gcc-3.exe
# /usr/bin/gcc-3.exe - priority 30
# slave lib-cpp: <NONE>
# slave cc: /usr/bin/cc-3.exe
# slave cpp: /usr/bin/cpp-3.exe
# slave gcov: /usr/bin/gcov-3.exe
# slave i686-pc-cygwin-gcc-4.3.4: <NONE>
# slave i686-pc-cygwin-gcc: /usr/bin/i686-pc-cygwin-gcc-3.exe
# slave protoize: /usr/bin/protoize-3.exe
# slave unprotoize: /usr/bin/unprotoize-3.exe
# slave cpp.1.gz: /usr/share/man/man1/cpp-3.1.gz
# slave gcc.1.gz: /usr/share/man/man1/gcc-3.1.gz
# slave gcov.1.gz: /usr/share/man/man1/gcov-3.1.gz
# slave ffi.3.gz: <NONE>
# slave ffi_call.3.gz: <NONE>
# slave ffi_prep_cif.3.gz: <NONE>
# /usr/bin/gcc-4.exe - priority 40
# slave lib-cpp: /usr/bin/cpp-4.exe
# slave cc: /usr/bin/gcc-4.exe
# slave cpp: /usr/bin/cpp-4.exe
# slave gcov: /usr/bin/gcov-4.exe
# slave i686-pc-cygwin-gcc-4.3.4: <NONE>
# slave i686-pc-cygwin-gcc: /usr/bin/i686-pc-cygwin-gcc-4.exe
# slave protoize: <NONE>
# slave unprotoize: <NONE>
# slave cpp.1.gz: /usr/share/man/man1/cpp-4.1.gz
# slave gcc.1.gz: /usr/share/man/man1/gcc-4.1.gz
# slave gcov.1.gz: /usr/share/man/man1/gcov-4.1.gz
# slave ffi.3.gz: /usr/share/man/man3/ffi-4.3.gz
# slave ffi_call.3.gz: /usr/share/man/man3/ffi_call-4.3.gz
# slave ffi_prep_cif.3.gz: /usr/share/man/man3/ffi_prep_cif-4.3.gz
# Current `best' version is /usr/bin/gcc-4.exe.
Create a new entry with
/usr/sbin/update-alternatives --install /usr/bin/gcc.exe gcc /usr/bin/gcc-3.exe 30 \
--slave /usr/bin/cc.exe cc /usr/bin/cc-3.exe \
--slave /usr/bin/cpp.exe cpp /usr/bin/cpp-3.exe \
--slave /usr/bin/gcov.exe gcov /usr/bin/gcov-3.exe \
--slave /usr/bin/i686-pc-cygwin-gcc.exe i686-pc-cygwin-gcc /usr/bin/i686-pc-cygwin-gcc-3.exe \
--slave /usr/bin/protoize.exe protoize /usr/bin/protoize-3.exe \
--slave /usr/bin/unprotoize.exe unprotoize /usr/bin/unprotoize-3.exe \
--slave /usr/share/man/man1/cpp.1.gz cpp.1.gz /usr/share/man/man1/cpp-3.1.gz \
--slave /usr/share/man/man1/gcc.1.gz gcc.1.gz /usr/share/man/man1/gcc-3.1.gz \
--slave /usr/share/man/man1/gcov.1.gz gcov.1.gz /usr/share/man/man1/gcov-3.1.gz
Select an entry with
/usr/sbin/update-alternatives --auto gcc # Select alternative for gcc based on priority
/usr/sbin/update-alternatives --set gcc /usr/bin/gcc-3.exe # Set gcc-3 as alternative for gcc (also set slaves, etc)
/usr/sbin/update-alternatives --config gcc # Select alternative via menu
Alternatives for clang
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-3.8 100
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-6.0 1000
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-3.8 100
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-6.0 1000
sudo update-alternatives --config clang
sudo update-alternatives --config clang++