Opkg
Every modern operating system is expected to host a variety of software applications and libraries. Managing their installation, upgrade, and removal has become more complex as software has become more sophisticated. Additionally, the pervasive presence of the Internet has driven an expectation by users of an ability to perform OS updates and upgrades via the Internet. This page describes the tool used by EMAC OE to cater to these needs and expectations.
Background
There are many package managers used for Linux systems. You may already be familiar with the most popularly used ones in desktop and server distributions of Linux: apt
(apt-get
, aptitude
, etc), rpm
, and yum
. You may even be familiar with some of the less popular ones, such as emerge
(from gentoo's portage
), the Mac OS X GNU tools package manager brew
, and the BSD package manager, ports
. The package manager used by EMAC OE is similar to these tools, but is the popular choice for embedded Linux: opkg
. If you're already familiar with any of the desktop/server package managers listed here, opkg
should be very easy to learn since it is very similar to all of those tools. If not, it should still be straightforward to learn because it has a well designed interface.
General Information
The basic capabilities of opkg
are available in OE 4.0 and earlier, but no packages are available online for these older versions. OE 5.0 adds an online package repository complete with updates. EMAC creates and hosts packages for all of our standard offerings, and may add updated packages when the need arises. EMAC recommends checking for and installing any updates available for your OE 5.x system prior to creating the final image which will be used to deploy your systems to ensure your image contains the latest bug fixes and security patches.
Should your application require the ability to be updated/upgraded remotely, EMAC is able to provide assistance and services for creating custom packages for your application and hosting these packages for a modest fee. We will also assist you with configuring the systems to check for and install these updates. Please contact EMAC support should you need more information about this extra level of support.
The opkg
tool is used to work with the OPKG package management system. This tool provides the user with many different capabilities. In this document, only the basic capabilities are described. More information can be found in the last section of this page.
OPKG
The following basic capabilities are shown in this document:
- Updating the list of available packages.
- Upgrading the system.
- Finding packages to install.
- Installing new packages.
- Removing packages.
Updating the List of Available Packages
The OPKG Package Manager keeps a local cache of the list of available packages so that it doesn't have to reach out to the Internet every time the user wishes to use this list in any way. This list is updated on demand, rather than periodically, so it's important to update this list before attempting to search for or install any new packages, or to upgrade the system.
To update the cached list of available packages, run:
root
@
som9x25
:
~
#
{{{1}}}
Note that you must be root in order to update this list.
Upgrading the System
You can use OPKG to upgrade the system by selectively telling it which packages to upgrade. You first need to obtain a list of available packages to upgrade with the following command:
root
@
som9x25
:
~
#
{{{1}}}
You can then upgrade a package with this command:
root
@
som9x25
:
~
#
{{{1}}}
Finding Packages to Install
There is more than one way to look through packages to see what's available to be installed. The first is the list
command by itself:
root
@
som9x25
:
~
#
{{{1}}}
This provides a complete list of all available packages. If you're already comfortable with the Linux command line, you may now wish to skip to the section, "Installing New Pacakges." If not, the following content shows how to more easily work with this output.
As usual on the Linux command line, this long list can be made much easier to peruse by piping the output of the opkg list
command into the less
command, like so:
root
@
som9x25
:
~
#
{{{1}}}
Often times, you will wish to search for something more specific. The grep
command is very useful for this task. The most basic use of grep looks like this:
root
@
som9x25
:
~
#
{{{1}}}
If you're not sure of the full package name, you can put in just a part of the name, since grep doesn't match against whole words by default. If, on the other hand, you want it to match against a whole word, you can enclose the word with escaped angle brackets:
root
@
som9x25
:
~
#
{{{1}}}
This tells grep
to only match against the full word represented by packagename. Use only the opening angle bracket if you only want it to look for a word that starts with packagename, and likewise, only use the closing angle bracket at the end if you only want it to search for a word that ends with packagename.
If the search is returning too many results because the word you're looking for is found in package descriptions, you may want to try using the beginning of line glob character, the caret:
root
@
som9x25
:
~
#
{{{1}}}
There are many more advanced regular expressions which can be used with grep, which will allow you to do things like match wildcards from the beginning of the line up to the characters you specify after the wildcard (which you might do if you know the package name contains a word, but doesn't start with that word, yet the word is too common to allow it to search through all of the text), but this should be enough to get you started. There are many in depth resources for the usage of grep
available online.
Installing New Packages
Once you have found a package or list of packages you wish to install, the opkg
command makes installation simple:
root
@
som9x25
:
~
#
{{{1}}}
This will download and install packagename and all of its dependencies for you. If you would like to install more than one at a time, you can do so by specifying them as a space-separated list:
root
@
som9x25
:
~
#
{{{1}}}
As before, all of the dependencies for the packages specified will be automatically downloaded and installed by opkg
as well.
Removing Packages
When you have installed a package that you no longer want to have on your system, opkg
provides the remove
command to remove the package:
root
@
som9x25
:
~
#
{{{1}}}
If there is anything that depends on it, opkg
will output an error message indicating that packages depend on it. You can add the --force-removal-of-dependent-packages
to force it to remove the package and everything that depends on it:
root
@
som9x25
:
~
#
{{{1}}}
- Caution: The very verbose argument name is required because this can be a dangerous way to remove packages, and the length of the name is intended to remind you of the danger. You may find yourself with an unbootable system if you uninstall a package which was depended upon by important system packages. It's generally wiser to use the less heavy handed version,
--force-depends
, which will only remove the package and a dependency one layer deep:
root
@
som9x25
:
~
#
{{{1}}}
If more layers are required to be removed, you should use the remove
command without either of these options on each dependency shown to see what depends on those dependencies, and continue this procedure recursively to ensure that nothing important will be removed before you attempt to remove a package with the heavy handed variant.
If you do render your system unbootable, contact EMAC, and we will help you get your system back into a usable state for a small fee. If you would prefer to avoid this fee, please be very careful about what you remove, since misusing the above commands is not covered by the EMAC warranty.
Examples
Removing a Package which has Dependencies
root
@
som9x25
:
~
#
{{{1}}}
No packages removed.
Collected errors:
* print_dependents_warning: Package alsa-conf-base is depended upon by packages:
* print_dependents_warning: libasound2
* print_dependents_warning: These might cease to work if package alsa-conf-base is removed.
* print_dependents_warning: Force removal of this package with --force-depends.
* print_dependents_warning: Force removal of this package and its dependents
* print_dependents_warning: with --force-removal-of-dependent-packages.
root
@
som9x25
:
~
#
{{{1}}}
Removing package alsa-conf-base from root...
Conclusion
Further Information
Where to Go Next
- Working with Installed Packages
- Configuring the Package Manager
- Advanced Package Management