]>
Commit | Line | Data |
---|---|---|
1 | <?xml version="1.0" encoding="UTF-8"?> | |
2 | <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" | |
3 | "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [ | |
4 | <!ENTITY % aptent SYSTEM "apt.ent"> %aptent; | |
5 | <!ENTITY % aptverbatiment SYSTEM "apt-verbatim.ent"> %aptverbatiment; | |
6 | <!ENTITY % aptvendor SYSTEM "apt-vendor.ent"> %aptvendor; | |
7 | ]> | |
8 | ||
9 | <book lang="en"> | |
10 | ||
11 | <title>dpkg technical manual</title> | |
12 | ||
13 | <bookinfo> | |
14 | ||
15 | <authorgroup> | |
16 | <author> | |
17 | <personname>Tom Lees</personname><email>tom@lpsg.demon.co.uk</email> | |
18 | </author> | |
19 | </authorgroup> | |
20 | ||
21 | <releaseinfo>Version &apt-product-version;</releaseinfo> | |
22 | ||
23 | <abstract> | |
24 | <para> | |
25 | This document describes the minimum necessary workings for the APT dselect | |
26 | replacement. It gives an overall specification of what its external interface | |
27 | must look like for compatibility, and also gives details of some internal | |
28 | quirks. | |
29 | </para> | |
30 | </abstract> | |
31 | ||
32 | <copyright><year>1997</year><holder>Tom Lees</holder></copyright> | |
33 | ||
34 | <legalnotice> | |
35 | <title>License Notice</title> | |
36 | <para> | |
37 | APT and this document are free software; you can redistribute them and/or | |
38 | modify them under the terms of the GNU General Public License as published by | |
39 | the Free Software Foundation; either version 2 of the License, or (at your | |
40 | option) any later version. | |
41 | </para> | |
42 | <para> | |
43 | For more details, on Debian systems, see the file | |
44 | /usr/share/common-licenses/GPL for the full license. | |
45 | </para> | |
46 | </legalnotice> | |
47 | ||
48 | </bookinfo> | |
49 | ||
50 | <chapter id="ch1"><title>Quick summary of dpkg's external interface</title> | |
51 | ||
52 | <section id="control"><title>Control files</title> | |
53 | <para> | |
54 | The basic dpkg package control file supports the following major features:- | |
55 | </para> | |
56 | <itemizedlist> | |
57 | <listitem> | |
58 | <para> | |
59 | 5 types of dependencies:- | |
60 | </para> | |
61 | <itemizedlist> | |
62 | <listitem> | |
63 | <para> | |
64 | Pre-Depends, which must be satisfied before a package may be unpacked | |
65 | </para> | |
66 | </listitem> | |
67 | <listitem> | |
68 | <para> | |
69 | Depends, which must be satisfied before a package may be configured | |
70 | </para> | |
71 | </listitem> | |
72 | <listitem> | |
73 | <para> | |
74 | Recommends, to specify a package which if not installed may severely limit the | |
75 | usefulness of the package | |
76 | </para> | |
77 | </listitem> | |
78 | <listitem> | |
79 | <para> | |
80 | Suggests, to specify a package which may increase the productivity of the | |
81 | package | |
82 | </para> | |
83 | </listitem> | |
84 | <listitem> | |
85 | <para> | |
86 | Conflicts, to specify a package which must NOT be installed in order for the | |
87 | package to be configured | |
88 | </para> | |
89 | </listitem> | |
90 | <listitem> | |
91 | <para> | |
92 | Breaks, to specify a package which is broken by the package and which should | |
93 | therefore not be configured while broken | |
94 | </para> | |
95 | </listitem> | |
96 | </itemizedlist> | |
97 | <para> | |
98 | Each of these dependencies can specify a version and a depedency on that | |
99 | version, for example "<= 0.5-1", "== 2.7.2-1", etc. The comparators | |
100 | available are:- | |
101 | </para> | |
102 | <itemizedlist> | |
103 | <listitem> | |
104 | <para> | |
105 | "<<" - less than | |
106 | </para> | |
107 | </listitem> | |
108 | <listitem> | |
109 | <para> | |
110 | "<=" - less than or equal to | |
111 | </para> | |
112 | </listitem> | |
113 | <listitem> | |
114 | <para> | |
115 | ">>" - greater than | |
116 | </para> | |
117 | </listitem> | |
118 | <listitem> | |
119 | <para> | |
120 | ">=" - greater than or equal to | |
121 | </para> | |
122 | </listitem> | |
123 | <listitem> | |
124 | <para> | |
125 | "==" - equal to | |
126 | </para> | |
127 | </listitem> | |
128 | </itemizedlist> | |
129 | </listitem> | |
130 | <listitem> | |
131 | <para> | |
132 | The concept of "virtual packages", which many other packages may provide, | |
133 | using the Provides mechanism. An example of this is the "httpd" virtual | |
134 | package, which all web servers should provide. Virtual package names may be | |
135 | used in dependency headers. However, current policy is that virtual packages | |
136 | do not support version numbers, so dependencies on virtual packages with | |
137 | versions will always fail. | |
138 | </para> | |
139 | </listitem> | |
140 | <listitem> | |
141 | <para> | |
142 | Several other control fields, such as Package, Version, Description, Section, | |
143 | Priority, etc., which are mainly for classification purposes. The package | |
144 | name must consist entirely of lowercase characters, plus the characters '+', | |
145 | '-', and '.'. Fields can extend across multiple lines - on the second and | |
146 | subsequent lines, there is a space at the beginning instead of a field name | |
147 | and a ':'. Empty lines must consist of the text " .", which will be ignored, | |
148 | as will the initial space for other continuation lines. This feature is | |
149 | usually only used in the Description field. | |
150 | </para> | |
151 | </listitem> | |
152 | </itemizedlist> | |
153 | </section> | |
154 | ||
155 | <section id="s1.2"><title>The dpkg status area</title> | |
156 | <para> | |
157 | The "dpkg status area" is the term used to refer to the directory where dpkg | |
158 | keeps its various status files (GNU would have you call it the dpkg shared | |
159 | state directory). This is always, on Debian systems, /var/lib/dpkg. However, | |
160 | the default directory name should not be hard-coded, but #define'd, so that | |
161 | alteration is possible (it is available via configure in dpkg 1.4.0.9 and | |
162 | above). Of course, in a library, code should be allowed to override the | |
163 | default directory, but the default should be part of the library (so that | |
164 | the user may change the dpkg admin dir simply by replacing the library). | |
165 | </para> | |
166 | <para> | |
167 | Dpkg keeps a variety of files in its status area. These are discussed later | |
168 | on in this document, but a quick summary of the files is here:- | |
169 | </para> | |
170 | <itemizedlist> | |
171 | <listitem> | |
172 | <para> | |
173 | available - this file contains a concatenation of control information from all | |
174 | the packages which dpkg knows about. This is updated using the dpkg commands | |
175 | "--update-avail <file>", "--merge-avail <file>", and | |
176 | "--clear-avail". | |
177 | </para> | |
178 | </listitem> | |
179 | <listitem> | |
180 | <para> | |
181 | status - this file contains information on the following things for every | |
182 | package:- | |
183 | </para> | |
184 | <itemizedlist> | |
185 | <listitem> | |
186 | <para> | |
187 | Whether it is installed, not installed, unpacked, removed, failed | |
188 | configuration, or half-installed (deconfigured in favour of another package). | |
189 | </para> | |
190 | </listitem> | |
191 | <listitem> | |
192 | <para> | |
193 | Whether it is selected as install, hold, remove, or purge. | |
194 | </para> | |
195 | </listitem> | |
196 | <listitem> | |
197 | <para> | |
198 | If it is "ok" (no installation problems), or "not-ok". | |
199 | </para> | |
200 | </listitem> | |
201 | <listitem> | |
202 | <para> | |
203 | It usually also contains the section and priority (so that dselect may classify | |
204 | packages not in available) | |
205 | </para> | |
206 | </listitem> | |
207 | <listitem> | |
208 | <para> | |
209 | For packages which did not initially appear in the "available" file when they | |
210 | were installed, the other control information for them. | |
211 | </para> | |
212 | </listitem> | |
213 | </itemizedlist> | |
214 | <para> | |
215 | The exact format for the "Status:" field is: | |
216 | </para> | |
217 | <screen> | |
218 | Status: Want Flag Status | |
219 | </screen> | |
220 | <para> | |
221 | Where <replaceable>Want</replaceable> may be one of | |
222 | <emphasis>unknown</emphasis>, <emphasis>install</emphasis>, | |
223 | <emphasis>hold</emphasis>, <emphasis>deinstall</emphasis>, | |
224 | <emphasis>purge</emphasis>. <replaceable>Flag</replaceable> may | |
225 | be one of <emphasis>ok</emphasis>, <emphasis>reinstreq</emphasis>, | |
226 | <emphasis>hold</emphasis>, | |
227 | <emphasis>hold-reinstreq</emphasis>. <replaceable>Status</replaceable> may | |
228 | be one of <emphasis>not-installed</emphasis>, <emphasis>unpacked</emphasis>, | |
229 | <emphasis>half-configured</emphasis>, <emphasis>installed</emphasis>, | |
230 | <emphasis>half-installed</emphasis> <emphasis>config-files</emphasis>, | |
231 | <emphasis>post-inst-failed</emphasis>, <emphasis>removal-failed</emphasis>. | |
232 | The states are as follows:- | |
233 | </para> | |
234 | <variablelist> | |
235 | <varlistentry> | |
236 | <term>not-installed</term> | |
237 | <listitem> | |
238 | <para> | |
239 | No files are installed from the package, it has no config files left, it | |
240 | uninstalled cleanly if it ever was installed. | |
241 | </para> | |
242 | </listitem> | |
243 | </varlistentry> | |
244 | <varlistentry> | |
245 | <term>unpacked</term> | |
246 | <listitem> | |
247 | <para> | |
248 | The basic files have been unpacked (and are listed in | |
249 | /var/lib/dpkg/info/[package].list. There are config files present, but the | |
250 | postinst script has _NOT_ been run. | |
251 | </para> | |
252 | </listitem> | |
253 | </varlistentry> | |
254 | <varlistentry> | |
255 | <term>half-configured</term> | |
256 | <listitem> | |
257 | <para> | |
258 | The package was installed and unpacked, but the postinst script failed in some | |
259 | way. | |
260 | </para> | |
261 | </listitem> | |
262 | </varlistentry> | |
263 | <varlistentry> | |
264 | <term>installed</term> | |
265 | <listitem> | |
266 | <para> | |
267 | All files for the package are installed, and the configuration was also | |
268 | successful. | |
269 | </para> | |
270 | </listitem> | |
271 | </varlistentry> | |
272 | <varlistentry> | |
273 | <term>half-installed</term> | |
274 | <listitem> | |
275 | <para> | |
276 | An attempt was made to remove the packagem but there was a failure in the | |
277 | prerm script. | |
278 | </para> | |
279 | </listitem> | |
280 | </varlistentry> | |
281 | <varlistentry> | |
282 | <term>config-files</term> | |
283 | <listitem> | |
284 | <para> | |
285 | The package was "removed", not "purged". The config files are left, but | |
286 | nothing else. | |
287 | </para> | |
288 | </listitem> | |
289 | </varlistentry> | |
290 | <varlistentry> | |
291 | <term>post-inst-failed</term> | |
292 | <listitem> | |
293 | <para> | |
294 | Old name for half-configured. Do not use. | |
295 | </para> | |
296 | </listitem> | |
297 | </varlistentry> | |
298 | <varlistentry> | |
299 | <term>removal-failed</term> | |
300 | <listitem> | |
301 | <para> | |
302 | Old name for half-installed. Do not use. | |
303 | </para> | |
304 | </listitem> | |
305 | </varlistentry> | |
306 | </variablelist> | |
307 | <para> | |
308 | The two last items are only left in dpkg for compatibility - they are | |
309 | understood by it, but never written out in this form. | |
310 | </para> | |
311 | <para> | |
312 | Please see the dpkg source code, <literal>lib/parshelp.c</literal>, | |
313 | <emphasis>statusinfos</emphasis>, <emphasis>eflaginfos</emphasis> and | |
314 | <emphasis>wantinfos</emphasis> for more details. | |
315 | </para> | |
316 | </listitem> | |
317 | <listitem> | |
318 | <para> | |
319 | info - this directory contains files from the control archive of every | |
320 | package currently installed. They are installed with a prefix of | |
321 | "<packagename>.". In addition to this, it also contains a file | |
322 | called <package>.list for every package, which contains a list | |
323 | of files. Note also that the control file is not copied into here; it | |
324 | is instead found as part of status or available. | |
325 | </para> | |
326 | </listitem> | |
327 | <listitem> | |
328 | <para> | |
329 | methods - this directory is reserved for "method"-specific files - each | |
330 | "method" has a subdirectory underneath this directory (or at least, | |
331 | it can have). In addition, there is another subdirectory "mnt", where | |
332 | misc. filesystems (floppies, CD-ROMs, etc.) are mounted. | |
333 | </para> | |
334 | </listitem> | |
335 | <listitem> | |
336 | <para> | |
337 | alternatives - directory used by the "update-alternatives" program. It | |
338 | contains one file for each "alternatives" interface, which contains | |
339 | information about all the needed symlinked files for each alternative. | |
340 | </para> | |
341 | </listitem> | |
342 | <listitem> | |
343 | <para> | |
344 | diversions - file used by the "dpkg-divert" program. Each diversion takes | |
345 | three lines. The first is the package name (or ":" for user diversion), the | |
346 | second the original filename, and the third the diverted filename. | |
347 | </para> | |
348 | </listitem> | |
349 | <listitem> | |
350 | <para> | |
351 | updates - directory used internally by dpkg. This is discussed later, in the | |
352 | section <xref linkend="updates"/>. | |
353 | </para> | |
354 | </listitem> | |
355 | <listitem> | |
356 | <para> | |
357 | parts - temporary directory used by dpkg-split | |
358 | </para> | |
359 | </listitem> | |
360 | </itemizedlist> | |
361 | </section> | |
362 | ||
363 | <section id="s1.3"><title>The dpkg library files</title> | |
364 | <para> | |
365 | These files are installed under /usr/lib/dpkg (usually), but | |
366 | /usr/local/lib/dpkg is also a possibility (as Debian policy dictates). Under | |
367 | this directory, there is a "methods" subdirectory. The methods subdirectory in | |
368 | turn contains any number of subdirectories for each general method processor | |
369 | (note that one set of method scripts can, and is, used for more than one of | |
370 | the methods listed under dselect). | |
371 | </para> | |
372 | <para> | |
373 | The following files may be found in each of these subdirectories:- | |
374 | </para> | |
375 | <itemizedlist> | |
376 | <listitem> | |
377 | <para> | |
378 | names - One line per method, two-digit priority to appear on menu at | |
379 | beginning, followed by a space, the name, and then another space and | |
380 | the short description. | |
381 | </para> | |
382 | </listitem> | |
383 | <listitem> | |
384 | <para> | |
385 | desc.<name> - Contains the long description displayed by dselect | |
386 | when the cursor is put over the <name> method. | |
387 | </para> | |
388 | </listitem> | |
389 | <listitem> | |
390 | <para> | |
391 | setup - Script or program which sets up the initial values to be used | |
392 | by this method. Called with first argument as the status area directory | |
393 | (/var/lib/dpkg), second argument as the name of the method (as in the | |
394 | directory name), and the third argument as the option (as in the names file). | |
395 | </para> | |
396 | </listitem> | |
397 | <listitem> | |
398 | <para> | |
399 | install - Script/program called when the "install" option of dselect is run | |
400 | with this method. Same arguments as for setup. | |
401 | </para> | |
402 | </listitem> | |
403 | <listitem> | |
404 | <para> | |
405 | update - Script/program called when the "update" option of dselect is | |
406 | run. Same arguments as for setup/install. | |
407 | </para> | |
408 | </listitem> | |
409 | </itemizedlist> | |
410 | </section> | |
411 | ||
412 | <section id="s1.4"><title>The "dpkg" command-line utility</title> | |
413 | ||
414 | <section id="s1.4.1"><title>"Documented" command-line interfaces</title> | |
415 | <para> | |
416 | As yet unwritten. You can refer to the other manuals for now. See | |
417 | <citerefentry><refentrytitle>dpkg</refentrytitle><manvolnum>8</manvolnum></citerefentry>. | |
418 | </para> | |
419 | </section> | |
420 | ||
421 | <section id="s1.4.2"><title>Environment variables which dpkg responds to</title> | |
422 | <itemizedlist> | |
423 | <listitem> | |
424 | <para> | |
425 | DPKG_NO_TSTP - if set to a non-null value, this variable causes dpkg to run a | |
426 | child shell process instead of sending itself a SIGTSTP, when the user selects | |
427 | to background the dpkg process when it asks about conffiles. | |
428 | </para> | |
429 | </listitem> | |
430 | <listitem> | |
431 | <para> | |
432 | SHELL - used to determine which shell to run in the case when DPKG_NO_TSTP | |
433 | is set. | |
434 | </para> | |
435 | </listitem> | |
436 | <listitem> | |
437 | <para> | |
438 | CC - used as the C compiler to call to determine the target architecture. The | |
439 | default is "gcc". | |
440 | </para> | |
441 | </listitem> | |
442 | <listitem> | |
443 | <para> | |
444 | PATH - dpkg checks that it can find at least the following files in the path | |
445 | when it wants to run package installation scripts, and gives an error if it | |
446 | cannot find all of them:- | |
447 | </para> | |
448 | <itemizedlist> | |
449 | <listitem> | |
450 | <para> | |
451 | ldconfig | |
452 | </para> | |
453 | </listitem> | |
454 | <listitem> | |
455 | <para> | |
456 | start-stop-daemon | |
457 | </para> | |
458 | </listitem> | |
459 | <listitem> | |
460 | <para> | |
461 | install-info | |
462 | </para> | |
463 | </listitem> | |
464 | <listitem> | |
465 | <para> | |
466 | update-rc.d | |
467 | </para> | |
468 | </listitem> | |
469 | </itemizedlist> | |
470 | </listitem> | |
471 | </itemizedlist> | |
472 | </section> | |
473 | ||
474 | <section id="s1.4.3"><title>Assertions</title> | |
475 | <para> | |
476 | The dpkg utility itself is required for quite a number of packages, even if | |
477 | they have been installed with a tool totally separate from dpkg. The reason | |
478 | for this is that some packages, in their pre-installation scripts, check that | |
479 | your version of dpkg supports certain features. This was broken from the | |
480 | start, and it should have actually been a control file header "Dpkg-requires", | |
481 | or similar. What happens is that the configuration scripts will abort or | |
482 | continue according to the exit code of a call to dpkg, which will stop them | |
483 | from being wrongly configured. | |
484 | </para> | |
485 | <para> | |
486 | These special command-line options, which simply return as true or false are | |
487 | all prefixed with "--assert-". Here is a list of them (without the prefix):- | |
488 | </para> | |
489 | <itemizedlist> | |
490 | <listitem> | |
491 | <para> | |
492 | support-predepends - Returns success or failure according to whether a version | |
493 | of dpkg which supports predepends properly (1.1.0 or above) is installed, | |
494 | according to the database. | |
495 | </para> | |
496 | </listitem> | |
497 | <listitem> | |
498 | <para> | |
499 | working-epoch - Return success or failure according to whether a version of | |
500 | dpkg which supports epochs in version properly (1.4.0.7 or above) is installed, | |
501 | according to the database. | |
502 | </para> | |
503 | </listitem> | |
504 | </itemizedlist> | |
505 | <para> | |
506 | Both these options check the status database to see what version of the | |
507 | "dpkg" package is installed, and check it against a known working version. | |
508 | </para> | |
509 | </section> | |
510 | ||
511 | <section id="s1.4.4"><title>--predep-package</title> | |
512 | <para> | |
513 | This strange option is described as follows in the source code: | |
514 | </para> | |
515 | <screen> | |
516 | /* Print a single package which: | |
517 | * (a) is the target of one or more relevant predependencies. | |
518 | * (b) has itself no unsatisfied pre-dependencies. | |
519 | * If such a package is present output is the Packages file entry, | |
520 | * which can be massaged as appropriate. | |
521 | * Exit status: | |
522 | * 0 = a package printed, OK | |
523 | * 1 = no suitable package available | |
524 | * 2 = error | |
525 | */ | |
526 | </screen> | |
527 | <para> | |
528 | On further inspection of the source code, it appears that what is does is | |
529 | this:- | |
530 | </para> | |
531 | <itemizedlist> | |
532 | <listitem> | |
533 | <para> | |
534 | Looks at the packages in the database which are selected as "install", | |
535 | and are installed. | |
536 | </para> | |
537 | </listitem> | |
538 | <listitem> | |
539 | <para> | |
540 | It then looks at the Pre-Depends information for each of these packages | |
541 | from the available file. When it find a package for which any of the | |
542 | pre-dependencies are not satisfied, it breaks from the loop through the | |
543 | packages. | |
544 | </para> | |
545 | </listitem> | |
546 | <listitem> | |
547 | <para> | |
548 | It then looks through the unsatisfied pre-dependencies, and looks for | |
549 | packages which would satisfy this pre-dependency, stopping on the first | |
550 | it finds. If it finds none, it bombs out with an error. | |
551 | </para> | |
552 | </listitem> | |
553 | <listitem> | |
554 | <para> | |
555 | It then continues this for every dependency of the initial package. | |
556 | </para> | |
557 | </listitem> | |
558 | </itemizedlist> | |
559 | <para> | |
560 | Eventually, it writes out the record of all the packages to satisfy the | |
561 | pre-dependencies. This is used by the disk method to make sure that its | |
562 | dependency ordering is correct. What happens is that all pre-depending | |
563 | packages are first installed, then it runs dpkg -iGROEB on the directory, | |
564 | which installs in the order package files are found. Since pre-dependencies | |
565 | mean that a package may not even be unpacked unless they are satisfied, it | |
566 | is necessary to do this (usually, since all the package files are unpacked | |
567 | in one phase, the configured in another, this is not needed). | |
568 | </para> | |
569 | </section> | |
570 | ||
571 | </section> | |
572 | ||
573 | </chapter> | |
574 | ||
575 | <chapter id="ch2"><title>dpkg-deb and .deb file internals</title> | |
576 | <para> | |
577 | This chapter describes the internals to the "dpkg-deb" tool, which is used by | |
578 | "dpkg" as a back-end. dpkg-deb has its own tar extraction functions, which is | |
579 | the source of many problems, as it does not support long filenames, using | |
580 | extension blocks. | |
581 | </para> | |
582 | ||
583 | <section id="s2.1"><title>The .deb archive format</title> | |
584 | <para> | |
585 | The main principal of the new-format Debian archive (I won't describe the old | |
586 | format - for that have a look at deb-old.5), is that the archive really is an | |
587 | archive - as used by "ar" and friends. However, dpkg-deb uses this format | |
588 | internally, rather than calling "ar". Inside this archive, there are usually | |
589 | the following members:- | |
590 | </para> | |
591 | <itemizedlist> | |
592 | <listitem> | |
593 | <para> | |
594 | debian-binary | |
595 | </para> | |
596 | </listitem> | |
597 | <listitem> | |
598 | <para> | |
599 | control.tar.gz | |
600 | </para> | |
601 | </listitem> | |
602 | <listitem> | |
603 | <para> | |
604 | data.tar.gz | |
605 | </para> | |
606 | </listitem> | |
607 | </itemizedlist> | |
608 | <para> | |
609 | The debian-binary member consists simply of the string "2.0", indicating | |
610 | the format version. control.tar.gz contains the control files (and scripts), | |
611 | and the data.tar.gz contains the actual files to populate the filesystem | |
612 | with. Both tarfiles extract straight into the current directory. Information | |
613 | on the tar formats can be found in the GNU tar info page. Since dpkg-deb | |
614 | calls "tar -cf" to build packages, the Debian packages use the GNU extensions. | |
615 | </para> | |
616 | </section> | |
617 | ||
618 | <section id="s2.2"><title>The dpkg-deb command-line</title> | |
619 | <para> | |
620 | dpkg-deb documents itself thoroughly with its '--help' command-line | |
621 | option. However, I am including a reference to these for | |
622 | completeness. dpkg-deb supports the following options:- | |
623 | </para> | |
624 | <itemizedlist> | |
625 | <listitem> | |
626 | <para> | |
627 | --build (-b) <dir> - builds a .deb archive, takes a directory which | |
628 | contains all the files as an argument. Note that the directory | |
629 | <dir>/DEBIAN will be packed separately into the control archive. | |
630 | </para> | |
631 | </listitem> | |
632 | <listitem> | |
633 | <para> | |
634 | --contents (-c) <debfile> - Lists the contents of the "data.tar.gz" | |
635 | member. | |
636 | </para> | |
637 | </listitem> | |
638 | <listitem> | |
639 | <para> | |
640 | --control (-e) <debfile> - Extracts the control archive into a directory | |
641 | called DEBIAN. Alternatively, with another argument, it will extract it into a | |
642 | different directory. | |
643 | </para> | |
644 | </listitem> | |
645 | <listitem> | |
646 | <para> | |
647 | --info (-I) <debfile> - Prints the contents of the "control" file in the | |
648 | control archive to stdout. Alternatively, giving it other arguments will cause | |
649 | it to print the contents of those files instead. | |
650 | </para> | |
651 | </listitem> | |
652 | <listitem> | |
653 | <para> | |
654 | --field (-f) <debfile> <field> ... - Prints any number of fields | |
655 | from the "control" file. Giving it extra arguments limits the fields it prints | |
656 | to only those specified. With no command-line arguments other than a filename, | |
657 | it is equivalent to -I and just the .deb filename. | |
658 | </para> | |
659 | </listitem> | |
660 | <listitem> | |
661 | <para> | |
662 | --extract (-x) <debfile> <dir> - Extracts the data archive of a | |
663 | debian package under the directory <dir>. | |
664 | </para> | |
665 | </listitem> | |
666 | <listitem> | |
667 | <para> | |
668 | --vextract (-X) <debfile> <dir> - Same as --extract, except it | |
669 | is equivalent of giving tar the '-v' option - it prints the filenames as it | |
670 | extracts them. | |
671 | </para> | |
672 | </listitem> | |
673 | <listitem> | |
674 | <para> | |
675 | --fsys-tarfile <debfile> - This option outputs a gunzip'd version of | |
676 | data.tar.gz to stdout. | |
677 | </para> | |
678 | </listitem> | |
679 | <listitem> | |
680 | <para> | |
681 | --new - sets the archive format to be used to the new Debian format | |
682 | </para> | |
683 | </listitem> | |
684 | <listitem> | |
685 | <para> | |
686 | --old - sets the archive format to be used to the old Debian format | |
687 | </para> | |
688 | </listitem> | |
689 | <listitem> | |
690 | <para> | |
691 | --debug - Tells dpkg-deb to produce debugging output | |
692 | </para> | |
693 | </listitem> | |
694 | <listitem> | |
695 | <para> | |
696 | --nocheck - Tells dpkg-deb not to check the sanity of the control file | |
697 | </para> | |
698 | </listitem> | |
699 | <listitem> | |
700 | <para> | |
701 | --help (-h) - Gives a help message | |
702 | </para> | |
703 | </listitem> | |
704 | <listitem> | |
705 | <para> | |
706 | --version - Shows the version number | |
707 | </para> | |
708 | </listitem> | |
709 | <listitem> | |
710 | <para> | |
711 | --licence/--license (UK/US spellings) - Shows a brief outline of the GPL | |
712 | </para> | |
713 | </listitem> | |
714 | </itemizedlist> | |
715 | ||
716 | <section id="s2.2.1"><title>Internal checks used by dpkg-deb when building packages</title> | |
717 | <para> | |
718 | Here is a list of the internal checks used by dpkg-deb when building | |
719 | packages. It is in the order they are done. | |
720 | </para> | |
721 | <itemizedlist> | |
722 | <listitem> | |
723 | <para> | |
724 | First, the output Debian archive argument, if it is given, is checked using | |
725 | stat. If it is a directory, an internal flag is set. This check is only made | |
726 | if the archive name is specified explicitly on the command-line. If the | |
727 | argument was not given, the default is the directory name, with ".deb" | |
728 | appended. | |
729 | </para> | |
730 | </listitem> | |
731 | <listitem> | |
732 | <para> | |
733 | Next, the control file is checked, unless the --nocheck flag was specified on | |
734 | the command-line. dpkg-deb will bomb out if the second argument to --build was | |
735 | a directory, and --nocheck was specified. Note that dpkg-deb will not be able | |
736 | to determine the name of the package in this case. In the control file, the | |
737 | following things are checked:- | |
738 | </para> | |
739 | <itemizedlist> | |
740 | <listitem> | |
741 | <para> | |
742 | The package name is checked to see if it contains any invalid characters (see | |
743 | <xref linkend="control"/> for this). | |
744 | </para> | |
745 | </listitem> | |
746 | <listitem> | |
747 | <para> | |
748 | The priority field is checked to see if it uses standard values, and | |
749 | user-defined values are warned against. However, note that this check is now | |
750 | redundant, since the control file no longer contains the priority - the | |
751 | changes file now does this. | |
752 | </para> | |
753 | </listitem> | |
754 | <listitem> | |
755 | <para> | |
756 | The control file fields are then checked against the standard list of fields | |
757 | which appear in control files, and any "user-defined" fields are reported as | |
758 | warnings. | |
759 | </para> | |
760 | </listitem> | |
761 | <listitem> | |
762 | <para> | |
763 | dpkg-deb then checks that the control file contains a valid version number. | |
764 | </para> | |
765 | </listitem> | |
766 | </itemizedlist> | |
767 | </listitem> | |
768 | <listitem> | |
769 | <para> | |
770 | After this, in the case where a directory was specified to build the .deb file | |
771 | in, the filename is created as "directory/pkg_ver.deb" or | |
772 | "directory/pkg_ver_arch.deb", depending on whether the control file contains | |
773 | an architecture field. | |
774 | </para> | |
775 | </listitem> | |
776 | <listitem> | |
777 | <para> | |
778 | Next, dpkg-deb checks for the <dir>/DEBIAN directory. It complains if it | |
779 | doesn't exist, or if it has permissions < 0755, or > 0775. | |
780 | </para> | |
781 | </listitem> | |
782 | <listitem> | |
783 | <para> | |
784 | It then checks that all the files in this subdir are either symlinks or plain | |
785 | files, and have permissions between 0555 and 0775. | |
786 | </para> | |
787 | </listitem> | |
788 | <listitem> | |
789 | <para> | |
790 | The conffiles file is then checked to see if the filenames are too | |
791 | long. Warnings are produced for each that is. After this, it checks | |
792 | that the package provides initial copies of each of these conffiles, | |
793 | and that they are all plain files. | |
794 | </para> | |
795 | </listitem> | |
796 | </itemizedlist> | |
797 | </section> | |
798 | ||
799 | </section> | |
800 | ||
801 | </chapter> | |
802 | ||
803 | <chapter id="ch3"><title>dpkg internals</title> | |
804 | <para> | |
805 | This chapter describes the internals of dpkg itself. Although the low-level | |
806 | formats are quite simple, what dpkg does in certain cases often does not make | |
807 | sense. | |
808 | </para> | |
809 | ||
810 | <section id="updates"><title>Updates</title> | |
811 | <para> | |
812 | This describes the /var/lib/dpkg/updates directory. The function of this | |
813 | directory is somewhat strange, and seems only to be used internally. A | |
814 | function called cleanupdates is called whenever the database is scanned. This | |
815 | function in turn uses | |
816 | <citerefentry><refentrytitle>scandir</refentrytitle><manvolnum>3</manvolnum></citerefentry>, | |
817 | to sort the files in this directory. Files who names do not consist entirely | |
818 | of digits are discarded. dpkg also causes a fatal error if any of the | |
819 | filenames are different lengths. | |
820 | </para> | |
821 | <para> | |
822 | After having scanned the directory, dpkg in turn parses each file the same way | |
823 | it parses the status file (they are sorted by the scandir to be in numerical | |
824 | order). After having done this, it then writes the status information back to | |
825 | the "status" file, and removes all the "updates" files. | |
826 | </para> | |
827 | <para> | |
828 | These files are created internally by dpkg's "checkpoint" function, and are | |
829 | cleaned up when dpkg exits cleanly. | |
830 | </para> | |
831 | <para> | |
832 | Juding by the use of the updates directory I would call it a Journal. Inorder | |
833 | to efficiently ensure the complete integrity of the status file dpkg will | |
834 | "checkpoint" or journal all of it's activities in the updates directory. By | |
835 | merging the contents of the updates directory (in order!!) against the original | |
836 | status file it can get the precise current state of the system, even in the | |
837 | event of a system failure while dpkg is running. | |
838 | </para> | |
839 | <para> | |
840 | The other option would be to sync-rewrite the status file after each operation, | |
841 | which would kill performance. | |
842 | </para> | |
843 | <para> | |
844 | It is very important that any program that uses the status file abort if the | |
845 | updates directory is not empty! The user should be informed to run dpkg | |
846 | manually (what options though??) to correct the situation. | |
847 | </para> | |
848 | </section> | |
849 | ||
850 | <section id="s3.2"><title>What happens when dpkg reads the database</title> | |
851 | <para> | |
852 | First, the status file is read. This gives dpkg an initial idea of the | |
853 | packages that are there. Next, the updates files are read in, overriding the | |
854 | status file, and if necessary, the status file is re-written, and updates files | |
855 | are removed. Finally, the available file is read. The available file is read | |
856 | with flags which preclude dpkg from updating any status information from it, | |
857 | though - installed version, etc., and is also told to record that the packages | |
858 | it reads this time are available, not installed. | |
859 | </para> | |
860 | <para> | |
861 | More information on updates is given above. | |
862 | </para> | |
863 | </section> | |
864 | ||
865 | <section id="s3.3"><title>How dpkg compares version numbers</title> | |
866 | <para> | |
867 | Version numbers consist of three parts: the epoch, the upstream version, and | |
868 | the Debian revision. Dpkg compares these parts in that order. If the epochs | |
869 | are different, it returns immediately, and so on. | |
870 | </para> | |
871 | <para> | |
872 | However, the important part is how it compares the versions which are | |
873 | essentially stored as just strings. These are compared in two distinct | |
874 | parts: those consisting of numerical characters (which are evaluated, and | |
875 | then compared), and those consisting of other characters. When comparing | |
876 | non-numerical parts, they are compared as the character values (ASCII), | |
877 | but non-alphabetical characters are considered "greater than" alphabetical | |
878 | ones. Also note that longer strings (after excluding differences where | |
879 | numerical values are equal) are considered "greater than" shorter ones. | |
880 | </para> | |
881 | <para> | |
882 | Here are a few examples of how these rules apply:- | |
883 | </para> | |
884 | <screen> | |
885 | 15 > 10 | |
886 | 0010 == 10 | |
887 | ||
888 | d.r > dsr | |
889 | 32.d.r == 0032.d.r | |
890 | d.rnr < d.rnrn | |
891 | </screen> | |
892 | </section> | |
893 | ||
894 | </chapter> | |
895 | ||
896 | </book> |