]>
Commit | Line | Data |
---|---|---|
1 | <!doctype debiandoc PUBLIC "-//DebianDoc//DTD DebianDoc//EN"> | |
2 | <book> | |
3 | <title>dpkg technical manual</title> | |
4 | ||
5 | <author>Tom Lees <email>tom@lpsg.demon.co.uk</email></author> | |
6 | <version>$Id: dpkg-tech.sgml,v 1.3 2003/02/12 15:05:45 doogie Exp $</version> | |
7 | ||
8 | <abstract> | |
9 | This document describes the minimum necessary workings for the APT dselect | |
10 | replacement. It gives an overall specification of what its external interface | |
11 | must look like for compatibility, and also gives details of some internal | |
12 | quirks. | |
13 | </abstract> | |
14 | ||
15 | <copyright> | |
16 | Copyright © Tom Lees, 1997. | |
17 | <p> | |
18 | APT and this document are free software; you can redistribute them and/or | |
19 | modify them under the terms of the GNU General Public License as published | |
20 | by the Free Software Foundation; either version 2 of the License, or (at your | |
21 | option) any later version. | |
22 | ||
23 | <p> | |
24 | For more details, on Debian systems, see the file | |
25 | /usr/share/common-licenses/GPL for the full license. | |
26 | </copyright> | |
27 | ||
28 | <toc sect> | |
29 | ||
30 | <chapt>Quick summary of dpkg's external interface | |
31 | <sect id="control">Control files | |
32 | ||
33 | <p> | |
34 | The basic dpkg package control file supports the following major features:- | |
35 | ||
36 | <list> | |
37 | <item>5 types of dependencies:- | |
38 | <list> | |
39 | <item>Pre-Depends, which must be satisfied before a package may be | |
40 | unpacked | |
41 | <item>Depends, which must be satisfied before a package may be | |
42 | configured | |
43 | <item>Recommends, to specify a package which if not installed may | |
44 | severely limit the usefulness of the package | |
45 | <item>Suggests, to specify a package which may increase the | |
46 | productivity of the package | |
47 | <item>Conflicts, to specify a package which must NOT be installed | |
48 | in order for the package to be configured | |
49 | <item>Breaks, to specify a package which is broken by the | |
50 | package and which should therefore not be configured while broken | |
51 | </list> | |
52 | Each of these dependencies can specify a version and a depedency on that | |
53 | version, for example "<= 0.5-1", "== 2.7.2-1", etc. The comparators available | |
54 | are:- | |
55 | <list> | |
56 | <item>"<<" - less than | |
57 | <item>"<=" - less than or equal to | |
58 | <item>">>" - greater than | |
59 | <item>">=" - greater than or equal to | |
60 | <item>"==" - equal to | |
61 | </list> | |
62 | <item>The concept of "virtual packages", which many other packages may provide, | |
63 | using the Provides mechanism. An example of this is the "httpd" virtual package, | |
64 | which all web servers should provide. Virtual package names may be used in | |
65 | dependency headers. However, current policy is that virtual packages do not | |
66 | support version numbers, so dependencies on virtual packages with versions | |
67 | will always fail. | |
68 | <item>Several other control fields, such as Package, Version, Description, | |
69 | Section, Priority, etc., which are mainly for classification purposes. The | |
70 | package name must consist entirely of lowercase characters, plus the characters | |
71 | '+', '-', and '.'. Fields can extend across multiple lines - on the second | |
72 | and subsequent lines, there is a space at the beginning instead of a field | |
73 | name and a ':'. Empty lines must consist of the text " .", which will be | |
74 | ignored, as will the initial space for other continuation lines. This feature | |
75 | is usually only used in the Description field. | |
76 | </list> | |
77 | ||
78 | <sect>The dpkg status area | |
79 | ||
80 | <p> | |
81 | The "dpkg status area" is the term used to refer to the directory where dpkg | |
82 | keeps its various status files (GNU would have you call it the dpkg shared | |
83 | state directory). This is always, on Debian systems, /var/lib/dpkg. However, | |
84 | the default directory name should not be hard-coded, but #define'd, so that | |
85 | alteration is possible (it is available via configure in dpkg 1.4.0.9 and | |
86 | above). Of course, in a library, code should be allowed to override the | |
87 | default directory, but the default should be part of the library (so that | |
88 | the user may change the dpkg admin dir simply by replacing the library). | |
89 | ||
90 | <p> | |
91 | Dpkg keeps a variety of files in its status area. These are discussed later | |
92 | on in this document, but a quick summary of the files is here:- | |
93 | ||
94 | <list> | |
95 | <item>available - this file contains a concatenation of control information | |
96 | from all the packages which dpkg knows about. This is updated using the dpkg | |
97 | commands "--update-avail <file>", "--merge-avail <file>", and | |
98 | "--clear-avail". | |
99 | <item>status - this file contains information on the following things for | |
100 | every package:- | |
101 | <list> | |
102 | <item>Whether it is installed, not installed, unpacked, removed, | |
103 | failed configuration, or half-installed (deconfigured in | |
104 | favour of another package). | |
105 | <item>Whether it is selected as install, hold, remove, or purge. | |
106 | <item>If it is "ok" (no installation problems), or "not-ok". | |
107 | <item>It usually also contains the section and priority (so that | |
108 | dselect may classify packages not in available) | |
109 | <item>For packages which did not initially appear in the "available" | |
110 | file when they were installed, the other control information | |
111 | for them. | |
112 | </list> | |
113 | <p> | |
114 | The exact format for the "Status:" field is: | |
115 | <example> | |
116 | Status: Want Flag Status | |
117 | </example> | |
118 | Where <var>Want</> may be one of <em>unknown</>, <em>install</>, | |
119 | <em>hold</>, <em>deinstall</>, <em>purge</>. <var>Flag</> | |
120 | may be one of <em>ok</>, <em>reinstreq</>, <em>hold</>, | |
121 | <em>hold-reinstreq</>. | |
122 | <var>Status</> may be one of <em>not-installed</>, <em>unpacked</>, | |
123 | <em>half-configured</>, <em>installed</>, <em>half-installed</> | |
124 | <em>config-files</>, <em>post-inst-failed</>, <em>removal-failed</>. | |
125 | The states are as follows:- | |
126 | <taglist> | |
127 | <tag>not-installed | |
128 | <item>No files are installed from the package, it has no config files | |
129 | left, it uninstalled cleanly if it ever was installed. | |
130 | <tag>unpacked | |
131 | <item>The basic files have been unpacked (and are listed in | |
132 | /var/lib/dpkg/info/[package].list. There are config files present, | |
133 | but the postinst script has _NOT_ been run. | |
134 | <tag>half-configured | |
135 | <item>The package was installed and unpacked, but the postinst script | |
136 | failed in some way. | |
137 | <tag>installed | |
138 | <item>All files for the package are installed, and the configuration | |
139 | was also successful. | |
140 | <tag>half-installed | |
141 | <item>An attempt was made to remove the packagem but there was a failure | |
142 | in the prerm script. | |
143 | <tag>config-files | |
144 | <item>The package was "removed", not "purged". The config files are left, | |
145 | but nothing else. | |
146 | <tag>post-inst-failed | |
147 | <item>Old name for half-configured. Do not use. | |
148 | <tag>removal-failed | |
149 | <item>Old name for half-installed. Do not use. | |
150 | </taglist> | |
151 | The two last items are only left in dpkg for compatibility - they are | |
152 | understood by it, but never written out in this form. | |
153 | ||
154 | <p> | |
155 | Please see the dpkg source code, <tt>lib/parshelp.c</tt>, | |
156 | <em>statusinfos</>, <em>eflaginfos</> and <em>wantinfos</> for more | |
157 | details. | |
158 | ||
159 | <item>info - this directory contains files from the control archive of every | |
160 | package currently installed. They are installed with a prefix of "<packagename>.". | |
161 | In addition to this, it also contains a file called <package>.list for every | |
162 | package, which contains a list of files. Note also that the control file is | |
163 | not copied into here; it is instead found as part of status or available. | |
164 | <item>methods - this directory is reserved for "method"-specific files - each | |
165 | "method" has a subdirectory underneath this directory (or at least, it can | |
166 | have). In addition, there is another subdirectory "mnt", where misc. | |
167 | filesystems (floppies, CD-ROMs, etc.) are mounted. | |
168 | <item>alternatives - directory used by the "update-alternatives" program. It | |
169 | contains one file for each "alternatives" interface, which contains information | |
170 | about all the needed symlinked files for each alternative. | |
171 | <item>diversions - file used by the "dpkg-divert" program. Each diversion takes | |
172 | three lines. The first is the package name (or ":" for user diversion), the | |
173 | second the original filename, and the third the diverted filename. | |
174 | <item>updates - directory used internally by dpkg. This is discussed later, | |
175 | in the section <ref id="updates">. | |
176 | <item>parts - temporary directory used by dpkg-split | |
177 | </list> | |
178 | ||
179 | <sect>The dpkg library files | |
180 | ||
181 | <p> | |
182 | These files are installed under /usr/lib/dpkg (usually), but | |
183 | /usr/local/lib/dpkg is also a possibility (as Debian policy dictates). Under | |
184 | this directory, there is a "methods" subdirectory. The methods subdirectory | |
185 | in turn contains any number of subdirectories for each general method | |
186 | processor (note that one set of method scripts can, and is, used for more than | |
187 | one of the methods listed under dselect). | |
188 | ||
189 | <p> | |
190 | The following files may be found in each of these subdirectories:- | |
191 | ||
192 | <list> | |
193 | <item>names - One line per method, two-digit priority to appear on menu | |
194 | at beginning, followed by a space, the name, and then another space and the | |
195 | short description. | |
196 | <item>desc.<name> - Contains the long description displayed by dselect | |
197 | when the cursor is put over the <name> method. | |
198 | <item>setup - Script or program which sets up the initial values to be used | |
199 | by this method. Called with first argument as the status area directory | |
200 | (/var/lib/dpkg), second argument as the name of the method (as in the directory | |
201 | name), and the third argument as the option (as in the names file). | |
202 | <item>install - Script/program called when the "install" option of dselect is | |
203 | run with this method. Same arguments as for setup. | |
204 | <item>update - Script/program called when the "update" option of dselect is | |
205 | run. Same arguments as for setup/install. | |
206 | </list> | |
207 | ||
208 | <sect>The "dpkg" command-line utility | |
209 | ||
210 | <sect1>"Documented" command-line interfaces | |
211 | ||
212 | <p> | |
213 | As yet unwritten. You can refer to the other manuals for now. See | |
214 | <manref name="dpkg" section="8">. | |
215 | ||
216 | <sect1>Environment variables which dpkg responds to | |
217 | ||
218 | <p> | |
219 | <list> | |
220 | <item>DPKG_NO_TSTP - if set to a non-null value, this variable causes dpkg to | |
221 | run a child shell process instead of sending itself a SIGTSTP, when the user | |
222 | selects to background the dpkg process when it asks about conffiles. | |
223 | <item>SHELL - used to determine which shell to run in the case when | |
224 | DPKG_NO_TSTP is set. | |
225 | <item>CC - used as the C compiler to call to determine the target architecture. | |
226 | The default is "gcc". | |
227 | <item>PATH - dpkg checks that it can find at least the following files in the | |
228 | path when it wants to run package installation scripts, and gives an error if | |
229 | it cannot find all of them:- | |
230 | <list> | |
231 | <item>ldconfig | |
232 | <item>start-stop-daemon | |
233 | <item>install-info | |
234 | <item>update-rc.d | |
235 | </list> | |
236 | </list> | |
237 | ||
238 | <sect1>Assertions | |
239 | ||
240 | <p> | |
241 | The dpkg utility itself is required for quite a number of packages, even if | |
242 | they have been installed with a tool totally separate from dpkg. The reason for | |
243 | this is that some packages, in their pre-installation scripts, check that your | |
244 | version of dpkg supports certain features. This was broken from the start, and | |
245 | it should have actually been a control file header "Dpkg-requires", or similar. | |
246 | What happens is that the configuration scripts will abort or continue according | |
247 | to the exit code of a call to dpkg, which will stop them from being wrongly | |
248 | configured. | |
249 | ||
250 | <p> | |
251 | These special command-line options, which simply return as true or false are | |
252 | all prefixed with "--assert-". Here is a list of them (without the prefix):- | |
253 | ||
254 | <list> | |
255 | <item>support-predepends - Returns success or failure according to whether | |
256 | a version of dpkg which supports predepends properly (1.1.0 or above) is | |
257 | installed, according to the database. | |
258 | <item>working-epoch - Return success or failure according to whether a version | |
259 | of dpkg which supports epochs in version properly (1.4.0.7 or above) is | |
260 | installed, according to the database. | |
261 | </list> | |
262 | ||
263 | <p> | |
264 | Both these options check the status database to see what version of the "dpkg" | |
265 | package is installed, and check it against a known working version. | |
266 | ||
267 | <sect1>--predep-package | |
268 | ||
269 | <p> | |
270 | This strange option is described as follows in the source code: | |
271 | ||
272 | <example> | |
273 | /* Print a single package which: | |
274 | * (a) is the target of one or more relevant predependencies. | |
275 | * (b) has itself no unsatisfied pre-dependencies. | |
276 | * If such a package is present output is the Packages file entry, | |
277 | * which can be massaged as appropriate. | |
278 | * Exit status: | |
279 | * 0 = a package printed, OK | |
280 | * 1 = no suitable package available | |
281 | * 2 = error | |
282 | */ | |
283 | </example> | |
284 | ||
285 | <p> | |
286 | On further inspection of the source code, it appears that what is does is | |
287 | this:- | |
288 | ||
289 | <list> | |
290 | <item>Looks at the packages in the database which are selected as "install", | |
291 | and are installed. | |
292 | <item>It then looks at the Pre-Depends information for each of these packages | |
293 | from the available file. When it find a package for which any of the | |
294 | pre-dependencies are not satisfied, it breaks from the loop through the packages. | |
295 | <item>It then looks through the unsatisfied pre-dependencies, and looks for | |
296 | packages which would satisfy this pre-dependency, stopping on the first it | |
297 | finds. If it finds none, it bombs out with an error. | |
298 | <item>It then continues this for every dependency of the initial package. | |
299 | </list> | |
300 | ||
301 | Eventually, it writes out the record of all the packages to satisfy the | |
302 | pre-dependencies. This is used by the disk method to make sure that its | |
303 | dependency ordering is correct. What happens is that all pre-depending | |
304 | packages are first installed, then it runs dpkg -iGROEB on the directory, | |
305 | which installs in the order package files are found. Since pre-dependencies | |
306 | mean that a package may not even be unpacked unless they are satisfied, it is | |
307 | necessary to do this (usually, since all the package files are unpacked in one | |
308 | phase, the configured in another, this is not needed). | |
309 | ||
310 | <chapt>dpkg-deb and .deb file internals | |
311 | ||
312 | <p> | |
313 | This chapter describes the internals to the "dpkg-deb" tool, which is used | |
314 | by "dpkg" as a back-end. dpkg-deb has its own tar extraction functions, which | |
315 | is the source of many problems, as it does not support long filenames, using | |
316 | extension blocks. | |
317 | ||
318 | <sect>The .deb archive format | |
319 | ||
320 | <p> | |
321 | The main principal of the new-format Debian archive (I won't describe the old | |
322 | format - for that have a look at deb-old.5), is that the archive really is | |
323 | an archive - as used by "ar" and friends. However, dpkg-deb uses this format | |
324 | internally, rather than calling "ar". Inside this archive, there are usually | |
325 | the folowing members:- | |
326 | ||
327 | <list> | |
328 | <item>debian-binary | |
329 | <item>control.tar.gz | |
330 | <item>data.tar.gz | |
331 | </list> | |
332 | ||
333 | <p> | |
334 | The debian-binary member consists simply of the string "2.0", indicating the | |
335 | format version. control.tar.gz contains the control files (and scripts), and | |
336 | the data.tar.gz contains the actual files to populate the filesystem with. | |
337 | Both tarfiles extract straight into the current directory. Information on the | |
338 | tar formats can be found in the GNU tar info page. Since dpkg-deb calls | |
339 | "tar -cf" to build packages, the Debian packages use the GNU extensions. | |
340 | ||
341 | <sect>The dpkg-deb command-line | |
342 | ||
343 | <p> | |
344 | dpkg-deb documents itself thoroughly with its '--help' command-line option. | |
345 | However, I am including a reference to these for completeness. dpkg-deb | |
346 | supports the following options:- | |
347 | ||
348 | <list> | |
349 | <item>--build (-b) <dir> - builds a .deb archive, takes a directory which | |
350 | contains all the files as an argument. Note that the directory | |
351 | <dir>/DEBIAN will be packed separately into the control archive. | |
352 | <item>--contents (-c) <debfile> - Lists the contents of ther "data.tar.gz" | |
353 | member. | |
354 | <item>--control (-e) <debfile> - Extracts the control archive into a | |
355 | directory called DEBIAN. Alternatively, with another argument, it will extract | |
356 | it into a different directory. | |
357 | <item>--info (-I) <debfile> - Prints the contents of the "control" file | |
358 | in the control archive to stdout. Alternatively, giving it other arguments will | |
359 | cause it to print the contents of those files instead. | |
360 | <item>--field (-f) <debfile> <field> ... - Prints any number of | |
361 | fields from the "control" file. Giving it extra arguments limits the fields it | |
362 | prints to only those specified. With no command-line arguments other than a | |
363 | filename, it is equivalent to -I and just the .deb filename. | |
364 | <item>--extract (-x) <debfile> <dir> - Extracts the data archive | |
365 | of a debian package under the directory <dir>. | |
366 | <item>--vextract (-X) <debfile> <dir> - Same as --extract, except | |
367 | it is equivalent of giving tar the '-v' option - it prints the filenames as | |
368 | it extracts them. | |
369 | <item>--fsys-tarfile <debfile> - This option outputs a gunzip'd version | |
370 | of data.tar.gz to stdout. | |
371 | <item>--new - sets the archive format to be used to the new Debian format | |
372 | <item>--old - sets the archive format to be used to the old Debian format | |
373 | <item>--debug - Tells dpkg-deb to produce debugging output | |
374 | <item>--nocheck - Tells dpkg-deb not to check the sanity of the control file | |
375 | <item>--help (-h) - Gives a help message | |
376 | <item>--version - Shows the version number | |
377 | <item>--licence/--license (UK/US spellings) - Shows a brief outline of the GPL | |
378 | </list> | |
379 | ||
380 | <sect1>Internal checks used by dpkg-deb when building packages | |
381 | ||
382 | <p> | |
383 | Here is a list of the internal checks used by dpkg-deb when building packages. | |
384 | It is in the order they are done. | |
385 | ||
386 | <list> | |
387 | <item>First, the output Debian archive argument, if it is given, is checked | |
388 | using stat. If it is a directory, an internal flag is set. This check is only | |
389 | made if the archive name is specified explicitly on the command-line. If the | |
390 | argument was not given, the default is the directory name, with ".deb" | |
391 | appended. | |
392 | <item>Next, the control file is checked, unless the --nocheck flag was | |
393 | specified on the command-line. dpkg-deb will bomb out if the second argument | |
394 | to --build was a directory, and --nocheck was specified. Note that dpkg-deb | |
395 | will not be able to determine the name of the package in this case. In the | |
396 | control file, the following things are checked:- | |
397 | <list> | |
398 | <item>The package name is checked to see if it contains any invalid | |
399 | characters (see <ref id="control"> for this). | |
400 | <item>The priority field is checked to see if it uses standard values, | |
401 | and user-defined values are warned against. However, note that this | |
402 | check is now redundant, since the control file no longer contains | |
403 | the priority - the changes file now does this. | |
404 | <item>The control file fields are then checked against the standard | |
405 | list of fields which appear in control files, and any "user-defined" | |
406 | fields are reported as warnings. | |
407 | <item>dpkg-deb then checks that the control file contains a valid | |
408 | version number. | |
409 | </list> | |
410 | <item>After this, in the case where a directory was specified to build the | |
411 | .deb file in, the filename is created as "directory/pkg_ver.deb" or | |
412 | "directory/pkg_ver_arch.deb", depending on whether the control file contains | |
413 | an architecture field. | |
414 | <item>Next, dpkg-deb checks for the <dir>/DEBIAN directory. It complains | |
415 | if it doesn't exist, or if it has permissions < 0755, or > 0775. | |
416 | <item>It then checks that all the files in this subdir are either symlinks | |
417 | or plain files, and have permissions between 0555 and 0775. | |
418 | <item>The conffiles file is then checked to see if the filenames are too | |
419 | long. Warnings are produced for each that is. After this, it checks that | |
420 | the package provides initial copies of each of these conffiles, and that | |
421 | they are all plain files. | |
422 | </list> | |
423 | ||
424 | <chapt>dpkg internals | |
425 | ||
426 | <p> | |
427 | This chapter describes the internals of dpkg itself. Although the low-level | |
428 | formats are quite simple, what dpkg does in certain cases often does not | |
429 | make sense. | |
430 | ||
431 | <sect id="updates">Updates | |
432 | ||
433 | <p> | |
434 | This describes the /var/lib/dpkg/updates directory. The function of this | |
435 | directory is somewhat strange, and seems only to be used internally. A function | |
436 | called cleanupdates is called whenever the database is scanned. This function | |
437 | in turn uses <manref name="scandir" section="3">, to sort the files in this | |
438 | directory. Files who names do not consist entirely of digits are discarded. | |
439 | dpkg also causes a fatal error if any of the filenames are different lengths. | |
440 | ||
441 | <p> | |
442 | After having scanned the directory, dpkg in turn parses each file the same way | |
443 | it parses the status file (they are sorted by the scandir to be in numerical | |
444 | order). After having done this, it then writes the status information back | |
445 | to the "status" file, and removes all the "updates" files. | |
446 | ||
447 | <p> | |
448 | These files are created internally by dpkg's "checkpoint" function, and are | |
449 | cleaned up when dpkg exits cleanly. | |
450 | ||
451 | <p> | |
452 | Juding by the use of the updates directory I would call it a Journal. Inorder | |
453 | to effeciently ensure the complete integrity of the status file dpkg will | |
454 | "checkpoint" or journal all of it's activities in the updates directory. By | |
455 | merging the contents of the updates directory (in order!!) against the | |
456 | original status file it can get the precise current state of the system, | |
457 | even in the event of a system failure while dpkg is running. | |
458 | ||
459 | <p> | |
460 | The other option would be to sync-rewrite the status file after each | |
461 | operation, which would kill performance. | |
462 | ||
463 | <p> | |
464 | It is very important that any program that uses the status file abort if | |
465 | the updates directory is not empty! The user should be informed to run dpkg | |
466 | manually (what options though??) to correct the situation. | |
467 | ||
468 | <sect>What happens when dpkg reads the database | |
469 | ||
470 | <p> | |
471 | First, the status file is read. This gives dpkg an initial idea of the packages | |
472 | that are there. Next, the updates files are read in, overriding the status | |
473 | file, and if necessary, the status file is re-written, and updates files are | |
474 | removed. Finally, the available file is read. The available file is read | |
475 | with flags which preclude dpkg from updating any status information from it, | |
476 | though - installed version, etc., and is also told to record that the packages | |
477 | it reads this time are available, not installed. | |
478 | ||
479 | <p> | |
480 | More information on updates is given above. | |
481 | ||
482 | <sect>How dpkg compares version numbers | |
483 | ||
484 | <p> | |
485 | Version numbers consist of three parts: the epoch, the upstream version, and | |
486 | the Debian revision. Dpkg compares these parts in that order. If the epochs | |
487 | are different, it returns immediately, and so on. | |
488 | ||
489 | <p> | |
490 | However, the important part is how it compares the versions which are | |
491 | essentially stored as just strings. These are compared in two distinct parts: | |
492 | those consisting of numerical characters (which are evaluated, and then | |
493 | compared), and those consisting of other characters. When comparing | |
494 | non-numerical parts, they are compared as the character values (ASCII), but | |
495 | non-alphabetical characters are considered "greater than" alphabetical ones. | |
496 | Also note that longer strings (after excluding differences where numerical | |
497 | values are equal) are considered "greater than" shorter ones. | |
498 | ||
499 | <p> | |
500 | Here are a few examples of how these rules apply:- | |
501 | ||
502 | <example> | |
503 | 15 > 10 | |
504 | 0010 == 10 | |
505 | ||
506 | d.r > dsr | |
507 | 32.d.r == 0032.d.r | |
508 | d.rnr < d.rnrn | |
509 | </example> | |
510 | ||
511 | </book> |