This file is indexed.

/usr/share/doc/maint-guide-ru/html/modify.ru.html is in maint-guide-ru 1.2.32.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Глава 3. Изменение исходного кода</title>
    <link rel="stylesheet" type="text/css" href="maint-guide.css"/>
    <meta name="generator" content="DocBook XSL Stylesheets V1.78.1"/>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <link rel="home" href="index.ru.html" title="Руководство начинающего разработчика Debian"/>
    <link rel="up" href="index.ru.html" title="Руководство начинающего разработчика Debian"/>
    <link rel="prev" href="first.ru.html" title="Глава 2. Первые шаги"/>
    <link rel="next" href="dreq.ru.html" title="Глава 4. Обязательные файлы в каталоге debian"/>
  </head>
  <body>
    <div class="navheader">
      <table width="100%" summary="Navigation header">
        <tr>
          <th colspan="3" align="center">Глава 3. Изменение исходного кода</th>
        </tr>
        <tr>
          <td align="left"><a accesskey="p" href="first.ru.html"><img src="images/prev.gif" alt="Пред."/></a> </td>
          <th width="60%" align="center"> </th>
          <td align="right"> <a accesskey="n" href="dreq.ru.html"><img src="images/next.gif" alt="След."/></a></td>
        </tr>
      </table>
      <hr/>
    </div>
    <div class="chapter">
      <div class="titlepage">
        <div>
          <div>
            <h1 class="title"><a id="modify"/>Глава 3. Изменение исходного кода</h1>
          </div>
        </div>
      </div>
      <div class="toc">
        <p>
          <strong>Содержание</strong>
        </p>
        <dl class="toc">
          <dt>
            <span class="section">
              <a href="modify.ru.html#quiltrc">3.1. Настройка <span class="command"><strong>quilt</strong></span></a>
            </span>
          </dt>
          <dt>
            <span class="section">
              <a href="modify.ru.html#fixupstream">3.2. Исправление ошибок в исходной программе</a>
            </span>
          </dt>
          <dt>
            <span class="section">
              <a href="modify.ru.html#destdir">3.3. Установка файлов в их каталоги назначения</a>
            </span>
          </dt>
          <dt>
            <span class="section">
              <a href="modify.ru.html#difflibs">3.4. Несовпадение библиотек</a>
            </span>
          </dt>
        </dl>
      </div>
      <p>
Заметим, что в данный документ невозможно поместить <span class="emphasis"><em>всю</em></span>
информацию по исправлению исходного кода программы, однако здесь приведены
основные шаги и проблемы, с которыми часто встречаются люди.
</p>
      <div class="section">
        <div class="titlepage">
          <div>
            <div>
              <h2 class="title"><a id="quiltrc"/>3.1. Настройка <span class="command"><strong>quilt</strong></span></h2>
            </div>
          </div>
        </div>
        <p>
Программа <span class="command"><strong>quilt</strong></span> предлагает простой способ записи
изменений, произведённых в исходном коде для пакетирования Debian. Для
удобства использования слегка изменим настройки по умолчанию, добавив для
пакетирования псевдоним <span class="command"><strong>dquilt</strong></span> в файле
<code class="filename">~/.bashrc</code>. Вторая строка служит для включения
автодополнения к <span class="command"><strong>dquilt</strong></span>, такого же как у команды
<span class="command"><strong>quilt</strong></span>.
</p>
        <pre class="screen">
alias dquilt="quilt --quiltrc=${HOME}/.quiltrc-dpkg"
complete -F _quilt_completion $_quilt_complete_opt dquilt
</pre>
        <p>
Затем создадим файл <code class="filename">~/.quiltrc-dpkg</code> со следующим
содержимым:
</p>
        <pre class="screen">
d=. ; while [ ! -d $d/debian -a `readlink -e $d` != / ]; do d=$d/..; done
if [ -d $d/debian ] &amp;&amp; [ -z $QUILT_PATCHES ]; then
    # если в пакетируемом дереве Debian не задана $QUILT_PATCHES
    QUILT_PATCHES="debian/patches"
    QUILT_PATCH_OPTS="--reject-format=unified"
    QUILT_DIFF_ARGS="-p ab --no-timestamps --no-index --color=auto"
    QUILT_REFRESH_ARGS="-p ab --no-timestamps --no-index"
    QUILT_COLORS="diff_hdr=1;32:diff_add=1;34:diff_rem=1;31:diff_hunk=1;33:diff_ctx=35:diff_cctx=33"
    if ! [ -d $d/debian/patches ]; then mkdir $d/debian/patches; fi
fi
</pre>
        <p>
О том, как использовать <span class="command"><strong>quilt</strong></span>, читайте в <span class="citerefentry"><span class="refentrytitle">quilt</span>(1)</span> и <code class="filename">/usr/share/doc/quilt/quilt.pdf.gz</code>.
</p>
      </div>
      <div class="section">
        <div class="titlepage">
          <div>
            <div>
              <h2 class="title"><a id="fixupstream"/>3.2. Исправление ошибок в исходной программе</h2>
            </div>
          </div>
        </div>
        <p>
Предположим, вы нашли ошибку в файле <code class="filename">Makefile</code> из архива
программы — вместо <code class="literal">install: gentoo</code> должно быть
<code class="literal">install: gentoo-target</code>:
</p>
        <pre class="screen">
install: gentoo
        install ./gentoo $(BIN)
        install icons/* $(ICONS)
        install gentoorc-example $(HOME)/.gentoorc
</pre>
        <p>
Внесём исправление и запишем его при помощи команды
<span class="command"><strong>dquilt</strong></span> в файл
<code class="filename">fix-gentoo-target.patch</code> <a href="#ftn.idp24460204" class="footnote" id="idp24460204"><sup class="footnote">[22]</sup></a>:
</p>
        <pre class="screen">
$ mkdir debian/patches
$ dquilt new fix-gentoo-target.patch
$ dquilt add Makefile
</pre>
        <p>
Изменим файл <code class="filename">Makefile</code> следующим образом:
</p>
        <pre class="screen">
install: gentoo-target
        install ./gentoo $(BIN)
        install icons/* $(ICONS)
        install gentoorc-example $(HOME)/.gentoorc
</pre>
        <p>
Запустите <span class="command"><strong>dquilt</strong></span> для генерации и записи заплаты в файл
<code class="filename">debian/patches/fix-gentoo-target.patch</code> и добавьте к ней
описание в соответствии с <a class="ulink" href="http://dep.debian.net/deps/dep3/">DEP-3: Руководство по
маркировке заплат</a>.
</p>
        <pre class="screen">
$ dquilt refresh
$ dquilt header -e
... описание заплаты
</pre>
      </div>
      <div class="section">
        <div class="titlepage">
          <div>
            <div>
              <h2 class="title"><a id="destdir"/>3.3. Установка файлов в их каталоги назначения</h2>
            </div>
          </div>
        </div>
        <p>
Большинство стороннего ПО устанавливает себя в иерархию каталогов
<code class="filename">/usr/local</code>. В Debian это место зарезервировано для
использования администратором по своему усмотрению, поэтому пакеты не должны
использовать такие каталоги как <code class="filename">/usr/local/bin</code>, а
должны устанавливаться в системные каталоги, такие как
<code class="filename">/usr/bin</code>, согласно <a class="ulink" href="http://www.debian.org/doc/packaging-manuals/fhs/fhs-2.3.html">стандарту
иерархии файловой системы</a> (FHS).
</p>
        <p>
Обычно, для автоматизации сборки программы используется <span class="citerefentry"><span class="refentrytitle">make</span>(1)</span>, а по команде <code class="literal">make install</code> выполняется
установка программ в желаемый каталог, назначенный для цели
<code class="literal">install</code> в файле <code class="filename">Makefile</code>. Для
создания двоичных, готовых к установке пакетов Debian, требуется изменить
систему сборки таким образом, чтобы она устанавливала программы в образ
файловой системы, развёрнутый во временном каталоге, а не в реальное место
назначения.
</p>
        <p>
Эти два различия между нормальной установкой программы, с одной стороны, и
системой пакетирования Debian с другой, могут быть прозрачно переданы
пакетом <code class="systemitem">debhelper</code> с помощью команд
<span class="command"><strong>dh_auto_configure</strong></span> и <span class="command"><strong>dh_auto_install</strong></span>,
если соблюдаются следующие условия:
</p>
        <div class="itemizedlist">
          <ul class="itemizedlist">
            <li class="listitem">
              <p>
Файл <code class="filename">Makefile</code> соответствует соглашениям GNU и
поддерживает переменную <code class="literal">$(DESTDIR)</code> <a href="#ftn.idp24472676" class="footnote" id="idp24472676"><sup class="footnote">[23]</sup></a>.
</p>
            </li>
            <li class="listitem">
              <p>
Исходный код следует FHS.
</p>
            </li>
          </ul>
        </div>
        <p>
Программы, использующие пакет GNU <span class="command"><strong>autoconf</strong></span>, автоматически
следуют соглашениям GNU, и их легко пакетировать. На основе этого и
эвристики можно сделать вывод, что пакет <code class="systemitem">debhelper</code> будет работать с почти 90% пакетов без
внесения серьёзных изменений в их системы сборки. Поэтому процесс
пакетирования не так сложен, как кажется.
</p>
        <p>
Если вам необходимо внести изменения в файл <code class="filename">Makefile</code>,
убедитесь, что он поддерживает переменную
<code class="literal">$(DESTDIR)</code>. Значение переменной
<code class="literal">$(DESTDIR)</code> явно в нём не задаётся, но указывается в
начале каждого файлового пути, который используется для установки
программы. Сценарий пакетирования присвоит <code class="literal">$(DESTDIR)</code>
значение временного каталога. 
</p>
        <p>
При создании из исходного кода одиночного пакета временный каталог,
используемый командой <span class="command"><strong>dh_auto_install</strong></span>, будет установлен в
<code class="filename">debian/<em class="replaceable"><code>пакет</code></em></code> <a href="#ftn.idp24479188" class="footnote" id="idp24479188"><sup class="footnote">[24]</sup></a>. Всё, что содержится во временном каталоге, будет
помещено в систему пользователя при установке пакета. Различие в том, что
<span class="command"><strong>dpkg</strong></span> установит файлы в систему относительно корневого
каталога, а не вашего рабочего каталога.
</p>
        <p>
Помните: даже если ваша программа устанавливается в
<code class="filename">debian/<em class="replaceable"><code>пакет</code></em></code>, нужно
внимательно следить за правильностью её установки из пакета
<code class="filename">.deb</code> в корневой каталог. Поэтому вы не должны разрешать
системе сборки записывать неизменяемые строки вроде
<code class="literal">/home/моего/deb/<em class="replaceable"><code>пакет</code></em>-<em class="replaceable"><code>версия</code></em>/usr/share/<em class="replaceable"><code>пакет</code></em></code>
в файлы пакета.
</p>
        <p>
Вот соответствующая часть файла <code class="filename">Makefile</code>, взятого из
пакета <code class="systemitem">gentoo</code><a href="#ftn.idp24487396" class="footnote" id="idp24487396"><sup class="footnote">[25]</sup></a>:
</p>
        <pre class="screen">
# Куда помещать исполняемые файлы по команде «make install»?
BIN     = /usr/local/bin
# Куда помещать значки по команде «make install»?
ICONS   = /usr/local/share/gentoo
</pre>
        <p>
Данные настройки предполагают установку в
<code class="filename">/usr/local</code>. Как указывалось ранее, эта иерархия
каталогов зарезервирована для локального использования в Debian, поэтому
измените этот путь на:
</p>
        <pre class="screen">
# Куда помещать исполняемые файлы по команде «make install»?
BIN     = $(DESTDIR)/usr/bin

# Куда помещать значки по команде «make install»?
ICONS   = $(DESTDIR)/usr/share/gentoo
</pre>
        <p>
Где именно должны располагаться исполняемые файлы, значки, документация и
т.д. описывает FHS — стандарт иерархии файловой системы. Рекомендуется
обратить внимание на разделы, которые касаются вашего пакета.
</p>
        <p>
Итак, исполняемые файлы следует устанавливать в
<code class="filename">/usr/bin</code> вместо <code class="filename">/usr/local/bin</code>,
справочные страницы в <code class="filename">/usr/share/man/man1</code> вместо
<code class="filename">/usr/local/man/man1</code> и т.д. Обратите внимание, что хотя
в <code class="filename">Makefile</code> из пакета <code class="systemitem">gentoo</code> отсутствует упоминание о справочной
странице, Debian Policy требует её наличия для каждой программы, поэтому
позднее мы создадим такую страницу и установим её в
<code class="filename">/usr/share/man/man1</code>.
</p>
        <p>
Некоторые программы не используют переменные в <code class="filename">Makefile</code>
для подобного указания путей. Это означает, что, возможно, вам придётся
редактировать исходные файлы, написанные на языке C, для указания
правильного расположения. Но где и как искать эти пути? Для этого вы можете
воспользоваться следующей командой:
</p>
        <pre class="screen">
$ grep -nr --include='*.[c|h]' -e 'usr/local/lib' .
</pre>
        <p>
Команда <span class="command"><strong>grep</strong></span> рекурсивно обходит всё дерево исходного кода
и при обнаружении совпадений сообщает вам имя соответствующего файла и номер
строки.
</p>
        <p>
Отредактируйте указанные строки в этих файлах, заменив
<code class="literal">usr/local/lib</code> на <code class="literal">usr/lib</code>. Это можно
сделать автоматически с помощью команды:
</p>
        <pre class="screen">
$ sed -i -e 's#usr/local/lib#usr/lib#g' \
        $(find . -type f -name '*.[c|h]')
</pre>
        <p>
Если вы хотите подтверждать каждую замену, запустите следующую команду:
</p>
        <pre class="screen">
$ vim '+argdo %s#usr/local/lib#usr/lib#gce|update' +q \
        $(find . -type f -name '*.[c|h]')
</pre>
        <p>
После этого вам нужно найти цель <code class="literal">install</code> (обычно
достаточно найти строку, начинающуюся с <code class="literal">install:</code>) и
заменить все ссылки на каталоги, которые отличаются от указанных в начале
файла <code class="filename">Makefile</code>.
</p>
        <p>
Первоначально, цель <code class="literal">install</code> в  <code class="systemitem">gentoo</code> была такой:
</p>
        <pre class="screen">
install: gentoo-target
        install ./gentoo $(BIN)
        install icons/* $(ICONS)
        install gentoorc-example $(HOME)/.gentoorc
</pre>
        <p>
Давайте исправим ошибку с путями в исходной программе и запишем её при
помощи команды <span class="command"><strong>dquilt</strong></span> в файл
<code class="filename">debian/patches/install.patch</code>.
</p>
        <pre class="screen">
$ dquilt new install.patch
$ dquilt add Makefile
</pre>
        <p>
Воспользуемся редактором для внесения в пакет Debian следующих изменений:
</p>
        <pre class="screen">
install: gentoo-target
        install -d $(BIN) $(ICONS) $(DESTDIR)/etc
        install ./gentoo $(BIN)
        install -m644 icons/* $(ICONS)
        install -m644 gentoorc-example $(DESTDIR)/etc/gentoorc
</pre>
        <p>
Разумеется вы заметили, что в начале цели появилась команда <code class="literal">install
-d</code>. В исходном <code class="filename">Makefile</code> её не было, так как
обычно <code class="literal">/usr/local/bin</code> и другие каталоги уже существуют в
системе на момент запуска <code class="literal">make install</code>. Однако, так как
мы будем проводить установку в создаваемый каждый раз свой каталог, нам
следует создать в нём все необходимые каталоги.
</p>
        <p>
В конец правила установки мы можем добавить что-нибудь ещё, например,
установку дополнительной документации, которую не включили авторы программы:
</p>
        <pre class="screen">
        install -d $(DESTDIR)/usr/share/doc/gentoo/html
        cp -a docs/* $(DESTDIR)/usr/share/doc/gentoo/html
</pre>
        <p>
Убедившись, что всё сделано правильно, c помощью <span class="command"><strong>dquilt</strong></span>
сгенерируем заплату <code class="filename">debian/patches/install.patch</code> и
добавим её описание:
</p>
        <pre class="screen">
$ dquilt refresh
$ dquilt header -e
... описание заплаты
</pre>
        <p>
Теперь у вас есть несколько заплат:
</p>
        <div class="orderedlist">
          <ol class="orderedlist">
            <li class="listitem">
              <p>
Заплата для исправления ошибки в программе:
<code class="filename">debian/patches/fix-gentoo-target.patch</code>
</p>
            </li>
            <li class="listitem">
              <p>
Изменения, необходимые для создания пакета Debian:
<code class="filename">debian/patches/install.patch</code>
</p>
            </li>
          </ol>
        </div>
        <p>
Всякий раз внося изменения, которые не относятся к пакету Debian, как те,
что содержатся в
<code class="filename">debian/patches/fix-gentoo-target.patch</code>, не забывайте
отправлять их сопровождающему программы, чтобы он мог включить эти правки в
следующую версию и они стали доступны всем. Перед отправкой ещё раз
убедитесь, что ваши исправления не относятся только к Debian или Linux (или
даже вообще Unix) — это требуется для переносимости. Такие исправления легче
применять.
</p>
        <p>
Не отправляйте разработчикам программы файлы <code class="filename">debian/*</code>.
</p>
      </div>
      <div class="section">
        <div class="titlepage">
          <div>
            <div>
              <h2 class="title"><a id="difflibs"/>3.4. Несовпадение библиотек</h2>
            </div>
          </div>
        </div>
        <p>
Нередко можно столкнуться с проблемой несовпадения библиотек на различных
платформах. Например, файл <code class="filename">Makefile</code> может содержать
ссылки на библиотеку, которой нет в Debian. В этом случае вы должны изменить
ссылку, указав библиотеку, служащую тем же самым целям, но присутствующую в
Debian.
</p>
        <p>
Предположим, что в программе есть <code class="filename">Makefile</code> (или
<code class="filename">Makefile.in</code>) со строкой следующего вида:
</p>
        <pre class="screen">
LIBS = -lfoo -lbar
</pre>
        <p>
Если ваша программа не компилируется из-за отсутствия библиотеки
<code class="literal">foo</code> и в Debian для неё есть замена в виде
<code class="literal">foo2</code>, то вы можете исправить проблему со сборкой с
помощью <code class="filename">debian/patches/foo2.patch</code>, который заменяет
<code class="literal">foo</code> на <code class="literal">foo2</code>:<a href="#ftn.idp24518300" class="footnote" id="idp24518300"><sup class="footnote">[26]</sup></a>
</p>
        <pre class="screen">
$ dquilt new foo2.patch
$ dquilt add Makefile
$ sed -i -e 's/-lfoo/-lfoo2/g' Makefile
$ dquilt refresh
$ dquilt header -e
... описание заплаты
</pre>
      </div>
      <div class="footnotes">
        <br/>
        <hr/>
        <div id="ftn.idp24460204" class="footnote">
          <p><a href="#idp24460204" class="para"><sup class="para">[22] </sup></a> Каталог <code class="filename">debian/patches</code> уже должен существовать, если вы
запускали <span class="command"><strong>dh_make</strong></span>, как это описывалось ранее. В этом
примере каталог создаётся вручную, на случай если обновляется существующий
пакет.  </p>
        </div>
        <div id="ftn.idp24472676" class="footnote">
          <p><a href="#idp24472676" class="para"><sup class="para">[23] </sup></a> Смотрите <a class="ulink" href="http://www.gnu.org/prep/standards/html_node/DESTDIR.html#DESTDIR">Стандарты программирования GNU: 7.2.4
DESTDIR: Поддержка поэтапной установки</a>.</p>
        </div>
        <div id="ftn.idp24479188" class="footnote">
          <p><a href="#idp24479188" class="para"><sup class="para">[24] </sup></a> При создании из исходного кода нескольких двоичных пакетов команда
<span class="command"><strong>dh_auto_install</strong></span> использует
<code class="filename">debian/tmp</code> в качестве временного каталога, а команда
<span class="command"><strong>dh_install</strong></span> с помощью файлов
<code class="filename">debian/<em class="replaceable"><code>пакет-1</code></em>.install</code> и
<code class="filename">debian/<em class="replaceable"><code>пакет-2</code></em>.install</code>
разнесёт содержимое <code class="filename">debian/tmp</code> по временным каталогам
<code class="filename">debian/<em class="replaceable"><code>пакет-1</code></em></code> и
<code class="filename">debian/<em class="replaceable"><code>пакет-2</code></em></code> для создания
двоичных пакетов
<code class="filename"><em class="replaceable"><code>пакет-1</code></em>_*.deb</code> и
<code class="filename"><em class="replaceable"><code>пакет-2</code></em>_*.deb</code>.
</p>
        </div>
        <div id="ftn.idp24487396" class="footnote">
          <p><a href="#idp24487396" class="para"><sup class="para">[25] </sup></a> Это просто пример, который показывает как должен выглядеть
<code class="filename">Makefile</code>. Если <code class="filename">Makefile</code> создан
командой <span class="command"><strong>./configure</strong></span>, то исправлять файл
<code class="filename">Makefile</code> предпочтительно вызовом
<span class="command"><strong>./configure</strong></span> из <span class="command"><strong>dh_auto_configure</strong></span> с
параметрами по умолчанию и добавленным параметром
<code class="literal">--prefix=/usr</code>.  </p>
        </div>
        <div id="ftn.idp24518300" class="footnote">
          <p><a href="#idp24518300" class="para"><sup class="para">[26] </sup></a>Если изменяется программный интерфейс (API) (то есть, вместо библиотеки
<code class="literal">foo</code> начинают использовать библиотеку
<code class="literal">foo2</code>), то требуется изменить исходный код так, чтобы он
использовал новый API.</p>
        </div>
      </div>
    </div>
    <div class="navfooter">
      <hr/>
      <table width="100%" summary="Navigation footer">
        <tr>
          <td align="left"><a accesskey="p" href="first.ru.html"><img src="images/prev.gif" alt="Пред."/></a> </td>
          <td align="center"> </td>
          <td align="right"> <a accesskey="n" href="dreq.ru.html"><img src="images/next.gif" alt="След."/></a></td>
        </tr>
        <tr>
          <td align="left" valign="top">Глава 2. Первые шаги </td>
          <td align="center">
            <a accesskey="h" href="index.ru.html">
              <img src="images/home.gif" alt="Начало"/>
            </a>
          </td>
          <td align="right" valign="top"> Глава 4. Обязательные файлы в каталоге <code class="filename">debian</code></td>
        </tr>
      </table>
    </div>
  </body>
</html>