source: introduction/important/pkgmgt.xml@ 5cd0959d

10.0 10.1 11.0 11.1 11.2 11.3 12.0 12.1 6.0 6.1 6.2 6.2.0 6.2.0-rc1 6.2.0-rc2 6.3 6.3-rc1 6.3-rc2 6.3-rc3 7.10 7.4 7.5 7.6 7.6-blfs 7.6-systemd 7.7 7.8 7.9 8.0 8.1 8.2 8.3 8.4 9.0 9.1 basic bdubbs/svn elogind gnome kde5-13430 kde5-14269 kde5-14686 kea ken/TL2024 ken/inkscape-core-mods ken/tuningfonts krejzi/svn lazarus lxqt nosym perl-modules plabs/newcss plabs/python-mods python3.11 qt5new rahul/power-profiles-daemon renodr/vulkan-addition systemd-11177 systemd-13485 trunk upgradedb xry111/intltool xry111/llvm18 xry111/soup3 xry111/test-20220226 xry111/xf86-video-removal
Last change on this file since 5cd0959d was 5cd0959d, checked in by Archaic <archaic@…>, 20 years ago

Resetting keywords

git-svn-id: svn://svn.linuxfromscratch.org/BLFS/trunk/BOOK@2592 af4574ff-66df-0310-9fd7-8a98e5e911e0

  • Property mode set to 100644
File size: 10.0 KB
Line 
1<?xml version="1.0" encoding="ISO-8859-1"?>
2<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
3 "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
4 <!ENTITY % general-entities SYSTEM "../../general.ent">
5 %general-entities;
6]>
7
8<sect1 id="intro-important-pkgmgt">
9<sect1info>
10<othername>$LastChangedBy$</othername>
11<date>$Date$</date>
12</sect1info>
13<?dbhtml filename="pkgmgt.html"?>
14<title>Package Management</title>
15
16<para>Package Management is an often requested addition
17to the <acronym>LFS</acronym> Book. A Package Manager allows tracking
18the installation of files making it easy to remove and upgrade packages.
19And before you begin to wonder, NO - this section does not talk about any
20particular package manager, nor does it recommend one. What it provides is
21a roundup of the more popular techniques and how they work. The perfect
22package manager for you may be among these techniques or may be a combination
23of two or more of these techniques. This section briefly mentions
24issues that may arise when upgrading packages.</para>
25
26<para>Some reasons why no package manager is mentioned in <acronym>LFS</acronym>
27or <acronym>BLFS</acronym>:</para>
28
29<itemizedlist>
30<listitem><para>Dealing with package management takes the focus away from
31the goals of these books - Teaching how a Linux System is built.</para></listitem>
32<listitem><para>There are multiple solutions for package management, each having
33its strengths and drawbacks. Including one that satifies all audiences is
34difficult.</para></listitem>
35</itemizedlist>
36
37<para>There are some hints written on the topic of package management. Visit
38the <ulink url="http://www.linuxfromscratch.org/hints/">Hints subproject</ulink>
39to find if one of them fits your need.</para>
40
41
42<sect2>
43<title>Upgrade Issues</title>
44
45<para>A Package Manager makes it easy to upgrade to newer versions as and when they
46are released. Generally the instructions in the <acronym>LFS</acronym> and
47<acronym>BLFS</acronym> Book can be used to upgrade to the newer versions.
48Following are some points that you should be aware of when upgrading
49packages, especially on a running system.</para>
50
51<itemizedlist>
52<listitem><para>It is recommended that if one of the toolchain package (glibc, gcc,
53binutils) needs to be upgraded to a newer minor vesion, it is safer to rebuild
54<acronym>LFS</acronym>. Though you <emphasis>may</emphasis> be able to get by
55rebuilding all the packages in their dependency order. We do not recommend the
56latter. For example, if glibc-2.2.x needs to be updated to glibc-2.3.x, it is safer
57to rebuild. For micro version updates, a simple reinstallation usually works, but
58is not guaranteed. For example, upgrading from glibc-2.3.1 to glibc-2.3.2 will not
59usually cause any problems.</para></listitem>
60<listitem><para>If a package containing a shared library is updated, and if the
61soname of the library changes, then all the packages dynamically linked to the
62library need to be recompiled to link against the newer library. (Note that there
63is no corelation between the package version and the soname of the library.) For
64example, consider a package foo-1.2.3 that installs a shared library with soname
65<filename>libfoo.so.1</filename>. Say you upgrade the package to a newer version
66foo-1.2.4 that installs a shared library with soname <filename>libfoo.so.2</filename>.
67In this case, all packages that are dynamically linked to <filename>libfoo.so.1</filename>
68need to be recompiled to link against <filename>libfoo.so.2</filename>. Note that
69you should not remove the previous libraries till the dependent packages are
70recompiled.</para></listitem>
71<listitem><para>If you are upgrading a running system, be on the lookout for
72packages that use <command>cp</command> instead of <command>install</command> to
73install files. The latter command is usually safer if the executable or library
74is already loaded in memory.</para></listitem>
75</itemizedlist>
76
77</sect2>
78
79
80<sect2>
81<title>Package Management Techniques</title>
82
83<para>The following are some common package management techniques. Before
84making a decision on a package manager, do a research on the various
85techniques, particularly the drawbacks of the particular scheme.</para>
86
87<sect3>
88<title>It is all in my head!</title>
89
90<para>Yes, this is a package management technique. Some folks do not find the
91need for a package manager because they know the packages intimately and know
92what files are installed by each package. Some users also do not need any
93package management because they plan on rebuilding the entire <acronym>LFS</acronym>
94when a package is changed.</para>
95
96</sect3>
97
98<sect3>
99<title>Install in separate directories</title>
100
101<para>This is a simplistic package management that does not need any extra package
102to manage the installations. Each package is installed in a separate directory.
103For example, package foo-1.1 is installed in <filename>/usr/pkg/foo-1.1</filename>
104and a symlink is made from <filename>/usr/pkg/foo</filename> to
105<filename>/usr/pkg/foo-1.1</filename>. When installing a new version foo-1.2,
106it is installed in <filename>/usr/pkg/foo-1.2</filename> and the previous
107symlink is replaced by a symlink to the new vesion.</para>
108
109<para>The environment variables such as those
110mentioned in <xref linkend="intro-important-beyond"/> need to be expanded to
111include <filename>/usr/pkg/foo</filename>. For more than a few packages,
112this scheme becomes unmanageable.</para>
113
114</sect3>
115
116<sect3>
117<title>Symlink style package management</title>
118
119<para>This is a variation of the previous package management technique. Each package
120is installed similar to the previous scheme. But instead of making the symlink,
121each file is symlinked into <filename>/usr</filename> hierarchy. This removes the need
122to expand the environment variables. Though the symlinks can be created by the user,
123to automate the creation, many package managers have been written on this approach.
124A few of the popular ones are Stow, Epkg, Graft, and Depot.</para>
125
126<para>The installation needs to be faked, so that the package thinks that it is
127installed in <filename class="directory">/usr</filename> though in reality it is installed in
128<filename class="directory">/usr/pkg</filename> hierarchy. Installing in this manner is not usually a trivial
129task. For example, consider that you are installing a package libfoo-1.1. The following
130instructions may not install the package properly:</para>
131
132<screen><userinput><command>./configure --prefix=/usr/pkg/libfoo/1.1 &amp;&amp;
133make &amp;&amp;
134make install</command></userinput></screen>
135
136<para>The installation will work, but the dependent packages may not link to
137libfoo as you would expect. If you compile a package that links against libfoo,
138you may notice that it is linked to <filename>/usr/pkg/libfoo/1.1/lib/libfoo.so.1</filename>
139instead of <filename>/usr/lib/libfoo.so.1</filename> as you would expect. The correct
140approach is to use <envar>DESTDIR</envar> strategy to fake installation of the package.
141This approach works as follows:</para>
142
143<screen><userinput><command>./configure --prefix=/usr &amp;&amp;
144make &amp;&amp;
145make DESTDIR=/usr/pkg/libfoo/1.1 install</command></userinput></screen>
146
147<para>Most of the packages do support this approach, but there are some which do not.
148For the non-compliant packages, you may either need to manually install the package,
149or you may find that it is easier to install some problematic packages into
150<filename>/opt</filename>.</para>
151
152</sect3>
153
154<sect3>
155<title>Timestamp based</title>
156
157<para>In this technique, a file is timestamped before the installation of the package.
158After the installation, a simple use of the <command>find</command> command with the
159appropriate options can generate a log of all the files installed after the timestamp
160file was created. A package manager written with this approach is install-log.</para>
161
162<para>Though this scheme has the advantage of being simple, it has two drawbacks.
163If during installation, the files are installed with any timestamp other than the
164current time, those files will not be tracked by the package manager. Also, this
165scheme can only be used when one package is installed at a time. The logs are not
166reliable if two packages are being installed on two different consoles.</para>
167
168</sect3>
169
170<sect3>
171<title>LD_PRELOAD based</title>
172
173<para>In this approach, a library is preloaded before installation. During
174installation, this library tracks the packages that are being installed by
175attaching itself to various executables such as <command>cp</command>,
176<command>install</command>, <command>mv</command> and tracking the system
177calls that modify the filesystem. For this approach to work, all the executables
178need to be dymanically linked without the suid or sgid bit. Preloading the
179library may cause some unwanted side-effects during installation; hence
180do perform some tests to ensure that the package manager does not break
181anything and logs all the appropriate files.</para>
182
183</sect3>
184
185<sect3>
186<title>Creating Package Archives</title>
187
188<para>In this scheme, the package installation is faked into a separate
189tree as described in the Symlink style package management. After the
190installation, a package archive is created using the installed files.
191This archive is then used to install the package either on the local
192machine or can even be used to install the package on other machines.</para>
193
194<para>This approach is used by most of the package managers found in the
195commercial distributions. Examples of package Managers that follow this
196approach are RPM, pkg-utils, Debian's apt, Gentoo's Portage system.</para>
197
198</sect3>
199
200<sect3>
201<title>User Based Management</title>
202
203<para>This scheme, that is unique to <acronym>LFS</acronym>, was
204devised by Matthias Benkmann, and is available from the <ulink
205url="http://www.linuxfromscratch.org/hints/">Hints Project</ulink>.
206In this scheme, each package is installed as a separate user into
207the standard locations. Files belonging to a package are easily
208identified by checking the user id. The features and shortcomings
209of this approach are too complex to describe in this section. For
210the details please see the hint at <ulink
211url="http://www.linuxfromscratch.org/hints/downloads/files/more_control_and_pkg_man.txt"/>.</para>
212
213</sect3>
214
215</sect2>
216
217
218</sect1>
Note: See TracBrowser for help on using the repository browser.