source: chapter08/pkgmgt.xml@ d0da969c

12.0 12.0-rc1 12.1 12.1-rc1 multilib renodr/libudev-from-systemd trunk xry111/arm64 xry111/arm64-12.0 xry111/clfs-ng xry111/loongarch xry111/loongarch-12.0 xry111/loongarch-12.1 xry111/mips64el xry111/update-glibc
Last change on this file since d0da969c was d0da969c, checked in by Bruce Dubbs <bdubbs@…>, 11 months ago

Reword library conflict paragraph.

  • Property mode set to 100644
File size: 18.5 KB
Line 
1<?xml version="1.0" encoding="ISO-8859-1"?>
2<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
3 "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
4 <!ENTITY % general-entities SYSTEM "../general.ent">
5 %general-entities;
6]>
7
8<sect1 id="ch-system-pkgmgt">
9 <?dbhtml filename="pkgmgt.html"?>
10
11 <title>Package Management</title>
12
13 <para>Package Management is an often requested addition to the LFS Book. A
14 Package Manager tracks the installation of files, making it easier to
15 remove and upgrade packages. A good package manager will also handle the
16 configuration files specially to keep the user configuration when the
17 package is reinstalled or upgraded. Before
18 you begin to wonder, NO&mdash;this section will not talk about nor recommend
19 any particular package manager. What it does provide is a roundup of the more
20 popular techniques and how they work. The perfect package manager for you may
21 be among these techniques, or it may be a combination of two or more of these
22 techniques. This section briefly mentions issues that may arise when upgrading
23 packages.</para>
24
25 <para>Some reasons why no package manager is mentioned in LFS or BLFS
26 include:</para>
27
28 <itemizedlist>
29 <listitem>
30 <para>Dealing with package management takes the focus away from the goals
31 of these books&mdash;teaching how a Linux system is built.</para>
32 </listitem>
33
34 <listitem>
35 <para>There are multiple solutions for package management, each having
36 its strengths and drawbacks. Finding one solution that satisfies all audiences
37 is difficult.</para>
38 </listitem>
39 </itemizedlist>
40
41 <para>There are some hints written on the topic of package management. Visit
42 the <ulink url="&hints-root;">Hints Project</ulink> and see if one of them
43 fits your needs.</para>
44
45 <sect2 id='pkgmgmt-upgrade-issues'>
46 <title>Upgrade Issues</title>
47
48 <para>A Package Manager makes it easy to upgrade to newer versions when they
49 are released. Generally the instructions in the LFS and BLFS books can be
50 used to upgrade to the newer versions. Here are some points that you should
51 be aware of when upgrading packages, especially on a running system.</para>
52
53 <itemizedlist>
54 <listitem>
55 <para>If the Linux kernel needs to be upgraded (for example, from
56 5.10.17 to 5.10.18 or 5.11.1), nothing else needs to be rebuilt.
57 The system will keep working fine thanks to the well-defined interface
58 between the kernel and userspace. Specifically, Linux API headers
59 need not be (and should not be, see the next item) upgraded
60 along with the kernel. You will merely need to reboot your system to use the
61 upgraded kernel.</para>
62 </listitem>
63
64 <listitem>
65 <para>If the Linux API headers or Glibc need to be upgraded to a newer
66 version, (e.g., from Glibc-2.31 to Glibc-2.32), it is safer to
67 rebuild LFS. Though you <emphasis>may</emphasis> be able to rebuild
68 all the packages in their dependency order, we do not recommend
69 it. </para>
70 </listitem>
71
72 <listitem> <para>If a package containing a shared library is updated, and
73 if the name of the library changes, then any packages dynamically
74 linked to the library must be recompiled, to link against the
75 newer library. (Note that there is no correlation between the package
76 version and the name of the library.) For example, consider a package
77 foo-1.2.3 that installs a shared library with the name <filename
78 class='libraryfile'>libfoo.so.1</filename>. Suppose you upgrade the package to
79 a newer version foo-1.2.4 that installs a shared library with the name
80 <filename class='libraryfile'>libfoo.so.2</filename>. In this case, any
81 packages that are dynamically linked to <filename
82 class='libraryfile'>libfoo.so.1</filename> need to be recompiled to link
83 against <filename class='libraryfile'>libfoo.so.2</filename> in order to
84 use the new library version. You should not remove the old
85 libraries until all the dependent packages have been recompiled.</para>
86 </listitem>
87
88 <listitem><para>If a package is (directly or indirectly) linked to both
89 the old and new versions of a shared library (for example, the package
90 links to both <filename class='libraryfile'>libfoo.so.2</filename> and
91 <filename class='libraryfile'>libbar.so.1</filename>, while the latter
92 links to <filename class='libraryfile'>libfoo.so.3</filename>), the
93 package may malfunction because the different revisions of the shared
94 library present conflicting locations for some symbol names. This can be
95 caused by recompiling some, but not all, of the packages linked to the
96 old shared library after the package providing the shared library is
97 upgraded. To avoid the issue, users will need to rebuild every package
98 linked to a shared library with an updated revision (e.g. libfoo.so.2 to
99 libfoo.so.3) as soon as possible.
100 </para></listitem>
101
102 <listitem> <para>If a package containing a shared library is updated,
103 and the name of the library doesn't change, but the version number of the
104 library <emphasis role="bold">file</emphasis> decreases (for example,
105 the library is still named
106 <filename class='libraryfile'>libfoo.so.1</filename>,
107 but the name of the library file is changed from
108 <filename class='libraryfile'>libfoo.so.1.25</filename> to
109 <filename class='libraryfile'>libfoo.so.1.24</filename>),
110 you should remove the library file from the previously installed version
111 (<filename class='libraryfile'>libfoo.so.1.25</filename> in this case).
112 Otherwise, a <command>ldconfig</command> command (invoked by yourself from the command
113 line, or by the installation of some package) will reset the symlink
114 <filename class='libraryfile'>libfoo.so.1</filename> to point to
115 the old library file because it seems to be a <quote>newer</quote>
116 version; its version number is larger. This situation may arise if
117 you have to downgrade a package, or if the authors change the versioning
118 scheme for library files.</para> </listitem>
119
120 <listitem><para>If a package containing a shared library is updated,
121 and the name of the library doesn't change, but a severe issue
122 (especially, a security vulnerability) is fixed, all running programs
123 linked to the shared library should be restarted. The following
124 command, run as <systemitem class="username">root</systemitem> after
125 the update is complete, will list which processes are using the old versions of those libraries
126 (replace <replaceable>libfoo</replaceable> with the name of the
127 library):</para>
128
129<screen role="nodump"><userinput>grep -l -e '<replaceable>libfoo</replaceable>.*deleted' /proc/*/maps |
130 tr -cd 0-9\\n | xargs -r ps u</userinput></screen>
131
132 <para>
133 If <application>OpenSSH</application> is being used to access
134 the system and it is linked to the updated library, you must
135 restart the <command>sshd</command> service, then logout, login again,
136 and rerun the preceding ps command to confirm that nothing is still using the
137 deleted libraries.
138 </para>
139
140 <para revision='systemd'>
141 If the <command>systemd</command> daemon (running as PID 1) is
142 linked to the updated library, you can restart it without rebooting
143 by running <command>systemctl daemon-reexec</command> as the
144 <systemitem class='username'>root</systemitem> user.
145 </para></listitem>
146
147 <listitem>
148 <para>If an executable program or a shared library is overwritten, the processes
149 using the code or data in that program or library may crash. The
150 correct way to update a program or a shared library without causing
151 the process to crash is to remove it first, then install the new
152 version. The <command>install</command> command
153 provided by <application>coreutils</application> has already
154 implemented this, and most packages use that command to install binary files and
155 libraries. This means that you won't be troubled by this issue most of the time.
156 However, the install process of some packages (notably Mozilla JS
157 in BLFS) just overwrites the file if it exists; this causes a crash. So
158 it's safer to save your work and close unneeded running processes
159 before updating a package.</para> <!-- binary is an adjective, not a noun. -->
160 </listitem>
161 </itemizedlist>
162
163 </sect2>
164
165 <sect2>
166 <title>Package Management Techniques</title>
167
168 <para>The following are some common package management techniques. Before
169 making a decision on a package manager, do some research on the various
170 techniques, particularly the drawbacks of each particular scheme.</para>
171
172 <sect3>
173 <title>It is All in My Head!</title>
174
175 <para>Yes, this is a package management technique. Some folks do not
176 need a package manager because they know the packages intimately
177 and know which files are installed by each package. Some users also do not
178 need any package management because they plan on rebuilding the entire
179 system whenever a package is changed.</para>
180
181 </sect3>
182
183 <sect3>
184 <title>Install in Separate Directories</title>
185
186 <para>This is a simplistic package management technique that does not need a
187 special program to manage the packages. Each package is installed in a
188 separate directory. For example, package foo-1.1 is installed in
189 <filename class='directory'>/usr/pkg/foo-1.1</filename>
190 and a symlink is made from <filename>/usr/pkg/foo</filename> to
191 <filename class='directory'>/usr/pkg/foo-1.1</filename>. When
192 a new version foo-1.2 comes along, it is installed in
193 <filename class='directory'>/usr/pkg/foo-1.2</filename> and the previous
194 symlink is replaced by a symlink to the new version.</para>
195
196 <para>Environment variables such as <envar>PATH</envar>,
197 <envar>LD_LIBRARY_PATH</envar>, <envar>MANPATH</envar>,
198 <envar>INFOPATH</envar> and <envar>CPPFLAGS</envar> need to be expanded to
199 include <filename>/usr/pkg/foo</filename>. If you install more than a few packages,
200 this scheme becomes unmanageable.</para>
201
202 </sect3>
203
204 <sect3>
205 <title>Symlink Style Package Management</title>
206
207 <para>This is a variation of the previous package management technique.
208 Each package is installed as in the previous scheme. But instead of
209 making the symlink via a generic package name, each file is symlinked into the
210 <filename class='directory'>/usr</filename> hierarchy. This removes the
211 need to expand the environment variables. Though the symlinks can be
212 created by the user, many package managers use this approach, and
213 automate the creation of the symlinks. A few of the popular ones include Stow,
214 Epkg, Graft, and Depot.</para>
215
216 <para>The installation script needs to be fooled, so the package thinks
217 it is installed in <filename class="directory">/usr</filename> though in
218 reality it is installed in the
219 <filename class="directory">/usr/pkg</filename> hierarchy. Installing in
220 this manner is not usually a trivial task. For example, suppose you
221 are installing a package libfoo-1.1. The following instructions may
222 not install the package properly:</para>
223
224<screen role="nodump"><userinput>./configure --prefix=/usr/pkg/libfoo/1.1
225make
226make install</userinput></screen>
227
228 <para>The installation will work, but the dependent packages may not link
229 to libfoo as you would expect. If you compile a package that links against
230 libfoo, you may notice that it is linked to
231 <filename class='libraryfile'>/usr/pkg/libfoo/1.1/lib/libfoo.so.1</filename>
232 instead of <filename class='libraryfile'>/usr/lib/libfoo.so.1</filename>
233 as you would expect. The correct approach is to use the
234 <envar>DESTDIR</envar> variable to direct the installation. This
235 approach works as follows:</para>
236
237<screen role="nodump"><userinput>./configure --prefix=/usr
238make
239make DESTDIR=/usr/pkg/libfoo/1.1 install</userinput></screen>
240
241 <para>Most packages support this approach, but there are some which do not.
242 For the non-compliant packages, you may either need to install the
243 package manually, or you may find that it is easier to install some problematic
244 packages into <filename class='directory'>/opt</filename>.</para>
245
246 </sect3>
247
248 <sect3>
249 <title>Timestamp Based</title>
250
251 <para>In this technique, a file is timestamped before the installation of
252 the package. After the installation, a simple use of the
253 <command>find</command> command with the appropriate options can generate
254 a log of all the files installed after the timestamp file was created. A
255 package manager that uses this approach is install-log.</para>
256
257 <para>Though this scheme has the advantage of being simple, it has two
258 drawbacks. If, during installation, the files are installed with any
259 timestamp other than the current time, those files will not be tracked by
260 the package manager. Also, this scheme can only be used when packages
261 are installed one at a time. The logs are not reliable if two packages are
262 installed simultaneously from two different consoles.</para>
263
264 </sect3>
265
266 <sect3>
267 <title>Tracing Installation Scripts</title>
268
269 <para>In this approach, the commands that the installation scripts perform
270 are recorded. There are two techniques that one can use:</para>
271
272 <para>The <envar>LD_PRELOAD</envar> environment variable can be set to
273 point to a library to be preloaded before installation. During
274 installation, this library tracks the packages that are being installed by
275 attaching itself to various executables such as <command>cp</command>,
276 <command>install</command>, <command>mv</command> and tracking the system
277 calls that modify the filesystem. For this approach to work, all the
278 executables need to be dynamically linked without the suid or sgid bit.
279 Preloading the library may cause some unwanted side-effects during
280 installation. Therefore, it's a good idea to perform some tests to
281 ensure that the package manager does not break anything, and that it logs all the
282 appropriate files.</para>
283
284 <para>Another technique is to use <command>strace</command>, which
285 logs all the system calls made during the execution of the installation
286 scripts.</para>
287 </sect3>
288
289 <sect3>
290 <title>Creating Package Archives</title>
291
292 <para>In this scheme, the package installation is faked into a separate
293 tree as previously described in the symlink style package management section. After the
294 installation, a package archive is created using the installed files.
295 This archive is then used to install the package on the local
296 machine or even on other machines.</para>
297
298 <para>This approach is used by most of the package managers found in the
299 commercial distributions. Examples of package managers that follow this
300 approach are RPM (which, incidentally, is required by the <ulink
301 url="https://refspecs.linuxfoundation.org/lsb.shtml">Linux
302 Standard Base Specification</ulink>), pkg-utils, Debian's apt, and
303 Gentoo's Portage system. A hint describing how to adopt this style of
304 package management for LFS systems is located at <ulink
305 url="&hints-root;fakeroot.txt"/>.</para>
306
307 <para>The creation of package files that include dependency information is
308 complex, and beyond the scope of LFS.</para>
309
310 <para>Slackware uses a <command>tar</command>-based system for package
311 archives. This system purposely does not handle package dependencies
312 as more complex package managers do. For details of Slackware package
313 management, see <ulink
314 url="https://www.slackbook.org/html/package-management.html"/>.</para>
315 </sect3>
316
317 <sect3>
318 <title>User Based Management</title>
319
320 <para>This scheme, unique to LFS, was devised by Matthias Benkmann, and is
321 available from the <ulink url="&hints-root;">Hints Project</ulink>. In
322 this scheme, each package is installed as a separate user into the
323 standard locations. Files belonging to a package are easily identified by
324 checking the user ID. The features and shortcomings of this approach are
325 too complex to describe in this section. For the details please see the
326 hint at <ulink url="&hints-root;more_control_and_pkg_man.txt"/>.</para>
327
328 </sect3>
329
330 </sect2>
331
332 <sect2>
333 <title>Deploying LFS on Multiple Systems</title>
334
335 <para>One of the advantages of an LFS system is that there are no files that
336 depend on the position of files on a disk system. Cloning an LFS build to
337 another computer with the same architecture as the base system is as
338 simple as using <command>tar</command> on the LFS partition that contains
339 the root directory (about 900MB uncompressed for a basic LFS build), copying
340 <!-- D. Bryant created LFS 11.2 in October 2022; 900MB is (roughly) the size of his rsync archive. -->
341 that file via network transfer or CD-ROM / USB stick to the new system, and expanding
342 it. After that, a few configuration files will have to be changed.
343 Configuration files that may need to be updated include:
344 <filename>/etc/hosts</filename>,
345 <filename>/etc/fstab</filename>,
346 <filename>/etc/passwd</filename>,
347 <filename>/etc/group</filename>,
348 <phrase revision="systemd">
349 <filename>/etc/shadow</filename>, and
350 <filename>/etc/ld.so.conf</filename>.
351 </phrase>
352 <phrase revision="sysv">
353 <filename>/etc/shadow</filename>,
354 <filename>/etc/ld.so.conf</filename>,
355 <filename>/etc/sysconfig/rc.site</filename>,
356 <filename>/etc/sysconfig/network</filename>, and
357 <filename>/etc/sysconfig/ifconfig.eth0</filename>.
358 </phrase>
359 </para>
360
361 <para>A custom kernel may be needed for the new system, depending on
362 differences in system hardware and the original kernel
363 configuration.</para>
364
365 <note><para>There have been some reports of issues when copying between
366 similar but not identical architectures. For instance, the instruction set
367 for an Intel system is not identical with the AMD processor's instructions, and later
368 versions of some processors may provide instructions that are unavailable with
369 earlier versions.</para></note>
370
371 <para>Finally, the new system has to be made bootable via <xref
372 linkend="ch-bootable-grub"/>.</para>
373
374 </sect2>
375
376</sect1>
Note: See TracBrowser for help on using the repository browser.